BluemixのDockerコンテナ環境にTensorFlowをインストールする

BluemixのDockerコンテナ環境にTensorFlowをインストールした時の手順を共有します。
GitHubのtensorflow/tensorflowリポジトリのDockerfileを、BluemixのDevOpsサービスのBUILD&DEPLOYを使ってビルド・デプロイします。
前提として、Bluemixアカウント（トライアルで可）、GitHubのアカウント、gitコマンド実行環境が必要です。

手順は以下のとおりです。

1. BluemixのDockerコンテナ環境を初期設定する（レジストリー名前空間の設定）
2. GitHubにリポジトリを作成する
3. tensorflow/tensorflowリポジトリの必要部分を自分のリポジトリにpushする
4. Bluemixにプロジェクトを作成する
5. Bluemix DevOpsサービスのBUILD&DEPLOYを設定する
6. Dockerコンテナをビルド・デプロイする

※この手順のうち"3"のステップは以下のいずれかの代替手段でスキップ可能です。その場合、gitコマンド実行環境は不要になります。

* 今回私がGitHub上に作成したリポジトリ（ https://github.com/takeyan/tensorflow_docker.git ）からForkする
* "4"のステップで私のGitHubリポジトリを直接指定する

ただし、私のGitHubリポジトリはいずれ陳腐化して動かなくなると思いますので、"3"のステップで最新状態のオリジナルからコピーを取得することをお勧めします。

---
## 1. BluemixのDockerコンテナ環境を初期設定する（レジストリ名の登録）
Bluemixコンソールのカタログの画面で、IBM Containersを選択します。
<img width="1280" alt="スクリーンショット 2016-10-12 20.05.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/ff1877f2-49c5-fff0-bcf7-1786a255fe80.png">

コンテナの作成の画面でコンテナイメージをひとつ選択します。
<img width="1280" alt="スクリーンショット 2016-10-12 20.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/f2a61493-2776-b979-4333-afa2f5344539.png">

レジストリー名前空間の設定を要求してくるので、適当に命名して保存します。
保存したらコンテナの作成の画面に戻ります。初期設定の作業はここまでです。
<img width="1280" alt="スクリーンショット 2016-10-12 20.15.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/c55e7b18-b58a-2f35-2ed0-8831ea0e226d.png">


## 2. GitHubにリポジトリを作成する
GitHubにログインし、リポジトリを新たに作成します。
<img width="1280" alt="スクリーンショット 2016-10-12 20.20.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/e6d783c8-14c1-8e27-58fa-cdd96865ac19.png">

リポジトリ名を適当に命名してCreate repositoryをクリックします。
<img width="1110" alt="スクリーンショット 2016-10-12 20.23.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/e839cb45-fc48-f499-886b-3ee212973e9e.png">

リポジトリが出来上がると以下の画面が表示されます。リポジトリのURLを後でコピペして使用する（git remoteコマンドで指定する）ので、この画面はこのまま置いておきます。
<img width="1280" alt="スクリーンショット 2016-10-12 20.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/87bdd7e8-5295-5fbe-6519-e737f1df5cea.png">

## 3. tensorflow/tensorflowリポジトリの必要部分を自分のリポジトリにpushする
本手順ではtensorflow/tensorflowに公開されているDockerfileをそのまま利用します。Dockerfileが置かれているサブディレクトリ以下だけが必要なのですが、まずはリポジトリ全体をgit cloneで入手します。
<img width="1280" alt="スクリーンショット 2016-10-12 20.34.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/4d07dcfa-962b-e4d0-7ff3-a06b382e46a4.png">

terminalを開いて以下のコマンドを実行します。

```bash
$ git clone https://github.com/tensorflow/tensorflow.git
```

カレントディレクトリ下にtensorflowというディレクトリができます。ここからDockerfileのあるサブディレクトリに移動します。

```bash
$ cd tensorflow/tensorflow/tools/docker
```

dockerサブディレクトリに移動したら、ここでgitプロジェクトを作成して、commitします。

```bash
$ git init
$ git add .
$ git commit -m "initial commit" 
```

