エヌビディアの佐々木です。
突然ですが皆さん、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".
適当訳: 「オススメの方法はご利用の環境に応じたパッケージマネージャで 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
この最後の sudo apt-get -y install cuda
を sudo apt-get -y install cuda-drivers
とすれば、最新のドライバだけが綺麗にインストールされます。これがオススメの方法です。
まとめ
- Docker 19.03 の GPU ネイティブ対応により、NVIDIA Docker の使い方も少し変わりました。今後は Docker 標準の --gpus オプションを使いましょう。
- nvidia-docker2 パッケージは Docker 19.03 の登場で非推奨になりましたが今のところ有効です。新旧双方のオプションが使えるので今のうちにじわじわと移行を進めてください。
- ついでに言うと、 NVIDIA ドライバは cuda-drivers パッケージでインストールするのがオススメ。