레이블이 cuda인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cuda인 게시물을 표시합니다. 모든 게시물 표시

2026년 1월 7일 수요일

Windows + WSL + TensorFlow + CUDA 설치하기

 아쉽게도 tensorflow가 native로 윈도우를 더 이상 지원하지 않기로 한 것 같다. 여기 저기 검색해 본 결과 JAX랑 PyTorch 쓰라고 하네. 당장 짜놓은 Tensorflow+keras 조합을 바꾸진 못할 것 같다.

당분간은 본업용 윈도우 시스템과 실험용 리눅스 시스템을 동시에 굴려서 실험을 해야 잘못된 실험(결과값을 reverse scaling하지 못해서 ....)을 다시 할 수 있을 것 같다. 

그럼 본업은 유지해야 하기 때문에 윈도우를 갈아 업을 순 없고 가능한 조합은 Windows + WSL + CUDA + Tensorflow + Keras 인것 같다.

그래서 먼저 WSL 설치하고 CUDA 설치하고 tensorflow를 설치해야 겠다.

1. WSL 설치

1.1. linux용 windows 하위 시스템 설치

PS C:\Windows\system32> wsl --install

재부팅하라니 재부팅을 해주어야 겠다.

1.2. 사용가능한 linux 배포판 확인하기

PS C:\Windows\system32> wsl --list --online

1.3. linux 배포판 설치

나는 자주 갈아 업는 배포판은 귀찮기 때문에 Ubuntu 24.04 LTS 버전을 설치하도록 하겠다.

PS C:\Windows\system32> wsl --install Ubuntu-24.04

1.4. Ubuntu 환경 업데이트

PS C:\Windows\system32> wsl 

user@DESKTOP:/mnt/c/Users/user$ sudo apt update

user@DESKTOP:/mnt/c/Users/user$ sudo apt upgrade


2. CUDA 환경 설치

Nvidia의 드라이버 구조와 cuda 는 다소 난잡하다. 

2.1. Nvidia 드라이버 설치

윈도우 시스템에 nvidia 드라이버가 설치된 상태로 wsl을 설치해서 그런지, 이미 설치되어 있는 듯 싶다. 확인만 하고 넘어 가자.

...$ nvidia-smi

드라이버 버전 확인 요망(내껀 드라이버 버전 576.88이다. CUDA도 설치 되어 있네 12.9)

2.2. CUDA Toolkit 설치

앞서 이야기 했듯이 난잡하다. nvidia 드라이버 버전을 기준으로 다른 패키지들 tensorflow와 cuda-toolkit의 매칭되는 버전을 찾아 보도록 해야 겠다. 다시 설치하고 그러기 싫다.

우선 시스템이 제공해 줄 수 있는 버전을 확인해 본다.

...$ sudo apt search nvidia-cuda-tool

nvidia-cuda-toolkit이 설치할 수 있게 검색되며 버전은 12.0.140 이다.

그럼 설치한다.

...$ sudo apt install nvidia-cuda-toolkit

오래 걸린다. 잠깐 정리하고 넘어가자.

nvidia 드라이버 버전(576.88), CUDA 버전(12.9), nvidia-cuda-toolkit 버전(12.0.140)

설치된 nvidia관련 패키지들 리스트들이다.

...$ apt list --installed | grep nvidia

libnvidia-compute-535/noble-updates,noble-security,now 535.274.02-0ubuntu0.24.04.2 amd64 [installed,automatic]

libnvidia-ml-dev/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-dev/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-gdb/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-toolkit-doc/noble,now 12.0.1-4build4 all [installed,automatic]

nvidia-cuda-toolkit/noble,now 12.0.140~12.0.1-4build4 amd64 [installed]

nvidia-opencl-dev/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-profiler/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

nvidia-visual-profiler/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

어 근데 cudnn은 없네 이것도 필요한 것으로 기억하는데 이것도 설치해야 겠다.

...$ sudo apt install nvidia-cudnn

현재 설치버전은 8.9.2.26이다. 버전이 무슨 암호 같다. 그 전에 너무 길다.

