皆さんこんにちは
お元気ですか。Kaggle Meetup面白かったです!またあいましょう。
今日はDockerを使った分析環境構築の話をしようと思います。
Dockerを使って何を作ろうかと思ったら、分析環境さっさと作りたい・・・
cudnn等の更新が面倒であることが思い浮かびました。
なんとなく、Dockerを使えば解消できるのではないかといったことを思いつき遊んでみました。
Dockerとは
Dockerはコードやシステムライブラリ、システムで利用するのを実行するために
必要な全てが含まれているものをラップするソフトウェアらしい。
OS上で仮想環境を立ち上げ、ソフトウェアなどの実行ができます。
Dockerのメリット
公式サイトによれば、次のとおりです。
何が嬉しいの?
一言で言うと環境の管理です。
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リポジトリは以下にあります。
まずは、インストールですが、以下のとおりです。
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を扱える気がします。
気が向いたらもう応用できそうな記事を書きます。