TensorFlowをMac & Dockerで使ってみたよ - Qiita

TensorFlowは、機械学習用のアルゴリズムを記述するためのインターフェースで、大規模システムからスマホまで、幅広い環境で使えるのが利点のようです。

Qiitaでもかなり話題になっており、現時点ですでに100以上の投稿があります。そのため、もう特に書くことはないのかなーと思ってましたが、Mac + Dockerの環境でインストールする例が見当たらなかったので、そちらのメモを書いておくことにしました。TensorFlowの基本的な解説を知りたい方は、こちらの記事を御覧ください。

今まで使ったことがなかったので面白そう、というのが主な理由ですが、MacでTensorFlowを使う場合は、Dockerでインストールするのが簡単だよ、とこちらの記事に書いてあったせいもあります。Windowsの場合も、Dockerを使うのが一番楽、とこちらの方で言われてます。

Docker環境の準備

まず、こちらからDocker Toolboxをダウンロードして、インストールしましょう。これにより、VirtualBox(仮想化ソフト)、Dockerクライアント、などが一括インストールされます。
インストールの途中で"Choose a tool to get started with Docker"というプロンプトが出て、Docker Quickstart TerminalかKitematicを選ぶことができますが、ここはDocker Quickstart Terminalを選びましょう。

Docker.png

すると、ターミナルが起動し、defaultと言われるDocker machine(Docker用の仮想マシン)の起動などが行われ、最終的にDockerが走り出します。

DockerQuickStart.png

ちなみに、このDocker Quickstart Terminalはアプリケーション/Dockerフォルダ内に保存されています。

Dockerがうまくインストールされたかを確認するため、docker run hello-worldと打ってみましょう。すると、

Hello from Docker.
This message shows (以下略)

を含む一連のメッセージが出るはずです。

DockerRunHelloWorld.png

これで、動作確認できました。

TensorFlowのDocker containerを起動する。

Dockerでは、OSとアプリケーションをパッケージ化した「image」をdockerfileからビルドとしてレポジトリに登録し、ユーザーの環境上のDockerクライアントでそのイメージを実行することで、アプリケーションを含むcontainerを作成します。

公式にある通り、Tensorflowのcontainerは以下のコマンドで作成します。

$ docker run -it b.gcr.io/tensorflow/tensorflow

ここで、docker runはコンテナを作成するコマンド、オプション -it はコンテナ内にシェルを起動させてコマンド操作をするのに使います。b.gcr.io/tensorflow/tensorflowはDockerイメージの場所です。MacやWindows環境では、GPUサポートは無いので悪しからず。

コマンドを実行させると、サーバーからイメージをダウンロードして、シェルのプロンプトが出てきます。

ImageLoad.png

ここで、~# python

の形で、pythonターミナルを起動できます。とりあえず、公式にあるサンプルを入力してみましょう。

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>

うまくいったら、exit()をタイプして、pythonターミナルを終了できます。Docker containerのシェル自体は、exitで終了できます。

デモモデルを実行する

こちらの公式チュートリアルにある手書き文字認識のデモモデルを実行します。結構メモリを必要とするので、あらかじめdocker machineのメモリを増やします。おそらく、この時点ではDocker Quickstartが起動したdefaultマシーンが起動しているはずです。ターミナルで docker-machine lsを実行し、現在走っているDocker machineを確認しましょう。

DockerMachineLs.png

また、defaultマシーンの現在のメモリ容量はdocker-machine inspect defaultで確認できます("Driver"の"Memory"の部分)。

DockerInspect.png

CPUは1つ、Memoryは2048(KB)のようです。

ここで、docker-machine rm defaultでdefaultマシーンを停止し、docker-machine create --driver virtualbox --virtualbox-memory 4096 --virtualbox-cpu-count 4 defaultで4CPU, 4096KBメモリのdefaultマシーンを改めて起動しましょう(参考1, 参考2)。起動したら、docker-machine inspect defaultで、設定が反映されているか確認してください。

確認できたら、
docker run -it b.gcr.io/tensorflow/tensorflow でTensorFlowコンテナを作成して、
python -m tensorflow.models.image.mnist.convolutionalでデモモデルを実行してください。ちなみに、-mオプションは、pythonモジュールを実行するときに使います。計算終了まで時間がかかるので、気長に待ってください。

Mac上のファイルにアクセスする

今度は、自分が書いたTensorFlow用pythonスクリプトを動かします。この場合、ホスト(ここではMacマシン)のディレクトリを指定し、コンテナ内のファイルシステムにマウントする、という方法をとります。まず、ローカルのPCのある場所(ここでは/Users/TensorFlow)に、以下のようなファイルを作ります。

test.py

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print sess.run(hello)

つぎに、
docker run -v /Users/TensorFlow:/tensorflow_dev -it b.gcr.io/tensorflow/tensorflow
とすると、ローカルのTensorFlowフォルダがコンテナ内のtensorflow_devフォルダにマウントされて、コンテナが作成されます。

シェルに入ったらls /tensor_flowでtest.pyがあることを確認してください。

大丈夫なら、python /tensorflow_dev/test.pyでスクリプトを走らせましょう。もし、エラーメッセージが出たら、ホスト(Mac)上でtest.pyを修正してセーブすれば、コンテナ内のtensorflow_devのtest.pyにも変更が反映されます。うまくいけば、Hello TensorFlow!のメッセージが出るはずです。

おわりに

とりあえず、機械学習どころかDockerやLinuxも怪しい私でも、最低限の作業はできそうです。次はもう少し具体的な問題について取り組んでみます。あと、Windowsでも動かしてみようかな。