Skip to content

チャレンジャーモデル

チャレンジャーモデルは、現在デプロイされているモデル(チャンピオンモデル)と比較できる代替モデルです。 これにより、本番環境で新しいモデルをテストしてパフォーマンスを比較し、チャンピオンをより高性能なチャレンジャーに置き換えるかどうかについて、データに基づいた意思決定を行うことができます。 このページでは、チャレンジャーモデルの作成、管理、および操作方法について説明します。

ベストプラクティス

チャレンジャーを使用するケース

  • A/Bテスト:本番環境で、現在のチャンピオンに対して新しいモデルをテストします。
  • モデルの検証:チャンピオンを置き換える前に、新しいモデルが良好に動作することを検証します。
  • パフォーマンス比較:複数のモデル候補を同時に比較します。
  • リスクの軽減:異なる特性(アルゴリズム、特徴量セットなど)を持つモデルをテストします。

チャレンジャーの管理

  1. 命名規則:モデルのタイプや目的を示す、わかりやすい名前を使用します(例:"XGBoost_v2_Challenger")。
  2. アクティブなチャレンジャーモデルの制限:チャレンジャーが多すぎると予測パフォーマンスに影響する可能性があります。通常は2〜3個で十分です。
  3. パフォーマンスの監視:チャレンジャーをチャンピオンに昇格させる決定を下す前に、チャレンジャーのパフォーマンス指標を定期的に確認してください。
  4. クリーンアップ:評価が終わったチャレンジャーを削除して、デプロイの状態を整理された状態に保ちます。
  5. ドキュメント化:各チャレンジャーが作成された理由と、チャンピオンとの違いを記録しておきます。

前提条件

チャレンジャーモデルを作成する前に、以下が揃っていることを確認してください。

  • 使用可能な登録済みモデルバージョン(モデルパッケージ)。
  • 適切に設定された予測環境。
  • デプロイでチャレンジャーモデルが有効化されていること。
  • テストまたは比較したい内容の把握。

チャレンジャーモデルの作成

チャレンジャーモデルを作成するには、デプロイ、モデルパッケージ(登録済みモデルバージョン)、および予測環境が必要です。 チャレンジャーは、指定されたモデルパッケージと予測環境を使用して、チャンピオンモデルと並行して予測を行います。

基本的なチャレンジャーモデルの作成

import datarobot as dr

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')

# Get a model package (registered model version) to use as challenger
project = dr.Project.get('6527eb38b9e5dead5fc12491')
model = project.get_models()[0]
registered_model_version = dr.RegisteredModelVersion.create_for_leaderboard_item(
    model_id=model.id,
    name="Challenger Model Version",
    registered_model_name='My Registered Model'
)

# Get a prediction environment
prediction_environments = dr.PredictionEnvironment.list()
prediction_environment = prediction_environments[0]

# Create the challenger
challenger = dr.Challenger.create(
    deployment_id=deployment.id,
    model_package_id=registered_model_version.id,
    prediction_environment_id=prediction_environment.id,
    name='Elastic-Net Classifier Challenger'
) 

完了を待機してチャレンジャーを作成する

デフォルトでは、チャレンジャーの作成は非同期で行われます。 作成が完了するまでの最大待機時間を指定できます。

# Wait up to 600 seconds for creation to complete
challenger = dr.Challenger.create(
    deployment_id=deployment.id,
    model_package_id=registered_model_version.id,
    prediction_environment_id=prediction_environment.id,
    name='Random Forest Challenger',
    max_wait=600
) 

チャレンジャーの一覧表示

デプロイに関連付けられているすべてのチャレンジャーを取得できます。

デプロイのすべてのチャレンジャーを一覧表示する

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
challengers = dr.Challenger.list(deployment_id=deployment.id) 

list_challengers()メソッドを使用することもできます。

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
challengers = deployment.list_challengers()

for challenger in challengers:
    print(f"{challenger.name}: {challenger.id}") 

特定のチャレンジャーの取得

IDを指定して単一のチャレンジャーを取得するには:

challenger = dr.Challenger.get(
    deployment_id='5c939e08962d741e34f609f0',
    challenger_id='5c939e08962d741e34f609f1'
) 

チャレンジャーのプロパティへのアクセス

challenger = dr.Challenger.get(
    deployment_id=deployment.id,
    challenger_id='5c939e08962d741e34f609f1'
) 

チャレンジャーモデルの更新

チャレンジャーモデルの名前と予測環境を更新できます。

チャレンジャーモデル名の更新

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
challenger = deployment.list_challengers()[0]
challenger.update(name='Updated Challenger Name') 

予測環境の更新

# Get a different prediction environment
prediction_environments = dr.PredictionEnvironment.list()
new_environment = prediction_environments[1]

challenger.update(prediction_environment_id=new_environment.id) 

名前と予測環境の両方を更新するには:

challenger.update(
    name='Final Challenger Name',
    prediction_environment_id=new_environment.id
) 

