GPU 개발환경 구축하기: Docker를 활용하여 개발환경 한 번에 구축하기

whatSup CheatSheet·2022년 10월 3일
3
post-thumbnail
  • 본 글은 다음과 같은 환경에서 진행하였습니다.
    • Ubuntu 22.04.1 LTS
    • Driver Version: 515.65.01

Intro

  • 지금까지 GPU 개발 서버를 구축하기 위해 5개의 글을 작성하였지만, 이를 오류 없이 완벽하게 호환시키는 것은 매우 어려운 일입니다.
  • 또한, 만약 필요 환경이 바뀌게 된다면 했던 작업들을 또 다시 반복해야 하는 번거로운 일이 생길 수 있습니다.
  • 이러한 일들을 방지하고자 docker를 활용하여 '나만의 딥러닝 개발 이미지'를 구축하려 합니다.

Nvidia driver 설치

  • 다음 명령어로 그래픽 카드와 사용가능한 driver 버전을 확인합니다.
ubuntu-drivers devices
  • 설치할 드라이버 버전을 확인한 뒤, 다음 명령어로 설치합니다.
# nvidia-driver-515 설치
sudo apt -y install nvidia-driver-515

# (참고) 자동으로 드라이버 버전 선택하여 설치
# sudo ubuntu-drivers autoinstall

# 다음 명령어로 드라이버가 정상적으로 작동되는지 확인합니다. (GPU 장치 및 활용 상태 확인)
nvidia-smi

Docker 설치

본 설치는 docker docs를 따라갑니다.

  • (만약 이전 버전이 설치되어 있다면) 다음 명령어로 이전 버전을 삭제합니다.
sudo apt-get remove docker docker-engine docker.io containerd runc
  • apt 패키지 인덱스를 업데이트하고, 필요한 패키지를 설치합니다.
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • 도커의 GPG키를 추가합니다.
 sudo mkdir -p /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • 다운로드를 위해 repository를 바라보게 합니다.
 echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 도커 엔진을 설치합니다.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • 다음 명령어를 실행시켜, root유저가 아닌 유저에게도 docker 관련 명령을 수행할 수 있는 권한을 부여합니다.
sudo usermod -a -G docker $USER
sudo service docker restart
  • 다음 명령어를 실행시켜, 정상적으로 설치되었는지 확인합니다.
docker --help

Nvidia-docker 설치

본 설치는 nvivia-docker guide를 따라갑니다.

  • 설치를 위해 패키지 리포지토리를 GPG키를 설정합니다.
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && 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/experimental/$distribution/libnvidia-container.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-docker2
  • docker 데몬을 다시 시작하여 설치를 완료합니다.
# 데몬 재시작
sudo systemctl restart docker

# (option) 설치 확인
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

Dockerfile 작성

본 Dockerfile은 nvidia/cuda를 기반으로 제작되었습니다.

  • 원하는 cuda 버전, cudnn 버전, 리눅스 종류 및 버전 등을 고려하여 tag 탭에서 선택합니다.
  • 본 글에서는 cuda:11.6.1-cudnn8-devel-ubuntu22.04을 사용하였습니다.
    • base, runtime, devel에 대한 설명을 다음을 참고해주세요.

도커 파일의 전반적인 맥락은 다음과 같습니다.

  • base 이미지를 불러옵니다.
FROM nvidia/cuda:11.7.1-cudnn8-devel-ubuntu22.04
  • 기본 유틸리티와 파이썬 prerequisites를 설치합니다.