あらかじめGitHubに作成しておいたプロジェクトにこのgitプロジェクトをpushします。以下のコマンド例を参考にしてください。
git remoteコマンドの引数は、先に作成したGitHubのプロジェクトのURLをコピペして下さい。
git pushコマンドを実行するとGitHubのユーザーID、パスワードを要求してくるので、適宜応答して下さい。

```bash
$ git remote add origin https://github.com/takeyan/tensorflow_docker.git
$ git push -u origin master
```

## 4. Bluemixにプロジェクトを作成する

Bluemix DevOpsサービス（hub.jazz.net）にログインします。
<img width="1280" alt="スクリーンショット 2016-10-12 20.55.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/55f94e56-2680-e3f5-afca-154882304a26.png">

Bluemixにログインしたのと同じブラウザでDevOpsサービスにログインすると、セッション情報を勝手に引き継いでBluemixのユーザーIDでログインしてくれます。最初の一回だけ別名の設定を要求してくるので適当に命名します。
<img width="1280" alt="スクリーンショット 2016-10-12 21.04.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/96d0ecbf-451e-5ded-2619-496d656ba19d.png">

<img width="1280" alt="スクリーンショット 2016-10-12 21.05.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/01f39c25-5c85-05e1-3206-7ec3488c8983.png">

Start Coding in a new projectを選択して、Bluemixにプロジェクトを作成します（new projectのリンクをクリックします）。
<img width="1280" alt="スクリーンショット 2016-10-12 21.08.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/53a570fa-9fa0-1f8f-ab18-d990f77569c8.png">

プロジェクト名を適当に命名し、Link to an existing GitHub repositoryを選択します。GitHubのユーザーID、パスワードを要求してきたら適宜応答します。
<img width="1280" alt="スクリーンショット 2016-10-12 21.13.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/809f699a-e5de-d2b1-a96d-ab001ee28911.png">


リポジトリ選択のプルダウンメニューが現れるので、先にGitHubに作成してdockerサブディレクトリ以下をgit pushしておいたプロジェクト（ここではtensorflow_docker）を選択します。
<img width="1280" alt="スクリーンショット 2016-10-12 21.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/c4cf0ace-dce8-2149-0da1-9773e7e84a5e.png">

プロジェクトを選択すると更に下に選択肢が表示されますが、デフォルトのままで大丈夫です。一番下にCREATEボタンが現れるので、これをクリックします。ここのプロセスは若干時間がかかります。
<img width="1280" alt="スクリーンショット 2016-10-12 21.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/de03b806-0d23-94f5-63d6-5d081760d9fb.png">

作成が完了すると以下の画面に切り替わります。
<img width="1280" alt="スクリーンショット 2016-10-12 21.24.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/af14f2fc-4094-c6b1-c1f5-52b2cbf742ca.png">

## 5. Bluemix DevOpsサービスのBUILD&DEPLOYを設定する
DevOpsサービスの画面右上のBUILD&DEPLOYボタンをクリックします。
<img width="1280" alt="スクリーンショット 2016-10-13 9.51.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/806c514c-6ff0-b8c0-4aba-ddc4f2e07904.png">

「パイプラインにようこそ」の画面は邪魔なので、右上の△で閉じておきます。
「ステージの追加」で「ビルド」ステージ、「デプロイ」ステージの順に作成していきます。
<img width="1280" alt="スクリーンショット 2016-10-13 9.55.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/1d4494e3-8b83-6a52-ca09-4bb92cec06d2.png">

まずはビルドのステージです。「入力」の画面はデフォルトのままで大丈夫です。
<img width="1280" alt="スクリーンショット 2016-10-13 10.00.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/4fe7854f-d32a-57d5-6101-872592c47e6f.png">

「ジョブ」の画面では、まずジョブ・タイプの選択で「ビルド」を選択します。
<img width="1280" alt="スクリーンショット 2016-10-13 10.03.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/574b1dd6-1d87-9260-74dd-b837b30a9ba1.png">

