LoginSignup
34
26

More than 5 years have passed since last update.

nvidia-dockerは何をしているのか

Last updated at Posted at 2017-04-25

この記事はnvidia-docker v1.0の仕様を説明しています。現在の最新版はnvidia-docker2であり、この記事の仕組みでは動いていません。

nvidia-dockerのwikiにかいてあった

nvidia-dockerとは?

nvidia-dockerを使うとdockerコンテナ内部から簡単にNVIDIAのGPUを使うことができる。

$ nvidia-docker run --rm nvidia/cuda nvidia-smi

nvidia-dockerを使うことによって、GPUのドライバとCUDA/cuDNNの関係を疎にしてあげる事ができる。結果として、ひとつのホスト上で複数のCUDA/cuDNNのバージョンのコンテナを動かす事ができ、CUDA/cuDNNを使っているコンテナのポータビリティがあがるらしい。

どうやって動いてるの?

nvidia-dockerは大まかにいうと、実行したいコンテナ内からGPUにアクセスできるようにDocker Engine APIに色々なパラメータを指定してあげてコンテナを起動している。GPU関連の情報を取得できるようにnvidia-docker-pluginっていうGPU関連の情報をHTTPのサーバが立っている。
なので,nvidia-dockerコマンド経由でなくても、通常のdockerコマンドから、GPUを利用するdockerコンテナを動かす事もできる。(volume plugin機能も提供しているみたいなので、インストール自体は必要っぽい。)

nvidia-docker.png

オプションの付与

nvidia-docker経由でコマンドを実行したときの処理の流れ

$ nvidia-docker run --rm nvidia/cuda nvidia-smi
  1. nvidia-dockerがコマンドをうけとる
  2. nvidia-dockerがnvidia-docker-pluginへホスト側のGPUに関連する情報を問い合わせる
  3. nvidia-dockerは受け取った情報を元に、docker-engineへ渡すべきオプションを生成する
  4. nvidia-dockerはdocker-engineのAPIをオプション付きで呼び出してコンテナを立ち上げる

nvidia-docker-plugin

REST API
以下のエンドポイントがある。

GET /v1.0/gpu/info, /v1.0/gpu/info/json
GET /v1.0/gpu/status, /v1.0/gpu/status/json
GET /v1.0/docker/cli, /v1.0/docker/cli/json
GET /v1.0/mesos/cli

cliのAPIを叩いた時には、dockerにそのまま渡せるオプションを返してるらしい。

$ curl -s http://localhost:3476/docker/cli
--device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia3 --device=/dev/nvidia2 --device=/dev/nvidia1 --device=/dev/nvidia0 --volume-driver=nvidia-docker --volume=nvidia_driver_361.48:/usr/local/nvidia:ro

nvidia-dockerはdockerエンジンに以下のオプションを渡している。
volume/volume-driver
ホスト側のnvidia driverをコンテナ側でもマウントさせている
device
ホスト側の/dev/nvidia*に存在するデバイスファイルをコンテナ側に追加している

Dockerイメージの検証

nvidia-dockerはdockerエンジンのAPIを叩く前に、対象コンテナにGPUオプションを渡す必要があるか、コンテナを当該ホストで起動できるかを検証している。

GPUを使うコンテナかの検証

そもそも、nvidia-dockerコマンド経由で実行されようとしているdockerコンテナがGPUを使わなければ、nvidia driverやdeviceのマウントは必要ない。nvidia-dockerはDockerイメージのcom.nvidia.volumes.neededラベルを見て、そいつがGPUを使うコンテナか調べてる。

コンテナが当該ホストで実行ができるかの検証

CUDAのそれぞれのバージョンには最低限必要とするnvidia driverのバージョンが存在する。
nvidia-dockerはdockerコンテナを起動しようとする時に、ホスト側のnvidia driverのバージョンを見て、起動したいdockerイメージに含まれるCUDAのバージョンが動くか調べて、無理な時はコマンド実行時にエラーを返すらしい。
nvidia/cudaを継承しているDockerイメージにはcom.nvidia.cuda.versionというラベルがついていて、dockerイメージにインストールされているCUDAのバージョンがわかるらしい。

まとめ

nvidia-dockerすごい

34
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
26