이젠 python 설치와 관련 패키지 설치인것 같다.


3. python 설치

다행이도 이미 설치된 버전은 3.12.3이다.

...$ python3

Python 3.12.3 (main, Nov  6 ...)

>>> quit()

그럼 관련 조합을 정리해 보자.

tensorflow-2.15 + cuda-12.2 + cudnn-8.9 -> corresponding NVIDIA Driver 535

약간 다르긴 하지만 이 조합 밖에 없다. 이걸로 밀어 부치자.

3.1. 가상 환경 설치하기

개발환경의 패키지 버전과 시스템이 관리하는 버전의 충돌을 경험해 보고 싶지 않으면 python 가상환경을 설치하자. 

...$ sudo apt install python3-venv

3.2. tensorflow를 위한 가상환경 생성

그럼 하얀 도화지를 준비하자.

...$ python3 -m venv tf-env

3.3. 생성된 가상 환경 활성화 하기

...$ source ./tf-env/bin/activate

(tf-env) ...$ 

가상환경 종료는 맨 마지막에 해주어야 하지만, 참고로 다음과 같이

(tf-env) ...$ deactivate

아무튼 가상환경 하에서 필요한 tensorflow-2.15버전을 설치한다.

3.4. tensorflow 2.15 설치

(tf-env) ...$ pip install tensorflow[and-cuda]==2.15

에휴 없다. 다시 호환표를 보자.

https://www.tensorflow.org/install/source?hl=ko#gpu

....

텐서플로우-2.17.0 3.9-3.12 클랭 17.0.6 바젤 6.5.0 8.9 12.3

텐서플로우-2.16.1 3.9-3.12 클랭 17.0.6 바젤 6.5.0 8.9 12.3

텐서플로우-2.15.0 3.9-3.11 클랭 16.0.0 바젤 6.1.0 8.9 12.2

...

맞는 조합이 없다. python 3.12이고 cuDNN 8.9고 CUDA는 12.9다.

모른겠다. 2.17버전 설치한다.

(tf-env) ...$ pip install tensorflow[and-cuda]==2.17

엉망 진창이지만 설치가 된다. 근데 오래 걸린다.

3.6. 설치 확인

(tf-env) ...$ python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

너무 오래 걸린다. 윈도우 환경으로 넘어가서 visual studio code 환경 설정해야 겠다.

4. visual studio code 환경 설정

visual studio code는 윈도우에 설치하고 python과 tensorflow는 윈도우 안에 있는 리눅스 시스템에 설치되어 있다. 이 둘 간의 OS를 넘나드는 다리를 만들어 주어야 한다.

visual studio code를 실행하고 좌측 탭의 extensions를 선택하고 "Remote - WSL"을 검색한다.

근데 WSL 밖에 없다. 설명을 보아 하니 WSL에 있는 폴더를 열 수 있다고 한다. 이것 설치한다.

그리고 좌측 하단의 원격 연결 버튼 ( >< 모양 아이콘)을 클릭하고 "Connect to WSL"을 선택한다.

뭔가 설치한 Ubuntu-24.04와 연결하는 것 같다.

File -> Open Folder 하고  WSL 디렉토리 선택하고 test.py 파일을 하나 만들면 필요한 extensions들을 추천해 주는데 다 설치하자. 그럼 또 가상 환경 만들라고 한다. 이미 만들어 놓은 건 어쩌고 만들라고 하는지 기존것 로딩하는 것은 없나 보다. 

아 귀찬다. /mnt/c/Users/usr/tf-env를 /home/user로 복사해 오자. 나머지는 내일 하는 것으로.



2025년 10월 29일 수요일

2025-10-29 현시점에서 개인 개발자를 위한 가장 현실적인 인공지능 학습을 위한 GPU workstation

 GPU - Nvidia RTX 4090(24GB) : 학습데이터 메인메모리에서 GPU로 옮기다가 에러나가 싫으면 24GB는 되어야 한다고 생각한다.

CPU - 사실 별로 중요하지 않다. 이왕이면 AMD로

