Save 37% off PRO during our Black Friday Sale! »

パイプラインツールgokartのタスク競合を解消した話

 パイプラインツールgokartのタスク競合を解消した話

0c2ae3d2aa77423465e1e533ff0d030a?s=128

Daiki Ikeshima

August 28, 2020
Tweet

Transcript

  1. パイプラインツールgokartの タスク競合を解消した(い)話 AI/機械学習チーム 池嶋大樹

  2. 自己紹介 エムスリー AI/機械学習チーム 医師の興味スコア算出モデルの開発 ↑ コンサル 機械学習エンジニア ダムの流入量予測など ↑ 大学院 土木工学専攻 人工衛星を使った河川の氾濫シミュレーション 池嶋大樹

    社会人4年目 エムスリーは2年目 最近はキャンプにややハマり気味
  3. - AIチームではpythonを頻繁に使用 - データパイプライン構築にgokartというライブラリを使用 パイプラインツール: gokart gokart - m3がメインで開発しているOSS -

    spotifyが開発するluigiのラッパー - https://github.com/m3dev/gokart Fringe81さんでも活用されている! https://speakerdeck.com/tenajima/goka rtdao-ru-falsekitukaketoyun-yong-false xian-zhuang
  4. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  5. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  6. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  7. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  8. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  9. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2’ 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  10. ④データやパラメータに変更があった場合には、新し い部分だけをやり直す ②最下流のタスクを実行すると依存する全てのタ スクを実行する パイプラインツール: gokart データ1 データ2’ 特徴量1 作成

    特徴量2 作成 モデル学習 評価 推論 推論結果 推論用 データ 特徴量 作成 ①処理をタスクとしてクラス単位で記述 ③タスク間は中間データとしてキャッシュファイルを 作成してデータをやりとり
  11. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ
  12. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  13. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  14. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  15. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  16. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  17. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同じタスクが存在 ストレージ キャッシュA
  18. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同時に実行 ストレージ
  19. アプリB 問題点: gokartのキャッシュ競合 別アプリケーションから同じタスクを実行するとキャッシュが競合することがある データ タスクA タスク AA タスクA タスクBB

    アプリA 同時に実行 ストレージ キャッシュA キャッシュA
  20. 解決方法の検討 キャッシュの保存先を分ける - キャッシュの保存される場所が違えば競合しえない - 共通するデータも複数実行・保存される無駄がある luigiのcentral scheduler - スケジューラが同じタスクが同時に実行されないか管理

    - スケジューラがスケーラブルではない ファイルをロックする - 同じキャッシュファイルへの同時アクセスを禁じる - k8上で非常に軽量なサーバーを立てておけば可能 アプリB タスクA アプリA タスクA キャッシュA キャッシュA アプリB タスクA アプリA タスクA スケジューラ 常駐Job アプリB タスクA アプリA タスクA キャッシュA mutex 常駐Job
  21. mutex的ロックの実装方法 GCP memorystore - マネージドなredisが使える - 環境ごとにmemorystoreの設定が必要で、アプリケーションと一括管理できない Kubernetes上にredisを立てる - Redisはインメモリで動作するため高速

    - Kubernetes上にたてるにはdeployするためのyamlを用意するだけなので、アプリと一括管理で きる
  22. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service Lock: なし    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/
  23. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service Lock: なし    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/
  24. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service Lock: アプリAのタスクA    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/
  25. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service キャッシュA    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/ 作成中 Lock: アプリAのタスクA
  26. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service キャッシュA    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/ 作成中 Lock: アプリAのタスクA
  27. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service キャッシュA    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/ 作成完了 Lock: なし Lock: なし
  28. 構成図 タスクA Pod A (アプリA) GCS タスクA Pod B (アプリB)

    Redis Redis Pod Redis Service キャッシュA    Kubernetes icons from - https://github.com/kubernetes/community/tree/master/icons - https://cloud.google.com/icons/ 作成完了 Lock: アプリBのタスクA
  29. 結果 - ちゃんとlockできており、キャッシュ競合しなくなった(はず)

  30. 今後と感想 今後 - 現在は社内でテスト中 - 今後、gokartの機能としてgithubにリリース予定 - 「Kubernetes上にRedisを立てる」の部分もgokart-cookiecutterにリリース予定 →社外でも利用可能にする見込み 感想

    - 社内で生じた問題の改善がOSSに反映されるおもしろさを感じた