ML System Monitoring Tips

TAKASHI NARIKAWA
Eureka Engineering
Published in
16 min readDec 19, 2022

--

目次

はじめに
対象読者
MLシステムのMonitoringについて
−− ML System Montitoring Overview
−− Software system health
−− Data quality and intergrity/ML model quality and relevance
−− Business KPI
ML Monitoring Tool(shapash/evidently) 紹介
−− shapash
−− evidently
ML Monitoring Tool(shapash/evidently) 導入Tips
−− shapash
−− 対応モデル形式でない場合にも、shapashが読み込めるようにする
−− LightGBM Boosterのmodelについて、学習後のモデルについてレポートを出力する
−− evidently
−− 学習に使用したデータとオンラインデータのドリフトを検知する
終わりに
参考文献

はじめに

この記事は「Eureka Advent Calendar 2022」19日目の記事です。

お久しぶりです、エウレカ AIチームのnariです。最近は雀魂を引退してSplatoon 3を毎日楽しくやっています。麻雀に関しては、打つ方は引退してもMリーグは引き続き楽しませてもらっています。パイレーツから推しの石橋選手がいなくなってしまったのでドリブンズ推しに鞍替えして、ドリブンズのファイナル進出をひたすら祈る毎日です。

仕事の方では、7月からSREチームからAIチームに異動しMLOpsエンジニアとして、大きく分けて以下のようなことをしています。

  • AIチームがOwnerのマイクロサービスである、審査システムなどのObservabilityの向上やコスト管理の強化などembedded SREとしての活動
  • MLモデル継続アップデート及び継続学習パイプラインの改善、ML Monitoring Tool(evidently/shapash)の導入

このうち、ML System Monitoring、特にML固有のモデルやデータのMonitoring Tool(evidently/shapash)の導入tipsについて、手短に書いていこうと思います。

対象読者

  • 通常のシステム監視では考慮しない、ML System固有のMonitoring領域について知りたい方

ML System Monitoringについて

ML System Montitoring Overview

Software system health

  • AIエンジニアのための機械学習システムデザインパターン によると、機械学習システムの異常は、1.推論器が異常と2. 推論結果が異常に分類できるとされていますが、こちらは1.推論器の異常、つまりアプリケーションとインフラの異常をチェックするものとなります。また、ML Modelの推論結果を返す仕組みとして、通常のシステムと監視項目は特に変わりません。
  • AIチームに移動してから半年ほど、こちらの強化をembedded SREとして行ってきました。行ってきたことはSREプラクティスの延長ですが、まずは現状の整理をし、Amazon EKSにてサービングしているオンライン推論器のアプリケーションとインフラについて3つのTelemetry、すなわちMetrics、Logs、Tracesを重要かつ不足しているなものについてDatadogやGCP Cloud Loggingを中心とした監視ツールで整備していき、かつ必要なログについてアプリケーション改修で追加し、ゴールデンシグナル(レイテンシー、トラフィック、エラー、サチュレーション)中心に監視可能な状態にし、アクションが必要なものについてはアラートを整備していきました。

Data quality and intergrity/ML model quality and relevance

  • AIエンジニアのための機械学習システムデザインパターンの分類の2. 推論結果が異常にかかる部分の監視、つまり通常のシステム監視にないML固有の監視項目となります。
  • 本番でサービングしたMLモデルは新しいデータを入力として受け取り、このデータは時間の経過とともに変化します。健全に継続的な学習を行っていくためにも、そのデータの傾向が学習時と推論で乖離がないかなど監視していく必要があります。‍ また、ML モデルそのものについても設定しているタスクに適合しているか定期的に確認し、満足いく信頼できる品質である必要があります。
  • 通常のシステムのSREとしてはあまり馴染みのない分野で、今はまだ手探りの状態ですが、現在はオンライン推論環境の監視としてはベーシックに混同行列ベースでPrecisionなどの監視をメインに行なっています。また、モデルのA/Bリリースをこのようなメトリクスベースで自動切り戻しする仕組みの導入などは検討されていますがまだ実施できていません。また、オフライン学習と推論時でのデータのドリフトのレポートを出力したり、オフライン学習時にモデル及び特徴量の詳細の分析レポートについて出力したりと、モデルの性能指標が悪化した際やパフォーマンスチューニングの際などにデータと特徴量などの観点からディープダイブしていける状態を作っていっています。(詳細は後述します。)

