のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Dockerを使ってGPUも使える分析環境を構築してみた

Sponsored Links

皆さんこんにちは
お元気ですか。Kaggle Meetup面白かったです!またあいましょう。

今日はDockerを使った分析環境構築の話をしようと思います。
Dockerを使って何を作ろうかと思ったら、分析環境さっさと作りたい・・・
cudnn等の更新が面倒であることが思い浮かびました。

なんとなく、Dockerを使えば解消できるのではないかといったことを思いつき遊んでみました。

Dockerとは

Dockerはコードやシステムライブラリ、システムで利用するのを実行するために
必要な全てが含まれているものをラップするソフトウェアらしい。
OS上で仮想環境を立ち上げ、ソフトウェアなどの実行ができます。

www.docker.com

Dockerのメリット

公式サイトによれば、次のとおりです。

  1. 階層化されたファイルシステムから構築されるので、ディスクやイメージが効率的
  2. DockerコンテナはLinuxMacOS, Windowsで動かせる
  3. 安全らしい

何が嬉しいの?

一言で言うと環境の管理です。

Dockerを使うと定義したコマンドを変更するのみで
ソフトウェアの更新が簡単になります。
また、同じファイルを利用している限り、同じ環境が構築されるので
マシンによってversionなどの差分が生まれることもなくなります。

私個人として大きいのは環境の再現だと思っています。
誰もがDockerを使うと同じバージョン、同じ環境を手間なく使えます。
更新手順と同じにしておけば、複数人で開発しても環境が同じ等、メリットがあります。

インストール

MacOS

これを試すためにだけ、Sierraにアップグレードしました。
Docker for macをダウンロードし、インストールすれば、準備完了です。
docs.docker.com

Ubuntu

MacOSと違って手順が少々必要です。(公式より)

sudo apt-get install apt-transport-https \
                       ca-certificates
curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add -

sudo apt-get install software-properties-common
sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"
sudo apt-get update
sudo apt-get -y install docker-engine

dockerを試してみる。

まずは、dockerのイメージを取得します。
pullコマンドはイメージをダウンロードするコマンドです。

docker pull ubuntu:16.04

次にDockerを実行します。実行コマンドはrunを使えばできます。

docker run -it ubuntu:16.04
root@fe9c5c38a45a:/#

そして、共有フォルダです。
ホストとコンテナのディレクトリを共有できます。
これは、-vを利用するとマウントが可能です。<ホスト側のパス>:<コンテナ側のパス>を記述して起動することで実現できます。

docker run -v /Users/Tereka/Desktop/Mount:/tmp/ -it ubuntu:16.04

また、Imageの一覧を確認するには、次のコマンドを使うと良いです。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               104bec311bcd        2 weeks ago         129 MB
hello-world         latest              c54a2cc56cbb        6 months ago

dockerのコンテナ状態は次のコマンドで見れます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e09f51e1b51c        ubuntu:16.04        "/bin/bash"         3 hours ago         Up 7 minutes

最後にコンテナの削除です。rmiコマンドを使うと可能です。

docker rmi <contener>:<tag>

どのようなimageがあるのかを検索したい時は、docker search
これを使うとpullで取得できるコンテナを探せます。

$ docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   2963      [OK]
jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   54                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   20                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]

Dockerfileを書く

Dockerfileを書くことで、独自のイメージを作れます。

FROMを利用すると、他のイメージをベースにDockerイメージをベースに構築できます。
RUNを利用することで、実際にコマンドの実行ができます。

説明するよりも見る方が早いかと。

試しにChainerを実行するDockerfileを作りました。
日本語入力にも対応しているコンテナです。

FROM nvidia/cuda:7.5-cudnn5-devel

RUN apt-get update
RUN apt-get install -y wget
RUN apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc

RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8

RUN wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh
RUN bash Anaconda3-4.2.0-Linux-x86_64.sh -b
ENV PATH /root/anaconda3/bin:$PATH
RUN echo $PATH

RUN pip install chainer

以下のコマンドはDockerfileをビルドし、cudnn_dockerの名前で新しいイメージを構築しています。

docker build -t cudnn_chainer .

途中で失敗すると既に実行された結果のキャッシュを使います。
そのため、修正して再トライするのは非常に早いです。

ただし、それまでの結果を更新したい(gitのリポジトリの最新を使いたい等)
結果のキャッシュを使いたくない場合は、キャッシュを無効にしなければなりません。

その場合は、以下のコマンドを使うとDockerfileに書いてある
全てのコマンドを対象にbuildを行います。

docker build -t --no-cache=true cudnn_chainer .

後はrunを使えば実行できます。

docker run -it cudnn_chainer

DockerでGPUを使う方法

しかし、これではGPUを使うとエラーが出ます。
GPUをDockerコンテナ上で動かす為にはGPUの色々な設定をする必要があるようです。

chainerの公式githubを確認すると、nvidia-dockerと呼ばれるコマンドがあるので
それを使うと解消できました。因みにnvidia-dockerリポジトリは以下にあります。

github.com

まずは、インストールですが、以下のとおりです。

wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

# 起動確認
nvidia-docker run --rm nvidia/cuda nvidia-smi

後は起動するだけです。起動はdockerの代わりにnvidia-dockerを使います。
試しに遊んでみたら高速だった。僕のcudnnが古すぎた。。

nvidia-docker run -it cudnn_chainer

最後

これで一通りDockerを扱える気がします。
気が向いたらもう応用できそうな記事を書きます。