
データサイエンスのディープラーニング(深層学習)する上でAnacondaとTensorflowはもはや必須の知識となりました。今回はデータサイエンスの初学者向けにDockerを使ってAnaconda環境構築とTensorflowのインストール方法を紹介します。
はじめに
以前の記事で、Mac上でpyenvを使ってAnaconda環境構築を行う方法を紹介しました。この方法は環境をスクラッチで構築するという観点では適切ですが、どうしても環境差分の影響を受けやすく、Anacondaのバージョンによってはうまく動作しない場合がありました。そこで、今回はそんな環境差分の影響を全く受けない方法として、Dockerを使ってコンテナとしてAnaconda環境を構築し、そこにTensorflowをインストールする方法を紹介します。
データサイエンスを始めたいのに環境が作れずに挫折した人は、今回の方法で問題なく環境構築を完了できると思います。
Dockerとは?
エンジニアであればDockerを知らない人はいないと思いますが、データサイエンスの初学者はエンジニアではない可能性もあるので簡単に説明しておきます。
Dockerとは、コンテナという単位でアプリケーションの実行環境を分離する技術で、単一のOS上に異なるOSやその上にアプリケーションがインストールされた環境を複数のコンテナとして実行させることができます。これは、従来の仮想化技術の仮想マシンと類似していますが、仮想マシンがOSをエミュレートして実行しているのに対し、Dockerのコンテナは名前空間などを利用することでホストOSからしたら単なるプロセスにしか見えない仕組みになっています。そのため、Dockerの方が仮想化技術よりもオーバーヘッドが少なく、複数の実行環境がコンテナとして軽快に動作します。その上、コンテナは起動や削除が簡単なため、今回のように開発環境構築や実験的にアプリケーションを試す場合などには最適と言えます。
さらに、DockerのコンテナはDockerイメージという形で雛形がDockerHub上に公開されており、複数のベンダーやコミュニティーが公式のDockerイメージを配布しています。今回は、Anacondaの公式のDockerイメージを利用することで、「確実に動く」環境を簡単に手に入れることにしましょう。
Dockerをインストールする
今回はMac上にHomebrewを使ってDockerをインストールします。
$ brew cask install docker
...
🍺 docker was successfully installed!
$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
Dockerのインストール方法はOSによって異なるため、WindowsやLinuxの人は公式のインストール手順を見てやってみて下さい。
Anacondaの環境構築
Anacondaはもちろん公式のイメージを使います。「docker pull」でイメージを取得して、起動してみましょう。
$ docker pull continuumio/anaconda3
$ docker run --rm continuumio/anaconda3 python --version
Python 3.6.4 :: Anaconda, Inc.
$ docker run --rm continuumio/anaconda3 jupyter --version
4.4.0
$ docker run --rm continuumio/anaconda3 jupyter notebook --version
5.4.0
「docker run –rm」でコンテナを起動した場合、コンテナは起動し、コマンドが実行され、その後コンテナは綺麗に削除されます。
これでDockerでAnaconda環境がいつでもコンテナとして起動できることが確認できました。Dockerさえ使えれば複雑な環境構築は一切不要です。
Jupyter Notebookを起動する
それでは、Anacondaの公式イメージを使って、今度はJupyter Notebookを起動してみましょう。今回用に「project」フォルダを作り、「data/notebooks」フォルダに作成したノートブックを保存するように指定して、コンテナを起動しましょう。
$ mkdir project
$ cd project
$ mkdir -p data/notebooks
$ docker run -it -p 8888:8888 -v $(pwd)/data:/data --rm continuumio/anaconda3 bash -c 'jupyter notebook --notebook-dir=/data/notebooks --ip=0.0.0.0 --port=8888 --no-browser --allow-root'
[I 08:08:18.939 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 08:08:19.439 NotebookApp] JupyterLab beta preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
[I 08:08:19.439 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 08:08:19.448 NotebookApp] Serving notebooks from local directory: /data/notebooks
[I 08:08:19.448 NotebookApp] 0 active kernels
[I 08:08:19.448 NotebookApp] The Jupyter Notebook is running at:
[I 08:08:19.449 NotebookApp] http://0.0.0.0:8888/?token=eb25640714a747414d4f4ecb835ed87aaf059a9cb39e691d
[I 08:08:19.450 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:08:19.451 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://0.0.0.0:8888/?token=eb25640714a747414d4f4ecb835ed87aaf059a9cb39e691d
ブラウザで「http://0.0.0.0:8888/?token=eb25640714a747414d4f4ecb835ed87aaf059a9cb39e691d」を開いてみましょう。
Jupyter Notebookが起動していることが確認できました。
続いて、簡単なノートブックを作成してみましょう。
問題なくノートブックは作成されました。
この状態で、Control+CでJupyter Notebookを終了してみましょう。
Shutdown this notebook server (y/[n])? y
[C 08:14:41.617 NotebookApp] Shutdown confirmed
[I 08:14:41.618 NotebookApp] Shutting down 1 kernel
[I 08:14:41.923 NotebookApp] Kernel shutdown: 6040ea6e-eb47-4115-bdc9-5e124b075e3c
$ tree data
data
└── notebooks
└── hello-jupyter.ipynb
1 directory, 1 file
Jupyter Notebookを終了しても、作成した「hello-jupyter.ipynb」が想定したフォルダ内に保存されていることが確認できました。
これでDockerでJupyter Notebookを扱うことができました。
Tensorflowをインストールする
最後にAnacondaにTensorflowをインストールしましょう。今回はDockerfileでインストールしたイメージをビルドすることにします。
$ pwd
/Users/you/project
$ touch Dockerfile
Dockerfileの中身は以下になります。
FROM continuumio/anaconda3:5.1.0
RUN conda update -n base conda \
&& conda create -n tensorflow-env python=3.6 \
&& . activate tensorflow-env \
&& conda install tensorflow
VOLUME /data
EXPOSE 8888
CMD jupyter notebook --notebook-dir=/data/notebooks --ip=0.0.0.0 --port=8888 --no-browser --allow-root
基本的には先程Jupyter Notebookを起動した時のコマンドをDockerfileにしただけですが、追加でcondaを使って仮想環境の構築とTensorflowのインストールを行っています。
それではイメージをビルドして、コンテナを起動しましょう。
$ docker build -t tensorflow-project .
...
Successfully built 85dd29cb0c75
Successfully tagged tensorflow-project:latest
$ docker run -it -p 8888:8888 -v $(pwd)/data:/data --rm tensorflow-project
[I 08:39:21.954 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 08:39:22.434 NotebookApp] JupyterLab beta preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
[I 08:39:22.435 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 08:39:22.444 NotebookApp] Serving notebooks from local directory: /data/notebooks
[I 08:39:22.445 NotebookApp] 0 active kernels
[I 08:39:22.445 NotebookApp] The Jupyter Notebook is running at:
[I 08:39:22.446 NotebookApp] http://0.0.0.0:8888/?token=4d1681702c20e5bb6636a1061a73b044a51b5cf10b4f0d06
[I 08:39:22.446 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:39:22.448 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://0.0.0.0:8888/?token=4d1681702c20e5bb6636a1061a73b044a51b5cf10b4f0d06
Jupyter Notebookが起動したので、ブラウザで「http://0.0.0.0:8888/?token=4d1681702c20e5bb6636a1061a73b044a51b5cf10b4f0d06」を開いてみましょう。
問題なくJupyter Notebookが起動し、先程作成した「hello-jupyter.ipynb」も表示されました。
次に、Tensorflowを使ったテストコードを書いてみましょう。
正しく実行できているので、Tensorflowが正しくインストールされていることを確認できました。
このファイルも保存し、Control+CでJupyter Notebookを終了しましょう。
Shutdown this notebook server (y/[n])? y
[C 08:46:11.193 NotebookApp] Shutdown confirmed
[I 08:46:11.194 NotebookApp] Shutting down 1 kernel
[I 08:46:11.703 NotebookApp] Kernel shutdown: a32f36e5-2803-4cb8-b9f1-13ff6f617f17
$ tree data
data
└── notebooks
├── hello-jupyter.ipynb
└── hello-tensorflow.ipynb
1 directory, 2 files
今作った「hello-tensorflow.ipynb」も保存されていることが確認できました。
以上で、DockerでAnaconda環境構築と、Tensorflowのインストールができました。Anacondaのバージョンが上がったとしても、DockerfileのAnacondaの公式イメージのバージョンを上げるだけで対応でき、とても便利です。
おまけ(追記)
MinicondaでTensorflowやKerasが入った軽量なDockerイメージを作る方法
AnacondaをDockerコンテナとして起動させるのはローカルにAnacondaをインストールするよりはるかに環境構築が容易です。ただし、一点問題があります。それはAnacondaをベースにしたDockerイメージは大変大きくなり、ディスク容量を圧迫する点です。この問題を軽減するメジャーな方法として、Minicondaをベースにする方法があります。
Minicondaの公式イメージをベースとした場合のDockerfileの例は以下です。(condaの仮想環境を使わないバージョンです。Pythonの開発では一般的にプロジェクト単位に仮想環境を構築しますが、Dockerの場合はプロジェクト単位にDockerイメージを作るので仮想環境は無くても問題ありません。)
FROM continuumio/miniconda3
RUN conda update conda \
&& conda update --all \
&& conda install jupyter numpy numexpr pandas matplotlib scipy statsmodels scikit-learn tensorflow keras \ # 好きなパッケージを入れる
&& conda clean --all
VOLUME /data
EXPOSE 8888
CMD jupyter notebook --notebook-dir=/data/notebooks --ip=0.0.0.0 --port=8888 --no-browser --allow-root
MinicondaはAnacondaと違い、最小限のパッケージしか入っていません。なので、自分の用途に応じてcondaで必要なパッケージをインストールする必要があります。
DockerHubに自作のDockerイメージをPushする方法
ベースとなるイメージをAnacondaからMinicondaに変えると、それだけでDockerイメージのサイズは半分以下になります。ただ、ローカルでDockerをビルドすると、どうしてもビルドする時間がかかります。それを回避するためのメジャーな解決策は、DockerHubに自作のイメージをPushして使い回す方法です。
DockerHubにアカウントがある前提として、例えば、アカウント名「your-account」、自作のイメージ名「your-tensorflow-image」とした場合は以下のようにコマンドラインから実行するだけでDockerHubにPushできます。
$ docker image build -t your-account/your-tensorflow-image -f Dockerfile .
$ docker login
$ docker image push your-account/your-tensorflow-image
利用する場合は、以下のようにすればOKです。
$ docker container run -it -p 8888:8888 -v $(pwd)/data:/data your-account/your-tensorflow-image
こうしておけばすぐにほしい環境が手に入ります。
さらに、Dockerイメージをローカルで作るのさえめんどうな場合は、GitHubにDockerfileをあげておき、DockerHubのAutomated Build(やり方はこちら)や、Travis CIやCircle CIなどのCIサービスを使って自動的にビルドしてDockerHubにイメージがPushされるようにしておくと便利です。
よくあるDockerイメージのビルドが失敗する場合の解決策
Tensorflowなどのイメージはサイズが大きいため、Dockerイメージのビルドをすると以下のようなエラーが出て失敗する場合があります。
- OSError(28, ‘No space left on device’)
- no space left on device
これらの原因はディスク容量が不足していることです。Dockerイメージを大量に作って放置している場合に陥る事象なので、以下のように不要なコンテナ、イメージ、ボリュームを削除するコマンドを実行するとハードディスクに空きができてエラーが無くなります。(削除する前にどの程度Docker関連のファイルが容量を使っているか知りたければ「docker system df」を実行してください)
$ docker system prune
それでもダメな場合は、「docker images」で大きいサイズのイメージを探し、不要であるか確認してから「docker rmi」で削除していくのが無難ですが、使っていないコンテナ、イメージ、ボリュームを全て削除してよければ以下のコマンドを実行してください。
$ docker system prune -a
これでもダメな場合は、どうにかしてハードディスクの容量を増やす他ありません。場合によっては、よりハイスペックなPCを購入した方が良いかもしれません。あるいは、ローカルで実行することを諦めてAzureやAWSなどのクラウド環境を利用すればハイスペックな環境を手に入れることは容易です。
最後に
いかがでしたか?これでディープラーニングを始める環境は整ったことでしょう。スクラッチで環境を構築するとどうしても環境差分で苦しむ事になるので、Dockerを使ったお手軽な方法を採用するのは賢明だと思います。これで、どんどんメインのディープラーニングに専念できますね。それでは。
環境
- PC : macOS High Serra 10.13.4
- Docker : Docker version 18.03.1-ce, build 9ee9f40
- AnacondaのDockerイメージ : anaconda3:5.1.0