Dockerで簡単にGPU対応のTensorFlow入りコンテナを作る方法2016年5月8日日曜日こんにちは。小説家になろうの作品群を読んでいたら連休が終わりそうです。DockerでGPUを使えるようにする方法を読み、書いてみたエントリです。Docker、なかなか良いものなのでもっと多くの方に知ってもらいたいなと思い。TensorFlowでGPUを有効活用する手順を紹介します。Caffe解説はすでにUbuntu14.04.3でnvidia-docker使ってCaffeをインストールしてみたがあります。Caffeな方はそちらを参照ください*1。今回はお題がTensorFlowという点と、NVIDIA公式配布のcuDNN入りイメージを利用する点が異なります。Dockerがイマイチこなれていなかった頃です。当時と今では公式イメージのバリエーションやコマンド利用時の注意点などに若干差異がありますが原則は変わりません。Dockerは、NVIDIAが開発しているDockerプラグインです。Toolkitを柔軟に組み合わせられます。Docker用に事前ビルドされたcuDNN入りDockerイメージを利用すると、NVIDIAへの開発者登録無しに(!)cuDNNライブラリを利用できます。Toolkitのバージョンを揃える必要がなくなる何よりもこれです。Toolkitバージョン(たとえば7.0と7.5)を利用したい場合に悩む必要がなくなります。6.5系で開発して7.5系へ上げたくない、というコンテナが「古いバージョンにひきこもり続け」られるようになります。GPUドライバをインストールした通常のDocker環境にプラグインひとつインストールするだけなので、手軽です。EULAにまつわる厄介事を回避できる(かもしれない)ドライバや各種ツールキットのEULAというのは、なかなか厄介なものです。最近もDockerコンテナ上でのJavaの実行はライセンス違反なのか?あたりが話題になっていました。Docker向け公式イメージはNVIDIA本家がメンテナンスしているものです。Hubへ突っ込んで良いかどうかは別問題かと思いますので、ここでは議論しません。issueを立てて開発チームへ確認すべき案件でしょう。Docker利用のデメリットまだ利用者があまり多くないので枯れていない現状(2016/05/08)、1.0.0-rc状態*3で、そろそろ基本的なところでつまづくことはなくなってきたようには思いますが、利用者が何万人もいる状況ではありません。簡単なテスト動作をおこなううえでは問題ありませんが、ちょっと実用的で凝ったことをやろうと思うと謎のエラーと戦ったりGitHubのissuesとにらめっこすることになるかもしれません。Dockerを混ぜて利用する手順の確立に工夫が必要docker-machineやcompose、swarmを利用して大規模環境を構築する際にはラベルフィルタなどをうまく使って非GPUホストへGPU利用前提のコンテナをデプロイしないなどの制約掛けが必要となるはずです(未検証)。Docker環境(通常のDockerを使ってディレクトリ共有・デバイス共有でCUDA/cuDNNを利用するパターン)でも変わりません。Dockerも1.0.0正式版をリリースするのだろうと踏んでいます。導入手順の概略NVIDIAの一定以上新しいドライバを正しくインストールできたUbuntu環境があれば、10分とかからずに動作確認できるでしょう。ここでは途中段階でトラブルシュートしやすいように動作確認ステップを多く設けていますが、一旦手順を確立した後は飛ばしても構わないと思います。Dockerをインストールし、動作確認をするcuDNN入りイメージをベースにTensorFlow込みのイメージ(カスタムイメージ)を作成するカスタムイメージから生成したコンテナでGPUを利用できることを確認するMNISTでTensorFlow+GPU(cuDNN)の動作確認さすがに他用途のDockerとは混ぜないほうが良いですね。実験用に作った環境はこんな感じでした。14.04のインストールです。今回はUNetbootinで作成したUSBメモリのライブ環境からHDDへインストールしたUbuntu環境を利用しました。標準グラフィックドライバの都合か、インストール画面の英文字列が歯抜けになって解読に苦労しましたが、普通にデスクトップ版をインストールしました。OSのインストールが完了して軽く動作確認したらXのターンは終わりです。NVIDIAのドライバはXが走っているとインストールできないので、Xを落とすかGRUBの設定でテキストモードbootさせましょう。デフォルトインストールされるNouveauドライバも邪魔なので無効化しておきます*4。/etc/default/grubは次のように編集します。nouveau.modeset=0"今年こそはUbuntuデスクトップ元年になるでしょうか。Serverをインストールし、以後の作業はSSH経由でおこないます。Nouveauドライバの無効化についてはAutodeskのヘルプページが分かりやすいので、困ったら参照してください。./NVIDIA-Linux-x86_64-361.42.runとしていくつかの質問に答えるだけですんなりドライバのインストールが完了するはずです。DockerはDocker(docker-engine)のプラグインとして構築されているので、まずDocker本体をインストールする必要があります。1.9.0以上が必要なので、今回はhttps://docs.docker.com/docker-trusted-registry/cs-engine/install/#install-on-ubuntu-14-04-ltsの手順に従ってインストールしました。infoの結果は次の通りです。Dockerをインストールする公式の手順通り次のコマンドにてインストールします。/tmp/nvidia-docker*.debDocker(docker-engine)を正しくインストールできていない場合にはエラーが発生するかもしれません。正常にインストールできれば、次のようなターミナル出力で終了するはずです。protected]:~$このあたりで一旦ホストOSを再起動しておきます。nvidia-smiとしてみます。|+-----------------------------------------------------------------------------+というようにGPUが認識されていれば、ひとまずOKそうです。アーキテクチャ世代が古かったり、ドライバ競合などによって認識できていなければ、金の弾丸が必要な雰囲気です*5。DockerがサポートするGPUデバイスを検出するサンプルがあります。PASSのような結果が出力されるはずです。PASSと出ているとなんだか安心しますね。実は、前述のdeviceQueryで作成したイメージにはCUDAのサンプルが一式含まれます。nbodyなどのサブディレクトリでmakeをおこなえばそれぞれ実行できるので、何か詰まった時には試してみると良いかもしれません。Toolkitバージョンごとの最低ドライババージョンとGPUアーキテクチャが記載されているので、参考にしてください。cuDNN入りイメージをベースにTensorFlow込みのイメージ(カスタムイメージ)を作成するお待ちかねの本編というところですが、とても簡単です。.とコマンドを実行するだけです。ビルド作業の途中でライブラリのビルドが走るため少々時間がかかりますが、成功すれば以下のようにイメージが生えたことを確認できるはずです。GBあとは、TensorFlow公式の手順に従って簡単な動作確認をおこないましょう。b))42>>>動作していますね。カスタムイメージから生成したコンテナでGPUを利用できることを確認するMNISTでTensorFlow+GPU(cuDNN)の動作確認ここでは、定番のMNISTを利用して正しくGPUを利用できていることを確認します。ホスト側で次のコマンドを実行します。tensorflow.models.image.mnist.convolutionalすると次のようにログが延々と出力されます。実行中に他のターミナルからnvidia-smiを実行してGPUの利用状況を確認してみます。||=============================================================================|+-----------------------------------------------------------------------------+GPU温度が上がっていますね。57度といえばもう少しで大半のタンパク質が変質する温度ですから、長時間稼働すれば半熟玉子ぐらいは作れそうです。|+-----------------------------------------------------------------------------+となり、きっちり消費電力も下がっています。Hub上のnvidia/cudaからイメージを拾ってくるという素直な作りです。タグ一覧をざっと見てみると、結構柔軟にさまざまな版を用意してくれていることがわかります(どれだけ動作確認されているかは別問題です)。Ubuntu嫌いの方はCentOSベースのものを利用できます。latestタグが打たれているデフォルトイメージはUbuntuベースで、pullした結果のサイズは次の通り1.2GB程度です。GB扱いやすいですね。Hub上に標準的な置き方をされているため、派生イメージを作りやすい(実際、今回の手順の途中でTensorFlow入りのものを作ったように)のでとても便利です。data/t10k-labels-idx1-ubyte.gzInitialized!のように元気よくInitialized!と叫んであっさり終わってしまう場合、以下のログエントリが出力されていないか確認してみてください。DSOこの場合、cuDNNを含まないDockerイメージを基盤として派生したイメージからコンテナを生成している可能性があります。nvidia/cuda:devel)になっている場合、そのイメージにはcuDNNが含まれません。残念ながら、Dockerfileを修正してTensorFlowを含むDockerイメージをビルドし直する必要があります。nvidia/cuda:cudnn-ubuntu14.04など)に変更して再度buildを実施してください。公式Dockerイメージに含まれるcuDNNのバージョン現状、公式のcudnnイメージに含まれるcuDNNのバージョンは4系(4.0.7)を正式として3系も別タグで提供されています。5のRC版がリリースされていますが、このイメージは提供されていません。5のRCが取れて正式リリースされたらイメージも更新すると表明しています。Dockerでは、HTTP経由でdiag情報へアクセスできます。MiBと、プロセス情報も出してくれます。至れり尽くせり感がありますね。これだけあれば情報を定点観測+加工して動作状況として集計、マシン調達や稼働の計画を作るのも楽になるのではないでしょうか。?おそらく、単純な実験を超えた実用の際にはdocker-machine+docker-compose(そしてswarm)を利用するでしょう。その場合はhttps://github.com/NVIDIA/nvidia-docker/issues/8を参照することになると思いますが、手元では今回試していません。Dockerを使ってcuDNN+TensorFlow環境を作る手順は割とシンプルです。先人がハマりにハマって踏み固められた道という感じで、今回の手順中で特段ハマる箇所はありませんでした。GPUドライバの通信仕様がLinux版とWindows版で同じということはさすがにない(=うまくいかない)と思うので試していません。私の現時点でのPetaLinux認識は次のとおりです。Xilinxが提供しているカスタムLinux構成管理ツール兼カーネル・rootfsビルダー。Dockerで簡単にGPU対応のTensorFlow入りコンテナを作る方法こんにちは。作品群を読んでいたら連休が終わりそうです。本ページで記載している内容は100V、12Aという大電流を扱うものです。パーツの組み方や運用の仕方によっては火災や感電へ発展する危険があります。通りハングアップしました。2.0(AOA2.0)についてかなり久々の翻訳です。昨年末に同人ハードウェア製作をしていたのですが、自前設計の基板に正しく信号が流れているのか確認するのに苦労することが何度かありました。MacBookを4/10に注文、4/14出荷、届いたのは4/17だったので正確にはもうすぐ2ヶ月ですが。資料を補足するシリーズです。途中でやったことや、参考情報を書いていきます。ライセンスの下に提供されています。