はじめに
こんにちはサイオステクノロジーの小野です。前回はOpenShift AIのデータサイエンスパイプラインを実装して実行しました。今回はそのパイプラインをスケジュール設定により、定期実行する方法を解説します。MLOpsにおいて重要な設定なので、ぜひ覚えて帰ってください。
パイプラインのスケジュールについて
OpenShift AIではパイプラインのスケジュール設定を行うことが可能です。パイプラインの定期実行により、常に最新のモデルAPIを利用することができます。
パイプラインのスケジュール実装例
モデルのデータ対応
今回は2つの画像データを用いて、スケジュールによるモデルの更新を確認します。
- A画像
- 今まで利用してきたMNIST画像です。今までの記事で作成したモデルはこのA画像に対応したモデルになります。
- B画像
- A画像の色を反転させた画像です。
A画像に対応しているモデルAPIをパイプラインのスケジュールによる自動更新により、B画像に対応したモデルに更新します。
パイプライン構成図
今回スケジュール設定を行うパイプラインは前回実行したものと同じになります。詳しくは前回の記事を参照して下さい。(URL)
その構成図を再掲すると以下になります:
このS3内の画像データをA画像からB画像に変更することで自動的にB画像に対応したモデルが作成され、デプロイされます。
前提条件
- OpenShift AI:2.13
- 以前の記事のモデルサービングを実行済み(OpenShift AIのモデルサービング機能について)
- すでにA画像で学習したモデルがデプロイされている状態になります。
- 以前の記事のパイプラインを実行済み(OpenShift AIのデータサイエンスパイプラインについて)
- サービスアカウントの設定を行って、モデルの更新ができる状態にしてください。
- 今回利用するプログラムは以下のリンクからダウンロードしてください。
モデル更新前動作確認
モデル更新前:A画像によるAPIリクエスト実施
JupyterLab上で5_test-api.ipynbを実行してください。なお実行時はコード内のエンドポイントやAPIのトークンのシークレットを各自設定した値に変更してください。
モデル更新前はA画像によって学習が行われたモデルAPIなので、A画像に対して正しい推論が行われていることが確認できます。
モデル更新前:B画像によるAPIリクエスト実施
JupyterLab上で6_test-api-inv.ipynbを実行してください。なお実行時はコード内のエンドポイントやAPIのトークンのシークレットを各自設定した値に変更してください。このプログラムは色が反転したB画像をモデルAPIに送信しています。
モデルAPIは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を押下すると、スケジュール設定できます。
スケジュール設定は以下のように設定します:
- 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にスケジュール設定通りの間隔でパイプラインが実行されます。
学習元データの変更
B画像アップロード
以上の操作で、スケジュールによってモデルの自動更新がされている状態になります。
ここでモデルの更新がされることを確認します。そこで、パイプライン中で取り扱っているA画像をB画像に上書きします。
JupyterLab上で7_dataupload-inv.ipynbを実行してください。これはパイプラインで取り扱うA画像が保存されている場所にB画像を上書きするプログラムです。
モデル更新後動作確認
モデル更新後:B画像によるAPIリクエスト実施
B画像をアップロードしてからパイプラインが実行されるのを確認したら、もう一度JupyterLab上で6_test-api-inv.ipynbを実行してください。B画像に対応したモデルが自動的にデプロイされているので正しく推論できるようになったことが確認できます。
モデル更新後:A画像によるAPIリクエスト実施
次にJupyterLab上で5_test-api.ipynbを実行してください。更新後のモデルAPIはB画像でしか学習していないので、A画像に対しては推論ができていないことが確認できます。
最後に
このようにパイプラインのスケジュール設定を行うと自動的にモデルの更新を行うことができます。MLOpsを実現するにはパイプラインのスケジュール設定が必須だと思います。モデルを常に最新の品質を保つためにもぜひパイプラインを実装して、スケジュール設定してみてください。