Ubuntu Weekly Recipe

第461回 DockerでCUDA 8.0を使用する

この記事を読むのに必要な時間:およそ 8.5 分

第456回ではUbuntu 16.04 LTS上にCUDA 8.0をインストールする方法を紹介しました。これをもっと簡単に環境構築できるよう,今回は第458回で紹介したDockerを使ってみましょう。

NVIDIAのDocker

第458回で紹介しているようにDockerはカーネルのコンテナ技術などを利用して,アプリケーションをサンドボックス環境の中で動かす仕組みです。Dockerではカーネルの名前空間機能を用いてプロセスなどのリソースをホストの他のリソースから隔離することで,独立したサンドボックス環境を構築しています。KVMやVirtualBoxといった仮想マシンともっとも異なるのは,ホストとコンテナのカーネルは共通であることでしょう。ホストもコンテナも同じカーネルインスタンスの上で動いています。つまりコンテナの操作によってカーネルがハングアップしてしまったとしたら,当然のことながらホストもハングアップしてしまいます。

カーネルが共通であるということは,カーネルモジュールも同じであるということです。そのためNVIDIAのデバイスをDocker上で使いたければ,ホスト上にNVIDIAのドライバーモジュールをインストールしなくてはなりません※1)⁠非特権コンテナであれば,コンテナ内部でのデバイスファイルの読み書きは明示的にホスト側で許可しない限りは行えません。

※1
CUDAのインストーラーはNVIDIAのドライバーもインストールしてくれます。ただし今回はコンテナの中でCUDAをインストールするため,ホストでも別途NVIDIAドライバーをインストールしておく必要があります。これが第456回のCUDAの紹介とは独立した記事として,第454回においてドライバーのインストール方法を紹介した理由です。

つまりDockerコンテナの中でCUDAのようなデバイスファイルの操作を行いたい場合,次の作業が必要になります

  • Control Groupを用いてコンテナからGPUのデバイスファイルへの読み書きの権限を与える--deviceオプション)
  • Linuxのcapabilities(7)を用いて非特権ユーザーにも一部の特権操作を行えるようにする--cap-addオプション)

CUDAを動かしたいだけであれば,必要なのは/dev/nvidia0などの読み書きのみとなります。よってcapabilitiesの設定は不要です。しかしながら指定しなければならないデバイスファイルが複数存在し,しかもnvidia-uvmのようにCUDAの利用によって動的にロードされうるモジュールも存在するため,生のDockerをそのまま使うのは若干手間がかかります。そこで出てくるのが「NVIDIA Docker」です。

NVIDIA DockerはCUDA入りのDockerイメージを構築・利用するためのツールです。もともとDocker Hubには,CUDAとcuDNN入りのイメージが公開されています。これ自体は普通のDockerツールでも利用はできます。NVIDIA Dockerは上記で説明したようなコンテナの中でCUDAを使うための諸々の作業をラッピングして,普通のDockerコンテナと同じように使えるようにしたツールです※2)⁠

※2
Dockerコマンドを完全に置き換えるコマンドラインツールであるnvidia-dockerコマンドと,Dockerのプラグインとして作られたnvidia-docker-pluginの2種類が存在します。後者はデーモンとして常駐し,GPUとnvidia-dockerコマンドとの連携を行うためのAPIを提供します。前者はdockerコマンドの代わりに使います。主にコンテナの中にホストのデバイスファイルを追加するなどの処理を行っています。NVIDIA Dockerのドキュメントによると,将来的に--deviceオプションを肩代わりする仕組みがDockerプラグインシステムに実装されたら、nvidia-dockerコマンドは不要になるようです。

CUDAをDocker上で使う最大のメリットは,複数のバージョンを同じホストで共存できることでしょう。また一度DockerとNVIDIA Dockerをインストールさえすれば,CUDAのインストールやアップグレードが簡単になります。必要なライブラリはすべてコンテナの中にインストールしてしまうので,ホスト側はNVIDIA製のドライバーを除いて,シンプルに保てるのも人によってはうれしいポイントかもしれません。またcuDNN入りのコンテナも用意されています。本来CUDAを利用したDeep Neural Network LibraryであるcuDNNは,ダウンロードするためにNVIDIAのサイトで開発者登録が必要です。今回紹介するNVIDIAのDockerイメージを使えば,最初からcuDNNがインストールされたイメージをデプロイすることが可能なのです。

このようにメリットの多いNVIDIA Dockerですが,2017年の1月19日に待望の1.0.0がリリースされました。1.0.0でDocker 1.13を,最近リリースされた1.0.1ではDocker 17.03にも対応しています。なお,NVIDIA Dockerをインストールするためには公式のDockerパッケージ(docker-engineパッケージ)が必要です。

NVIDIA Dockerのインストール

あらかじめ第458回に従って,Docker公式のdocker-engineパッケージをインストールしておいてください。

NVIDIA Dockerもこれまでと同様に,インストールにはいくつかの方法が存在します。

  • リリース版のDebファイルをダウンロードしてインストールする
  • リリース版のソースコードをダウンロードしてビルド&インストールする
  • Gitリポジトリの最新版ををcloneしてビルド&インストールする

Ubuntuの場合は,単純にDebファイルをダウンロードしてインストールする方法が簡単です。

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
$ sudo apt install /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

$ ps -fe | grep nvidia
nvidia-+  1259     1  3 20:06 ?        00:00:00 /usr/bin/nvidia-docker-plugin -s /var/lib/nvidia-docker
root      1293     2  0 20:06 ?        00:00:00 [irq/132-nvidia]
root      1294     2  0 20:06 ?        00:00:00 [nvidia]
shibata   1653 22617  0 20:06 pts/2    00:00:00 grep --color=auto nvidia

$ systemctl is-enabled nvidia-docker
enabled

これでインストールは完了です。ちなみに前述のとおり,NVIDIA DockerはDockerのラッパースクリプトです。Docker HubなどへのアクセスはDocker本体のほうが行います。よってプロキシなどのネットワーク関連の設定もDocker側のみ行っておけば大丈夫でしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入