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

2c. チュートリアル:Code Repositories でモデルを訓練する

このチュートリアルのステップを始める前に、モデリングプロジェクトのセットアップを完了してください。このチュートリアルでは、Jupyter® ノートブックまたは Code Repositories のどちらでモデルを訓練するかを選択できます。迅速かつ反復的なモデル開発には Jupyter® ノートブックを、本番環境向けのデータパイプラインやモデルパイプラインにはコードリポジトリを推奨します。

このチュートリアルのステップでは、Code Repositories でモデルを訓練します。このステップでは、次の内容を扱います。

  1. モデル訓練用のコードリポジトリを作成する
  2. 特徴量データをテスト用と訓練用に分割する
  3. Code Repositories でモデル訓練ロジックを開発する
  4. バッチ推論を実行する
  5. モデルを閲覧し、モデリング目標に登録する

2c.1 モデル訓練用のコードリポジトリを作成する方法

Foundry の Code Repositories アプリケーションは、本番環境向けのデータパイプラインや機械学習パイプラインを開発するための Web ベースの開発環境です。機械学習向けに、Foundry はモデル訓練の言語テンプレートを備えたモデル統合リポジトリを提供しています。

アクション: このチュートリアルの前のステップで作成した code フォルダーで、+ 新規 > Code repository を選択します。コードリポジトリには、訓練するモデルに関連する名前を付けてください。この場合は、リポジトリに median_house_price_model_repo という名前を付けます。Repositoryタイプでモデル統合を、Template の言語でモデル訓練を選択し、リポジトリを初期化するを選択します。

モデル訓練テンプレートを初期化する

モデル訓練テンプレートには、このチュートリアルに合わせて変更する構成例が含まれています。左側のファイルを展開すると、プロジェクトの例を確認できます。

空のモデル訓練テンプレート

2c.2 特徴量データをテスト用と訓練用に分割する方法

教師あり機械学習プロジェクトの最初のステップは、ラベル付き特徴量データを訓練用とテスト用の別々のデータセットに分割することです。最終的には、パフォーマンスメトリクス(新しいデータに対するモデルの性能の推定値)を作成し、このモデルが本番環境で使用できる十分な性能を備えているかどうかを判断するとともに、モデルの結果をどの程度信頼できるかをほかの関係者に伝えられるようにします。パフォーマンスメトリクスが実際の環境での性能を反映するよう、この検証には別のデータを使用する必要があります。

そのため、ラベル付き特徴量データを受け取り、訓練用とテスト用の2個のデータセットに分割する Python トランスフォームを作成します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from transforms.api import transform, Input, Output @transform.spark.using( features_and_labels_input=Input("<YOUR_PROJECT_PATH>/data/housing_features_and_labels"), training_output=Output("<YOUR_PROJECT_PATH>/data/housing_training_data"), testing_output=Output("<YOUR_PROJECT_PATH>/data/housing_test_data"), ) def compute(features_and_labels_input, training_output, testing_output): # この TransformInput を PySpark DataFrame に変換します features_and_labels = features_and_labels_input.dataframe() # PySpark データフレームを学習データ80%、テストデータ20%の割合でランダムに分割します training_data, testing_data = features_and_labels.randomSplit([0.8, 0.2], seed=0) # 学習データとテストデータを Foundry に書き戻します training_output.write_dataframe(training_data) testing_output.write_dataframe(testing_data)

お使いのエンロールメントが機密情報区分ベースのアクセス制御(CBAC)を使用している場合、トランスフォームは自身の出力リソースを作成できません。出力がまだ存在しないトランスフォームをビルドすると、機密情報区分ベースのアクセス制御が有効な場合はデータセットの作成が許可されないことを示すエラーが発生し、ビルドに失敗します。このチュートリアルの残りのステップでは、まだ存在しない出力を宣言するため、ビルドする前にそれぞれの出力を作成し、新しく作成するリソースに求められるファイルの機密情報区分を設定してください。data フォルダーで + 新規 > データセットを選択して housing_training_data、housing_test_data、housing_testing_data_inferences データセットを作成し、models フォルダーで + 新規 > モデルを選択して linear_regression_model モデルを作成します。その後、以降のステップのトランスフォームで、これらの既存のパスを指定します。

アクション: リポジトリ内の feature_engineering.py ファイルを開き、上記のコードをリポジトリにコピーします。このチュートリアルの前のステップでアップロードしたデータセットを正しく参照するように、パスを更新します。左上の Build を選択してコードを実行します。必要に応じて、プレビューを選択し、データの一部を使ってこのロジックをテストすることで、反復作業をよりすばやく進めることもできます。

特徴量エンジニアリングコードのビルド

このビルドの実行中に、2c.3 に進むことができます。

2c.3 Code Repositories でモデルのトレーニングロジックを作成する方法

Foundry のモデルは、モデルアーティファクト(モデルのトレーニングジョブで生成されるモデルファイル)とモデルアダプター(Foundry がモデルアーティファクトと連携して推論を実行する方法を記述する Python クラス)の2つのコンポーネントで構成されます。

モデルトレーニングテンプレートは、トレーニングジョブ用の model_training とモデルアダプター用の model_adapters の2つのモジュールで構成されます。

モデルの依存関係

モデルのトレーニングでは、ほとんどの場合、モデルのトレーニング、シリアライズ、推論、または評価のロジックを含む Python の依存関係を追加する必要があります。Foundry では、conda を通じて依存関係の仕様を追加できます。これらの依存関係の仕様を使用して、モデルのトレーニングジョブを実行するための、依存関係が解決された Python 環境を作成します。

Foundry では、これらの解決済みの依存関係がモデルとともに自動的にパッケージ化されるため、推論(予測の生成)の実行に必要なすべてのロジックがモデルに自動的に含まれます。この例では、pandas と scikit-learn を使用してモデルを作成し、dill を使用してモデルを保存します。

アクション: 左サイドバーでライブラリを選択し、scikit-learn、pandas、dill の依存関係を追加します。次に、コミットを選択して、依存関係が解決された Python 環境を作成します。

Palantir Foundry のモデルトレーニング用コードリポジトリテンプレートにモデルの依存関係を追加する

モデルアダプターのロジック

モデルアダプターは、Foundry のすべてのモデルに標準インターフェースを提供します。Foundry が、モデルとその Python の依存関係の読み込み、API の公開、モデルとの連携に必要なインフラストラクチャを処理するため、この標準インターフェースによって、すべてのモデルを本番アプリケーションですぐに使用できます。

これを実現するには、この通信レイヤーとして機能する ModelAdapter クラスのインスタンスを作成する必要があります。

実装する関数は4個あります。

  1. モデルの保存と読み込み: モデルを再利用するには、モデルを保存して読み込む方法を定義する必要があります。Palantir はシリアライズ(保存)のデフォルトの方法を多数提供しており、より複雑なケースではカスタムシリアライズのロジックを実装できます。
  2. api: モデルの API を定義し、モデルに必要な入力データの種類を Foundry に伝えます。
  3. predict: モデルにデータを渡すために Foundry が呼び出します。ここで入力データをモデルに渡し、推論(予測)を生成できます。
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 import palantir_models as pm class SklearnRegressionAdapter(pm.ModelAdapter): @pm.auto_serialize def __init__(self, model): self.model = model @classmethod def api(cls): columns = [ ('median_income', float), ('housing_median_age', float), ('total_rooms', float), ] return {"df_in": pm.Pandas(columns)}, \ {"df_out": pm.Pandas(columns + [('prediction', float)])} def predict(self, df_in): df_in['prediction'] = self.model.predict( df_in[['median_income', 'housing_median_age', 'total_rooms']] ) return df_in

アクション model_adapters/adapter.py ファイルを開き、上記のロジックをファイルに貼り付けます。

Palantir Foundry のモデルトレーニング用コードリポジトリテンプレートのモデルアダプターロジック

モデルのトレーニングロジック

依存関係を設定し、モデルアダプターを記述したので、Foundry でモデルをトレーニングできます。

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 from transforms.api import transform, Input from palantir_models.transforms import ModelOutput from main.model_adapters.adapter import SklearnRegressionAdapter def train_model(training_df): from sklearn.impute import SimpleImputer from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler numeric_features = ['median_income', 'housing_median_age', 'total_rooms'] numeric_transformer = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()) ] ) model = Pipeline( steps=[ ("preprocessor", numeric_transformer), ("classifier", LinearRegression()) ] ) 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/linear_regression_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 )

オプション: モデルのトレーニングロジックとモデルアダプターのロジックを繰り返し改善する際は、ビルドを実行する前にトレーニングデータの一部で変更をテストすると便利です。コードをテストするには、左上のプレビューを選択します。

Palantir Foundry のモデルトレーニング用コードリポジトリテンプレートのトレーニングロジックとプレビュー出力。

アクション: リポジトリの model_training/model_training.py ファイルを開き、上記のコードをリポジトリにコピーします。ステップ1.1で作成したトレーニングデータセットとモデルフォルダーを正しく参照するようにパスを更新します。コードを実行するには、左上の Build を選択します。

Palantir Foundry のモデルトレーニング用コードリポジトリテンプレートのトレーニングロジック

(任意)モデル実験にメトリクスとハイパーパラメーターを記録する

モデル実験は、モデルのトレーニング実行中に生成されるメトリクスとハイパーパラメーターを記録するための軽量なフレームワークです。記録したメトリクスとハイパーパラメーターは、モデルとともに公開し、モデルページに保存できます。

実験の作成と実験への書き込みについて、詳しくはこちら。

2c.4 バッチ推論を実行する方法

Code Repositories での実行

モデルのトレーニングロジックの実行が完了すると、コードリポジトリで直接予測(推論とも呼ばれます)を生成できます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from transforms.api import transform, Input, Output, LightweightInput, LightweightOutput from palantir_models.transforms import ModelInput from palantir_models import ModelAdapter @transform.using( testing_data_input=Input("<YOUR_PROJECT_PATH>/data/housing_test_data"), model_input=ModelInput("<YOUR_PROJECT_PATH>/models/linear_regression_model"), predictions_output=Output("<YOUR_PROJECT_PATH>/data/housing_testing_data_inferences") ) def compute( testing_data_input: LightweightInput, model_input: ModelAdapter, predictions_output: LightweightOutput ): inference_outputs = model_input.transform(testing_data_input) predictions_output.write_pandas(inference_outputs.df_out)

モデルが定義されていないトランスフォームリポジトリ内でモデルを実行するには、ModelInput で use_sidecar = True を設定します。これにより、モデルアダプターとその依存関係が自動的にインポートされ、依存関係の競合を防ぐために別の環境で実行されます。詳細については、ModelInput クラスのリファレンスを参照してください。use_sidecar が True に設定されていない場合、モデルアダプターとその依存関係を現在のコードリポジトリにインポートするか、その中で定義する必要があります。

アクション: リポジトリの model_training/run_inference.py ファイルを開き、上記のコードをリポジトリにコピーします。先ほど作成したモデルアセットとテストデータセットを正しく参照するようにパスを更新します。コードを実行するには、左上の Build を選択します。

Palantir Foundry の Code Repositories アプリケーションでモデルの推論をビルドする

ビルドが完了すると、ビルド出力パネルで生成された予測を確認できます。

Palantir Foundry の Code Repositories アプリケーションでモデルの推論を表示する

Pipeline Builder での実行

Pipeline Builder でモデルをバッチ推論またはストリーミング推論に使用する方法を確認します。

2c.5 任意:ライブ推論を設定する

任意で、直接デプロイを通じてこのモデルを REST API として使用できます。直接デプロイを設定する方法を確認します。

2c.6 モデルを表示してモデリング目標に登録する方法

モデルのビルド後、model_training/model_training.py ファイルで linear_regression_model を選択するか、先ほど作成したフォルダー構造内のモデルに移動することで、モデルを開けます。

Palantir Foundry のコードリポジトリテンプレートでモデルを開く

モデルビューには、モデルをトレーニングしたソース、このモデルの作成に使用したトレーニングデータセット、モデル API、およびこのモデルの公開に使用したモデルアダプターが表示されます。重要な点として、同じモデルに多数の異なるバージョンを公開できます。これらのモデルバージョンは、左サイドバーのドロップダウンメニューから利用可能です。

モデルバージョンは、トレーニング時に使用した特定のモデルアダプターに関連付けられているため、モデルアダプターのロジックへの変更を適用するには、モデルトレーニングプロセスを再公開してビルドする必要があります。

Palantir Foundry でモデルアセットを表示する

モデルができたので、管理、評価、および運用アプリケーションへのリリースのために、そのモデルをモデリング目標に登録できます。

アクション: コード内の linear_regression_model を選択して、作成したモデルアセットに移動し、モデリング目標に登録を選択して、このチュートリアルのステップ1で作成したモデリング目標にそのモデルを登録します。登録名と登録の所有者を指定するよう求められます。これは、モデリング目標内でモデルを一意に追跡するためのメタデータです。モデルに linear_regression_model という名前を付け、ご自身を登録の所有者に指定します。

モデルをモデリング目標に登録する

次のステップ

Foundry でモデルをトレーニングしたので、モデルの管理、テスト、およびモデルの評価に進めます。モデリング目標で実行できる追加のステップの例を以下に示します。

任意で、迅速かつ反復的なモデル開発のために、Code Workspaces アプリケーションを使用して Jupyter® ノートブックでモデルをトレーニングすることもできます。