ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 딥 러닝을 위한 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

     

    Docker + Pytorch + GPU로 딥 러닝 개발하기

    https://www.slideshare.net/MichaelDucy/the-future-of-everything-37344357 The Future of Everything The Future of Everything www.slideshare.net Docker의 중요성을 알려주는 슬라이드다. 한 번 감상해보자...

    hanseokhyeon.tistory.com

    이 글을 참고하자.

     

    1. Docker-compose 설치 [ubuntu 기준]

    https://docs.docker.com/compose/install/

     

    Install Docker Compose

    You can run Compose on macOS, Windows, and 64-bit Linux. Prerequisites Docker Compose relies on Docker Engine for any meaningful work, so make sure you have Docker Engine installed either...

    docs.docker.com

    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://crystalcube.co.kr/197

    https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose

     

     

    반응형
Designed by Tistory.