ML Study Jams : Machine Learning トレーニングプログラム - Homeをやってみました。初心者向けと中級者向けの合計12ラボです。
- ML Study Jams : Machine Learning 初心者向けトレーニングプログラム - Home
- Predict Visitor Purchases with a Classification Model in BQML | Qwiklabs
- Predict Taxi Fare with a BigQuery ML Forecasting Model | Qwiklabs
- Google Cloud Speech API: Qwik Start | Qwiklabs
- Cloud Natural Language API: Qwik Start | Qwiklabs
- Speech to Text Transcription with the Cloud Speech API | Qwiklabs
- Entity and Sentiment Analysis with the Natural Language API | Qwiklabs
- ML Study Jams : Machine Learning 中級者向けトレーニングプログラム - Home
- Classify Images of Clouds in the Cloud with AutoML Vision | Qwiklabs
- Detect Labels, Faces, and Landmarks in Images with the Cloud Vision API | Qwiklabs
- Integrating Machine Learning APIs | Qwiklabs
- Classify Text into Categories with the Natural Language API | Qwiklabs
- Awwvision: Cloud Vision API from a Kubernetes Cluster | Qwiklabs
- Real Time Machine Learning with Google Cloud ML | Qwiklabs
AWSは普段利用していますが、GCPはまったく触ったことがなかったのでとても参考になりました。無料でQwiklabsのクーポンコードを配ってくれたGoogleに感謝ですm(_ _)m
トレーニングプログラムで学べたこと
全12ラボを通じて経験できることは以下になります。もちろんそれぞれ触りだけですが、ついでにドキュメントを読んだりすることで雰囲気はそこそこつかめたと思います。あと機械学習というよりは機械学習関連サービスのハンズオンでした。
- 初心者向けコースまで
- 中級者向けコース以降
- Cloud AutoML API
- IAM
- Cloud Storage
- Cloud Vision API
- Service Account
- Cloud Translation API
- Kubernetes
- Cloud Pub/Sub
- Compute Engine
- Cloud Machine Learning Engine
- Cloud Dataflow
Qwiklabsの進め方
一通りやってみて、Qwiklabsの進め方について気がついたことをメモしておきます。
まずは一通りラボの内容を読んでから開始する
ラボの先頭に記載されている通り、まずは一通りラボの内容を読んでから開始したほうがよいです。ラボで利用可能なGCPの利用時間は上限があるので、読みながらやると結構時間ギリギリか、場合によっては足りなくなると思います。実際、私は最初のラボを開始してからこのアドバイスを読んだので、最初のラボは時間ギリギリでした。。そのため、2つ目のラボからは最初に一通り読んで内容を把握した上で開始するようにしました。そのおかげで、実際にGCP上で操作した際の不明点を確認する際も時間に余裕があってよかったです。
GCPコンソールをシークレットウィンドウで開く
Qwiklabsはメインのウィンドウで開くようにして、GCPコンソールをシークレットウィンドウで開くようにした方がよいと考えます。最初にQwiklabsをシークレットウィンドウで開いた状態でGCPコンソールも開いたら、シークレットウィンドウ上にGoogleアカウントが2つログインした状態になってめんどうな感じになりました。そのため、以降はGCPコンソールのみシークレットウィンドウで開くようしました。手順としてはラボで[Open Google Console]で開いたタブのURLをシークレットウィンドウに貼ってログインするようにしていました。
ラボは単体で完結する構成になっている
当たり前なんですが、ラボは単体で完結する構成になっています。そのため、前半の諸注意やGCPアカウント有効化手順などは概ね同じ内容になっています。なので特に初心者向けのラボだと慣れてくると前半は読み飛ばして差分だけサクッと試すみたいな感じになります。
ラボの内容が一部古いことがある
これは仕方ないことなんですが、ラボによっては記述内容と実際に試したGCP側の状況が一致しないケースがありました。GCPサービスの更新にラボの更新が追いついていなかったようです。なので、一致していないケースは更新が追いついていないんだろうなと思って読み飛ばすとよいとかと考えます。とはいえ数箇所でしたし、私がトレーニングプログラムをやっている10日間の間にも(偶然かもしれませんが)修正されていたので、更新頻度は高いのかもしれません。
ラボはクエストという単位でまとめられている
Qwiklabsはクエスト - Qwiklabs ヘルプという単位で複数のラボを1つのまとまりにしています。そしてあるクエストのラボをすべて終了するとバッジがもらえるらしいです。なお、今回の12ラボをすべて終了してもバッチはもらえませんでした。
初心者向けコースのメモ
初心者向けコースは全体的に簡単でした。合計で4時間近くかかりましたが、メモを取りながら気になる点などを調べての時間なので単にハンズオンを試すだけなら3時間もかからないと思います。
- Predict Visitor Purchases with a Classification Model in BQML | Qwiklabs
- roc_auc of 0.91 は高すぎる気が。action_type 入れてるから、これ leakage になってるんじゃw
- Results が飛躍している気が。。もうちょっと丁寧に解説してほしかった。
- Predict Taxi Fare with a BigQuery ML Forecasting Model | Qwiklabs
- 2019-04-29にやって気になる点があったが、2019-05-01にアップデートされていて、気になっていた点が修正されていたw
- Google Cloud Speech API: Qwik Start | Qwiklabs
- Cloud Shellすごい便利!
- Cloud Natural Language API: Qwik Start | Qwiklabs
- Speech to Text Transcription with the Cloud Speech API | Qwiklabs
- Entity and Sentiment Analysis with the Natural Language API | Qwiklabs
- Cloud Natural Language API で紹介しなかった他のAPIについても紹介していた。それぞれのAPIの解説が結構わかりやすかった。また、こちらでは
gcloud
コマンドではなくcrul
コマンドでREST APIを利用していた。 - dependency parse treeも含めて各種APIのデモはCloud Natural Language | Cloud Natural Language API | Google Cloudで試せるのが便利だった。
- Cloud Natural Language API で紹介しなかった他のAPIについても紹介していた。それぞれのAPIの解説が結構わかりやすかった。また、こちらでは
中級者向けコースのメモ
中級者向けコースはさすがに中級者向けだけあって、ソースファイルを読み込んだりしてそれなりに時間がかかりました。合計で6.5時間かかりました。あと、中級者向けコースは公式サイトに記載されている順番通りだとちょっと難しそうだったので、以下に記載した順序でやりました。
Classify Images of Clouds in the Cloud with AutoML Vision
- https://www.qwiklabs.com/focuses/1779?parent=catalog
- AutoML Visionはアップロードした画像に合わせて学習するとのこと。転移学習ベースなんだろうけど、柔軟だなー。
- Cloud AutoML APIは個別に有効化が必要。しかも1分ぐらいかかった。
- 専用のUIページを持っていて、GCPとは別サービスになっていた。
- https://cloud.google.com/automl/ui/vision
- GCPに対するOAuthのクレデンシャルを要求してた。
- 専用のUIページを持っていて、GCPとは別サービスになっていた。
- Set up AutoML Vision
- add-iam-policy-binding でそれぞれ Role 追加してるけど、IAMの画面で確認した感じ最初から全部設定済みに見えたw
- Storage bucket も同じでやはり最初から存在してコマンドを実行しても already exists になった。
- おそらくCloud AutoMLの Set up Now ボタンで関連リソース作成しているのではないかと予想される。
- add-iam-policy-binding でそれぞれ Role 追加してるけど、IAMの画面で確認した感じ最初から全部設定済みに見えたw
- Create a dataset
- "Enable multi-label classification" unchecked
- マルチラベリングできるのなんかすごい。
- https://developers.google.com/machine-learning/glossary/#multi-class
- 用語集のリンク先はリンク文字列とはあってるけど、マルチラベルではなくマルチクラシフィケーション、要は多項分類なのでマルチラベリングの説明ではなかった。
- https://cloud.google.com/vision/automl/docs/prepare
- こっちに例が書いてある。最大20個まで設定できるとのこと。
- "Enable multi-label classification" unchecked
- Inspect images
- 少なくともそれぞれ 100 以上必要とのこと。この辺りの閾値を明示しているのはよいなー。
- Train your model
- すでにUIが変わっていたw
- Generate predictions
Detect Labels, Faces, and Landmarks in Images with the Cloud Vision API
- https://www.qwiklabs.com/focuses/1841?parent=catalog
- Cloud Vision API
- Upload an image to your bucket
- Label Detection
- request.json に LABEL_DETECTION に追加して WEB_DETECTION を指定したらまとめて結果を取得できた。
- mid は machine-generated identifier の略らしい。
- Explore other Vision API methods
- 一通りレスポンスをドキュメントベースで確認した。
- Logo detection
- Safe search detection
- Text detection
Integrating Machine Learning APIs
- https://www.qwiklabs.com/focuses/1726?parent=catalog
- Overview
- 以下のAPIについてPythonのサンプルコードをベースに実行するというもの。初級で一通りやっているはずで、Pythonのコードの雰囲気がわかる。
- Cloud Vision to understand the content of an image
- Cloud Speech-to-Text to transcribe audio to text
- Cloud Translation to translate an arbitrary string to any supported language
- Cloud Natural Language to extract information from text
- 後は、Pythonから実行するためIAMのクレデンシャルファイルを作成しているのは所見だった。
- 以下のAPIについてPythonのサンプルコードをベースに実行するというもの。初級で一通りやっているはずで、Pythonのコードの雰囲気がわかる。
- Service Account
- PythonスクリプトからAPIを実行するためService Accountを作成していた。
- https://cloud.google.com/iam/docs/service-accounts
- コンソール上で個別の権限を指定できない感じだった。そういうものなのかなー?
- https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/create
- 権限に関するオプションが見当たらない。。
- 少しだけドキュメントを読んでみたが、やはりIAM Roleという考え方は存在する。なので、ある程度最初から権限を付与された状態で作成されるってことかなー?
- 最初から他に3つService Accountが存在した。
- ドキュメントに明記されていた。
- まず以下のコマンドで新規にサービスアカウントを作成した。作成後にコンソール上でも追加されることを確認した。
gcloud iam service-accounts create ml-api-test
- 何度か作成して6文字以上とかアンダースコアは使えなくてハイフンしか使えないみたいなエラーメッセージを見た。
- 次に以下のコマンドでサービスアカウントに対するキー(クレデンシャルファイル)を作成した。
gcloud iam service-accounts keys create ml-api-test.json --iam-account ml-api-test@qwiklabs-gcp-XXXXX.iam.gserviceaccount.com
- 作成後はコンソール上でもキーが存在する状態になっていた。
- 最後に GOOGLE_APPLICATION_CREDENTIALS 環境変数にクレデンシャルファイルのパスを指定して利用できるようにした。
export GOOGLE_APPLICATION_CREDENTIALS=/home/googleXXXX_student/ml-api-test.json
- PythonスクリプトからAPIを実行するためService Accountを作成していた。
- Cloud Vision
- Cloud Speech-to-Text
- https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py
- とても短くて、修正箇所は入力ファイルに対してハードコードされている部分を今回用に修正するだけだった。
- https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py
- Cloud Translation
- Cloud Natural Language
- https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py
- 普通に読めば内容を理解できる感じだった。修正箇所は解析対象のテキスト。デフォルトのまま試すとラボと同じ結果になる。
- https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py
Classify Text into Categories with the Natural Language API
- https://www.qwiklabs.com/focuses/1749?parent=catalog
- 前半は簡単だけど、中級なだけに後半になるとBigQueryやPythonスクリプトも利用してちょっと高度な感じになっている。
- Confirm that the Cloud Natural Language API is enabled
- Classify a news article
- コンテンツカテゴリはアド用のカテゴリを流用してそうな気がするw
- Classifying a large text dataset
- Classifying news data and storing the result in BigQuery
- Pythonスクリプト用にService Accountを作成する。
- Integrating Machine Learning APIsと比べてRoleの追加処理があった。やはりRoleを追加するのは自然みたい。Natural Language APIは最初から使えるのかなー?
- BigQueryのテーブルに直接データをinsertしてるけど、BigQueryってそれ自体のデータ格納領域あったんだ。てっきりCloud Storage前提だと思ってた。
- https://cloud.google.com/bigquery/docs/locations?hl=ja
- Cloud Storageとかは外部データソースという扱いだった。
- BigQueryはエディタ上でクエリの妥当性チェックをしてくれるようになっていて、すごい気が利いている。
- 検索結果も先頭の1024byte以降は非表示にしてるとか改行のあるデータもきれいに表示してて、やはりこの辺りはGoogleすごいなーと思う。
- Pythonスクリプト用にService Accountを作成する。
- Cloud Shellも改めて調べてみたが、ほんとよく出来てると思う。これが無料かー。。
- https://cloud.google.com/shell/docs/features
- 複数セッションも当然開ける。
- 逆に単一のセッションを利用している場合、ブラウザ側でアクティブなウィンドウは1つになる。つまり、再接続できるってことだよなこれ。ほんとよく出来てる。
Awwvision: Cloud Vision API from a Kubernetes Cluster
- https://www.qwiklabs.com/focuses/1241?parent=catalog
- Kubernetesを利用するのはちょっとごつい感じだけど、手順自体は結構シンプルだった。
- Create a Kubernetes Engine cluster
- 3分ぐらいかかった。
- コマンド実行後、K8s EngineとCompute Engineのコンソールでも確認できた。
gcloud container clusters get-credentials awwvision
- クレデンシャル情報を取得して .kube/config に記録する。で、その情報を前提に次の kubectl コマンドが利用できる。実際 .kube/config をリネームしたら kubectl コマンドが利用できなかった。
- 3分ぐらいかかった。
- Get the Sample
- cloud-vision/python/awwvision at master · GoogleCloudPlatform/cloud-vision
- 一通りソースを読んでみた。概ね理解できた。
- メインとなる Makefile でそれぞれのサブディレクトリ配下の redis / webap / worker の Makefile をキックしていた。
- それぞれのサブディレクトリ内の構成も似ていて、spec.yaml が存在し、これでそれぞれのアプリケーションをK8s上にデプロイするようにしていた。
- webapp と worker はPythonのコードが存在しており、まず Dockerfile でDockerイメージをビルドして、GCRに push する構成になっていた。
- webapp と worker はCloud Pub/Subで連携する構成になっていて、webapp の start_crawler 関数で pubsub を経由して worker 側の scrape_reddit_task 関数を実行する構成にしていた。で、Redisを共有してクローリングしたデータを共有する構成になっていた。
- cloud-vision/python/awwvision at master · GoogleCloudPlatform/cloud-vision
- Deploy the sample
- 事前に確認していた通り、docker buildしてimageをContainer Registryにpushしていた。実際にコンソールでも確認できた。
- https://cloud.google.com/container-registry/docs/
- 要はAWSでいうECRだよね。
- 5分かからないぐらい?
- 完了後にK8sのWorkloadsで確認したら3つ登録されいた。Podsは合計5で、つまり2つの仮想マシン上に5つのDockerコンテナを起動してるってことだろうな。
- 事前に確認していた通り、docker buildしてimageをContainer Registryにpushしていた。実際にコンソールでも確認できた。
- Check the Kubernetes resources on the cluster
- ブラウザでアクセスしたらちゃんと表示できた。
- Pub/SubにTopicもできていたけど、メッセージはSubscriberを作成しないと見れない感じだった。
- ソースさえ読めば概ね把握できる。あとはK8sとCloud Pub/Subをどこまで深掘りするか次第って感じ。それぞれ別のラボをやってもいいかも。
Real Time Machine Learning with Google Cloud ML
- https://www.qwiklabs.com/focuses/3393?parent=catalog
- Overview
- 以下のクエストを前提としている感じで書いてあるが、実際にはこのラボ単体で試せるようになっている。
- Preparing your Environment
- Get started
- "Click the SSH link to the right of the single VM instance that is listed to connect to the console of the VM via SSH."
- "This TensorFlow model was trained using the techniques covered in the previous labs in the Data Science on Google Cloud Platform: Machine Learning quest"
- つまり、事前のラボでモデルの作成を経験できるっぽい。
- "The source data for this exercise was copied in to this location for you when the lab was launched."
- モデル自体はラボ側で準備してくれてるので事前のラボをやらなくても問題ない。
- ML EngineはAI Platformの中にあった。
- Configure Java components.
- https://github.com/GoogleCloudPlatform/data-science-on-gcp/tree/master/10_realtime/chapter10/src/main/java/com/google/cloud/training/flights
- 1パッケージだけど、ソースファイルがそこそこある。
- ざっくり見てみたが、いくつかの用途別のクラスが存在する模様。基本は FlightsMLService.java だけでよくて、これは単体で概ね完結している感じだった。
- 使ってるのはBeanの Flight 型ぐらいみたい。
- 事前に作成しておいたML-Engineのモデルを使って予測するぐらいの内容で、とてもシンプルだった。
- Start the real-time simulation script
- https://github.com/GoogleCloudPlatform/data-science-on-gcp/tree/master/04_streaming
- https://github.com/GoogleCloudPlatform/data-science-on-gcp/blob/master/04_streaming/simulate/simulate.py
- だいたい分かった。BigQueryのテーブルにフライト情報が存在する前提で、テーブルから取得したフライト情報をwaitかけつつひたすらPub/Subのtopicにpublishしているだけだった。
- Start the real-time prediction service
- 結局、AddRealtimePrediction の方をCloud Dataflowに紐付けて起動していた。で、AddRealtimePrediction を起点にパッケージのソースを一通り確認した。
- AddRealtimePrediction が PubSubBigQuery を io として利用する。
- PubSubBigQuery は PubSubInput のサブクラスで、その更に親が InputOutput になっている。この InputOutput#addPredictionInBatches において FlightsMLService を利用している。後は、PubSubBigQuery#writeFlights で addPredictionInBatches メソッドを呼び出している。
- Cloud Dataflowのコンソールで実際に動いてるのがわかる。
- それぞれのステップがどのような状況とかログも見れるようになってる。これはすごい感じがする(゚д゚)!
- いくつかエラーが発生していることもわかる。
- 最後までフローが進まないとBigQueryに書き込まれないので直後だと predictions テーブルがなかった。
- GCEのコンソールを見たら、Dataflow用のインスタンスが起動していた。
- それぞれのステップがどのような状況とかログも見れるようになってる。これはすごい感じがする(゚д゚)!
- 結局、AddRealtimePrediction の方をCloud Dataflowに紐付けて起動していた。で、AddRealtimePrediction を起点にパッケージのソースを一通り確認した。
- https://cloud.google.com/dataflow/
- Apache Beam を使用
- https://beam.apache.org/
- そうそう、Javaのコードでも結構パッケージを見かけた。
- https://beam.apache.org/get-started/beam-overview/
- Pythonも対応していた。
- https://cloud.google.com/dataflow/docs/guides/using-monitoring-intf
- あくまでもBeamのパイプラインを可視化していることがわかった。
- Apache Beam を使用
最後に
普段はAWSしか使っていないので、GCPを触ってみていろいろと新鮮でした。やはり似たようなサービスは複数触らないと相対化して評価できないので、今後も機会があればGCPを触っていきたいと思いました。