RAM - 뭐가 되었든 최소 64GB 이상 데이터를 그래프화 하거나 저장하거나 할때 말도 않되는 메모리 사용량에 프로그램이 멈추는 경험을 하기 싫다면 많을 수록 좋다.

메인보드 - 당장 GPU를 하나밖에 달 수 없는 주머니 사정을 어쩔 수 없더라도 누가 알겠는가 어쩌다 돈이 떨어져서 GPU를 하나 더 달 수 있는 상황이 발생할지도 그러니까 그러니 GPU를 어러게 달 수 있는 메인보드를 선택하자 당장은 어쩔 수 없이 하나만 달아서 쓰더라도.

 파워서플라이 - 850W 이상 끝.

Keras 정확히는 Tensorflow의 메모리 부족 문제 해결책

 처음에는 학습데이터의 양이 메인 메모리의 한계를 넘어가면서 메모리를 증설했고 그 다음에는 학습데이터를 GPU에 옮기는 과정에서 GPU 메모리가 부족하여 batch_size를 줄여도 보았으나 다음과 같은 에러 메시지는 해결되지 않았다. 

" InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized."

 확실하진 않지만 위와 같은 메시지 였던것 같다. CPU에서 다루던 데이터를 GPU로 옮기다가 사고가 나는 것 같다. 이치상으로 보면 batch_size를 줄이면 해결되어야 하는데 해결되지 않았고 어디서 다음과 같은 DataGenerator로 조금씩 데이터를 흘려 주면 된다고 했는데 나한테는 전혀 효과가 없었다.


class DataGenerator(Sequence):
  def __init__(self, x_set, y_set, batch_size):
    self.x, self.y = x_set, y_set
    self.batch_size = batch_size

  def __len__(self):
    return int(np.ceil(len(self.x) / float(self.batch_size)))

  def __getitem__(self, idx):
    if idx == self.__len__() - 1:
      batch_x = self.x[idx * self.batch_size : ]
      batch_y = self.y[idx * self.batch_size : ]
    else:
      batch_x = self.x[idx * self.batch_size : (idx+1) * self.batch_size]
      batch_y = self.y[idx * self.batch_size : (idx+1) * self.batch_size]
    return batch_x, batch_y

train_gen = DataGenerator( X_train_split,  y_train_split,  batch_size)
test_gen = DataGenerator(X_val_split, y_val_split, batch_size)

history = self.model.fit(
 train_gen,
 validation_data=test_gen,
 epochs=epochs,
 callbacks=callbacks,
 verbose=1

 정확히 문제가 되는 지점이 학습 완료 후 평가하는 과정에서 사단이 나서 굉장히 열받는 상황이었다. 며칠을 걸려서 학습을 완료했는데 왜 평가할때 프로그램이 사망하냐구.

 아무튼 좀 더 구글링을 해서 찾은 해결책은 학습기간 동안 최적의 모델을 파일형태로 저장하도록 하고 기존 모델을 제거해서 메모리 문제를 제거하는 방법을 시도해 보았다. 그리고 최적의 모델은 다시 파일에서 로딩하는 방식으로... 하지만 다음 명령어는 효과가 없었다.

del model

 뭔가 cuda와 cuDNN 그리고 tensorflow의 backend 사이에 꼬여 있는 부분이 있는 것 같다. 여러 차례의 시도를 하여 각 tensorflow의 backend의 각세션을 학습 완료 후 재 초기화 하고 "del model"을  수행한다. 그리고 garbage collect을 통해 안쓰는 데이터를 메모리에서 해제한다. 그 결과 평가 단계로 수훨하게 넘어 갈 수 있었다. 그 기록을 여기에 남겨 둔다.

 ... 학습 완료 후...

    # reset Keras Session
    sess = tf.compat.v1.keras.backend.get_session()
    tf.compat.v1.keras.backend.clear_session()
    sess.close()
    sess = tf.compat.v1.keras.backend.get_session()
    del self.model  # this is from global space - change this as you need
    # use the same config as you used to create the session
    config = tf.compat.v1.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=config))

    import gc

    gc.collect()

... 저장된 파일에서 self.model을 다시 로드한다...