-
[Docker] pytorch 딥러닝 환경 구축하기et al/Docker&git 2023. 10. 22. 06:42
환경
os : ubuntu 20.04.6(lts)
Graphic card : rtx4060ti 16gb
설치할 버전들
NVIDIA-DRIVER : 535 ver
CUDA : 11.8 ver
pytorch : 2.0.0 ver
tensorflow : 2.14 ver
cuDNN : 8.7 ver
자신의 그래픽 카드에 맞는 버전을 알고 싶으면 이전 글을 참고하면 된다.
2023.10.19 - [et al/Docker] - [CS] 4060ti 16GB - cuda & pytorch & tensorflow & cuDNN 호환 버전 확인
목차
1. nvidia-driver 설치
2. docker 설치
3. nvidia-container-toolkit 설치
4. pytorch 설치
5. docker container 실행
6. container 볼륨 설정 ( cotainer과 로컬주소 연결하기 )
7. 컨테이너 생성 (포트 옵션 설정)
8. docker에서 pip로 필요한 패키지 다운받기
9 jupyter 환경설정
10. 주피터 실행
11. jupyter notebook 접속
12. 재접속시
13. docker commit
1. nvidia driver설치
이전 글에서 정리해뒀다. 아래 내용을 보고 설치를 완료하자. (docker를 먼저 설치해도 상관없다.)
2023.10.19 - [et al/Docker] - [CS] ubuntu 20.04.6 [LTS]에 NVIDIA - DRIVER 설치
nvidia-smi
2. 도커 설치
도커 설치에 대해 자세히 정리해둔 블로그가 많아서 아래 공식문서로 대체하고, 도커 설치 과정은 생략한다.
도커 설치 후 sudo를 사용하지 않고 docker를 사용할 수 있게끔, 권한 설정해줘야하는데 인터넷에서 찾아서 잘 적용해주자.
https://docs.docker.com/desktop/install/ubuntu/
3. nvidia container toolkit 설치
nvidia gpu는 게임용으로 만들었기에, 연산용으로 사용하기 위해선 cuda toolkit이 필요하다. toolkit도 두 종류인데, 로컬환경에서 사용하기 위한 cuda toolkit과 docker와 같은 컨테이너를 위한 container toolkit이 있다. 여기서는 도커 사용을 목적으로 하기 때문에 container toolkit을 다운받을 것이다.
(toolkit을 설치하기 전에 docker와 nvidia driver가 컴퓨터에 설치되어 있어야한다. 터미널에 nvidia-smi를 입력했을 때 드라이버 버전이 잘 출력되고, docker version을 입력했을 때 버전이 잘 출력되면 toolkit을 설치할 준비가 된 것이다.)
더보기(상관 없는 얘기지만, 기록용 추가설명을 남긴다. cuda toolkit에 경우 다운 받을 때 deb와 runfile이 있는데, deb파일은 nvidia driver도 포함되어 있는 것 같다. runfile로 driver를 제외한 나머지 파일을 선택 다운 받았는데, 툴킷이 제대로 작동하지 않았다.로컬설치를 장렬하게 실패하여 docker 환경으로 전향한 것도 있다...)
toolkit 설치 과정은 nvidia 공식 홈페이지의 과정을 따른다.
깃허브 : https://github.com/NVIDIA/nvidia-docker
nvidia 공홈 유저 가이드 : https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
Installing with Apt
Configure the repository:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \ && \ sudo apt-get update
그대로 터미널에 입력하자.
패키지를 다운받는다.
sudo apt-get install -y nvidia-container-toolkit
Configuring Docker
sudo nvidia-ctk runtime configure --runtime=docker
도커를 재시작한다.
sudo systemctl restart docker
도커에 툴킷이 잘 설치 되었는지 확인하는 예제 코드를 입력해보자.
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
위 코드를 보면 docker를 nvidia driver정보를 볼 때 입력했던 코드, nvidia-smi가 있다.
ubuntu라는 image에 대한 컨테이너를 실행시키는데, 컨테이너에서 gpu를 사용하기 위해 --runtime=nvidia 옵션이 붙었다. --gpus all은 모든 gpu를 돌린다는 뜻으로, 그래픽 카드가 하나뿐인 나에게는 없어도 되는 옵션이다.
참고로 --rm은 예제코드이므로, 컨테이너를 나왔을 때 자동으로 컨테이너가 삭제되게끔 하기위해 넣은 옵션이다.
설치가 잘 되었다면 아래와 같이 뜰 것이다.
드라이버 버전 옆의 cuda 버전은 현재 내 컨테이너에 설치된 cuda 버전이 아닌 해당 드라이버에 권장되는 cuda 버전을 알려주는 것이다. (신경쓸 것 없다.)
※ nvcc -V에 대한 참고사항
더보기nvcc -V
위 코드는 nvidia cuda toolkit 설치 후 버전을 확인하기 위한 코드이다.
nvidia container toolkit은 컨테이너에서 nvcc -V를 입력하더라도 버전을 확인할 수 없다. 헷갈리지 말자.\
아래 링크는 cuda toolkit에 관한 글이다.
4. pull pytorch image
여기서부터는 유튜브를 참고했다. 영상으로 자세한 설명을 보고 싶으면 아래 링크에서 확인하면된다.
https://www.youtube.com/watch?v=-pimSpfBEBY&t=831s
pull image
docker hub에서 pytorch/pytorch를 검색하면 파이토치를 설치할 수 있는 image가 있다.
https://hub.docker.com/r/pytorch/pytorch/tags?page=1&name=11.8
tags에서 자신이 원하는 버전의 이미지를 다운받는다.
docker pull pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime
옆의 숫자들은 버전을 의미한다. pytorch 2.1.0 버전 cuda 11.8버전, cuDNN 8버전
runtime은 linux 환경의 이용자를 위한 파일인데, 전용 라이브러리가 있다고 한다.
devel은 용량을 보면 알 수 있지만 훨씬 많은 게 들어있는 이미지로, 필요성을 느낄 때 다운 받으면 된다.
image가 잘 받아졌는지 확인하기 위해서 다운받은 이미지 목록을 볼 수 있는 docker images를 입력한다.
docker images
아래와 같이 출력된다면 이미지를 잘 내려받은 것이다.
REPOSITORY TAG IMAGE ID CREATED SIZE pytorch/pytorch 2.1.0-cuda11.8-cudnn8-runtime 67ea460be595 2 weeks ago 7.68GB
5. docker container 생성 및 cuda 활성 체크.
gpu를 활용하기 위해 --runtime=nvidia를 붙이자.
# docker run --runtime=nvidia -it <image-name> 형식에 맞춰 컨테이너를 생성하자. docker run --runtime=nvidia -it pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime
nvidia-smi 입력시 잘 출력되는지 확인한다.
root@378945d9d4f6:/workspace# nvidia-smi
파이썬을 실행하자. 잘 실행되면 문제 없는 것이다.
root@378945d9d4f6:/workspace# python Python 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
pytorch에서 cuda를 사용할 수 있는지 체크해보자.
>>> import torch >>> torch.__version__ '2.1.0' >>> torch.cuda.is_available() True
False가 아닌 True가 출력된다면 문제 없이 cuda가 활성화되어 있는 것이다.
6. 도커 볼륨 설정
컨테이너에서 로컬 주소에 있는 폴더와 파일에 접근하기 위해 주는 옵션이 volume옵션이다.
컨테이너를 생성할 때의 코드는 똑같고 추가된 부분이 -v ~/PytorchProject:/workspace 인데,
-v는 volume 옵션을 부여하겠다는 것을 의미하고, 콜론을 기준으로 "로컬 주소" : "컨테이너 주소"를 의미한다.
다시 풀어 적자면, 물결 '~'은 root 위치를 말하고, root 위치에 있는 'PytorchProject' 폴더와 컨테이너의 workspace폴더를 연결시켜준다는 의미이다.
docker run --runtime=nvidia -it -v ~/PytorchProject:/workspace pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime
유튜브 영상에서는 깃허브에서 예제 파일을 로컬 주소에 받아서 도커 컨테이너에서 실행하는 과정이 나오므로 필요하면 참고하자.
아래 목차는 유튜브 영상의 목차인데,
위에 작성한 과정은 3번까지의 내용이다. 아래 목차를 보고 궁금하면 유튜브에서 확인하도록 하자.
영상은 총 3편짜리인데 모두 유용했고, 영상길이도 짧아서 아주 좋았다. 도커 입문자에게 강추한다.
https://youtu.be/xtHOsyLjOlk?si=e5PUey7Jo7tgozth
더보기유튜브 3편에서 bash에 대한 설명이 나오는데 기존에 /bin/bash로 알고 있었어서 chat-gpt에게 /bin/bash와 bash에 대한 차이를 물어봤다.
docker exec 명령어를 사용할 때, 컨테이너 내에서 실행하려는 셸을 지정할 수 있는데, /bin/bash와 bash 사이에 차이가 있습니다.
- docker exec -it 컨테이너_이름 bash: 이 명령은 호스트 시스템의 기본 경로에 있는 bash 셸을 실행하려고 시도합니다. 컨테이너 내에 bash가 설치되어 있지 않은 경우에는 이 명령이 실패할 수 있습니다. 그러므로 컨테이너 내부에서 bash가 사용 가능한 경로에 있어야 합니다.
- docker exec -it 컨테이너_이름 /bin/bash: 이 명령은 명시적으로 /bin/bash 경로에 있는 bash 셸을 실행하도록 지정합니다. 컨테이너 내의 /bin/bash 경로에 bash가 설치되어 있으면, 항상 해당 경로의 bash가 실행됩니다. 이것은 bash가 어떤 경로에 설치되어 있더라도 명확하게 지정하는 데 도움이 됩니다.
차이는 주로 컨테이너의 파일 시스템 구조나 실행 환경에 따라 달라집니다. 일반적으로 /bin/bash를 사용하는 것이 더 명확하고 호환성이 높을 수 있습니다.
7. 컨테이너 생성 (포트 옵션 설정)
docker run --name kaggle_cmi --runtime=nvidia --gpus all -it -v ~/study:/workspace -p 8888:8888 cmi_torch:10.28
포트 설정에 대한 설명은 위에서 소개한 유튜브 2편 뒷 부분에 나온다.
8. docker에서 pip로 필요한 패키지 다운받기
pip install jupyter pip install numpy pip install matplotlib pip install pandas pip install scikit-learn pip install scikit-learn pip install xgboost pip install parquet pip install seaborn pip install pyarrow ...
9-1 jupyter 환경설치
docker container 안에서 pip로 jupyter를 받고 나면 환경을 세팅해줘야한다.
서버를 띄우기 위해서 인증 정보를 생성해야 하는데, 이를 위해서 config 파일을 생성한다.
config 파일은 생성 시 /root/.jupyter/jupyter_notebook_config.py 에 저장된다.
jupyter notebook --generate-config -y
overwrite을 묻는다면 y를 입력해준다.
9-2 ipython
ipython으로 인증 정보를 생성한다. jupyter notebook 서버에 접속할 때 필요한 비밀번호를 생성하는 과정이다.
root@bba86646a2eb:/workspace# ipython
ipython에 진입 후 from notebook.auth import passwd 을 입력해준다. ( 에러 발생 시 아래 참고)
밑의 에러 때문에 서칭 중에 pyp3 install --upgrade ipython 과정을 추가하긴 했다. 무관할듯 싶으나 혹시 몰라서 기록을 남겨둔다.
upgrade를 한 후에도 해결되지 않아서 아래 소개할 다른 방법을 적용해서 해결했다.
In [1]: from notebook.auth import passwd --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[1], line 1 ----> 1 from notebook.auth import passwd ModuleNotFoundError: No module named 'notebook.auth'
위와 같이 에러가 발생해서 서칭 끝에 아래 코드로 수정해서 입력했고, 잘 작동했다.
from jupyter_server.auth import passwd
passwd()는 패스워드를 생성하는 명령어이다.
In [3]: passwd() Enter password: Verify password:
아래처럼 코드가 출력되는데, 반드시 복사해놓아야한다. 나중에 써먹는다.
Out[2]: 'argon2:$argon2id$.....' # 따옴표를 포함해서 모두 복사해둔다.
이후 quit()을 입력해서 빠져나온다.
9-3 환경정보 입력
jupyter notebook에서 서버를 띄우기 위한 환경 정보를 입력해준다.(jupyter_notebook_config.py를 수정해준다.)
docker container 내부에서 nano 패키지를 설치해준다.
apt-get update apt-get install nano # config 파일 오픈 명령어 nano /root/.jupyter/jupyter_notebook_config.py
파일의 내용은 아래와 같다. 아래와 같이 값을 넣고 저장해 준다.
c=get_config() c.NotebookApp.ip='localhost' c.NotebookApp.open_browser=False c.NotebookApp.password='argon2:$argon2......' # 이전에 복사해 놓은 값 입력 c.NotebookApp.password_required=True c.NotebookApp.port=8888 c.NotebookApp.iopub_data_rate_limit=1.0e10 c.NotebookApp.terminado_settings={'shell_command': ['/bin/bash']} # terminal을 bash로 실행
10. 주피터 실행
-ip 0.0.0.0는 모든 ip 접근을 가능하게 한다.
--allow-root는 root권한을 허용해준다.
root@f6dcfb3f63b0:/workspace# jupyter notebook --ip 0.0.0.0 --allow-root
참고로 포트를 변경하고 싶으면 --port 옵션을 사용하면 된다.
# 예를 들어 컨테이너 실행시 port를 8889로 맞춰주면 주피터 노트북 실행할 때도 포트옵션을 사용해서 맞춰줘야 한다. docker run --name <name> --runtime=nvidia --gpus all -it -d -v /home:/workspace/home -v -p 8888:8889 <image id> /bin/bash # ... 중략 ... jupyter notebook --ip 0.0.0.0 --allow-root --port=8889
11. jupyter notebook 접속
주피터 노트북 접속 방법 : 웹 브라우저에 http://(host machine ip):8888/tree 입력하면 비밀번호 입력 창이 뜬다.
11-1 host machine IP 확인 방법
docker inspect container [container ID] | grep IPAddress
12. 재접속시
docker exec -it [container name] /bin/bash
root@f6dcfb3f63b0:/workspace# jupyter notebook --ip 0.0.0.0 --allow-root
http://(host machine ip):8888/tree
13. docker commit
docker commit <컨테이너 id> <image name>[:TAG] docker commit 378945d9d4f6 cmi_torch:10.28
* 참고
https://saturncloud.io/blog/how-to-install-pytorch-on-the-gpu-with-docker/
https://www.tensorflow.org/install/docker?hl=ko
https://yeko90.tistory.com/entry/how-to-run-jupyter-docker
9-2 오류 참고 https://stackoverflow.com/questions/76943786/modulenotfounderror-no-module-named-notebook-auth
8 ~ 12 과정 참고 https://talktato.tistory.com/44
'et al > Docker&git' 카테고리의 다른 글
[git] 기본 명령어 정리 (1) 2023.11.29 [git] vscode로 git commit 하는 법 (2) 2023.11.28 [CS] 4060ti 16GB - cuda & pytorch & tensorflow & cuDNN 호환 버전 확인 (0) 2023.10.19 [CS] ubuntu 20.04.6 [LTS]에 NVIDIA - DRIVER 설치 (1) 2023.10.19 [Docker] 도커(wsl)에서 미니콘다(miniconda)와 vscode 연결하기 (0) 2023.06.24