ビルダー・タイプで「IBM Container Service」を選択します。
イメージ名は適当に命名します。（英小文字、数字の組み合わせが無難です）
他はデフォルトで大丈夫です。入力したら一番下の「保存」ボタンをクリックします。（以下の添付画面には「保存」ボタンは見えていません）
<img width="1280" alt="スクリーンショット 2016-10-13 10.09.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/8bd14e95-41cd-1414-473f-2e866118bcc5.png">

次に、もう一度「ステージの追加」をクリックして、デプロイのステージを作成します。ここでも「入力」の画面はデフォルトのままで大丈夫です。
「ジョブ」の画面に移って、ジョブ・タイプの選択で今度は「デプロイ」を選択します。
<img width="1280" alt="スクリーンショット 2016-10-13 10.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/16fcdc22-093b-90d7-fbce-9606463fe1bb.png">

デプロイヤー・タイプでIBM Containers on Bluemixを選択します。
名前がデフォルトでmyApplicationNameになっているので、好みの名前に変更します。
ポート番号はデフォルトで80になっていますが、8888に変更します。
他はデフォルトのままで大丈夫です。
デプロイのステージでは環境プロパティーも設定するので、まだ「保存」はクリックしないで下さい。
<img width="1280" alt="スクリーンショット 2016-10-13 10.20.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/971e898e-25ec-16cf-f05e-339f8396d92b.png">

「環境プロパティー」の画面では、「プロパティーの追加」をクリックして、文字プロパティとして"CONTAINER_SIZE","medium"と入力します。この指定でコンテナに2GBのRAMを割り当てます。これがBluemixのトライアルアカウントのRAM割当の上限(※)です。
入力したら「保存」をクリックします。
※全てのコンテナのRAMサイズの合計が2GBに制限されますので、コンテナを複数作成したい場合はRAMサイズを控えめにして下さい。2GB RAMのコンテナをひとつ作成すると、それ以上コンテナを作成できなくなります。
CONTAINER_SIZEの選択肢とRAMサイズ（MB）を以下に列挙します。デフォルトはmicroです。

* pico (64)
* nano (128)
* micro (256)
* tiny (512)
* small (1024)
* medium (2048)
* large (4096)
* x-large (8192)
* 2x-large (16384)

<img width="1280" alt="スクリーンショット 2016-10-13 10.28.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/a39c10c8-12b9-19dc-62eb-499578ecd060.png">

## 6. Dockerコンテナをビルド・デプロイする
BUILD&DEPLOYの設定が完了すると、以下の画面の状態になっています。ここでビルドのステージの右上の▲をクリックしてビルドを開始します。ビルドが正常に終了すると、続いて自動的にデプロイが開始します。
<img width="1280" alt="スクリーンショット 2016-10-13 10.35.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/205402e2-1e14-dd95-f643-914aeaac15a8.png">

今回の実行では、ビルド開始からデプロイ完了まで13分程度かかりました（ビルドで9分20秒、デプロイで3分30秒）。ビルド環境を一から構築してそれからビルドを実行する、というようなことを毎回やっているので時間がかかるようです。
実行状況は「ログおよび履歴の表示」で確認することができます。

以下はデプロイまで完了した状態の画面です。このコンテナにアサインされたIPアドレスが確認できます。
<img width="1280" alt="スクリーンショット 2016-10-13 11.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/a01fd846-d1d4-56a5-8baa-d14b54f6ce95.png">

ダッシュボードを開くと、今デプロイしたコンテナがリストに表示されています。
<img width="1280" alt="スクリーンショット 2016-10-13 11.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/af42abfc-059a-100d-a6db-f5ada662fd1c.png">

コンテナの詳細は以下のとおりです。
<img width="1280" alt="スクリーンショット 2016-10-13 11.20.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/bbc418ba-ae74-09f6-a8b7-ab7b645ac631.png">

最後に、コンテナにアサインされたIPアドレスのポート8888（ここでは http://169.46.159.57:8888 ）にアクセスして、応答が返ることを確認します。
<img width="1280" alt="スクリーンショット 2016-10-13 11.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/3dc452b0-172e-7687-d719-28ab5b39f5c7.png">

無事TensorFlowをBluemixのDockerコンテナ環境にインストールできました。


以上です。