チャレンジャーの削除

デプロイからチャレンジャーを削除するには:

challenger = dr.Challenger.get(
    deployment_id=deployment.id,
    challenger_id='5c939e08962d741e34f609f1'
)
challenger.delete()

# Verify deletion
challengers = deployment.list_challengers()
challenger_ids = [c.id for c in challengers] 

チャレンジャー設定の管理

デプロイのチャレンジャーモデルの有効化/無効化や、チャレンジャー関連の設定を行えます。

チャレンジャー設定の取得

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
settings = deployment.get_challenger_models_settings() 

チャレンジャー設定の更新

デプロイのチャレンジャーモデルを有効または無効にするには:

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
deployment.update_challenger_models_settings(challenger_models_enabled=True) 

チャレンジャーモデルを無効にするには:

deployment.update_challenger_models_settings(challenger_models_enabled=False) 

チャレンジャーの予測の操作

チャレンジャーはチャンピオンモデルと並行して予測を行うため、パフォーマンスを比較できます。

チャレンジャー予測の仕組み

チャレンジャーが有効な場合、デプロイに対して行われた予測はチャレンジャーモデルによってもスコアリングされます。 これにより以下が可能になります。

  • チャンピオンとチャレンジャーの間で予測出力を比較する。
  • チャレンジャーのパフォーマンス指標を監視する。
  • モデルの置き換えについて、情報に基づいた意思決定を行う。

チャレンジャーモデルのスコアリング

既存の予測リクエストに対してチャレンジャーのスコアリングをトリガーできます。

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
# Score challengers for predictions with a specific timestamp
deployment.score_challenger_predictions(timestamp='2024-01-15T10:00:00Z') 

一般的なワークフロー

異なるモデルから複数のチャレンジャーを作成する

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
project = dr.Deployment.get(deployment_id=deployment.id).model['project_id']
project = dr.Project.get(project)

# Get top 3 models from the project
models = project.get_models()[:3]
prediction_environment = dr.PredictionEnvironment.list()[0]

challengers = []
for i, model in enumerate(models):
    registered_model_version = dr.RegisteredModelVersion.create_for_leaderboard_item(
        model_id=model.id,
        name=f"Challenger {i+1}",
        registered_model_name=f'Challenger Model {i+1}'
    )
    challenger = dr.Challenger.create(
        deployment_id=deployment.id,
        model_package_id=registered_model_version.id,
        prediction_environment_id=prediction_environment.id,
        name=f'{model.model_type} Challenger'
    )
    challengers.append(challenger)

print(f"Created {len(challengers)} challengers") 

チャレンジャー情報の比較

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
challengers = deployment.list_challengers()

print("Challenger Comparison:")
print(f"{'Name':<40} {'Model Type':<30} {'Model Package ID':<20}")
print("-" * 90)
for challenger in challengers:
    model_type = challenger.model.get('type', 'Unknown')
    model_package_id = challenger.model_package.get('id', 'Unknown')
    print(f"{challenger.name:<40} {model_type:<30} {model_package_id:<20}") 

古いチャレンジャーモデルのクリーンアップ

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')
challengers = deployment.list_challengers()

# Delete challengers older than a certain date or based on criteria
# Example: delete challengers with specific naming pattern
for challenger in challengers:
    if 'Old' in challenger.name:
        print(f"Deleting challenger: {challenger.name}")
        challenger.delete() 

チャレンジャーを新しいモデルに置き換える

deployment = dr.Deployment.get(deployment_id='5c939e08962d741e34f609f0')

# Get existing challenger
old_challenger = deployment.list_challengers()[0]

# Create new model version
# Get a different model
new_model = project.get_models()[1]
new_registered_model_version = dr.RegisteredModelVersion.create_for_leaderboard_item(
    model_id=new_model.id,
    name="Updated Challenger Version",
    registered_model_name='Challenger Model'
)

# Delete old challenger
old_challenger.delete()

# Create new challenger with same name but new model
new_challenger = dr.Challenger.create(
    deployment_id=deployment.id,
    model_package_id=new_registered_model_version.id,
    prediction_environment_id=old_challenger.prediction_environment['id'],
    name=old_challenger.name
) 

注意事項

  • チャレンジャーの作成は非同期プロセスです。 max_waitパラメーターは、作成完了まで待機する時間を制御します。
  • 1つのデプロイに対して、複数のチャレンジャーモデルを同時にアクティブにできます。
  • チャレンジャーはチャンピオンと同じ予測リクエストを使用するため、直接比較が可能です。
  • チャレンジャーが参照している間は、チャンピオンモデル(現在デプロイされているモデル)を削除することはできません。
  • チャレンジャーモデルは、デプロイと互換性のある予測環境を使用する必要があります。
  • チャレンジャーに使用するモデルパッケージは、チャンピオンモデルと同じターゲットタイプおよび互換性のある設定を持っている必要があります。