Ubuntu 20.04にNVIDIA Container ToolkitをインストールしてDockerfileを作成

Ubuntu 20.04上のdockerでGPUを使うためには、NVIDIA Container Toolkitが必要です。

この記事ではNVIDIA Container Toolkitのインストール方法を紹介します。また、nvidia/dockerイメージを利用した最小限レベルのDockerfileも作成します。

基本的には公式のgithubのQuickstartに従います。また、Docker 19.03からNVIDIA GPUがネイティブにサポートされるようになったので、今回はDocker 19.03以降を想定しています。

NVIDIA Driverは既に導入済みであることを想定しているので、導入していない方はこちらを参照ください。

Dockerのインストール

まずDockerをインストールします。Dockerの公式ドキュメントに従います。下記では必要なコマンドだけ書いています。

※この記事を書いた段階(2020/05/22)では、Ubuntu20.04は正式サポートされていないようですが、とりあえず問題なく動きます。

# 既存パッケージの削除
$ sudo apt-get remove docker docker-engine docker.io containerd runc 
# 必要なパッケージをインストール 
$ sudo apt-get update 
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 
# 公式のGPG keyを追加 
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
$ sudo apt-key fingerprint 0EBFCD88 
# 安定版のリポジトリを追加 
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 
# dockerのインストール 
$ sudo apt-get update 
$ sudo apt-get install docker-ce docker-ce-cli containerd.io 
# 動作確認 
$ docker --version 
Docker version 19.03.9, build 9d988398e7 
$ sudo docker run hello-world

NVIDIA Container Toolkitをインストール

ここは、先程のQuickstartを参考にします。

# インストール
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
# 動作確認(nvidia-smiコマンドをコンテナ上で実行してみる)
$ sudo docker run --gpus all --rm nvidia/cuda nvidia-smi
...
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64 Driver Version: 440.64 CUDA Version: 10.2 |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2070 Off | 00000000:06:00.0 On | N/A |
| 25% 31C P8 16W / 215W | 834MiB / 7979MiB | 32% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================| 
+-----------------------------------------------------------------------------+

無事コンテナがGPUを認識しているようです。

nvidia/cudaを利用したDockerfileの作成

nvidia/cudaを利用したDockerfileの簡単なサンプルを作成したいと思います。下記の手順で行います

  1. Dockerfileの作成
  2. docker imageの作成と起動

Dockerfileの作成

FROM nvidia/cuda:latest
LABEL maintainer="keita"
WORKDIR /app
RUN apt update && apt install -y \
  vim \
  python3 \
  python3-pip
RUN python3 helloworld.py
$ cat helloworld.py
if __name__ == "__main__":

Dockerイメージの作成と起動

hello.pyは起動確認用プログラムです。

# 適当なディレクトリを作成
$ mkdir workdir
$ cd workdir


# 上記で作成したDockerfileの配置
$ cp /from/Dockerfile ./


# GPUの確認用プログラム
$ cat helloworld.py
if __name__ == "__main__":
    print("Hello World in docker")


# docker imageの作成
$ sudo docker build -t sample_docker:1.0 .
...
Hello World in docker
...


# docker containerの起動と確認
# --gpus allを忘れないこと!
$ sudo docker run -it --gpus all --rm sample_docker:1.0
root@5318e0262d06:/app# nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64       Driver Version: 440.64       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070    Off  | 00000000:06:00.0  On |                  N/A |
| 26%   31C    P8    10W / 215W |   1112MiB /  7979MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+


root@5318e0262d06:/app# python3 helloworld.py 
Hello World in docker

これで色々開発が行えそうです。