Business KPI

  • 最後にビジネス及びプロダクトの KPI があります良い性能のモデルがあったとしても、ユーザーを購入者に変える、何かをクリックさせる、より良い予測を得る、配送コストを削減するなどのビジネス ニーズをみたしていなければなんの意味もありません。モデルに割り当てられた金銭的な価値、測定可能なプロダクトのメトリクス、または最適な間接指標の監視が必要です。
  • こちらに関しては、AIチーム単独で設定することはできませんが日々プロダクト側と適切な指標について議論が交わされています。詳細についてこちらで公表するのは難しいですが、まだまだ改善の余地があるのも事実なのでこちらについて塾考し改善していく必要も感じているのでやっていきたいと思っています。

ここまでML System Monitoringの概要とそれに紐づいたエウレカでの監視状況について説明してきましたが、この中で今回はData quality and intergrity/ML model quality and relevanceの監視強化にむけておこなった、ML Monitoring Tool(shapash/evidently)の導入のお話をさせていただこうと思います。

ML Monitoring Tool(shapash/evidently) 紹介

shapash

Shapashは、”機械学習を誰にとっても解釈可能で理解しやすいものにすること”を目的とした Python ライブラリです。Shapashはダッシュボードをhtml出力する形式と、見たい項目(グラフ)を個別に指定して出力する2つの出力形式をとることができます。具体的になにがみれるのか、というと重要特徴量と予測への貢献度 を表示することができます。特徴量ごとのフィルターや、個別データをピックアップして詳細を見ることができるといった特徴を持っています。

こちらのデモサイトで具体的なデートセットとモデルに対するサンプルレポートをいじることができるので、気になることはこちらからいじってみることをお勧めします。

デモサイトのスクリーンショット

evidently

Evidentlyはモデルやデータのドリフト検知を簡単に行えるPythonライブラリです。

学習環境/オンライン環境での機械学習モデル及びデータについて、以下のような項目に対してレポートを出力することができます。

  • Data Drift
  • Target Drift(Numerical Target Drift, Categorical Target Drift)
  • Model Performance(Regression Performance, Classification Performance, Probabilistic Classification Performance)

Data Driftでは、データセットの各特徴量の分布の可視化および、統計的に分布に差があるかの確認ができます。モデルの挙動をインプットとしてのデータを中心に分析することができるという点が、shapashと最も異なるところといえます。詳細は公式にてドキュメントもチュートリアルも丁寧に整備されているため、こちらから読んでいただくのがわかりやすいかと思います。

ML Monitoring Tool(shapash/evidently) 導入Tips

ここからは、実際にshapsh/evidentlyを入れる際の注意すべき点とユースケースについてお話ししていきます。

shapash

  • 今回作成したkaggle sample notebookはこちら (Titanic datasetを使用)

対応モデル形式でない場合にも、shapashが読み込めるようにする

ShapashはRegression, Binary Classification, Multiclass problemそれぞれの問題に使用できます。また、Catboost, Xgboost, LightGBM, Sklearn Ensemble, Linear models, SVMなど多くのモデルに互換性があるとGithub Repositoryには記載があります。

shapshに互換性があるかどうかをcheckするロジックは以下のようになっていて、scikitlearn系の出力形式であれば通るようになっているようです。(GIthub上でのCodeはこちら)

def check_model(model):
"""
Check if model has a predict_proba method is a one column dataframe of integer or float
and if y_pred index matches x_init index
Parameters
----------
model: model object
model used to check the different values of target estimate predict or predict_proba
Returns
-------
string:
'regression' or 'classification' according to the attributes of the model
"""
_classes = None
if hasattr(model, 'predict'):
if hasattr(model, 'predict_proba') or \
any(hasattr(model, attrib) for attrib in ['classes_', '_classes']):
if hasattr(model, '_classes'): _classes = model._classes
if hasattr(model, 'classes_'): _classes = model.classes_
if isinstance(_classes, np.ndarray): _classes = _classes.tolist()
if hasattr(model, 'predict_proba') and _classes == []: _classes = [0, 1] # catboost binary
if hasattr(model, 'predict_proba') and _classes is None:
raise ValueError(
"No attribute _classes, classification model not supported"
)
if _classes not in (None, []):
return 'classification', _classes
else:
return 'regression', None
else:
raise ValueError(
"No method predict in the specified model. Please, check model parameter"
)

弊社のある Binary Classificationのユースケースでは、Oputuna LightGBM Tunerを使用してハイパーパラメータ自動最適化をし、boosterを出力していて、lightgbm.Booster の形式のmodelを使用しています。そちらをそのままshapshでcompileをすると以下のようなエラーが発生します。

ValueError: 
Type of contributions parameter specified is not compatible with
regression model.
Please check model and contributions parameters.

こちらを解決するには、modelにpredict methodが生えている、かつ_classes attributeが[],None以外の値で設定されていればclassificationタスクのshapash対応モデルとして認識される作りとなっているので、今回のケースの場合_classes attributeを設定するだけで通るようになります。

booster._classes = [0, 1]

LightGBM Boosterのmodelについて、学習後のモデルについてレポートを出力する

  • レポーティングの昨日まで使用する場合は以下のコマンドでreportに必要なmoduleまでインストールする必要があります。
pip install shapash[report]
  • 以下のようにhtml形式で、modelのparamters、featureのヒートマップ、feature importanceの棒グラフ、feature contribution、modelの性能評価までチェックすることができます。特にfeature contributionでは個別データまで確認することができるのもあり、どのfeatureのどの値のレンジのデータが効いているかなども詳細に確認できるので、ここからデータの加工やルールベースの実装に落とし込むなどのアクションをプランニングすることができます。

evidently

  • 今回作成したkaggle sample notebookはこちら (bcancer datasetを使用)

学習に使用したデータとオンラインデータのドリフトを検知する

  • 以下のように、Dashboard methodにてtabsにDataDriftTabを指定することでDataDrift用のレポートを出力できるようになります(そのほかのTarget Drift, Model Performanceのユースケースにについても同じ要領でtabsを追加するだけでレポートに追加することができます)
bcancer_data_and_target_drift_dashboard = Dashboard(tabs=[DataDriftTab(verbose_level=0), 
CatTargetDriftTab(verbose_level=0)])
  • 上記メソッドの返り値のdashboardのSaveメソッドによって、Referenceとして指定したデータセットと、Currentとして指定したデータセットの各特徴量の分布の可視化、統計的に分布に差があるかの確認が可能なレポートを出力することができます。これを用いて、学習に使用したデータとオンラインで推論していっているデータを定期的に比較してドリフトがないか検知することによって、モデルを更新していく際の留意点を事前に認識しておくことができます。(年齢やその他の属性で事前にフィルターしたデータセットの比較なども有用そうです。)

終わりに

  • 今回はML System Monitoringの概要+エウレカの実施状況、ML Monitoring Tool(shapash/evidently)の導入のお話を書かせていただきました。導入したばかりでレポートを用いた具体的なアクションやモデル改善はまだまだ取れていない状況なので、そちらも知見も溜まり次第記事にしていけたらと考えています。
  • また、その他のMLシステム固有の監視指標や、そちらを用いたモデルリリース管理についても知見を貯めていき共有していけたらと考えてますので、その際もチェックしていただけたら幸いです。
  • 明日は BOXP(Keitaro Takeuchi) による「ClusterとJavaScriptで始めるメタバース開発」です。お楽しみに!

参考文献

--

--

TAKASHI NARIKAWA
Eureka Engineering

Site Reliablity Engineer in Tokyo. SRE/devops/Go/AWS/Terraform/Kubernetes/Docker