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

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

突然ですが皆さん、Docker コンテナで GPU を使うとき、(典型的には NGC のコンテナイメージを使うときとか) どういうコマンドを実行していますか?

nvidia-docker run ....

と打ち込んでいる方は是非この記事を最後まで読んでください。懐かしの nvidia-docker コマンド (NVIDIA Docker 2 ではシェルスクリプト) は、最新の NVIDIA Docker にはもはや含まれていません。

NVIDIA Docker の歴史

さて、ここまで普通に「NVIDIA Docker」と書いてしまっていますが、GitHub リポジトリを見ればわかるとおり、このプロジェクトの名前は既に NVIDIA Docker ではありません。実はこのプロジェクトはこれまでに、

  • 名前が3回変わっており
  • 大きなアーキテクチャ変更 (所謂「NVIDIA Docker 2」になったとき) や
  • 後方互換性のない変更 (nvidia-docker(1) が消えたとか) もあり
  • インストールするパッケージ名も変わっています

ちょっと表にしてみましょう。なお、ここで言う「バージョン」は、GitHub の nvidia-docker リポジトリのリリース番号です。

Name Version Package Name Description
NVIDIA Docker 1.0.1 まで .deb や .rpm ファイルを配っていた nvidia-docker-plugin という Docker ボリューム プラグインのデーモンが動いており、nvidia-docker コマンドはこのデーモンと通信してコンテナで GPU を使うための環境を整えていた 。
Docker
Engine Utility for NVIDIA GPUs
2.0.2 nvidia-docker2 ボリュームプラグインは使われなくなった。
docker run --runtime=nvidia としてエヌビディアによるカスタマイズ版の runc を指定するようになった。
nvidia-docker は --runtime=nvidia オプションなどを補って docker コマンドを実行するラッパースクリプトになった。
このカスタムランタイム (/usr/bin/nvidia-container-runtime) の役割は、コンテナ作成直後に処理を挿入できる pre-start-hook にプログラム (/usr/bin/nvidia-container-runtime-hook) を登録して、以前のバージョンのボリューム プラグイン相当の処理を行うこと。
NVIDIA
Container Runtime for Docker
2.1.0 nvidia-docker2
2.0.x 系と仕組みは同じ
NVIDIA
Container Toolkit
2.2.1 nvidia-container-toolkit Docker 19.03 が GPU にネイティブ対応したことに伴い、pre-start-hook の登録にカスタムランタイムが不要になった。
--runtime=nvidia ではなく --gpus オプションを指定する必要がある。
nvidia-docker コマンド(スクリプト) が含まれなくなった。

なんか、ころころ変わっててすみません…

NVIDIA Docker 使い方 (最新版)

というわけで、本記事執筆時点 (2019年11月) の最新 NVIDIA Docker しぐさは次のようなものです。まずは過去のしがらみなく、まっさらな Linux 環境で初めて NVIDIA Docker を使い始める状況を想定します。

この場合話は簡単で、こちらに記載の通り

  • 最新の NVIDIA ドライバーをインストール ()
  • Docker の最新バージョン (19.03) をインストール
  • nvidia-container-toolkit パッケージをインストール

これだけです。そして、GPU コンテナを実行するには Docker 19.03 でサポートされた --gpus オプションを使います。

docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
  • --runtime=nvidia オプションは無意味です。
  • nvidia-docker コマンドもありません (nvidia-container-toolkit パッケージに含まれていません)。

今後はこれが標準かつ唯一の方法になって世の中が少しシンプルになるはずです。

後方互換性

いくら最新の Docker が公式に GPU に対応したからとはいえ、--runtime=nvidia オプションや nvidia-docker コマンドが突然使えなくなってしまうのでは困るケースも多いと思います。ご安心ください、実は --runtime=nvidia オプションや nvidia-docker コマンドを提供していた nvidia-docker2 パッケージは、

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.

出典: https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart

と明記はされているものの、最新の Docker 19.03 の環境でもまだ利用可能です。この、「Docker 19.03 + nvidia-docker2 パッケージ」の状態では、次のように新旧全ての書き方が通用します。

$ docker run --gpus all 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

出典: https://github.com/NVIDIA/nvidia-docker/tree/master#upgrading-with-nvidia-docker2-deprecated

しかし、いつまで nvidia-docker2 パッケージが使えるかはわかりませんから、できるだけ前述の標準かつ唯一の方法への移行をオススメします。

おまけ: NVIDIA ドライバーのインストール

NVIDIA Docker と直接は関係しませんが、いや、そんなことないか、ほぼ直接関係する大事なことなので書きますが、 NVIDIA ドライバーをインストールする、オススメの方法(だけど案外知られていない気がする方法) は次の通りです。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".

出典: https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-the-nvidia-driver

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

cuda-drivers パッケージをインストールというのをもう少し具体的に示しますと、例えば Ubuntu 18.04 であれば CUDA 10.1 のインストール Web サイトで下記のようなコマンドが提示されると思います。

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
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork

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

まとめ

  • Docker 19.03 の GPU ネイティブ対応により、NVIDIA Docker の使い方も少し変わりました。今後は Docker 標準の --gpus オプションを使いましょう。
  • nvidia-docker2 パッケージは Docker 19.03 の登場で非推奨になりましたが今のところ有効です。新旧双方のオプションが使えるので今のうちにじわじわと移行を進めてください。
  • ついでに言うと、 NVIDIA ドライバは cuda-drivers パッケージでインストールするのがオススメ。

関連情報

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away