Casual Developers Note

エンジニアやデザイナー向けの技術情報・英語学習情報・海外留学情報・海外旅行情報を提供中。世界を旅して人生を楽しもう。

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • お問い合わせ
現在の場所:ホーム / 技術 Tips & Tutorials / データサイエンスのためのAnaconda環境構築とTensorflowのインストール方法(Docker編)

2018年5月14日 By KD コメントを書く

データサイエンスのためのAnaconda環境構築とTensorflowのインストール方法(Docker編)

データサイエンスのためのAnaconda環境構築とTensorflowのインストール方法(Docker編)

データサイエンスのディープラーニング(深層学習)する上でAnacondaとTensorflowはもはや必須の知識となりました。今回はデータサイエンスの初学者向けにDockerを使ってAnaconda環境構築とTensorflowのインストール方法を紹介します。

見出し

  • 1 はじめに
  • 2 Dockerとは?
  • 3 Dockerをインストールする
  • 4 Anacondaの環境構築
  • 5 Jupyter Notebookを起動する
  • 6 Tensorflowをインストールする
  • 7 おまけ(追記)
    • 7.1 MinicondaでTensorflowやKerasが入った軽量なDockerイメージを作る方法
    • 7.2 DockerHubに自作のDockerイメージをPushする方法
    • 7.3 よくあるDockerイメージのビルドが失敗する場合の解決策
  • 8 最後に
  • 9 環境
    • 9.1 関連記事

はじめに

以前の記事で、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 1

Jupyter Notebookが起動していることが確認できました。

続いて、簡単なノートブックを作成してみましょう。

Jupyter 2

問題なくノートブックは作成されました。

Jupyter 3

この状態で、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 tensorflow 1

問題なくJupyter Notebookが起動し、先程作成した「hello-jupyter.ipynb」も表示されました。

次に、Tensorflowを使ったテストコードを書いてみましょう。

Jupyter tensorflow 2

正しく実行できているので、Tensorflowが正しくインストールされていることを確認できました。

Jupyter tensorflow 3

このファイルも保存し、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
The following two tabs change content below.
  • この記事を書いた人
  • 最新の記事
KD
Twitter のプロフィール

KD

世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。挑戦に終わりはない。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。
KD
Twitter のプロフィール

最新記事 by KD (全て見る)

  • 2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介 - 2020年1月13日
  • 今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~ - 2019年11月4日
  • ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~ - 2019年10月30日

関連記事

  • データサイエンスのためのAnaconda環境構築とJupyter Notebook入門

    少し前からディープラーニングやAIなどのデータサイエンスが流行っています。一説によると海外の企業は優秀なデータサイエンテ…

  • 初級JavascriptフルスタックエンジニアのためのReactとExpressの同時開発チュートリアル(Dockerコンテナ化してHerokuにデプロイ編)

    最近のアプリケーションはDocker上で稼働させるのが当たり前になりつつあります。そして、HerokuのようなPaaS環…

カテゴリ : 技術 Tips & Tutorials タグ : anaconda, docker, jupyter, keras, miniconda, tensorflow

ブログ更新情報や海外の関連情報などを配信する無料メルマガ

Sponsored Links

About Author

KD

世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。挑戦に終わりはない。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。

https://casualdevelopers.com/

最近の投稿

  • 2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年1月13日
  • 今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    2019年11月4日
  • ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    2019年10月30日
  • BashからZshに移行する方法(Mac編)

    BashからZshに移行する方法(Mac編)

    2019年10月21日
  • Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    2019年9月30日

カテゴリ

  • 技術 Tips & Tutorials (100)
  • 技術塾 (6)
  • ライフハック (26)
  • 海外留学 (12)
  • 英語学習 (3)
  • コラム (6)

アーカイブ

最高の学習のために

人気記事ランキング

  • MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
    MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
  • Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
    Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
  • SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
    SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
  • [tips][perl] Perlで文字コードをいい感じに処理する方法
    [tips][perl] Perlで文字コードをいい感じに処理する方法
  • 爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
    爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
  • FacebookログインのJavascriptのSDKをサクッと試す方法
    FacebookログインのJavascriptのSDKをサクッと試す方法
  • Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
    Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
  • [tips][bat] バッチで明日の日付を計算する。
    [tips][bat] バッチで明日の日付を計算する。
  • SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)
    SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)
  • PythonでWebスクレイピング入門(Scrapy+Selenium編)
    PythonでWebスクレイピング入門(Scrapy+Selenium編)

Bitcoin寄付 / BTC Donation

Bitcoinを寄付しよう

BTC
Select Payment Method
Personal Info

Donation Total: BTC 0.0010

このブログの運営のためにBitcoinでの寄付を募集しています。お気持ち程度の寄付を頂けると管理者の励みになります。

Bitcoin寄付について知りたい方はこちらの記事へ

The following two tabs change content below.
  • この記事を書いた人
  • 最新の記事
KD
Twitter のプロフィール

KD

世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。挑戦に終わりはない。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。
KD
Twitter のプロフィール

最新記事 by KD (全て見る)

  • 2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介 - 2020年1月13日
  • 今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~ - 2019年11月4日
  • ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~ - 2019年10月30日

関連記事

  • データサイエンスのためのAnaconda環境構築とJupyter Notebook入門

    少し前からディープラーニングやAIなどのデータサイエンスが流行っています。一説によると海外の企業は優秀なデータサイエンテ…

  • 初級JavascriptフルスタックエンジニアのためのReactとExpressの同時開発チュートリアル(Dockerコンテナ化してHerokuにデプロイ編)

    最近のアプリケーションはDocker上で稼働させるのが当たり前になりつつあります。そして、HerokuのようなPaaS環…

ビットコイン取引ならここ

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • サイトマップ
  • タグ一覧
  • プライバシーポリシー
  • お問い合わせ

Copyright © 2023 KD - Casual Developers Notes