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

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로 복사해 오자. 나머지는 내일 하는 것으로.



2026년 1월 4일 일요일

[책] Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow

 3판까지 나온 상태인 것 같다. 가격이 제법 나가서 사서 살펴보진 못했다. (원서는 10만원 선이고, 번역서는 5만원 선으로 검색된다.) 둘다 사서보기 부담 스럽다. 강의에 써보고 싶은데 접근하기가 쉽지 않다.

이론적으로 매몰되지 않고 그렇다고 따라 하기 식으로 매뉴얼 처럼되어 있는 책도 아닌 그 사이 어딘가에 있는 책같다. 들여다 봐야 할 것 도 많고 할일도 많은데 선 듯 움직여 지지 않는다. 그래서 되세김하기 위해 여기에 기록으로 남겨 볼때 마다 기억나게 남겨둔다. 

2025년 10월 29일 수요일

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을 다시 로드한다...

2023년 6월 6일 화요일

데비안 리눅스 시스템은 python 최신버전으로 유지 될때 과거의 python 설치하는 법

 [원본 : https://unix.stackexchange.com/questions/188741/install-newer-older-versions-of-python-on-debian]

대부분 우분투의 deadsnakes PPA를 이용하여 설치하는 방법을 설명하지만 아쉽게도 Debian에 이와 같이 설정하면 어디에선가 문제를 야기시킬수 있는 위험을 가지고 있다. 위의 원본 게시물에서도 알려주다시피 메뉴얼로다가 해당 버전을 다운로드 해서 수작업으로 설치하는 것을 추천한다.

현시점에서 python 3.11 버전으로 업데이트 되어 더이상 tensorflow를 설치할 수 없다. tensorflow가 지원하는 최신버전의 python이 3.10이다. 먼저 python 3.10 설치하고 그리고 Teledyne의 Spinnaker SDK의 python 버전이 python 3.8만 지원한다. 이것도 나중에 설치해야 겠다.

우선 급한데로 python 3.10 버전을 수작업으로 설치하는 방법을 기록해 둔다.

# 사전 준비물

```bash

$ apt install libssl-dev openssl libffi-dev

```

# python 3.10.11 버전 수동 설치

```bash

$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz

$ tar zxf Python-3.10.11.tgz

$ cd Python-3.10.11/
$ ./configure --prefix=/usr/local
$ make
$ make install

```

여기서, 시스템에서 관리되는 /usr/local에 설치하면 시스템 관리에 혼동을 초래할 수 있기 때문에 가능하면 /opt/python-3.10.11로 설정해서 컴파일하고 설치하도록 하자.

 그리고, 시스템에서 접근할 수 있게 PATH에 추가하거나 /usr/local에 symbolic link를 만들어 두자.

```bash

$ ln -s /opt/python-3.10.11/bin/python3.10 /usr/local/bin/python3.10
$ ln -s /opt/python-3.10.11/bin/pip3.10 /usr/local/bin/pip3.10

```