1. 도커 설치 및 초기설정
(해당 과정은 Docker가 설치되어 있지 않을 때 하시면 됩니다. 설치되어 있다면 2번으로 이동 !)
1.1. 도커 설치
$ curl -fsSL https://get.docker.com/ | sudo sh
설치가 불가능 하다면,
1.1.1. 도커 제거
$ sudo apt-get remove docker docker-engine docker.io containerd runc
1.1.2 관련 apt 설치 & docker official GPG key 추가
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ sudo apt-get update
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
1.1.3 docker repository 추가
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
ModuleNotFoundError: No module named 'apt_pkg' 에러가 뜨면 Python 기본 버전을 잠시 바꿔줬다가 해봅니다.
$ update-alternatives --set python3 /usr/bin/python3.5
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ update-alternatives --set python3 /usr/bin/python3.6
경우에 따라 3.5 대신 다른 버전일 수 있습니다. sudo update-alternatives --config python3 으로 버전을 확인합니다.
1.1.4 도커 설치
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
특정 버전 설치는 apt-cache madison docker-ce로 버전을 확인 후 sudo apt-get install docker-ce= docker-ce-cli= containerd.io와 같이 설치하자.
1.2. 도커 권한 설정
$ sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
$ sudo usermod -aG docker oem # oem 사용자에게 권한주기
1.3. Nvidia Toolkit 설치
도커 컨테이너 내에서 GPU를 사용할 수 있도록, Host(Local) GPU Driver와 Docker Container를 연동시켜주는 NVIDIA-Docker를 설치합니다.
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
1.3.1. GPU 확인
CUDA 11 기준 다음 명령어를 통해 GPU 할당 여부를 확인할 수 있습니다.
$ docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
2. 이미지 및 컨테이너 다루기
2.1. 도커 Image 다운
다음 명령어를 통해 Host(Local)의 pytorch 버전을 확인 할 수 있습니다.
$ nvidia-smi
$ nvcc -V
# version 8 이전
$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
# version 8 이후
$ cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
Host(Local)에 맞는 torch 버전, cudnn 버전의 설치 명령어를 도커 허브에서 찾아 설치해줍니다.
(저의 경우 pytroch 1.7.1 & cuda 11.0 & cudnn 8 을 사용하였습니다 - GTX3090)
$ docker pull pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime
참고
2.2. 다운 받은 Images 확인
$ docker images
2.3. 다운 받은 Image 삭제
Image를 잘못 다운 받았을 때 다음 명령어를 통해 삭제가 가능합니다.
$ docker rmi -f <Image ID>
2.4. 컨테이너 실행하기
$ sudo docker run -d -it --name [컨테이너 이름] --gpus all --ipc=host -v [로컬 디렉토리]:/workspace -p 8888:8888 [실행할 이미지]
$ sudo docker run -d -it --name pytorch --gpus all --ipc=host -v /home/test:/workspace -p 8888:8888 pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime
서비스 배포가 아닌 실험환경 구축이 목적이기 때문에 Container를 사용자 폴더에 mount 시키도록 하겠습니다.
그리고 사용자별로 다른 Container를 사용할 수 있기 때문에 port도 지정해두도록 하겠습니다.
- -d : 백그라운드에서 실행
- --name : 컨테이너 이름 지정
- --gpus : 사용할 gpu 할당
- --ipc : numworker 사용
- --mount type=bind,source=(우분투 폴더 절대경로),target=(Container에서의 작업 경로)
- -v [Ubuntu(Local) 작업 경로]/[Container에서의 작업 경로]
- -p : 포트 포워딩 \(\rightarrow\) jupyter를 사용하기 위해 8888로 설정
- python -m http.server : docker를 background에서 실행할 명령어
2.5. 도커 볼륨 생성 및 확인
$ docker volume [볼륨 이름]
$ docker volume ls
$ docker volume inspect [볼륨 이름]
2.6. 컨테이너 상태 확인
$ docker ps -a
2.7. 도커 내부 접속하기
$ docker exec -it [CONTAINER NAME] bash
2.8. GPU 동작 확인
$ python
>>> import torch
>>> torch.cuda.is_available()
3. Docker Hub에 업로드하기
3.1. Docker Hub 로그인
$ docker login
User name : gukss # 이메일이 아니라 사용자명 입니다.
Password : # 로그인 -> Account Setting -> Access Tokens 발급 코드
3.2. 이미지화 하기 전 컨테이너 중단
$ docker stop [컨테이너 이름]
3.3. 배포할 컨테이너 이미지화
$ docker commit [컨테이너 이름] [hub ID]/[image명]:[tag]
3.4. 이미지 업로드
$ docker push [hub ID]/[image명]:[tag]
내가 사용할 것 정리
1. pytorch & jupyter lab images \(\rightarrow\) container
$ sudo docker run -d -it --name [컨테이너 이름] --gpus all --ipc=host -v [서버 디렉토리]:/workspace -p 8888:8888 [컨테이너 이름] jupyter lab --allow-root
2. bash 접속
$ docker exec -it [컨테이너 이름] bash
3. 생성한 Container Start
$ docker container start [컨테이너 ID]
4. 생성한 Container Remove
$ docker rm -f [컨테이너 ID]
[추천] Dockerfile 세팅
2.1 까지 진행 후 다음을 진행하면 된다.
1. Dockerfile 생성
$ vim Dockerfile
# Dockerfile
FROM pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime
# Remove any third-party apt sources to avoid issues with expiring keys.
RUN rm -f /etc/apt/sources.list.d/*.list
# Install some basic utilities & python prerequisites
RUN apt-get update -y && apt-get install -y --no-install-recommends\
wget \
vim \
curl \
ssh \
tree \
sudo \
git \
libgl1-mesa-glx \
libglib2.0-0 \
zip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set up time zone
ENV TZ=Asia/Seoul
RUN sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
# Set Jupyter
RUN python -m pip install --upgrade pip && \
pip install jupyter && \
pip install jupyterlab
RUN jupyter notebook --generate-config
RUN echo "c.NotebookApp.password = u'sha1:5799b6a14b52:06b42abb34e2349370b37e014f0f608b6d61c099'" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.open_browser = False" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.password_required = True" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.use_redirect_file = False" >> /root/.jupyter/jupyter_notebook_config.py
여기서 주의할 점은 jupyter notebook의 password 형식을 'sha1' 알고리즘으로 생성해야 한다. 'argon2' 알고리즘 방식으로 생성 후 적용하면 비밀번호를 틀렸다고 출력한다.
$ python
>>> from notebook.auth import passwd
>>> passwd('비밀번호', 'sha1')
'sha1:~'
또한, 자신의 서버에 맞는 pytorch 버전을 찾아야 한다.
2. Dockerfile \(\rightarrow\) Docker Image
$ docker build -t [이름]:[태그] .
3. 컨테이너 생성
$ sudo docker run -d -it --name [CONTAINER NAME] --gpus all --ipc=host -v [LOCAL DIR]:/workspace -p 8888:8888 [IMAGE NAME]:[IMAGE TAG] jupyter lab --allow-root
$ sudo docker run -d -it --name [CONTAINER NAME] --gpus '"device=1"' --ipc=host -v [LOCAL DIR]:/workspace -p 8888:8888 [IMAGE NAME]:[IMAGE TAG] /bin/bash
참고
https://greeksharifa.github.io/references/2021/06/21/Docker/
https://pebpung.github.io/development/2022/01/11/Docker-1.html
https://yeko90.tistory.com/entry/how-to-run-jupyter-docker
'Dev > Docker' 카테고리의 다른 글
[Docker] 도커 캐시 삭제하기 (0) | 2023.07.20 |
---|---|
[Docker] docker-compose 설치 (0) | 2023.03.18 |