# 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
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && apt-get install -y --no-install-recommends\
    vim \
    curl \
    apt-utils \
    ssh \
    tree \
    ca-certificates \
    sudo \
    git \
    bzip2 \
    libx11-6 \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    wget \
    llvm \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libxml2-dev \
    libxmlsec1-dev \
    libffi-dev \
    liblzma-dev \
    python3-openssl && \
    rm -rf /var/lib/apt/lists/*
  • 타임존을 서울로 설정합니다.
# Set up time zone
ENV TZ=Asia/Seoul
RUN sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
  • ssh 연결을 위해 config를 추가합니다.
# Add config for ssh connection
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
    echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config
  • non-root유저를 추가하고, 디렉토리 등을 설정해줍니다.
# Create a non-root user and switch to it & Adding User to the sudoers File
ARG USER_NAME user
ARG USER_PASSWORD 0000
RUN adduser --disabled-password --gecos '' --shell /bin/bash $USER_NAME && \
    echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USER_NAME && \
    echo "$USER_NAME:$USER_PASSWORD" | chpasswd 
USER $USER_NAME

# All users can use /home/user as their home directory
ENV HOME /home/$USER_NAME
RUN mkdir $HOME/.cache $HOME/.config && \
    chmod -R 777 $HOME 

# Re-run ssh when the container restarts.
RUN echo "sudo service ssh start > /dev/null" >> $HOME/.bashrc

# Create a workspace directory
RUN mkdir $HOME/workspace
WORKDIR $HOME/workspace
  • pyenv를 설치하고 세팅합니다.
# Set up python environment with pyenv
ARG PYTHON_VERSION 3.10.6
RUN curl https://pyenv.run | bash
ENV PYENV_ROOT="$HOME/.pyenv"
ENV PATH "$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
ENV eval "$(pyenv init -)"
RUN cd $HOME && /bin/bash -c "source .bashrc" && \
    /bin/bash -c "pyenv install -v $PYTHON_VERSION" && \
    /bin/bash -c "pyenv global $PYTHON_VERSION"
  • petry를 설치하고 세팅합니다.
# Install Poetry
ENV PATH "$HOME/.local/bin:$PATH"
ENV PYTHON_KEYRING_BACKEND keyring.backends.null.Keyring
RUN curl -sSL https://install.python-poetry.org | python - && \
    poetry config virtualenvs.in-project true && \ 
    poetry config virtualenvs.path "./.venv"
  • [option] poetry를 통해 기본 DL 개발환경(Jupyter lab, torch, torchvision, ...)을 세팅합니다. 이 부분은 (pyproject.toml으로)환경에 대한 재현을 가능하게 해줍니다.
# [option] Set up DL development environment (with poetry)
RUN mkdir $HOME/workspace/machine-learning
WORKDIR $HOME/workspace/machine-learning
COPY pyproject.toml $HOME/workspace/machine-learning/pyproject.toml
RUN /bin/bash -c "pyenv local $PYTHON_VERSION" && \
    poetry env use python3 && \
    poetry run poetry install --no-cache
CMD cd $HOME/workspace/machine-learning && \
    poetry run jupyter lab --ip 0.0.0.0 --allow-root \
    --NotebookApp.token= --no-browser --notebook-dir=$HOME
  • Dockerfile 소스는 깃허브 링크에서 확인하실 수 있습니다.

도커 이미지 빌드 & 실행

  • 도커파일이 있는 폴더에서 다음 명령어로 도커 이미지를 빌드합니다.
docker build -t dl-world:cuda11.7.1-cudnn8-ubuntu22.04 \
--build-arg USER_NAME=<username> \
--build-arg USER_PASSWORD=<password> \
--build-arg PYTHON_VERSION=<python-version> .
  • 도커 컨테이너를 실행시켜 잘 동작하는지 확인합니다.
docker run -itd --name test-container \
--gpus all -p 2222:22 \
--restart always \
-v <volume-name>:<container-folder> \
-w <workspace> \
dl-world:cuda11.7.1-cudnn8-ubuntu22.04

dldev의 기본 CMD는 jupyter lab 서버를 실행시킵니다(비밀번호 x).
보안을 위해 비밀번호를 설정하고 싶으시면 여기를 참고해주세요.

Docker Hub에 Push

Docker Hub를 이용하기 위해선, 먼저 회원가입이 필요합니다.

  • 허브를 사용하기 전 로그인합니다.
docker login

  • Docker Hub를 바라보도록 tag를 생성합니다.
docker tag <image-name>:<tag> <username>/<new-image-name>:<new-tag>

  • image를 Docker Hub에 push합니다.
docker push <username>/<imagename>:<tag>
  • 다음과 같이 잘 push되었음을 확인할 수 있습니다.
  • 완성된 이미지는 도커 허브 링크에서 확인하실 수 있습니다.

Reference

profile
AI Engineer : Lv 0

0개의 댓글