Docker Compose

dockerでcudaコンテナの作成

cuda の GPG key 登録

  1. 古いキーの削除

    $ sudo apt-key del 7fa2af80
    
  2. ヘルパーパッケージを利用したキーの登録 nvidia が提供している、nvidia リポジトリ用の新しい署名キーのインストールを自動化する新しいヘルパーパッケージを利用して鍵を登録

    $ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
    $ sudo dpkg -i cuda-keyring_1.0-1_all.deb
    

    ubuntu2204x86_64は該当のものに書き換える

  3. remove の仕方 ※インストール時にターミナルに表示された文

    A deprecated public CUDA GPG key appear to be installed.
    To remove the key, run this command:
    sudo apt-key del 7fa2af80
    

結局必要だったのかわからなかったけどとりあえずやったこと

Setting up NVIDIA Container Toolkit

  1. パッケージリポジトリと GPG key のセットアップ

    $ 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/$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
    
  2. nvidia-docker2 パッケージのインストール

    $ sudo apt-get update
    $ sudo apt-get install -y nvidia-docker2
    
  3. Docker demon のリスタート

    $ sudo systemctl restart docker
    
  4. ベースとなるCUDAコンテナを実行することによって、動作するセットアップをテスト

    $ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
    

    以下のような出力ならOK!

    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
    | N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    

containerd

  1. コンテナエンジンとしてcontainerdをシステムにインストールするために、いくつかの前提モジュールをインストール

    $ sudo modprobe overlay \
        && sudo modprobe br_netfilter
    
  2. これらを確実に持続させることができる

    $ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
    overlay
    br_netfilter
    EOF
    
  3. apt が HTTPS 上でリポジトリを使用できるようにするためのパッケージをインストール

    $ sudo apt update
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  4. リポジトリとGPG key の追加

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/  docker-archive-keyring.gpg
    $ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    ※1回やってたらいらないかも…

Dockerfile and docker-compose.yml の作成

docker compose と Dockerfileを使う場合

コンテナ作成後の設定

  1. 鍵の作成
  2. ssh server の起動
    $ bash ./sterter.sh
    
  3. vscodeのsettings.jsonとkeyboard.jsonの設定
  4. rootのパスワード設定

Dockerfile のみの場合

trouble

apt が使えない…

コンテナにはproxyを通してたけどaptに通すのを忘れてた…

Dockerfile の apt update の前に以下の文を追加

RUN echo 'Acquire::http::proxy "http://proxy.cc.yamaguchi-u.ac.jp:8080"; \
Acquire::https::proxy "https://proxy.cc.yamaguchi-u.ac.jp:8080";' > /etc/apt/apt.conf

nvidia gpg key の更新

$ sudo apt-key del 7fa2af80
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb 
$ sudo apt update

cuda version を下げるとapt update が通らなくなる

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

みたいな感じで updateinstall をつなげてみたけどだめだった…

nvidiaのドライバが使えなくなった…

  1. nvidia driverのバージョンを落としてインストールし直す
  2. nvidia container toolkitをインストール
  3. proxy設定

参照

CudaをDockerで使用する際のDockerfileの作成

  1. 次のようなDockerfileを作成する

    FROM nvidia/cuda:11.4.0-cudnn8-devel-ubuntu20.04
    
    USER root
    
    COPY ./requirements.txt /tmp
    WORKDIR /code
    
    # ENV DEBIAN_FRONTEND noninteractive
    ENV https_proxy "http://<proxy server>"
    ENV https_proxy "http://<proxy server>"
    
    RUN echo 'Acquire::http::proxy "http://<proxy server>"; \
    Acquire::https::proxy "https://<proxy server>";' > /etc/apt/apt.conf
    
    RUN apt-get update && apt-get install -y \
    curl \
    python3 \
    python3-distutils
    
    RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py
    
    RUN pip install -r /tmp/requirements.txt
    
    • proxy 設定は以下のようにする
      ENV https_proxy "http://~~~"
      ENV http_proxy "http://~~~"
      
    • **cuda の version を下げると apt update が通らなくなったので、RUN apt-get update 以下はコメントアウトして、 pythonなどはコンテナ作成後にアタッチしてインストールした…
  2. 同じ階層に requirememts.txt を作成し、 Dockerfile で呼び出せるようにする。 このファイルには必要なパッケージを記入しておく

    jupyter
    jupyterlab
    numpy
    pandas
    matplotlib
    scikit-learn
    scikit-image
    scipy
    torch
    torchvision
    tqdm
    albumentations
    tensorflow-gpu
    Pillow
    opencv-python
    
  3. 作成したディレクトリ構造は次のようになる

    $ tree my-nvidia-cuda/
    my-nvidia-cuda/
    ├── Dockerfile
    ├── requirements.txt
    └── src
        └── test.ipynb
    
  4. Docker イメージをビルド

    $ cd my-nvidia-cuda
    $ docker build . -t <image name>
    
  5. Docker コンテナを起動

    $ sudo docker run -it --gpus=all -v "$PWD":/code -p 8888:8888 --name <container name> <image name> /bin/bash
    
    • --gpusはgpuのを列挙