BETA

Google Cloud Dataflowで分割学習(分散学習じゃないよ)

投稿日:2020-06-09
最終更新:2020-06-09

これはなに?

Dataflowで機械学習の学習部分を複数モデルで学習する。通常、機械学習では学習するモデルは1つであることがほとんどだが、パーソナライズ等でモデルの学習を複数で大量に実行したい場合にDataflowのパイプラインを活用して実装する。

準備

  • Python2系のインストール
  • Googleのアカウント作成
  • GCPの有効化
  • GCP SDKのインストール
  • Dataflowの準備 参考: google
  • サービスアカウントのjsonファイルの作成と環境変数へのセット
  • GCPプロジェクトの作成
  • 以上、これらは他を参考に

サンプル実行

  • githubから取得
  • pip install future
  • wordcountを実行する
  • python wordcount.py --output outputs
  • 上記はlocalで実行するdirect runnerなので実際にはDataflow上では実行していない

分割学習

Bigqueryの準備

  • Kaggleからタイタニックのtrain.csvを取得する
  • GCPのBigQueryに適当なデータセットをつくる
  • train.csvをアップロードしてtitanic_trainというテーブルを作成する
  • 欠損値を埋める
  • UPDATE bq_tutorial.titanic_train SET Embarked='C' WHERE Embarked IS NULL;
  • UPDATE bq_tutorial.titanic_train SET Age=20 WHERE Age IS NULL;

Cloud Storageの準備

  • 適当なバケットを作成し、その中にbinariestempバケットを作成する

APIの有効化

  • GCPコンソールからDataflow APIを有効化する

packageの追加インストール

  • pip install --upgrade google-cloud-bigquery

ソースコード

  • Github
  • 分割処理の部分
query = "SELECT Pclass, Sex, Age, SibSp, Parch, Fare, Embarked, Survived FROM `bq_tutorial.titanic_train`;"  

# パイプライン定義  
(pipeline  
 | "read" >> beam.io.Read(beam.io.BigQuerySource(project=google_cloud_options.project, query=query, use_standard_sql=True))  
 | "map" >> beam.Map(lambda v: (v["Sex"], v))  
 | 'window' >> beam.WindowInto(beam.window.FixedWindows(1))  
 | "group by" >> beam.GroupByKey()  
 | "learn" >> beam.FlatMap(train))  

pipeline.run().wait_until_finish()  

ちょっと説明

  • データを取得→分割する単位のキーでmap
  • [key, [data, data, ...]] というブロックができるので学習処理へ渡す
  • 実行状態はDataflowコンソールで確認できる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@yoko8maの技術ブログ システムと人間について

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう