こんにちは。
今回は、主にDeep LearningをGPUで実行できる環境をDockerで作ってみました。主に入れたものは以下のものです。
keras=2.0.8 tensorflow_gpu=1.3.0 theano=0.10.0beta3 # 特定のチャンネル内に存在するパッケージ。理由は下記参照。 cntk=2.1 lasagne=0.2.dev1 python 3.5 miniconda 3-4.2.12
上のもの以外にもいれていますが、だいたいやりたいことはできるような感じで環境は作りました。全部のDeepLearningフレームワークで、GPUが使えるようになっています。
今後もバージョンを変えたりとかすれば、簡単にGPU環境を用意できそうなので、自分用のためにも以下、メモしておこうと思います。
初期セットアップ・環境
○nvidia-dockerのインストール
今回のDockerfileはnvidia-dockerがインストールされていることが必須です。
インストールについては以下のページで書いたとおりにインストールしました。
○環境
■Ubuntu環境
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
■GPU周り
$ lspci | grep -i nvidia 05:00.0 VGA compatible controller: NVIDIA Corporation GK104GL [Quadro K4200] (rev a1) 05:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1) 06:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1) 06:00.1 Audio device: NVIDIA Corporation Device 0fb0 (rev a1) 0a:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1) 0a:00.1 Audio device: NVIDIA Corporation Device 0fb0 (rev a1)
■dockerのバージョンなど
$ sudo docker version Client: Version: 17.06.2-ce API version: 1.30 Go version: go1.8.3 Git commit: cec0b72 Built: Tue Sep 5 20:00:17 2017 OS/Arch: linux/amd64 Server: Version: 17.06.2-ce API version: 1.30 (minimum version 1.12) Go version: go1.8.3 Git commit: cec0b72 Built: Tue Sep 5 19:59:11 2017 OS/Arch: linux/amd64 Experimental: false
kerasのGPU実行環境の作成
ここまでで、nvidia-dockerの準備はできたので、あとはベースのイメージをnvidia-dockerにしてkerasの実行環境を作っていきます。
○参考にしたサイト
ここからの内容は、以下のサイトにあるDockerfileを参考、自分なりにアレンジしました。巨人の皆さん、ありがとうございます。
○使い方
使い方は以下の通り。
■ファイルの配置
レポジトリにあるすべてのファイルを、プロジェクト(実行したいDeep Learningと同じ環境)のルートに置きます。置かなくてもボリュームをいじればいいんですが、面倒だと思うので、コピーしてプロジェクトのルートに置くのが良いと思います。
ファイルの構成は結局以下のような感じになると思います。
- Dockerfile - Makefile - requirements.txt - theanorc ... - project_src
■Dockerfile
の編集
Dockerfile
の編集を行う必要があります。基本的に編集するのは4行だけです。
### # 略 ### # 以下を自由に設定する MAINTAINER MAINTAINER_NAME <EMAIL> ### # 略 ### # 以下のユーザー名、userid、groupidにホストと同じものをいれる。 ENV NB_USER user_name ENV NB_UID 12345 ENV NB_GID 12345 ### # 略 ###
ホスト側のユーザー名、userid, groupidについては、ターミナルからid
と打てば確認することができます。これらをホストと同じようにDocker上で設定しておかないと、マウントしたボリュームにDockerからファイルを作成したり編集したりすることができなくなるので、注意が必要です。これについては下でも書いてあるので、参照してください。
■Makefile
の編集
Makefile
内の変数を適時編集してください。cudaなどのバージョンなどは自由に設定できます。
Image名とかは気になれば編集するほうがいいかと(適当なので)。
■requirements.txt
の編集
必要な追加のpythonパッケージがあれば追加してください。追加すると、自動でインストールしてくれます。
■makeコマンドでbuild/run
実行するコマンドが長いので、Makefile
を用意しています。使い方は以下の通り。
# Dockerfileのビルドを実行。まずはこれでビルドしてください。めっちゃ時間かかります笑。 make build # Dockerfileのイメージを実行して、bashを起動します。 make bash # Dockerfileのイメージを実行して、ipythonを起動します。 make ipython # Dockerfileのイメージを実行して、jupyter notebookを起動します。 make notebook
Makefile
の中に、指定できる変数などを用意しているので、適時変更して使用することができます。詳しくはコードを見てください。
編集時の注意事項とかハマったことのメモ
○Theanoのバージョン
Theanoは開発が終了してしまっていますが、開発段階で最新であったバージョンの0.9では、gpu使用時の注意があります。Theanoのバージョン0.9では、pygpuに関するエラーに対処していない(というよりも開発が終了していて対応する予定はないというツラミな感じ、、、)とのことで、今回はバージョンはむやみに最新を使うのは避けました。
以下が参考サイトです。
■[2017/10/12追記]
上記のバージョンで以下のissueで見られるようなエラーが出たので、バージョン0.9ではなく、condaで特定のチャンネルで管理されているバージョンをいれることにしました。
○Dockerのパーミッション
このDockerfileを作成した時に一番ハマったのが、マウントしたボリュームのパーミッションの設定についてです。
こちらのサイトによれば、uidとgidがDockerとホストの両方で同じであれば、両方のユーザーが同じユーザーとしてみなされ、パーミッションの問題が解決されます。
今回はこれで対応できました。
■参考サイト
そんな感じですね。
Dockerfileとか書くのあんまりうまくないので、何か改善点とかあれば教えて欲しいです。
それでは。