自前の物理環境を用意せずにTensorFlowを動かしたかったので、AWSのmicroインスタンス上に環境を構築した際の手順まとめ。
#TensorFlowって?
2015/11/10にGoogleが公開した機械学習技術のライブラリで、サンプルを眺めただけでも以下のような学習機が使えるようだ。
- 手書き文字認識
- リカレントニューラルネットワーク(RNN)
- 畳み込みニューラルネットワーク(CNN)
###前提環境 - AWS EC2 上のVM
- Amazon Linux AMI 2015.03.1 (HVM), SSD Volume Type - ami-1c1b9f1c
- Docker 1.7.1
- Ubuntu 14.04LTS(Docker上のコンテナ)
- AWSへの登録や仮想マシン登録は終わっている前提
####AWS EC2 上のVMにDocker導入
VMにsshでログインし、以下のコマンドを入力すればDockerが導入される。
sudo yum install -y docker
sudo /etc/init.d/docker start
sudo chkconfig docker on
sudo docker -v
Docker version 1.7.1, build 786b29d/1.7.1
####DockerでUbuntu14.04のコンテナ起動
色々Dockerの起動オプションはあるけれど、とりあえず最低限の設定で。
sudo docker run -it ubuntu:14.04 bash
初回の場合、イメージのダウンロードでしばらく時間がかかる。
イメージのダウンロードが終わると、コンテナとしてUbuntuマシンが立ち上がり、以下のようなプロンプトが表示される。
root@5d1402469575:/#
####Ubuntu14.04コンテナにTensorFlowインストール
Dockerでコンテナとして起動すると、本当に最低限のパッケージしか入っていないため、通常のUbuntuマシンにインストールするときと比べて手動で導入するものが多いかも。
####Python系のインストール
apt-get update
apt-get install -y python
apt-get install -y python-pip
apt-get install -y python-dev
python -V
Python 2.7.6
pip -V
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)
####tensorflowモジュールのインストール
pipコマンドで一発。
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
#TensorFlowでMINSTを試す
チュートリアルとして、機械学習で一般的な手書き文字認識用のデータセット、MINSTを使うPythonプログラムが用意されているため、これを動かしてみる。
####gitのインストール
TensorFlowのチュートリアルは、githubで配布されているため、入手のためにまずgitを導入する。
apt-get install -y git
git version 1.9.1
####チュートリアルプロジェクトの入手
git clone --recurse-submodules https://github.com/tensorflow/tensorflow
####コードの修正
チュートリアルの説明によれば、'fully_connected_feed.py'を実行すれば良いはずだが、エラーが発生したため、原因となっていたコードを修正。
(後述の「トラブルシュート」に備忘のため発生したエラーの内容を記載しておく)
#from tensorflow.g3doc.tutorials.mnist import input_data
#from tensorflow.g3doc.tutorials.mnist import mnist
import input_data
import mnist
####MNINSTの実行
cd /tensorflow/tensorflow/g3doc/tutorials/mnist
python fully_connected_feed.py
エラー発生せず動作すると、以下のように学習が進む様子が出力される。
Succesfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Succesfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Succesfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Succesfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 1
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 1
Step 0: loss = 2.32 (0.066 sec)
Step 100: loss = 2.14 (0.005 sec)
Step 200: loss = 1.93 (0.005 sec)
Step 300: loss = 1.57 (0.005 sec)
Step 400: loss = 1.32 (0.005 sec)
Step 500: loss = 0.91 (0.005 sec)
Step 600: loss = 0.98 (0.005 sec)
Step 700: loss = 0.65 (0.005 sec)
Step 800: loss = 0.63 (0.005 sec)
Step 900: loss = 0.62 (0.005 sec)
Training Data Eval:
Num examples: 55000 Num correct: 47233 Precision @ 1: 0.8588
Validation Data Eval:
Num examples: 5000 Num correct: 4329 Precision @ 1: 0.8658
Test Data Eval:
Num examples: 10000 Num correct: 8691 Precision @ 1: 0.8691
Step 1000: loss = 0.56 (0.013 sec)
Step 1100: loss = 0.54 (0.108 sec)
Step 1200: loss = 0.51 (0.005 sec)
Step 1300: loss = 0.47 (0.005 sec)
Step 1400: loss = 0.43 (0.005 sec)
Step 1500: loss = 0.59 (0.005 sec)
Step 1600: loss = 0.41 (0.005 sec)
Step 1700: loss = 0.43 (0.005 sec)
Step 1800: loss = 0.37 (0.005 sec)
Step 1900: loss = 0.34 (0.005 sec)
Training Data Eval:
Num examples: 55000 Num correct: 49217 Precision @ 1: 0.8949
Validation Data Eval:
Num examples: 5000 Num correct: 4515 Precision @ 1: 0.9030
Test Data Eval:
Num examples: 10000 Num correct: 9036 Precision @ 1: 0.9036
##トラブルシュート
###(1)ImportError: No module named g3doc.tutorials.mnistが出る
'fully_connected_feed.py'の内容を修正せずに実行すると、以下のようなエラーが出て途中で停止する。
python fully_connected_feed.py
Traceback (most recent call last):
File "tensorflow/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py", line 19, in <module>
from tensorflow.g3doc.tutorials.mnist import input_data
ImportError: No module named g3doc.tutorials.mnist
###(2)TypeError: init() got an unexpected keyword argument 'syntax'が出る
再現性がないが、以下のようなエラーが出て実行が停止したこと有り。
python fully_connected_feed.py
Traceback (most recent call last):
File "fully_connected_feed.py", line 15, in <module>
import tensorflow.python.platform
File "/usr/local/lib/python2.7/dist-packages/tensorflow/__init__.py", line 4, in <module>
from tensorflow.python import *
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/__init__.py", line 13, in <module>
from tensorflow.core.framework.graph_pb2 import *
File "/usr/local/lib/python2.7/dist-packages/tensorflow/core/framework/graph_pb2.py", line 16, in <module>
from tensorflow.core.framework import attr_value_pb2 as tensorflow_dot_core_dot_framework_dot_attr__value__pb2
File "/usr/local/lib/python2.7/dist-packages/tensorflow/core/framework/attr_value_pb2.py", line 16, in <module>
from tensorflow.core.framework import tensor_pb2 as tensorflow_dot_core_dot_framework_dot_tensor__pb2
File "/usr/local/lib/python2.7/dist-packages/tensorflow/core/framework/tensor_pb2.py", line 16, in <module>
from tensorflow.core.framework import tensor_shape_pb2 as tensorflow_dot_core_dot_framework_dot_tensor__shape__pb2
File "/usr/local/lib/python2.7/dist-packages/tensorflow/core/framework/tensor_shape_pb2.py", line 22, in <module>
serialized_pb=_b('\n,tensorflow/core/framework/tensor_shape.proto\x12\ntensorflow\"d\n\x10TensorShapeProto\x12-\n\x03\x64im\x18\x02 \x03(\x0b\x32 .tensorflow.TensorShapeProto.Dim\x1a!\n\x03\x44im\x12\x0c\n\x04size\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\tb\x06proto3')
TypeError: __init__() got an unexpected keyword argument 'syntax'
####解決策
'protobuf'というPythonモジュールのバージョンが古いため発生していた模様。再インストールにより解消。
python
>>> import google.protobuf
>>> print google.protobuf.__version__
3.0.0a1
TensorFlowを動かすためには、3.0.0a4以上でないとダメ。
protobufを再インストールする
pip uninstall protobuf
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl