モデルの接続と開発チュートリアル:教師あり機械学習モデルの本番運用への移行

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

4. チュートリアル - モデルを本番運用に移行する

このチュートリアルを進める前に、モデリングプロジェクトのセットアップとモデルのトレーニングのチュートリアルを完了してください。必要に応じて、モデルの評価のチュートリアルも完了してください。この時点で、モデリング目標にモデルが1つ以上あるはずです。

このチュートリアルのステップでは、機械学習モデルを本番環境で使用するための設定を行います。

  1. モデリング目標でモデルをリリースする。
  2. バッチ処理用のバッチデプロイを作成する。
  3. モデル用の対話型ライブエンドポイントを作成する。

4.1 モデリング目標でモデルをリリースする

モデルが用意できたので、本番環境にデプロイできます。このモデルの用途に応じて、いくつかの方法から本番運用への移行方法を選べます。モデルは Modeling Objectives からデプロイできます。Modeling Objectives は、ドキュメント、評価、元となる複数のモデルからの提出モデルの比較をサポートする、充実したリリース管理とモデル管理の機能を提供します。

Modeling Objectives からのデプロイには、次の方法があります。

  • バッチデプロイ: データセットの予測を生成します。レコードのグループに対して予測を一括で計算する場合に推奨します。
  • ライブデプロイ: REST エンドポイントを介してモデルをホストします。外部システムからモデルを使用する場合や、モデルとのリアルタイムの対話が必要な場合に推奨します。
  • Python トランスフォーム: トランスフォームで素早く反復作業を行うのに役立ちます。

また、より軽量なセットアップを好むユーザーは、Code Repositories でバッチ推論を実行するチュートリアルの説明に従って、バッチ推論用のトランスフォームにモデルをインポートできます。モデリング目標を作成せずに、直接デプロイを使用して REST エンドポイントを介してモデルをデプロイすることもできます。

Modeling Objectives のライブデプロイと直接デプロイの違いについては、詳しくはこちらをご覧ください。

モデリング目標のリリースとは?

バッチデプロイとライブデプロイは、モデルのリリースを元にしています。モデリング目標で新しいモデルをリリースすると、そのモデリング目標のデプロイは、新しくリリースされたモデルを使用するように自動的にアップグレードされます。

これにより、モデルの利用者は具体的な実装を気にせずにモデルを使用できます。データサイエンティストはモデルの改善に集中し、アプリケーション開発者は有用なアプリケーションの構築に集中できます。

リリース管理

リリースとデプロイは、ステージングと本番に分類されます。モデル開発者は、本番リリースの前にステージング環境にモデルをリリースできます。これにより、本番デプロイは変更されず、ステージングデプロイがアップグレードされます。その後、データサイエンティストやアプリケーション開発者は、モデルを本番運用に移行する前にステージング環境で新しいモデルをテストできます。

すべてのリリースと、モデルをリリースした担当者が記録されるため、チームはいつどのモデルが使用されたかを追跡できます。これは、GDPR や EU AI Act で求められるような、規制に関する質問に回答する際に役立ちます。

アクション: モデリング目標のホームページに移動し、リリースセクションまでスクロールします。ステージングにリリースを選択し、次に矢印アイコンを選択してモデルを本番環境にリリースします。リリースには「1.0」などのリリース番号を指定する必要があります。

モデリング目標でモデルをステージングにリリースする

4.2 バッチ処理用のバッチデプロイを作成する方法

バッチデプロイは、入力データセットから Foundry のトランスフォームを作成します。バッチデプロイの出力は、モデルを使用して入力データセットに対して推論(予測の生成)を実行した結果のデータセットです。

アクション: デプロイを作成するをクリックし、本番用のバッチデプロイを設定します。デプロイの名前を Batch deployment、説明を Production batch deployment にします。先ほど作成した housing_inference_data データセットを入力データセットとして選択し、data フォルダーに house_price_predictions という名前の新しい出力データセットを作成します。デプロイを作成するを選択して設定を保存します。

モデリング目標の設定でデプロイを作成する

モデリング目標の設定でバッチデプロイを設定する

これで、新しいモデルがリリースされるたびに出力データセットが自動的に更新されるよう、バッチデプロイをスケジュールできます。これにより、常に最良の予測を使用できます。出力データセットにスケジュールを追加し、新しいロジックを受け取るたびに出力データセットが再ビルドされるようにします。

アクション: デプロイのテーブルでバッチデプロイを選択します。house_price_predictions という名前の出力データセットを選択します。すべてのアクションで、スケジュールの管理を選択します。house_price_predictions データセットで、新しいスケジュールを作成 -> 複数の時間またはイベント条件が満たされたときを選択し、house_price_predictions データセットが新しいロジックを受け取ったときを条件にします。最後に、保存を選択してスケジュールを保存します。

モデリング目標でバッチデプロイを開く

モデリング目標のバッチデプロイで出力データセットを開く

空のデータセットのスケジュールを管理する

モデリング目標から出力されるデータセットに新しいロジックのスケジュールを作成する

最後に、house_price_predictions データセットはまだ更新していないため、これを実行して予測を生成できます。ビルドが完了したら、house_price_predictions データセットを開き、prediction 列で新たに生成された予測を確認できます。

アクション: スケジュール表示で今すぐ実行を選択して、house_price_predictions データセットをビルドします。ビルドが完了したら、house_price_predictions データセットを右クリックして開くを選択すると、出力データセットを開いて生成された予測を確認できます。

モデリング目標から出力されるデータセットで新しいロジックのスケジュールを実行する

バッチデプロイの出力データセットを表示する

4.3 モデルのインタラクティブなライブエンドポイントを作成する方法

ライブデプロイメントは、REST エンドポイント経由で本番モデルをホストする、クエリ可能なエンドポイントです。ライブデプロイメントは、モデルを対話的に操作する場合に便利で、次の場所からクエリできます。

  • Functions on Models:Functions on Models を使用すると、Foundry の Slate または Workshop アプリケーションからモデルに直接クエリできます。
  • リアルタイムの外部システム: たとえば、ユーザーの行動からリアルタイムで予測を生成する必要がある Web サイトです。
  • CURL: モデルをローカルでテストするために使用します。

この例では、ユーザーが国勢調査地区の詳細を入力し、それが住宅価格の中央値にどのような影響を与えるかを確認できる、インタラクティブなダッシュボードを作成することが考えられます。

ライブデプロイメントを作成する権限は、バッチデプロイメントを作成する権限とは別に設定できるため、上記のバッチデプロイメントを作成できた場合でも、この選択肢は利用できないことがあります。利用できない場合は、Palantir サポートにお問い合わせください。

アクション: オブジェクティブのホームページから、デプロイメントを作成をクリックし、本番のライブデプロイメントを設定します。デプロイメントの名前を Live deployment、説明を Production live deployment にします。デプロイメントを作成をクリックして、設定を保存します。

モデリングオブジェクティブの設定でデプロイメントを作成する

モデリングオブジェクティブの設定でライブデプロイメントを設定する

ライブデプロイメントの起動には数分かかる場合があります。初期化が完了すると、モデルに接続するリアルタイムの業務アプリケーションを設定できます。

アクション: ライブデプロイメントを選択します。デプロイメントのアップグレードが完了したら、クエリタブを開きます。以下の例を貼り付け、実行を選択してモデルをテストします。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 { "df_in": [ { "housing_median_age": 33.4, "total_rooms": 1107.0, "total_bedrooms": 206, "population": 515.3, "households": 200.9, "median_income": 4.75 } ] }

モデリングオブジェクティブでライブデプロイメントを開く

モデリングオブジェクティブのライブデプロイメントでクエリタブを開く

オプション: クエリのテキストボックスに例のクエリを入力した状態で、コピーアイコンを選択して、モデルをローカルでテストするために使用できる CURL リクエストの例をコピーします。<BEARER_TOKEN>、、および <DEPLOYMENT_RID> を、Foundry 環境とライブデプロイメントに合わせて更新する必要があります。ユーザートークンの生成に関するドキュメントに従って、<BEARER_TOKEN> を生成できます。

Copied!
1 curl --http2 -H "Content-Type: application/json" -H "Authorization: <BEARER_TOKEN>" -d '{"requestData":[ { "housing_median_age": 33.4, "total_rooms": 1107.0, "total_bedrooms": 206, "population": 515.3, "households": 200.9, "median_income": 4.75 } ], "requestParams":{}}' --request POST <STACK>/foundry-ml-live/api/inference/transform/<DEPLOYMENT_RID>
Foundry はライブデプロイメントを自動的に終了しません

ライブデプロイメントは、継続的に稼働するサーバーを使用します。一度起動すると、Foundry はステージングまたは本番のデプロイメントを自動的に終了しません。ライブデプロイメントには高額な費用がかかる場合があるため、チュートリアルが完了したら、必ずこのライブデプロイメントを無効にするか削除してください。一方、直接デプロイメントは、ゼロまでスケールダウンし、必要に応じてサーバーを起動するように設定できます。ただし、最初の呼び出しでは、サーバーが起動する間、レスポンスに時間がかかります。

ライブデプロイメントの表示画面にあるアクションのドロップダウンから、ライブデプロイメントを無効にするか削除できます。

次のステップ

ここまでで、機械学習プロジェクトのセットアップ、新しいモデルの構築、性能の評価、デプロイが完了し、モデルを業務で使用する準備が整いました。

チュートリアルのまとめを読む前に、モデルの新しいバージョンをトレーニングして評価し、新しい本番リリースを作成してデプロイメントを更新することを検討してください。代わりに、以下のロジックを使用して、scikit-learn と新しい派生プロパティ housing_age_per_income でランダムフォレスト回帰モデルをトレーニングできます。以下のコードを使用するために、モデルアダプターのロジックを更新する必要はありません。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 from transforms.api import transform, Input from palantir_models.transforms import ModelOutput from main.model_adapters.adapter import SklearnRegressionAdapter def derive_housing_age_per_income(X): X['housing_age_per_income'] = X['housing_median_age'] / X['median_income'] return X def train_model(training_df): from sklearn.ensemble import RandomForestRegressor from sklearn.impute import SimpleImputer from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, FunctionTransformer numeric_features = ['median_income', 'housing_median_age', 'total_rooms'] numeric_transformer = Pipeline( steps=[ ("rooms_per_person_transformer", FunctionTransformer(derive_housing_age_per_income, validate=False)), ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()) ] ) model = Pipeline( steps=[ ("preprocessor", numeric_transformer), ("regressor", RandomForestRegressor()) ] ) X_train = training_df[numeric_features] y_train = training_df['median_house_value'] model.fit(X_train, y_train) return model @transform.using( training_data_input=Input("<YOUR_PROJECT_PATH>/data/housing_training_data"), model_output=ModelOutput("<YOUR_PROJECT_PATH>/models/random_forest_regressor_model"), ) def compute(training_data_input, model_output): training_df = training_data_input.pandas() model = train_model(training_df) # 学習済みモデルを ModelAdapter でラップします foundry_model = SklearnRegressionAdapter(model) # 学習済みモデルを Foundry に公開して書き込みます model_output.publish( model_adapter=foundry_model )