Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Daiki Ikeshima

August 28, 2020
Tweet

More Decks by Daiki Ikeshima

Other Decks in Programming

Transcript

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

    View Slide

  2. 自己紹介
    エムスリー AI/機械学習チーム
    医師の興味スコア算出モデルの開発

    コンサル 機械学習エンジニア
    ダムの流入量予測など

    大学院 土木工学専攻
    人工衛星を使った河川の氾濫シミュレーション
    池嶋大樹
    社会人4年目
    エムスリーは2年目
    最近はキャンプにややハマり気味

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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/

    View Slide

  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/

    View Slide

  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/

    View Slide

  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

    View Slide

  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

    View Slide

  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: なし

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide