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

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