NVIDIA Docker って今どうなってるの? (20.09 版)

Kuninobu Sasaki
NVIDIA Japan
Published in
13 min readSep 8, 2020

--

※ この記事は以前私が Qiita に書いたものを、現状に合わせて更新したものです。(内容、結構変わりました)

※ 2021/01/08 CUDA Toolkit 11.2 のリリースに伴い、「NVIDIA ドライバのインストール」節を更新しました。
※ 2020/09/24 CUDA Toolkit 11.1 のリリースに伴い、「NVIDIA ドライバのインストール」節を更新しました。

エヌビディアの佐々木です。

この記事では、Docker 等のコンテナで GPU を利用するための「NVIDIA Docker」の現状を紹介します。

「Docker で GPU を使うためにあちこち調べてみたけれど、nvidia-docker コマンドを使えばよいとか、--rutime=nvidiaオプションが必要とか、はたまた Docker が標準で GPU をサポートしたとか、色々な情報があってよくわからない」という方は是非ご一読ください。

NVIDIA Docker の歴史

さて、冒頭で「NVIDIA Docker」と書いてしまっていますが、GitHub リポジトリを見ればわかるとおり、このプロジェクトの名前は既に NVIDIA Docker ではありません。技術的にも、大きく 3 世代に分けられますので、簡単に解説しておきます。
なお、ここで言う「バージョン」は、GitHub の nvidia-docker リポジトリのリリース番号です。

誕生からバージョン 1.0.1 まで

第 1 世代の NVIDIA Docker は、標準の docker コマンドとは別の nvidia-dockerというコマンドが提供されていました。

また、ホスト側の CUDA 関連ファイルをコンテナで利用可能にするために、nvidia-docker-plugin という Docker ボリューム プラグインのデーモンが動いており、nvidia-docker コマンドはこのデーモンと通信してコンテナで GPU を使うための環境を整えていました。

この頃はまだパッケージリポジトリを公開しておらず、.deb や .rpm ファイルを直接配布していました。

バージョン 2.0.2 から 2.1.1 まで

いわゆる「NVIDIA Docker 2」です。nvidia-docker2 パッケージでインストールできるようになりました。

第 1 世代とはアーキテクチャが変わり、コンテナ実行時はdocker run --runtime=nvidiaとしてエヌビディアによるカスタマイズ版の runc を指定する形になりました。nvidia-docker コマンドは --runtime=nvidia オプション等を補って docker コマンドを実行するラッパースクリプトとして残りました。

プロジェクトの名称は、当初 “Docker Engine Utility for NVIDIA GPUs” で、後に “NVIDIA Container Runtime for Docker” と変わりました。

バージョン 2.2.1 以降

Docker 19.03 が GPU をサポートし --gpus オプションが追加されたことに対応したのがこの世代です。名称は NVIDIA Container Toolkit になりました。引き続き、nvidia-docker2 パッケージでインストールできますが、パッケージの構成が少し変わっています。

2020 年 9 月現在、この NVIDIA Container Toolkit が最新の「NVIDIA Docker」です。

NVIDIA Container Toolkit

環境構築方法

本記事執筆時点の状況を元に、NVIDIA Docker 環境の作り方を示します。
とても簡単な 3 ステップです。

  1. NVIDIA ドライバのインストール
  2. Docker のインストール
  3. NVIDIA Container Toolkit のインストール

NVIDIA ドライバのインストール

オススメの方法 (だけど案外知られていない気がする方法) はエヌビディア提供の cuda-drivers パッケージを使うことです。NVIDIA Docker の FAQ にもあるのです。

The recommended way is to use your package manager and install the cuda-drivers package (or equivalent).
When no packages are available, you should use an official “runfile”.

適当訳: 「オススメの方法はご利用の環境に応じたパッケージマネージャで cuda-drivers パッケージ (あるいはその相当品) をインストールすることです。パッケージが利用できない場合に、公式の “runfile” を使ってください。」

cuda-drivers パッケージをインストールというのをもう少し具体的に示しますと、例えば Ubuntu 18.04 に CUDA 11.2 をインストールするのであれば、CUDA Toolkit の Web サイトで下記のようなコマンドが提示されると思います。(Installer Type として deb (local) を選んだ場合)

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda-repo-ubuntu1804-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

この最後の行を sudo apt-get -y install cuda-drivers とすれば、最新のドライバだけが綺麗にインストールされます。これがオススメの方法です。

※ その他の Linux ディストリビューション、CUDA バージョンに関しては CUDA Toolkit Archive のページから辿ってください。

なお、cuda-drivers パッケージでインストールする場合は、

  • 手動で nouveau をブラックリストに追加する必要はありません
    パッケージのインストール時に、/lib/modprobe.d/nvidia-graphics-drivers.conf が自動的に作成されます。
  • ウィンドウシステム (X とか) を終了する必要はありません
    run ファイルでインストールする場合は、下記のようなエラー画面が表示され、ウィンドウシステムを終了する必要がありますが、パッケージでインストールする場合にはそういう手間がありません。
