[AWS]AmazonLinuxの仮想マシンの上にDocker入れて機械学習（TensorFlow）動かす

自前の物理環境を用意せずにTensorFlowを動かしたかったので、AWSのmicroインスタンス上に環境を構築した際の手順まとめ。
#TensorFlowって?
2015/11/10に[Googleが公開](http://tensorflow.org/)した機械学習技術のライブラリで、サンプルを眺めただけでも以下のような学習機が使えるようだ。
- 手書き文字認識
- リカレントニューラルネットワーク(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が導入される。

```bash: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の起動オプションはあるけれど、とりあえず最低限の設定で。

```bash:Ubuntu14.04のコンテナ起動
sudo docker run -it ubuntu:14.04 bash
```
初回の場合、イメージのダウンロードでしばらく時間がかかる。
イメージのダウンロードが終わると、コンテナとしてUbuntuマシンが立ち上がり、以下のようなプロンプトが表示される。
```root@5d1402469575:/#```

####Ubuntu14.04コンテナにTensorFlowインストール
Dockerでコンテナとして起動すると、本当に最低限のパッケージしか入っていないため、通常のUbuntuマシンにインストールするときと比べて手動で導入するものが多いかも。
####Python系のインストール
```bash
 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コマンドで一発。

```bash
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を導入する。

```bash
apt-get install -y git
 git version 1.9.1
```
####チュートリアルプロジェクトの入手
```bash
git clone --recurse-submodules https://github.com/tensorflow/tensorflow
```
####コードの修正
チュートリアルの説明によれば、'fully_connected_feed.py'を実行すれば良いはずだが、エラーが発生したため、原因となっていたコードを修正。
（後述の「トラブルシュート」に備忘のため発生したエラーの内容を記載しておく）

```py:/tensorflow/tensorflow/g3doc/tutorials/mnist/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の実行
```bash
cd /tensorflow/tensorflow/g3doc/tutorials/mnist
python fully_connected_feed.py
```
エラー発生せず動作すると、以下のように学習が進む様子が出力される。

```bash: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
```

##トラブルシュート
###（１）ImportError: No module named g3doc.tutorials.mnistが出る
'fully_connected_feed.py'の内容を修正せずに実行すると、以下のようなエラーが出て途中で停止する。

```bash
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
```
###（２）TypeError: __init__() got an unexpected keyword argument 'syntax'が出る
再現性がないが、以下のようなエラーが出て実行が停止したこと有り。

```bash
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モジュールのバージョンが古いため発生していた模様。再インストールにより解消。

```bash
python
>>> import google.protobuf
>>> print google.protobuf.__version__
3.0.0a1
```
TensorFlowを動かすためには、3.0.0a4以上でないとダメ。
protobufを再インストールする

```bash
pip uninstall protobuf
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
```