St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

keras(tensorflow/theano/cntk)でGPUをnvidia-dockerから使ってみた (+αでLasagneも入れた&Dockerfileも作った)

こんにちは。

今回は、主に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がインストールされていることが必須です。

インストールについては以下のページで書いたとおりにインストールしました。

st-hakky.hatenablog.com

○環境

■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を参考、自分なりにアレンジしました。巨人の皆さん、ありがとうございます。

○作成したもの

以下のGithubにおいてあります。

github.com

○使い方

使い方は以下の通り。

■ファイルの配置

レポジトリにあるすべてのファイルを、プロジェクト(実行したい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に関するエラーに対処していない(というよりも開発が終了していて対応する予定はないというツラミな感じ、、、)とのことで、今回はバージョンはむやみに最新を使うのは避けました。

以下が参考サイトです。

github.com

■[2017/10/12追記]

上記のバージョンで以下のissueで見られるようなエラーが出たので、バージョン0.9ではなく、condaで特定のチャンネルで管理されているバージョンをいれることにしました。

github.com

○Dockerのパーミッション

このDockerfileを作成した時に一番ハマったのが、マウントしたボリュームのパーミッションの設定についてです。

こちらのサイトによれば、uidとgidがDockerとホストの両方で同じであれば、両方のユーザーが同じユーザーとしてみなされ、パーミッションの問題が解決されます。

今回はこれで対応できました。

■参考サイト


そんな感じですね。

Dockerfileとか書くのあんまりうまくないので、何か改善点とかあれば教えて欲しいです。
それでは。