cuda-drivers パッケージでインストールすればこんなエラーとも無縁

Docker のインストール

Docker 公式の便利スクリプトで、最新の安定版をすぐにインストールできます。インストール後、docker サービスの開始と、自動起動設定をしておきましょう。

curl https://get.docker.com | sh
sudo systemctl start docker && sudo systemctl enable docker

Docker のバージョンは 19.03 以降が推奨ですが、1.12 以降であればサポートはされています。私は 19.03 と 18.09 で試しましたが、問題なく動作しました。

また、これは必須ではありませんが、sudo なしに docker コマンドを実行可能にするのであれば、次のように対象のユーザーを docker グループへ追加しましょう。

sudo usermod -aG docker $USER

NVIDIA Container Toolkit のインストール

インストールするパッケージについては、少し前まで下記のようにお伝えしていました。

過去のしがらみがなければ Docker 19.03 + nvidia-container-toolkit

後方互換性を維持する必要があれば Docker 19.03 + nvidia-docker2

です。

しかし、2020 年 9 月の更新により、とてもシンプルになりました。
今は単に nvidia-docker2 パッケージをインストールすれば OK です。

ここでは例として、私が Ubuntu-18.04 にインストールした際のコマンドを示します。

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-docker2
sudo systemctl restart docker

各 Linux ディストリビューションでの nvidia-docker2 パッケージのインストール方法は、公式ドキュメントのインストールガイドを参照してください。

以上で、インストールは完了です。

補足: nvidia-docker2 パッケージについて

以前は、NVIDIA Docker のドキュメントに下記の記述がありましたが、最新版では削除されています。

With the release of Docker 19.03, usage of nvidia-docker2 packages are deprecated since NVIDIA GPUs are now natively supported as devices in the Docker runtime.

また、公式ドキュメントのインストールガイドには以下のようにあり、 nvidia-docker2 パッケージが推奨のインストールパッケージになっています。

For purposes of simplicity (and backwards compatibility), it is recommended to continue using nvidia-docker2 as the top-level install package.

補足: nvidia-docker2 と nvidia-container-toolkit の関係

以前の記事で紹介した nvidia-container-toolkit パッケージはなくなったわけではありません。実は、NVIDIA Container Toolkit に名前が変わったタイミングで、 nvidia-docker2 パッケージは新しい nvidia-container-toolkit パッケージに依存するようになっており、nvidia-docker2 だけをインストールすれば、nvidia-container-toolkit も一緒にインストールされます。

詳細は、公式ドキュメントのアーキテクチャ概要をご覧ください。

GPU 付きコンテナの起動方法

ここでは、実際にコンテナで GPU を利用する方法を紹介します。

Docker 19.03 で追加された--gpus オプションを使う場合は以下の通りです。利用する GPU の指定なども柔軟に可能です。

# すべての GPU を使用
docker run --gpus all --rm nvidia/cuda:9.0-base nvidia-smi
# 2 つの GPU を使用(※ GPU ID 0 から順番に選択される)
docker run --gpus 2 --rm nvidia/cuda:9.0-base nvidia-smi
# GPU ID または UUID を指定して使用 (クォートが冗長に見えるけど必要)
docker run --gpus '"device=0,1"' --rm nvidia/cuda:9.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' --rm nvidia/cuda:9.0-base nvidia-smi

また、従来の方法も引き続き有効です。

docker run --runtime nvidia nvidia/cuda:9.0-base nvidia-smi
nvidia-docker run nvidia/cuda:9.0-base nvidia-smi

とはいえ、徐々に --gpus を利用する新しい方式へ移行することをお勧めします。

補足: NVIDIA Docker 1 をご利用の方へ

いまだに NVIDIA Docker 1 (/usr/bin/nvidia-docker がバイナリファイル) を利用されている場合は、できるだけすみやかに最新環境へ移行しましょう。 NVIDIA Docker 1 は既にメンテナンスされていませんし、 CUDA 10 以降の環境では動作しません。

まとめ

  • Docker 19.03 の GPU ネイティブ対応に合わせて、NVIDIA Docker は NVIDIA Container Toolkit になり、 Docker 標準の--gpusオプションに対応しました。
  • NVIDIA Container Toolkit のインストールは、 従来通りnvidia-docker2 パッケージで OK 。新しい nvidia-container-toolkit パッケージは依存関係により自動的にインストールされます。
  • NVIDIA ドライバは cuda-drivers パッケージでインストールするのがオススメです。nouveau をブラックリストに登録する必要も、 GUI を停止する必要もありません。

関連情報

--

--