구글링 하다가 답답해서 직접 TensorFlow GPU 환경 세팅에 대한 포스팅으로 정리하기로 했습니다. Python, tf, cuda, cudnn 모두 환장의 버전 일치에 대한 세심한 체크가 필요한 아이들이라서, 자료의 최신화가 매우 매우 중요한데, 글들이 죄다 2023년에 멈춰있을 뿐더러 (벌써 2024년의 반 이상이 지나간 시점인데...) 구글 검색 설정을 통해 최근 글을 보려고 해도 자료가 없습니다. 그냥 없어요.
암튼 이런 저런 답답한 마음에, 그냥 나만을 위해서라도 자료 하나 정리해놓으려고 합니다. 먼저, 컴퓨터 사양은 다음과 같습니다.
환경 세팅 과정은 TensorFlow 공식 홈페이지(https://www.tensorflow.org/install/gpu?hl=ko) 의 과정을 따라갑니다.
여느 딥러닝 프레임워크가 그렇듯이, GPU 버전을 따로 관리합니다. 본인이 만약 NVIDIA GPU가 없는 컴퓨터 사양이라면, 제가 지금 정리하고 있는 내용을 따라올 필요가 없습니다. 먼저 위의 링크를 들어가보면,
TensorFlow GPU 지원에는 다양한 드라이버와 라이브러리가 필요합니다 라고 하네요. 설치를 단순화하려면 Linux 환경에서 Docker 이미지를 활용하라고 하지만, 저는 Windows 환경이므로 복잡하게 가겠습니다. 끝에 테스트된 빌드 구성 이라는 부분에 들어갑니다.
그럼 이런 화면이 나오는데, 위로 쭉 올려봅니다.
네 리눅스에 대한 내용입니다. 아무래도 AI 개발 환경에서는 리눅스를 많이 사용하다보니 리눅스에 대한 빌드 구성이 디폴트로 되어있는 것 같습니다. 페이지 우측의 소스에서 빌드 > Windows를 눌러서 밑으로 스크롤 하다보면 동일한 빌드 구성에 대한 표가 나옵니다.
여기서 주의 사항을 알려줍니다.
기본 Windows에서의 GPU 지원은 2.10 이하 버전에서만 사용할 수 있습니다. TF 2.11부터 CUDA 빌드는 Windows에서 지원되지 않습니다. Windows에서 TensorFlow GPU를 사용하려면 WSL2에서 TensorFlow를 빌드/설치하거나 TensorFlow-DirectML-Plugin과 함께 tensorflow-cpu를 사용해야 합니다.
그럼 최신의 TensorFlow를 사용하려면 WSL2 환경에서 실행시켜야 한다는 것 같군요. (2년 전이랑 많이 바뀌었네요...) 그럼 WSL2 환경을 먼저 구성해봅시다.
https://21june.tistory.com/2 해당 블로그를 참고하여 작성하였습니다.
WSL2를 사용하기 위해 윈도우 시스템 설정 몇 가지를 변경해야합니다. Win+s - Windows 기능 켜기/끄기 를 실행합니다.
이후 다음을 체크한 후 컴퓨터를 재부팅 시킵니다.
저도 재부팅 하고 오겠습니다..
재부팅이 완료되었다면, Windows PowerShell을 관리자 권한으로 실행시킵니다. 이후, 다음의 명령으로 Ubuntu를 설치합니다.
wsl --install -d ubuntu-20.04
설치하다가 알아낸건데, 이전에 제 경우, Microsoft Store에서 Ubuntu를 설치한 적이 있는데 이러면 그냥 호환이 되는 것 같습니다. 그래도 따로 가서 받지 마시고 제 글의 순서대로 하는 것이 나을 듯 합니다. 정상적으로 설치가 되었다면, Enter new UNIX username: 이라는 문구가 나오고 비밀번호를 두 번 치게 됩니다. 이후 다음과 같은 화면을 만날 수 있습니다.
만약 이후에 WSL로 들어가고 싶다면, 윈도우 검색 창에 WSL이라고 검색하면 다음과 같이 WSL로 들어가지는 것을 확인할 수 있습니다. (이 와중에 로고 너무 귀엽네요)
말로는 많이 들어보셨을 그 CUDA와 cuDNN 입니다. 딥러닝 모델 학습에 GPU를 사용할 수 있도록 해주는 일종의 가속기 역할을 하는 프로그램으로, NVIDIA 그래픽카드들을 사용하기 위해서는 빠지지 말아야할 녀석들이죠. 이 친구들의 문제가 버전을 굉장히 많이 탄다는 것입니다. 진짜 이 정도 버전 차이는 괜찮겠지 라는게 없습니다. Docu에 명시된대로 무조건 따라주어야 해요. 여기로 다시 들어가보죠.
그럼 아까 리눅스 빌드 구성표 쪽으로 가질겁니다. 우리는 WSL 환경에 CUDA와 cuDNN을 설치할 것이기 때문에 리눅스 빌드 구성을 따라가야 합니다. 글을 작성하고 있는 시점에서 가장 최신 버전 구성은 다음과 같습니다.
- 버전: 텐서플로우-2.17.0
- 파이썬 버전: 3.9-3.12
- 컴파일러: 클랭 17.0.6
- 빌드 도구: 바젤 6.5.0
- cuDNN: 8.9
- CUDA: 12.3
근데 여기서 문제는, https://en.wikipedia.org/wiki/CUDA#GPUs_supported 이쪽 위키를 보면, GPU 모델 별로 지원되는 CUDA 버전이 따로 있습니다. 제 경우에는 RTX 3060이므로, 8.6 버전의 cuDNN을 사용할 수 있겠네요. 가장 최신 TF를 사용하고 싶지만, 아쉽게도 버전을 다소 거슬러 올라가야 할 것 같습니다. 이에 맞는 구성은 다음과 같습니다.
- 버전: 텐서플로우 2.13.0
- 파이썬 버전: 3.8-3.11
- 컴파일러: 클랭 16.0.0
- 빌드 도구: 바젤 5.3.0
- cuDNN: 8.6
- CUDA: 11.8
CUDA를 먼저 설치해보겠습니다. 밑의 사이트로 이동합니다.
https://developer.nvidia.com/cuda-toolkit-archive
CUDA Toolkit 11.8.0을 찾아 들어갑니다.
들어가면 다음과 같은 화면이 나옵니다.
환경을 구성하고 있는 상황에 대해 다시 한 번 복기해보겠습니다. 본판은 Windows 입니다. 거기에 Ubuntu를 구동시킬 수 있는 일종의 가상 환경인 WSL을 설치하여 Linux 환경을 따로 구성해놓았습니다. 이 상태이기 때문에, Windows가 아닌 Linux를 선택합니다.
최종적으로는 위와 같이 선택해주면 밑에 어떻게 설치해야하는지 잘 나오네요. 본격적으로 WSL에 설치해주기 전에, 관리를 용이하게 해주기 위해 폴더 하나를 만들어서 관리해주겠습니다. WSL을 키고 다음의 경로로 이동해 폴더 하나를 만들어줍니다.
/mnt/host/c
구성은 컴퓨터 마다 다를 수도 있습니다. 여기에 Downloads라는 폴더를 통해 저는 관리하겠습니다.
다시 CUDA로 돌아와서, 다음의 명령어를 치라고 아주 친절하게 알려줍니다.
생성해준 폴더로 이동한 다음, (노파심에 적어 놓는데, 리눅스 명령어에 대한 숙지가 부족하시다면 리눅스 명령어에 대해 조금 알아보고 오시는 것을 추천드립니다. 너무 늦게 말씀드렸나... 암튼 꼭 보고 오시는 것을 추천드립니다.) 명령어 입력을 통해 CUDA를 설치합니다.
CUDA 설치를 완료했다면, cuDNN을 설치합니다. 다음의 링크로 들어가서 Download cuDNN Library를 클릭합니다.
https://developer.nvidia.com/cudnn
다음 페이지에서는 OS를 선택하는 것이 아니라 우리가 설치할 버전인 8.6 버전을 찾아갈 겁니다. 빨간색으로 네모친 부분으로 들어가서 아카이브를 뒤적거릴거에요.
로그인 하면 파일 하나가 다운로드 될 겁니다. 이 파일을 아까의 c/Downloads/ 경로에 다운받아주세요. 이후 다음의 명령어를 통해 설치합니다.
tar xvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
이후, cuDNN의 라이브러리 경로를 추가하기 위해 다음 명령어를 입력합니다.
sudo nano ~/.bashrc
bashrc 파일 마지막에 아래 문장을 추가합니다.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.8/lib64/
이후 저장하고 나갑니다. 마지막으로, bashrc 파일을 동기화 시켜줍니다.
source ~/.bashrc
제대로 설치되었는지 확인해야겠죠? 다음의 명령어를 입력했을 때, Result=PASS가 나오면 잘 설치된겁니다.
/usr/local/cuda-11.8/extras/demo_suite/deviceQuery
여기까지가 CUDA, cuDNN 설치 과정입니다. 이후에는 Anaconda와 Tensorflow 패키지 설치를 해보겠습니다.
https://www.anaconda.com/download/success
먼저, 위의 링크로 이동합니다.
Linux 버전을 다운로드해줍니다. 아까와 마찬가지로 c/Downloads/
에 다운받아줍니다. 이후 다음의 명령어를 통해 설치해줍니다.
bash Anaconda3-2024.06-1-Linux-x86_64.sh
그러면 More
라고 뜰텐데, 엔터 누르고 있어줍니다. 이후, yes를 입력하여 설치를 진행합니다. 마지막에 [no] >>>
라고 뜨는데, yes 입력 후 엔터 눌러줍니다.
이제 커맨드 상에서 conda를 사용할 수 있게 등록시켜줘야 합니다. 다시 편집기를 통해 bashrc
파일을 엽니다. 마찬가지로 제일 마지막에 다음의 명령어를 추가해줍니다.
export PATH=/home/<사용자명>/anaconda3/bin:$PATH
저장 후, bashrc
파일을 동기화시켜줍니다.
source ~/.bashrc
그러면, WSL 상에 못 보던 키워드가 생긴 것을 확인할 수 있습니다.
이 (base)
라는 단어가 생겼다면 성공입니다. (Anaconda base env라는 뜻입니다.) Anaconda를 설치했으니, 가상 환경 하나를 만들어서 Tensorflow를 설치해줄 겁니다. 제 경우, 3.11 버전으로 환경을 구성하겠습니다.
conda create -n [NAME] python=3.11
conda activate tensorflow
이후, 다음의 명령어를 통해 tensorflow를 설치해줍니다.
pip install tensorflow==2.13.0
드디어 WSL로부터의 해방입니다. 친숙한 윈도우에 WSL을 연결시켜보죠.
VSCode의 Extension 검색창에서 wsl을 검색해서 설치해줍니다. Python도 같이 설치를 진행해주세요. 이후, Ctrl+Shift+P를 누르고 WSL을 검색해줍니다.
그러면 좌측 하단에 새로운 무언가가 뜬 것을 확인할 수 있습니다.
터미널은 기본적으로 Anaconda를 설치했기 때문에 (base)
가 뜨는 것을 확인할 수 있습니다. 이후, TensorFlow를 구동하기 위한 파이썬 인터프리터를 생성하거나 골라주어야 합니다. 생성을 위해 WSL로 이동하여 다음의 명령을 통해 새로운 conda 환경을 생성해줍니다.
conda create -n [환경이름] python=3.11.9
conda activate
다시 Ctrl + Shift + P를 통해서 python을 검색해봅시다.
Select Interpreter를 클릭합니다.
저는 tensorflow
라는 이름으로 가상환경을 생성했고, 인터프리터로 지정해보겠습니다.
터미널 쪽에 (tensorflow)
라고 인터프리터가 설정된 것을 볼 수 있습니다.
참고 - PyCharm의 경우, Professional 버전이 아니면 인터프리터로 WSL을 지정할 수 없습니다. Community 버전을 쓰시는 분은 학교 계정이나 회사 계정으로 Professional 전환 후 사용해주세요.
PyCharm을 켜주고 Settings로 들어갑니다
이후, Project -> Python Interpreter
로 들어가서, 우측 상단에 Add Interpreter
를 눌러봅니다.
On WSL
를 누릅니다.
하단에 Introspection completed successfully!
메세지가 뜬다면 PyCharm이 WSL을 성공적으로 인식했다고 할 수 있습니다. Next
클릭해주세요.
바로 다음 화면입니다. 우리는 Anaconda로 환경을 구성했었기 때문에, 왼쪽에 Conda Environment
를 통해 설정합니다.
내가 미리 생성해둔 가상 환경을 선택하고 Create
눌러줍니다.
그러면 다음과 같이 인터프리터 목록에 선택한 가상 환경이 지정된 것을 볼 수 있습니다.
앞서 VSCode와 PyCharm에서 WSL을 연동시키는 것을 확인했습니다. 그러면, WSL이 정확하게 GPU를 인식하고 있고, 학습에 GPU를 잘 활용하는지 살펴봐야겠죠? 아무 Python 파일을 만들고 다음과 같이 구성합니다.
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
다음과 같은 메세지가 뜬다면 성공입니다.
2024-08-06 16:02:00.229419: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Created device /device:GPU:0 with 9711 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3060, pci bus id: 0000:0b:00.0, compute capability: 8.6
GPU 인식은 했는데, 학습에 GPU 자원을 사용하는지 확인하기 위해 간단한 Transformer 예제 노트북을 구동시켜서 작업관리자로 확인해보았습니다.
일 열심히 잘 하고 있는 것을 확인할 수 있습니다.
내가 답답해서 정리하는 tensorflow 환경에 대한 포스팅을 마무리하였습니다. 사실 예전에 tensorflow를 활용할 때에는 이 정도로 복잡하지 않았던 것 같은데, 최신 버전에 대한 윈도우 지원이 중단됨에 따라 비교적 윈도우 친화적이지 않은 환경 설정 과정이었던 것 같습니다. 그래도 윈도우에서 어느 정도 리눅스 환경을 같이 구동할 수 있다는 점을 확인하였고, 오래 걸리긴 했지만 본격적으로 환경을 구성했다는 것에 의의를 두고 진행했습니다. 사실 포맷하면서 더블 부팅 세팅을 날려버렸더니 이 고생을 한 것도 있는데, 다양한 경험은 중요한 자산이라고 생각하는 입장에서는 좋은 경험이었습니다. 질문 있으시면 댓글 달아주시고 도움이 되셨으면 좋겠습니다. 감사합니다.