y.takky てくめも

web技術について勉強会の参加メモだったり、本を読んだメモだったりを載せる予定

devfest tokyo 2016に行ってきた。

gdg-tokyo.connpass.com

に行ってきたのでメモを。 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

  • Terafformがおすすめ。
  • インスタンスの連番とかzoneの自動振り分けとか
  • Cloud DNSとかの設定もできる。

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のパラダイム

  • テンソルの演算グラフを作る
  • 実行単位をセッションとしてまとめる
  • 定数、変数をプレースホルダーとして宣言できて、グラフはCPU/GPUテンカイスル。
  • 分散処理も可能

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 .ノウハウの文章化

  1. Podが最高 Podは複数のコンテナ. pod単位で複製してデプロイできる。

  2. 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は飛んでなかったけどまあ大学借りてやってるししょうがないよね。