TensorBoardをGoogle App Engineで使えるようにしてみた


概要

TensorBoardはCloud Storageにある学習結果ファイルを参照できるっぽいのだけれど、ローカルからCloud Storageにアクセスするのに環境構築や権限設定が面倒だったので、App Engineに環境を作ってTensorBoardにアクセスできるようにした。

といいますか、公式がそういう便利なのを用意してくれてたので、ありがたく利用させてもらいます。

GoogleCloudPlatform/appengine-tensorboard
https://github.com/GoogleCloudPlatform/appengine-tensorboard

Google App Engineを使用すると、小さなコストで認証を使用して永続的なTensorboardサーバを簡単に取得できます。

さらに、Tensorboardサーバーを起動するときにGCSから大量のデータを取得する場合は、GCSとGAE間のデータ出力に料金を払わないため、実際には永続的なGAEサーバーの料金が少なくなることがあります。

(Google翻訳)

仕組み的にはoauth2_proxyでユーザー認証の上、デプロイ時に設定したCloud Storageの指定バケットをlog_dirとして参照できるみたいです。

手順

プロジェクトファイルのダウンロード

> git clone https://github.com/GoogleCloudPlatform/appengine-tensorboard.git
> cd appengine-tensorboard

OAuth2の設定

ここではGCPの認証を利用します。

GCP管理コンソールの[APIとサービス]にある[認証情報]を開く。

[認証情報を作成]ボタンから[OAuthクライアントIDの作成]をクリック

以下の内容を選択・入力して[作成]ボタンをクリック

  • アプリケーションの種類: ウェブアプリケーション
  • 名前: 適当に
  • 承認済みのJavaScriptを生成: 空でOK
  • 承認済みのリダイレクトURI: あとから設定するので空でおk

これで、OAuth2認証用のクライアントIDとクライアントシークレットが発行されます。

OAuth2 Proxyの設定を行います。

> cp example_oauth2_proxy.cfg oauth2_proxy.cfg
> vi oauth2_proxy.cfg
oauth2_proxy.cfg
-client_id = "my-client-id"
-client_secret = "myclientsecret"
+client_id = "GCP認証情報のクライアントID"
+client_secret = "GCP認証情報のクライアントシークレット"

App Engineの設定を行います。

> cp example-app.yaml app.yaml
> vi app.yaml

もし既存のGCPプロジェクトにデプロイする場合、service 指定しないと、default にデプロイされてしまうので、ご注意ください。

app.yaml
runtime: custom
env: flex
+service: サービス名
threadsafe: true
resources:
  memory_gb: 32
  cpu: 8
automatic_scaling:
  max_num_instances: 1
env_variables:
- EVENT_FILE_PATH: gs://ml-workshop/output/mnist_hptuning10
+ EVENT_FILE_PATH: gs://任意のバケット/output/TensorFlowの結果フォルダ
  RELOAD_INTERVAL: 600
- GCS_PROXY_CONFIG: gs://ml-workshop/oauth2_proxy.cfg
+ GCS_PROXY_CONFIG: gs://任意のバケット/oauth2_proxy.cfg
  RELOAD_INTERVAL: 600

App Engineへデプロイ

oauth2_proxy.cfgをCloud Storageへコピーします。

バケットがなかったら作成しておきましょう。

> gsutil cp oauth2_proxy.cfg gs://任意のバケット/oauth2_proxy.cfg

TensorFlowの結果についてもCloud Storageへコピーしておきましょう。

> gsutil cp -r TensorFlowの結果フォルダ  gs://任意のバケット/output/

では、App Engineへデプロイします。
GoogleさんがDockerイメージを用意してくれているので、それをデプロイする感じです。

> gcloud app deploy app.yaml --image-url=gcr.io/google-samples/appengine-tensorboard:latest

()
Deployed service [サービス名] to [https://サービス名-dot-プロジェクトID.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s サービス名

To view your application in the web browser run:

これでURLがきまりましたので、先程作成した、認証情報の[承認済みのリダイレクトURI]に設定しておきましょう。

アクセスしてみる。

では、App Engineにデプロイできたので、URLへアクセスしてみましょう。

> open https://サービス名-dot-プロジェクトID.appspot.com

認証しろと表示されます。

この辺は通常のOAuth2の認証ですね。

で、認証したら無事にTensorBoardが表示されました。

やったぜ。

注意点としては、Dockerイメージが用意されていますが、TensorFlowのバージョンが古め(0.8.0)なところでしょうか。

参考

GoogleCloudPlatform/appengine-tensorboard
https://github.com/GoogleCloudPlatform/appengine-tensorboard