devfest tokyo 2016に行ってきた。
に行ってきたのでメモを。 GCP/機械学習関連について聞いてきた。
セッションタイムスケジュール DevFest Tokyo
アジェンダ詳細 DevFest Tokyo 2016 プログラム詳細
スライドは qiita.com とかにまとまっている。
GCE周りの変更点
Compute Engine
- subnetがregion単位で切れるようになった
- APIが変わってる
- Developer ConsoleにSerial portでつなげるようになった
- コスト削減とかのためにおすすめができるようになった (再起動する)
- 起動中のインスタンスマシンサイズが変更できるようになった
- scope(GCP関連の権限付与) の変更もできるようになった。
- yumのリポジトリとかがgoogle提供のものもできた
GCS
- https load balancing with google cloud storage
- 自前のドメインでやるときはSSLできなかったけど、LoadBalanceの後ろにGCSを指定できるようになった
StackDriver
- 画面が変わった。統合監視ツールっぽい感じに
- stack driver -agent がV3へ。APIの叩く量が増えた(3倍ぐらい)
- stack driver logging google-fluentdがで取集
- Error Reporting ->fluend で叩きつける感じ
CloudSQL 2nd Generaltion
- 接続速度が向上
- Endpoint IP か Clous SQL Proxyを使う。
- Failover Replica と Read Replica
Failoverの仕様 - Failoverの後Failbackする。 そのあとSwitch overしない。 - Masterの障害後 Failover ReplicaとRead Replicaのみになる。 - Masterを復帰後 MasterのBackupを取得 - そのBackupからFailover Replica / Read ReplicaのRestoreで再起動 - Master復帰までProxy経由でもクエリ投げらんない。 (そもそも落ちない大丈夫)
Hasicorp Terraform
Q&A
CloudSQL グローバルIPからしか繋げないのキツイよね ってのが世界中からきてるから そのうち直りそう
GCPのネットワーク構成について
- 一から学べるGoogle Cloud Networking リファレンスガイド っていうのがかなり参考になる。
default
defaultにはfirewall rulesとかREGIONごとにsubnetが切られている SRC_RANGESが0.0.0.0/0 でtcp:22なので sshでどこからでもつなげる。
subnetはregion単位 firewall ruleを指定しないとsshとかできない
GCE上は同一DNSサーバを見てるので、 名前解決ができる。
custom subnet network
subnetを自分で作った場合、firewall ruleを定めないと内外部どちらも接続できない。 gcloud コマンドから作ると警告と、firewallのルール例が出る。
GCPの外の世界を意識した場合subnetが有用かもしれない。
BigQueryとCompute Engineで扱う自然言語のビッグデータ
雑談対話システムの作成
App Engineで受ける。ユーザからの発言に対してどのアルゴリズムを使うかとログをStackDriverに投げてBQに入れたりするのに使う Compute Engine -> Chainer Memcache or Data store Compute Engine Tensor Flow Data store 発話Data
アルゴリズム
直近の話題から TensorFlowであらかじめ用意しておいた発話候補に得点つけて返答
発話データ
Datasotreに key(話題となるキーワード) と candidates(発話候補) で入れ込んでおく。 ここの準備が大変
発話元データ
TwitterのデータをBQに入れておく。 keyword と tweetの形で。 これをいい感じに加工してDataStoreに入れ込むのにCompute Engine使ってるけど結構大変。
前処理
BQでできるものはBQでやる。 NGワードとかメンションとか長すぎるものとか。 Not Contains ~ みたいなクエリを自動生成して叩いた。 100GBくらいまで減らせたので、あとはGCEでやる。
バッチ処理を実行するためのアーキテクチャ
BQから必要なデータを分割してファイル出力。 Preemptible VM 500台で1番で終わらせた。 ファイル処理が終わったかはApp Engineのpull queueで管理
構成
ユーザ -> Appengine -> Pull Queue (Request) ↓ ↑ Lease Instance Group -> Datastore
BQ -> GCS ↑ DL
Compute Engineを立ち上げた時のstart up scriptで pull queueから引っ張ってきたりとか DatastoreにPutしたりとかしてる。
スケールするアーキテクチャ
なぜ前段にApp Engineをかませているのか? スケーラビリティとアベイラビリティの向上 -> Compute Engineが忙しくてもApp Engineでタスクを貯めておくことができる。
発話ロジックの選択を行うことができる -> ロジックがかけるLB
Cacheの作成
スケーラビリティするには。
非同期・並列にする。
App EngineではQueueに入れたあとすぐに Responseを返す。
Pull Queueに入れ込んで、 Queueの中のTask数に応じてスケールする。
Firebase
発話をレスポンスするところができない。 LineとかはLine側のサーバに返せばいいけど、今回はレスポンスを直接プログラムに返す必要がある。
FireBaseを使う。 発話結果をFirebase Realtime DBに突っ込む。 App Engineはkeyだけを返す。 クライアントはkeyの場所をWatchしておいて、そこのメッセージを見る。
学習部分の課題
Tensorflowの学習部分 特に工夫していない。GCEインスタンスを手で立ち上げていた。 ちゃんと考えれば安価に効率よくできそう。
機械学習で並列化できそうなとこ
ハイパーパラメータの設定を並列化する。 途中経過を定期的に保存しておいて他インスタンスでやる Preemptible VMなので気軽に良いスペックを選べる
学習用アーキテクチャ
App EngineでPull Queueに突っ込むのと同時にインスタンスの数を制御して、 Instance 起動時に startup scriptに仕込む
Cloud Machine Learningがよさそう。
ハイパーパラメータの調整機能 ここの学習の並列化 学習済みモデルのデプロイ
Q&A
Chainer と Tensorflowの違いは? アルゴリズムが違うけど単純に組んだ人が違う。
エンジニアとして知っておくと幸せになれる(かもしれない)機械学習とTensorFlowのこと
スライド: https://goo.gl/o8gBB1
TensorFlow User Groupが立ち上がった。
https://goog.gl/NzrHei ↑ User Group
機械学習の勉強方法わからんすよ。
Step別イメージ
step1:ブラックボックスとして使う 機械学習アルゴリズムを使って
step2: 用途別に呼び出す手法を判断できる scikit-learn alogorithm cheat-sheet どれをやればいいかわかるチートシート
step3: 得られた結果の判断とパラメータチューニング
http://playground.tensorflow.org がいい感じ。
多くの人がstep2 -> step3で脱落している。
数学から逃げずに比較的硬派な本を読むべき
機械学習理論入門、実践機械学習システム, Python 機械学習プログラミング
— 深層学習との関連は? 機械学習はアルゴリズムが取扱えるデータフォーマットへの変換が大きく影響を与える 深層学習では ロウデータを与えまくると向上する。けどパラメータチューニングするところが多くなって分からなくなる。
ImageNetという画像分類のベンチマーク Inception-V3
TensorFlow
2015/11に公開されたOSSで音声認識やスパムフィルタで使われてるらしい。
TensorFlowは深層学習に特化したツールである。というのは勘違いであって、 データフローグラフを利用した数値計算のためのOSSソフトウェアライブラリ
ざっくり言うと 入力から出力までグラフを記述して最後に実行する。 分散処理の実行系。
Tensorflowのパラダイム
Pythonをインターフェースとしているフレームワーク。 機械学習に関しては便利なヘルパーがある。
演算がグラフのノードとなる。 逆ポーランド記法みたいな
プレースホルダー : 学習データが変わって入るよ。という考え方。
セッション: 名前空間みたいなもの。別の環境で同じ関数を実行しているイメージ
多次元の話に拡張 -> テンソルを拡大
ランク 0 -> スカラ 1 -> ベクトル 2 -> 行列 n -> n次元配列
入力を多次元にすると、多次元にできる。
深層学習
入力に対して途中の演算があってアルゴリズムからの出力がある。 アルゴリズムを構成する演算それぞれに、理想的な出力値を返してあげる。 と、フィードバックがたまって人工知能っぽくなる。
tf.contrib.learn
scikit-learnを関数呼び出しの関学でTensorFlowで使えるようなもの。 深層学習以外のアルゴリズムも提供されている。
Keras
tensorflowをBackendとしたもの。
生のTensorFlowrを書くのは辛いのでtf.contrib.learnとかKerasになるかも
Cloud ML
TensorFlownによる学習をクラウド上で実行できる。 ローカルPCでやるのは辛い(スペック的に)
小規模でもGKE
http://www.slideshare.net/lestrrat/
カンファレンスのページの運用は割と技術力が必要 builderscon https://builderscon.io/
kubernetes visualizer
https://github.com/brendandburns/gcp-live-k8s-visualizer
https://github.com/builderscon
ミニマム構成をしている。
小規模構成でも得られるメリット(1)
1 .ノウハウの文章化
Podが最高 Podは複数のコンテナ. pod単位で複製してデプロイできる。
Node Pod内のコンテナは必ず同じNodeに配置される
4.Deploymentsが最高すぎる Deploymentがシステム構成のテンプレート Replica set 実際にデプロイされている構成 Replica set は世代ごとに管理されている
5.kubectl rollout undo とかでrollback できる。
6.kube-lego
Ket’s Encrypt対応 勝手に証明書の確認更新とかがしてくれる。
7.GCPのログが勝手に使える。
イマドキのGAE
google slideでいい感じにしてくれる機能があったりする。
最新の更新情報
App Engine のRelease Notesみればいい。 最新機能追加もなかったように安定したから更新がなくなってきた印象。 SDKは更新なし。repositoryは更新ある(go) 周辺のサービス(Firebase StackDriverなど)
Google app engine Flexible Environment (FE)
旧Managed VM / 自由なライブラリ,ランタイム、環境が利用可能 Dockerコンテナを走らせることができる。
Compute Engineよりは手軽に使えるものだと考えれば結構使えるかも
StackDriver
StackDriver Trace appstatsのサービス版
StackDriver Debugger ブレークポイントを直接置いてデバックできる。
LogVIewer ソースコード連携しとくとそこ見れる。
logger
Pub/Subに投げてCloud Functionsで処理を追加したりできる。
Cloud Endpoint v2
アプリケーション前にプロキシを置くことでAPIの監視、認証周りを実施
GAEは衰退した?
盛り上がりはないけど安定した。 普及気になった?
GCP全体で追うといいかも。
まとめ
いいイベントでした。自分が参加したセッションは席数も割と余裕あったし、キャパ的には余裕そうでした。 Wifiは飛んでなかったけどまあ大学借りてやってるししょうがないよね。