深層学習のためのDocker(1)

機械学習のために利用可能な実験サーバーが複数ある状況を考える. この時,コードの実行に必要なライブラリをそれぞれのサーバーにおのおのインストールすることには,いくつかの問題がある:

  • 手間: 全てのサーバーにいちいちライブラリをインストール/更新していくのは面倒
  • 副作用: サーバーを他者と共有している場合,ライブラリのバージョン変更などの影響がお互いに気になる

Docker利用の意義

以上の議論から,いくつかのライブラリをまとめてdocker imageとして持っておくと便利だと言える.

この時,それぞれの実験サーバーが異なるcompute capabilityのGPUを搭載していることが想定されるが,CUDAより上のレイヤをできるだけ新しいバージョンにしておけば,いずれのノードにおいても同じDockerイメージを利用できる.これについて次の章で述べる.

GPU/ドライバ/CUDA/cuDNN/深層学習ライブラリの互換性

NVIDIAGPUで深層学習をやるには,5つのレイヤ: GPU/ドライバ/CUDA/cuDNN/深層学習ライブラリ を理解する必要があり,これを復習する.

  • ドライバはGPUに対して後方互換性がある.つまりGPUを固定してドライバを更新し続けることができる.[1]
  • ドライバはCUDAに対しても後方互換性がある.つまりCUDAを固定してドライバを更新し続けることができる.
  • 特定のCUDAを使うには,対応するドライバの最低バージョンがある.つまり新しいCUDAには一定以上新しいドライバしか使えない.[2]
  • Compute capabilityの概念によれば,新しいGPUに対応しているCUDAは新しいバージョンだけ.つまりGPUをアップグレードするとCUDAも必然的にアップグレードしないといけない.[3]
    • 逆に,新しいCUDAは割と古いGPUにも対応している
  • 大抵,新しいCUDAには新しい深層学習ライブラリしか対応していない.CUDA/cuDNN/深層学習ライブラリはセットでバージョンを揃える.
  • つまり:
    • ドライバは常に最新
    • 新しいGPUには新しいCUDA/cuDNN/深層学習ライブラリしか使えない
    • 新しいリソース: コード/深層学習ライブラリ/cuDNN/CUDA,はドライバさえ更新していれば古いGPUでも基本的には使える(はず)
    • 逆に,古いリソースは新しいGPUでは基本的に動かない
  • コード/深層学習ライブラリ/cuDNN/CUDAはセットにして,最新を追従するよう努める

NVIDIA Container Toolkit

DockerコンテナとNVIDIA driverの接続が面倒らしい. そこを自動でやってくれるのがNVIDIA Container Toolkit (NVIDIA Docker). ドライバはホストOSにインストールしておく必要がある.[4]
前述の通りこれは最新を入れれば良い. ベースとなるimageはNVIDIAが色々公開しているので利用すると楽できる.

参考文献

[1] NVIDIAドライバダウンロード. https://www.nvidia.co.jp/Download/index.aspx?lang=jp
[2] NVIDIA CUDA Toolkit Release Notes. https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
[3] GPUs supported. https://en.wikipedia.org/wiki/CUDA#GPUs_supported
[4] NVIDIA Container Toolkit. https://github.com/NVIDIA/nvidia-docker