初めてのAnacondaとTensorflowのインストールとGCPでの実行

こんにちは。だいぶ涼しくなってきました。これはPythonを使ったことの無い初老のプログラマ:older_man_tone1:が、機械学習の学習（←機械に使われている感が満載）をしようとしているところの初動メモです。（手探りなので随時更新する予定です。）

# Anacondaのインストール

Anacondaとは、Python本体とAnacondaが『Data Science Libraries』と呼ぶ機械学習およびそれに必要なライブラリをセットにしたパッケージのようです。
[公式サイト](https://www.anaconda.com/)からダウンロードしてインストールします。ディストリビューションはWin,Mac,Linuxと充実しています。ちなみに自分はMacにインストールしました。

# Anaconda Navidatorを使う

インストールしたアイコンをクリックすると、Anaconda Navidatorが起動します。
![Screen Shot 2017-09-23 at 12.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/133139/8599cf19-59b2-43a6-5375-584ff5ed7467.png)


## Jupyter notebookの起動

公式ガイドは[こちら](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)

先ほどの画面で、jupyterを起動するボタン（Launch）を押します。
→環境を新しく作ると、Install→Launchと、インストールが先に必要になるようです。

起動すると早速エラー。

``` sh:console

[I 11:42:10.592 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=41d7fc8bdb3a35fe1cba4ffebb72ab2104a8a49cfe041177
[I 11:42:10.592 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 11:42:10.594 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=41d7fc8bdb3a35fe1cba4ffebb72ab2104a8a49cfe041177
0:97: execution error: "http://localhost:8888/tree?token=c5d5948f0ebe9d59988acddbc6655a66a93128a68bc28413" doesn’t understand the “open location” message. (-1708)
```

URLをコピペして〜とメッセージに書いてあるとおりにします。Chromeを起動し、

- URLに『http://localhost:8888』をコピペして実行
- ログイン画面になるので、そこのToken欄に、token=の後をコピペして実行（上記例だと41d7fc8bdb3a35fe1cba4ffebb72ab2104a8a49cfe041177）

execution errorのあとのTokenが、最初のTokenと異なる値になっているのが何故なのかはよく分かりません…とにかく、最初のメッセージ"The Jupyter Notebook is running at:"の環境が正しいようです。（"Copy/paste this URL..."のあとも同じURLになっていますね）

そして、Macを再起動するとエラーが消えました。なんだったんでしょう。

``` sh:console
[I 23:23:30.037 NotebookApp] 0 active kernels 
[I 23:23:30.037 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=ffd10efe43c1f78ccf733822665ecab69c231aa4c5e4485a
[I 23:23:30.037 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 23:23:30.038 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=ffd10efe43c1f78ccf733822665ecab69c231aa4c5e4485a
[I 23:23:30.377 NotebookApp] Accepting one-time-token-authenticated connection from ::1
```


## Jupyter notebookの使い方

既に素晴らしい記事があります:relaxed:ので、引用します
1. [Jupyter Notebook の基本的な使い方](http://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)
2. [Jupyterノートブックを使うメリット](http://news.mynavi.jp/series/zeropython/002/)
3. [Jupyter Notebook の Tips](https://adtech.cyberagent.io/techblog/archives/2317)

# 機械学習のチュートリアル

[Pythonの機械学習の本](https://www.amazon.co.jp/gp/product/4844380605/)を見ながら、githubにある[サンプルソースコード](https://github.com/rasbt/python-machine-learning-book)をjupyter notebookで動かしています。

.ipynbのページの先頭に書いてあるライブラリ（バージョンはノートに記載のバージョンに従う必要があります）をインストールし、実行時のタイムスタンプなどをプリントする[watermark](https://github.com/rasbt/watermark)というパッケージもインストールする必要があります。

```
Sebastian Raschka 
last updated: 2017-10-02

CPython 3.6.2
IPython 6.1.0

numpy 1.13.1
pandas 0.20.3
matplotlib 2.0.2
scipy 0.19.1
sklearn 0.19.0
```


このあと、メニューから『Run Cells』を選択するか、再生ボタンのアイコン・ボタンを押すと、Pythonのコードが実行されるようです。ノートブックの下部のコードは、上部で宣言しているクラスや変数を参照しているので、ノートの上から実行していく必要があります。

![Screen Shot 2017-09-24 at 12.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/133139/2eaf539e-a8ac-f636-45f3-683e998dd695.png)

# Tensorflow

## インストール

Anacondaの環境に[他のパッケージを追加する方法](https://docs.anaconda.com/anaconda/#packages-available-in-anaconda)がガイドににあり、conda installコマンドでインストールすることができると記載されています。

[追加できるパッケージの一覧はこちら](https://docs.anaconda.com/anaconda/packages/py3.6_osx-64)で、Tensorflowもconda installコマンドでインストールできるのですが、バージョンが1.1.0（2017年10月6日現在）で少し古いようです。



そこで、Tensorflowの[公式インストールガイド(Mac)](https://www.tensorflow.org/install/install_mac)を見ると、Anacondaの環境でのインストール手順が掲載されています。

ガイドだとpython2向けのコマンドなので、[同じガイドの別のページ](https://www.tensorflow.org/install/install_mac#the_url_of_the_tensorflow_python_package)を参考にpython3向け環境にすると

```
(tensorflow)$ pip install --ignore-installed --upgrade \
 https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl
```
となります。

インストールしたあとに、パッケージの一覧を見るとこんな感じ…

```
(tensorflow) bash-3.2$ conda list -n tensorflow
# packages in environment at /Users/xxxxx/anaconda/envs/tensorflow:
#
bleach                    1.5.0                     <pip>
certifi                   2016.2.28                py36_0  
html5lib                  0.9999999                 <pip>
libprotobuf               3.2.0                         0  
Markdown                  2.6.9                     <pip>
mkl                       2017.0.3                      0  
numpy                     1.12.1                   py36_0  
numpy                     1.13.3                    <pip>
openssl                   1.0.2l                        0  
pip                       9.0.1                    py36_1  
protobuf                  3.2.0                    py36_0  
protobuf                  3.4.0                     <pip>
python                    3.6.2                         0  
readline                  6.2                           2  
setuptools                36.5.0                    <pip>
setuptools                36.4.0                   py36_1  
six                       1.11.0                    <pip>
six                       1.10.0                   py36_0  
sqlite                    3.13.0                        0  
tensorflow                1.3.0                     <pip>
tensorflow                1.1.0               np112py36_0  
tensorflow-tensorboard    0.1.8                     <pip>
tk                        8.5.18                        0  
werkzeug                  0.12.2                   py36_0  
Werkzeug                  0.12.2                    <pip>
wheel                     0.29.0                   py36_0  
wheel                     0.30.0                    <pip>
xz                        5.2.3                         0  
zlib                      1.2.11                        0  

```

最初にconda install tensorflowを実行したために、1.1.0のパッケージも入っています。大丈夫かな…

## 動作確認

インストールガイドや[Githubの動作確認コード](https://github.com/tensorflow/tensorflow)をJupyter notebookで実行します

``` python:prac.ipynb
in[1]:

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

``` python:
b'Hello, TensorFlow!'
```
``` python:prac.ipynb
in[2]:

a = tf.constant(10)
b = tf.constant(32)
sess.run(a + b)
```
``` python:
out[2]: 42
```
``` python:prac.ipynb
in[3]:
sess.close()
```

無事動きました。

![Screen Shot 2017-10-06 at 20.31.54.png](https://qiita-image-store.s3.amazonaws.com/0/133139/004e78c8-14bf-6efc-4d5e-5677d03e2f96.png)

# Google Cloud Platform (GCP)で動かす

次に、TensorflowをGCPのCloud ML Engineで動かします。
基本的にはローカルで動作確認をして、gcloudコマンドで、GCPにジョブとして投入するのですが、[実行環境について注意事項](https://cloud.google.com/ml-engine/docs/environment-overview?hl=ja#cloud_storage_buckets)があるので、ここにメモします。

## クラウド版の注意事項①

- GPUサポートは現時点で下記のリージョンのみサポートされる
    - us-east1
    - asia-east1
    - europe-west1

- Cloud ML Engine jobsは、入力/出力データの格納先であるGoogle Cloud Storage bucketと同じリージョンでなければならない

ということで、日本から使うときは、アジア（asia-east1：台湾）で設定をしたら良さそうなので、それで進めています。

## クラウド版の注意事項②：predictionがサポートされるRegion

Cloud ML Engineはasia-east1でGPU含めサポートされているのですが、それで進めていたら、生成されたモデルをEngineにdeployして予測機能を使おうとすると、このリージョンは使えませんというエラーが出ました…

``` bash:console
(/Users/xxxxxxx/anaconda/envs/gcp) bash-3.2$ gcloud ml-engine models create $MODEL_NAME --regions=$REGION
ERROR: (gcloud.ml-engine.models.create) INVALID_ARGUMENT: Field: model.regions Error: The provided GCE region 'asia-east1' is not available. Options are [asia-northeast1, europe-west1, us-central1, us-east1].
- '@type': type.googleapis.com/google.rpc.BadRequest
  fieldViolations:
  - description: The provided GCE region 'asia-east1' is not available. Options are
      [asia-northeast1, europe-west1, us-central1, us-east1].
    field: model.regions
(/Users/xxxxxxx/anaconda/envs/gcp) bash-3.2$ gcloud ml-engine models create $MODEL_NAME --regions=asia-northeast1
```

asia-northeast1は東京ですね。こちらに切り替えたら無事にモデルが生成されました。


今日はここまで:slight_smile: