OpenShift AIのパイプラインにスケジュール設定してみた

はじめに

こんにちはサイオステクノロジーの小野です。前回はOpenShift AIのデータサイエンスパイプラインを実装して実行しました。今回はそのパイプラインをスケジュール設定により、定期実行する方法を解説します。MLOpsにおいて重要な設定なので、ぜひ覚えて帰ってください。

パイプラインのスケジュールについて

OpenShift AIではパイプラインのスケジュール設定を行うことが可能です。パイプラインの定期実行により、常に最新のモデルAPIを利用することができます。

パイプラインのスケジュール実装例

モデルのデータ対応

今回は2つの画像データを用いて、スケジュールによるモデルの更新を確認します。

  • A画像
    • 今まで利用してきたMNIST画像です。今までの記事で作成したモデルはこのA画像に対応したモデルになります。
  • B画像
    • A画像の色を反転させた画像です。

今回用いるデータ。A画像は今まで利用してきた画像。B画像はA画像の色を反転させた画像。モデルAPIをA画像に対応したモデルからB画像に対応したモデルに更新する。

A画像に対応しているモデルAPIをパイプラインのスケジュールによる自動更新により、B画像に対応したモデルに更新します。

パイプライン構成図

今回スケジュール設定を行うパイプラインは前回実行したものと同じになります。詳しくは前回の記事を参照して下さい。(URL)

その構成図を再掲すると以下になります:

パイプラインの構成図

このS3内の画像データをA画像からB画像に変更することで自動的にB画像に対応したモデルが作成され、デプロイされます。

前提条件

モデル更新前動作確認

モデル更新前:A画像によるAPIリクエスト実施

JupyterLab上で5_test-api.ipynbを実行してください。なお実行時はコード内のエンドポイントやAPIのトークンのシークレットを各自設定した値に変更してください。

モデル更新前はA画像によって学習が行われたモデルAPIなので、A画像に対して正しい推論が行われていることが確認できます。

モデル更新前のA画像に対する推論結果。推論と実際の結果が一致しているのが確認できる。

以前の記事でデプロイしたモデルはA画像で学習している。したがって、A画像の推論はうまくいく。

モデル更新前:B画像によるAPIリクエスト実施

JupyterLab上で6_test-api-inv.ipynbを実行してください。なお実行時はコード内のエンドポイントやAPIのトークンのシークレットを各自設定した値に変更してください。このプログラムは色が反転したB画像をモデルAPIに送信しています。

モデルAPIはB画像を学習していないので、推論した画像の数字と実際の画像の数字が一致しないことが確認できます。

モデル更新前のB画像に対する推論結果。推論と実際の結果が一致していないのが確認できる。

デプロイされているモデルはA画像でしか学習していないのでB画像の推論はうまくいかない。

スケジュール設定

パイプラインのエクスポート

JupyterLab上で4_pipeline-demo.pipelineファイルを開いてください。このパイプラインファイルをKubeflow Pipelines形式のyamlファイルにエクスポートしてください。詳しくは前回の記事を参照してください。(URL)

エクスポートしたyamlの一部が以下になります。デフォルトだとパイプラインのキャッシング機能がオンになっていますが、今回構築したパイプラインはキャッシング機能がついていると毎回の実行が省略されてしまいます。スケジュール設定によって毎回実行してほしいのでキャッシング機能をオフにします。そのためにenableCacheをfalseに設定します。

root:
  dag:
    tasks:
      run-a-file:
        cachingOptions:
          enableCache: false # enableCacheをfalseに変更する
        componentRef:
          name: comp-run-a-file
        taskInfo:
          name: 1_dataprocessed
      run-a-file-2:
        cachingOptions:
          enableCache: false # enableCacheをfalseに変更する
        componentRef:
          name: comp-run-a-file-2
        dependentTasks:
        - run-a-file
        taskInfo:
          name: 2_training
      run-a-file-3:
        cachingOptions:
          enableCache: false # enableCacheをfalseに変更する
        componentRef:
          name: comp-run-a-file-3
        dependentTasks:
        - run-a-file-2
        taskInfo:
          name: 3_modeldeploy
schemaVersion: 2.1.0
sdkVersion: kfp-2.8.0

パイプラインのインポート

編集したyamlファイルをパイプラインサーバーにインポートします。Import Pipelineを押下して、パイプライン名を記入して、upload fileでyamlファイルをアップロードします。

パイプラインのインポート

パイプラインのスケジュール設定

作成したパイプラインのActionsから、Create Scheduleを押下すると、スケジュール設定できます。

Create scheduleを押下するとスケジュール設定が行える

スケジュール設定は以下のように設定します:

  • Experiment:Default
  • Name:スケジュール名
  • Trigger type:Periodic(スケジュール設定する形式を指定)
  • Run every:実行する間隔を指定(今回はモデルの更新を確認するだけなので5分程度の間隔で十分です)
  • Maximum concurrent runs:10(並行して実行するパイプラインの最大数)
  • Start date:オフ(スケジュール実行の始める日にちを指定)
  • End date:オフ(スケジュール実行が終わる日にちを指定)
  • Catch up:オン(スケジュールが遅れた場合、本来のスケジュールに追いつく必要があるかどうかの設定)
  • Pipeline:スケジュール設定するパイプラインを指定
  • Pipeline version:スケジュール設定するパイプラインのバージョンを指定

スケジュール設定

パイプラインのスケジュール実行

スケジュールを実行するとパイプラインのRunsのSchedulesに追加されます。

パイプラインのスケジュール

Runsにスケジュール設定通りの間隔でパイプラインが実行されます。

パイプラインのスケジュール実行。設定した5分間隔でパイプラインが実行されているのが確認できる。

学習元データの変更

B画像アップロード

以上の操作で、スケジュールによってモデルの自動更新がされている状態になります。
ここでモデルの更新がされることを確認します。そこで、パイプライン中で取り扱っているA画像をB画像に上書きします。

JupyterLab上で7_dataupload-inv.ipynbを実行してください。これはパイプラインで取り扱うA画像が保存されている場所にB画像を上書きするプログラムです。

A画像が保存されている場所にB画像を上書きする。

モデル更新後動作確認

モデル更新後:B画像によるAPIリクエスト実施

B画像をアップロードしてからパイプラインが実行されるのを確認したら、もう一度JupyterLab上で6_test-api-inv.ipynbを実行してください。B画像に対応したモデルが自動的にデプロイされているので正しく推論できるようになったことが確認できます。

モデル更新後のB画像に対する推論結果。推論と実際の結果が一致しているのが確認できる。

パイプラインが実行されてB画像を学習したモデルがデプロイされたのでB画像の推論がうまくいく。

モデル更新後:A画像によるAPIリクエスト実施

次にJupyterLab上で5_test-api.ipynbを実行してください。更新後のモデルAPIはB画像でしか学習していないので、A画像に対しては推論ができていないことが確認できます。

モデル更新後のA画像に対する推論結果。推論と実際の結果が一致していないのが確認できる。

B画像でしか学習していないモデルなのでA画像に対してはうまく推論できない。

最後に

このようにパイプラインのスケジュール設定を行うと自動的にモデルの更新を行うことができます。MLOpsを実現するにはパイプラインのスケジュール設定が必須だと思います。モデルを常に最新の品質を保つためにもぜひパイプラインを実装して、スケジュール設定してみてください。

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です