Cloud Datalabのいい感じな部分と惜しい部分

このエントリは、

- [Cloud Datalabの概要](http://qiita.com/rindai87/items/14366d38ec6ecf01cda3)

の続きです。

## Cloud Datalabの基本

[こちらにも](http://qiita.com/rindai87/items/14366d38ec6ecf01cda3)類似のことは書いていますが改めて書きますと、Cloud Datalabとは以下のようなものです。

- Jupyterをベースとしたインタラクティブな分析の環境
- GCPと統合された環境
- Jupyter及びPythonのライブラリをコンテナ化したパッケージ
- コンテナをdatalabコマンド経由でGCE上に簡単に立ち上げたり落としたりできる

### Datalabの前提
DatalabはGCPのプロジェクトと密接に結びついて動作するように作られています。

デフォルトで特に何も指定しないと以下のようになります。

- project内の[Cloud Source Repository](https://cloud.google.com/source-repositories/)に`datalab-notebooks`という[リポジトリが作られます](https://cloud.google.com/datalab/docs/how-to/datalab-team#use_the_automatically_created_git_repository_for_sharing_notebooks)
- GCS上に`${PROJECT_ID}.appspot.com/datalab_backups`バケットが作られてその中に[バックアップが作られます](https://cloud.google.com/datalab/docs/how-to/working-with-notebooks#cloud_datalab_backup)

### 起動

という前提で色々やってみます。何はともあれDatalabの起動です。

```
$ datalab create --disk-size-gb 10 --no-create-repository datalab-test
```

- `--disk-size-gb`でディスクサイズを指定します。
  - デフォルトでは200GBで作られるので、小さめサイズで10GBを指定しました
- `--no-create-repository`でリポジトリ作成を行いません
  - リポジトリ単独で消したりしていたら、`--no-create-repository`をつけないと起動しなくなってしまいました。。。何でだろう、これ。またちゃんと調査します。

## BigQueryとの連携

DatalabはBigQueryと連携できて大変素敵です。で、少し話は変わりますが、Jupyterには[Magic Command](http://ipython.readthedocs.io/en/stable/interactive/magics.html) という`%%`から始まるコマンド機能がありまして、BigQueryやGCSの機能も提供されています。

### Magic Commandとしてクエリの実行

[サンプル](https://github.com/googledatalab/notebooks/blob/master/tutorials/BigQuery/Hello%20BigQuery.ipynb)どおりですが、これがセル内に書けるという素晴らしさは試してみるとよくわかります。

```
%%bq query
SELECT id, title, num_characters
FROM `publicdata.samples.wikipedia`
WHERE wp_namespace = 0
ORDER BY num_characters DESC
LIMIT 10
```

### google.datalab.bigqueryを通じての実行

セルにBQのクエリかけるんだから、そのまま処理したいですねということで[サンプルにあるもの](https://github.com/googledatalab/notebooks/blob/master/tutorials/BigQuery/SQL%20and%20Pandas%20DataFrames.ipynb)ですが、クエリの結果をdataframeとしてPandasに渡すことができます。素敵です。

```
%%bq query -n requests
SELECT timestamp, latency, endpoint
FROM `cloud-datalab-samples.httplogs.logs_20140615`
WHERE endpoint = 'Popular' OR endpoint = 'Recent'
```
```Python
import google.datalab.bigquery as bq
import pandas as pd

df = requests.execute(output_options=bq.QueryOutput.dataframe()).result()
```

もうちょいAPI経由っぽくするとこんな感じでしょうか？

```Python
import google.datalab.bigquery as bq
import pandas as pd

# 発行するクエリ
query = """SELECT timestamp, latency, endpoint
           FROM `cloud-datalab-samples.httplogs.logs_20140615`
           WHERE endpoint = 'Popular' OR endpoint = 'Recent'"""
# クエリオブジェクトを作る
qobj = bq.Query(query)
# pandasのデータフレームとしてクエリの結果を取得
df2 = qobj.execute(output_options=bq.QueryOutput.dataframe()).result()
# 以下pandasの操作へ
df2.head()
```

よく考えると、こちらのAPIが提供されているから、Magic Commandが作られるって流れですね。実際、[こちら](https://github.com/googledatalab/pydatalab/blob/b27dc582882fe5497af49d45fc28204e4c46db12/google/datalab/bigquery/commands/_bigquery.py#L933)を見るとMagic Commandとして`%%bq`が定義されているのが分かります。

## GCSとの連携

BigQueryと同じく[サンプル通り](https://github.com/googledatalab/notebooks/tree/master/tutorials/Storage)、セル上からGCS上のオブジェクトを操作できます。ポイントとしては、ファイルの読み書きまでできることでしょうか。BigQueryの結果をデータソースとできるのも協力ですが、GCSのデータをそのままデータソースとして透過的に扱えるのは魅力的です。


## CloudMLとの連携

これは、とりあえずAPI経由で何か動くことは確認できましたが、色々と挙動として分からないことも多いので今回はスキップします。

## インスタンスタイプの変更

ここからがクラウドの真骨頂です。オンプレでは不可能な必要になったらスペックアップ、が実現できます。datalabコマンドのcreateでは`--machine-type`オプションでインスタンスタイプを指定できます。デフォルトでは`n1-standard-1`が立ち上がるようになっています。

```bash
# deleteコマンドでインスタンスは削除
# この場合はアタッチされていたディスクはそのまま残る
$ datalab delete datalab-test

# 同一のマシン名で、インスタンスタイプを変えて起動
# マシン名+pd の命名規則でディスクが作られているため
# 同一のマシン名だと勝手にディスクをアタッチしてくれる
$ datalab create --no-create-repository \
                 --machine-type n1-standard-4 \
                 datalab-test
```

これで、必要に応じてマシンのスペックを上げ下げすることができます。

## GPUの分析環境！
一応、今回のハイライトです。

これで！！！GPUインスタンスを指定したら！！！！お手軽にGPU機械学習環境が簡単に手に入るぞ！！！！

と思ったらそう簡単にいかないのが世の中でして、、、今のところ、[GPUインスタンスはDatalabでは対応していません。](http://stackoverflow.com/questions/42703467/how-do-i-configure-google-cloud-datalab-to-use-gpus-for-tensorflow)


## まとめ
ところどころ惜しかったりするDatalabですが、GPUインスタンスは何となくいずれ対応してくれるんではないかという淡い期待はあったりしまして、Cloud Source Repositoryのところや、Cloud ML Engineまわりがもやっとしているところを除いたりしても、データ分析環境を作るための重要なパーツではないかと思う今日このごろなのです。次回はこのあたりをもう少ししっかり見ていきたいと思います。

### その他参考情報

- [Datalab API](http://googledatalab.github.io/pydatalab/)
- Datalabに入っている[Pythonライブラリ](https://github.com/googledatalab/datalab/blob/master/containers/base/Dockerfile)
  - OpenCV系のライブラリなどは入っていないっぽい
  - が、追加で[pythonモジュールをインストールすることは可能](https://cloud.google.com/datalab/docs/how-to/adding-libraries)
  - OS側のコマンドも`!`をつければ叩けるので、`apt-get`とかで対応できるパッケージは入れられるはず