-
딥 러닝을 위한 docker-compose 설치 및 사용법 [pytorch, tensorboard 예제]개발 환경/Docker 2020. 4. 11. 17:49반응형
Docker를 도입한지 시간이 흘렀고, 현재 가장 Low-level로 사용중이다. docker run ...으로 시작하는 명령어를 통해 컨테이너를 만들고 실행한다. 이제는 익숙해졌지만 사실 docker-compose라는 자동화된 패키지가 있는 것을 알고 있었다. 이번 기회에 한번 docker-compose를 사용하여 생산성을 높여볼까 한다.
0. Docker로 딥 러닝 하기 위한 준비
https://hanseokhyeon.tistory.com/entry/Docker-Pytorch-GPU로-딥-러닝-개발하기?category=854704
이 글을 참고하자.
1. Docker-compose 설치 [ubuntu 기준]
https://docs.docker.com/compose/install/
Docker-compose는 url을 통해 binary로 받을 수 있다.
A. curl로 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
현재 stable 버전이 1.25.4이고 다른 버전을 깔아야 한다면 명령어에서 1.25.4만 바꿔주면 된다.
output:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 638 100 638 0 0 23629 0 --:--:-- --:--:-- --:--:-- 23629 100 16.3M 100 16.3M 0 0 1966k 0 0:00:08 0:00:08 --:--:-- 2142k
이렇게 설치가 된다.
B. 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
C. 설치 확인
docker-compose --version
output:
docker-compose version 1.25.4, build 8d51620a
정상적으로 설치되었다.
2. 딥러닝을 위한 docker-compose.yml 작성
현재 딥러닝 프레임워크로 pytorch를 사용중이며, visualization은 tensorboard로 하고 있다. 작성한 yml은 이러하다.
version: '3' services: train: image: hsh0322/las-pytorch volumes: - ./:/opt/project command: nvidia-smi # python3 train_timit.py config/las_timit_config.yaml tensorboard: image: hsh0322/las-pytorch volumes: - ./:/opt/project command: tensorboard --logdir=log/las_timit --port=6006 --host=0.0.0.0 ports: - "6006:6006"
파이참에서 작성하였는데 알아서 docker-compose 인식해서 자동완성 제공해주었다. 역시 갓브레인...
A. version
docker-compose를 작성하는 문법?의 버전을 말하는데 현재 3이 최신이고 추천한다고 documentation에 나와있다. 3을 사용하자.
B. services
docker-compose에서는 실행할 컨테이너들을 service라고 칭한다. 나는 네트워크를 학습시킬 train과 학습을 시각화할 tensorboard라 명명하였다.
C. train
train: image: hsh0322/las-pytorch runtime: nvidia volumes: - ./:/opt/project command: nvidia-smi # python3 train_timit.py config/las_timit_config.yaml
- image는 컨테이너 만들때 사용할 이미지
- GPU 없이 네트워크를 학습시킬 수는 없으니 runtime은 nvidia로 설정
- 현재 디렉토리에 있는 코드와 데이터들을 /opt/project에 마운트하자. 이미지를 만들 때 사용한 Dockerfile에는 WORKDIR /opt/project 명령이 존재한다.
- 테스트를 위해 nvidia-smi를 먼저 추천한다.
D. tensorboard
tensorboard: image: hsh0322/las-pytorch volumes: - ./:/opt/project ports: - "6006:6006" command: tensorboard --logdir=log/las_timit --port=6006 --host=0.0.0.0
- tensorboard를 사용하기 위해 pytorch는 필요없기 때문에 tensorboard 전용 이미지를 구해봐야겠다.
- volume도 사실 log 파일만 마운트하면 된다. 수정해야 한다.
- 컨테이너의 6006 포트와 내 로컬 6006 포트를 연결시켜준다. (포워딩)
- log의 주소를 적고, 사용할 포트를 6006으로 지정해주고, 모든 호스트에게 다 열어준다.
3. runtime=nvidia를 default로 설정
기존에 docker run 할 때는 --runtime=nvidia라는 옵션을 줘서 컨테이너 내부에서 GPU를 사용하였다. 하지만 docker-compose에는 다른 방법을 사용해야한다. 꼭 docker-compose를 위한 방법만은 아닌게 runtime=nvidia로 설정하면 docker run으로 컨테이너를 생성할 때도 --runtime=nvidia 옵션이 필요없어진다.
A. /etc/docker/daemon.json 수정
vim /etc/docker/daemon.json
/etc/docker에 있는 daemon.json 파일을 수정하자.
before:
{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
after:
{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
두번째 줄만 추가하면 된다.
B. docker 재실행
sudo service docker restart
docker를 재실행해줘야 수정이 반영된다.
C. Test
docker run hsh0322/las-pytorch nvidia-smi
--runtime=nvidia 옵션 없이 nvidia-smi를 실행했을 때 정상적으로 작동하면 성공이다.
4. docker-compose로 컨테이너 생성
docker-compose up
output:
Creating listen-attend-and-spell-pytorch_tensorboard_1 ... done Creating listen-attend-and-spell-pytorch_train_1 ... done Attaching to listen-attend-and-spell-pytorch_tensorboard_1, listen-attend-and-spell-pytorch_train_1 train_1 | Tue Apr 14 08:25:16 2020 train_1 | +-----------------------------------------------------------------------------+ train_1 | | NVIDIA-SMI 440.64 Driver Version: 440.64 CUDA Version: 10.2 | train_1 | |-------------------------------+----------------------+----------------------+ train_1 | | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | train_1 | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | train_1 | |===============================+======================+======================| train_1 | | 0 GeForce GTX 1070 Off | 00000000:01:00.0 Off | N/A | train_1 | | 0% 44C P8 6W / 166W | 19MiB / 8117MiB | 0% Default | train_1 | +-------------------------------+----------------------+----------------------+ train_1 | | 1 GeForce GTX 1070 Off | 00000000:03:00.0 Off | N/A | train_1 | | 0% 45C P8 5W / 151W | 2MiB / 8119MiB | 1% Default | train_1 | +-------------------------------+----------------------+----------------------+ train_1 | train_1 | +-----------------------------------------------------------------------------+ train_1 | | Processes: GPU Memory | train_1 | | GPU PID Type Process name Usage | train_1 | |=============================================================================| train_1 | +-----------------------------------------------------------------------------+ listen-attend-and-spell-pytorch_train_1 exited with code 0 tensorboard_1 | 2020-04-14 08:25:16.616284: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64 tensorboard_1 | 2020-04-14 08:25:16.616336: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer_plugin.so.6'; dlerror: libnvinfer_plugin.so.6: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64 tensorboard_1 | 2020-04-14 08:25:16.616341: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly. tensorboard_1 | TensorBoard 2.1.1 at http://0.0.0.0:6006/ (Press CTRL+C to quit)
5. 결론
docker를 겨우 이제 하면서 트렌드를 따라간다고 할 수는 없지만 그래도 트렌드를 따라가려고 노력중이다. 이제 다음 목표는 진짜 트렌드라고 할 수 있는 Kubeflow다!!
출처:
https://docs.docker.com/compose/install/
https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose
반응형'개발 환경 > Docker' 카테고리의 다른 글
Docker, docker-compose에 원하는 GPU만 할당하기 (0) 2020.05.21 Docker compose 원하는 log만 출력하기 (0) 2020.04.16 서버에서 Docker + tensorboard 사용하기 (0) 2020.03.11 docker --runtime=nvidia default로 바꾸기 (GPU 사용 default) (0) 2020.02.26 Mac + Docker 에서 GUI 사용하기 (python matplotlib 사용하기) (5) 2020.02.23