개발 환경 도커로 구성하기

yun·2023년 11월 21일
2

Docker

목록 보기
4/7

프로젝트의 성격

로컬 환경

  • 운영체제: Ubuntu 22.04
  • GPU: GeForce RTX 2060 Mobile
  • Nvidia Cuda 버전: 12.0
  • Docker 버전: 24.0.7

도커 이미지를 어떻게 만들까?

  • Docker Hub에 push하는 것도 좋지만
  • 프로젝트 코드와 같이 Git으로 관리하고 싶어서 Dockerfile을 작성하기로 했다.
  • 설치할 프로그램
    • vim
    • 딥러닝에 필요한 pip 라이브러리
      • ultralytics(YOLOv8)
      • pytorch
      • tensorflow
    • ROS2-humble: (작성시점 기준) EOL date(유효기간)이 가장 길다.
  • 근데... 딥러닝에 필요한 프로그램과 통신에 필요한 프로그램이 전혀 다른데.. 하나의 도커 이미지로 만드는 게 괜찮나...?
    • 충돌이 없으면 하나로 만들어도 상관없다지만, 용도별로 만들어서 compose로 한번에 실행하는 게 나을 것 같다.
      • 최신 버전에서는 compose.yaml을 가장 선호(이전 버전과의 호환을 위해 docker-compose.yml도 지원은 하지만, 여러 파일이 있다면 compose.yml 내용을 실행)
    • 이미지 하나씩만 실행하고 싶으면 docker run을 사용할 것
    • ROS2 도커 이미지는 따로 Dockerfile을 작성하지 않고 있는 이미지를 그대로 사용할 수 있다.
      • 빠른 설치를 위해 osrf의 도커 이미지를 사용

딥러닝용 도커를 만들자

  • Dockerfile의 첫 행은 FROM이다. (도커 공식문서 참고)
    • GPU 사용을 해야 하니까 CUDA가 설치된 도커에서 시작하자.

Base Image

  • Q. TensorFlow? PyTorch? Nvidia?
  • A. 로컬에서 라이브러리 설치 시 PyTorch 버전과 CUDA 버전 호환이 안 맞아서 여러 번 삭제 후 재설치를 했다. PyTorch 도커로 시작하자.

도커와 로컬의 CUDA 버전이 다른 경우

  • Q. 도커에서 사용한 CUDA와 로컬의 CUDA 버전이 다를 때 도커 내부의 CUDA가 정상 동작할까?
  • A. YES - NVIDIA 개발자 답변
    • source에서 PyTorch를 빌드하거나, custom CUDA를 사용하는 경우에만 로컬에 설치된 CUDA toolkit이 사용되며, 도커 내부에서는 도커에 설치된 CUDA가 사용된다.
    • NVIDIA 드라이버는 이전 버전과 호환되므로 신규 버전에서 이전 버전을 지원한다.
      • 로컬에서 CUDA 12.1과 호환되는 PyTorch 최신 버전이 설치됐을 때는 정상적으로 import할 수 없었지만 11.7과 호환되는 버전은 정상 동작했다.

Dockerfile

  • 테스트를 위해 PyTorch 이미지를 실행 후 ultralytics를 설치했더니
    ImportError: libGL.so.1: cannot open shared object file: No such file or directory 에러 발생

  • 그래서 답변에 제시된 대로

    libgl1-mesa-devlibglib2.0-0을 설치하기로 했다.

  • 근데 libglib2.0-0 설치중에 timezone을 묻는 질문이 나오는데 Dockerfile RUN 명령어로 설치중일 때는 답을 못하잖아...?

    • 그래서 발견한 DEBIAN_FRONTEND noninteractive

    • 도커 공식문서에서는 이 환경변수를 설정하지 않도록 권고하고 있다.

      • 이 속성이 Dockerfile에서 빌드된 모든 이미지와 컨테이너에 상속되어서 도커 내부에서 설치하려고 할 때도 상호작용을 못하게 되는 부작용이 있기 때문
      • 사용해야 한다면, 설치를 끝낸 후에 기본값으로 되돌려야 한다.
      • 기본값은 newt이다
  • 결과

    • lsb-release는 우분투 버전 확인을 위해 추가했다.
    • 확인 시 우분투 버전은 20.04.6 LTS(focal)
    • 프로젝트 디렉토리 최상단에 Dockerfile이 있다.
      • ADD 명령어로 프로젝트 코드 전체를 도커 내부 workspace 하위의 project 디렉토리에 복사해서 올려준다.
    • 기본 설정은 root 권한으로 docker 내부에 들어가는데, root가 생성한 파일은 root만 사용할 수 있고 volume으로 전달된 로컬 파일마저도 root만 사용할 수 있게 된다.
      • 해결하려면?
      • 도커파일에서 일반사용자를 만들어 준다.
      • 디렉토리의 root 권한을 풀어준다: 아래 코드에서는 모든 사용자에게 모든 권한을 부여하고 있는데, 한 PC를 여러 사용자가 사용한다면, 보안에 더 신경을 써야 한다면 현재 사용자 또는 특정 그룹에만 권한을 부여하도록 하자.
        sudo chmod -R 777 ~/deeplearning-repo-4
  • Q. object detection은 yolo v5가 제일 잘한다는데 v8이랑 같이 쓰지는 못한다고 한다. 딥러닝 도커 2개 만들까?

  • A. 크게 차이 없으니까 일단 만든 거 테스트 ㄱㄱ

이미지 사용

  • (Dockerfile이 있는 경로에서) 이미지 빌드

    docker build . -t dl_haejo
    • -t: build 시 tag 옵션을 줘서 <image_name>:<tag_name> 형태로 생성함 (tag 안 쓰면 latest로 생성됨)
    • 최초 실행 시에는 RUN 명령어 실행에 시간 소요됨
    • 이미지 삭제했더라도 2회차부터는 빨리 실행됨
  • 컨테이너 생성

    docker run --net=host --ipc=host --pid=host --gpus all -it --name <container_name> <image_name>
  • 컨테이너 삭제

    docker rm <container_name>
  • 이미지 삭제

    docker rmi <image_name>

0개의 댓글