Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 エムスリー AI/機械学習チーム 医師の興味スコア算出モデルの開発 ↑ コンサル 機械学習エンジニア ダムの流入量予測など ↑ 大学院 土木工学専攻 人工衛星を使った河川の氾濫シミュレーション 池嶋大樹 社会人4年目 エムスリーは2年目 最近はキャンプにややハマり気味

Slide 3

Slide 3 text

- 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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

解決方法の検討 キャッシュの保存先を分ける - キャッシュの保存される場所が違えば競合しえない - 共通するデータも複数実行・保存される無駄がある luigiのcentral scheduler - スケジューラが同じタスクが同時に実行されないか管理 - スケジューラがスケーラブルではない ファイルをロックする - 同じキャッシュファイルへの同時アクセスを禁じる - k8上で非常に軽量なサーバーを立てておけば可能 アプリB タスクA アプリA タスクA キャッシュA キャッシュA アプリB タスクA アプリA タスクA スケジューラ 常駐Job アプリB タスクA アプリA タスクA キャッシュA mutex 常駐Job

Slide 21

Slide 21 text

mutex的ロックの実装方法 GCP memorystore - マネージドなredisが使える - 環境ごとにmemorystoreの設定が必要で、アプリケーションと一括管理できない Kubernetes上にredisを立てる - Redisはインメモリで動作するため高速 - Kubernetes上にたてるにはdeployするためのyamlを用意するだけなので、アプリと一括管理で きる

Slide 22

Slide 22 text

構成図 タスク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/

Slide 23

Slide 23 text

構成図 タスク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/

Slide 24

Slide 24 text

構成図 タスク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/

Slide 25

Slide 25 text

構成図 タスク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

Slide 26

Slide 26 text

構成図 タスク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

Slide 27

Slide 27 text

構成図 タスク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: なし

Slide 28

Slide 28 text

構成図 タスク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

Slide 29

Slide 29 text

結果 - ちゃんとlockできており、キャッシュ競合しなくなった(はず)

Slide 30

Slide 30 text

今後と感想 今後 - 現在は社内でテスト中 - 今後、gokartの機能としてgithubにリリース予定 - 「Kubernetes上にRedisを立てる」の部分もgokart-cookiecutterにリリース予定 →社外でも利用可能にする見込み 感想 - 社内で生じた問題の改善がOSSに反映されるおもしろさを感じた