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

2. チュートリアル - コードリポジトリでモデルを訓練する

このチュートリアルのステップを始める前に、 モデリングプロジェクトの設定を完了している必要があります。

このチュートリアルのステップでは、 コードリポジトリでモデルを訓練します。このステップは必須で、以下の内容をカバーします:

  1. モデル訓練のためのコードリポジトリの作成
  2. テストと訓練のための特徴データの分割
  3. コードリポジトリでのモデル訓練ロジックの作成
  4. コードリポジトリでの推論ロジックのテスト
  5. モデルの表示とモデリング目標への提出

2.1 モデル訓練のためのコードリポジトリの作成方法

Foundry のコードリポジトリアプリケーションは、データパイプラインと機械学習ロジックを作成するためのWebベースの開発環境です。Foundry は Model Training テンプレートという機械学習用のテンプレートリポジトリを提供しています。

アクション: このチュートリアルの前のステップで作成した code フォルダーで、+ New > Code repository を選択します。コードリポジトリは訓練しているモデルに関連した名前をつけるべきです。この場合、リポジトリの名前を "median_house_price_model_repo"とします。Model Training テンプレートを選択し、Initialize をクリックします。

Model Trainingテンプレートの初期化

モデル訓練テンプレートには、このチュートリアルに適応させるサンプル構造が含まれています。左側のファイルを展開して、サンプルプロジェクトを確認できます。

空のModel Trainingテンプレート

2.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( 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)

アクション:ユーザーのリポジトリ内の feature_engineering.py ファイルを開き、上記のコードをリポジトリにコピーします。このチュートリアルの前のステップでアップロードしたデータセットを正しく指すようにパスを更新します。左上の Build を選択してコードを実行します。必要に応じて、Preview を選択し、データの一部を使ってこのロジックをテストし、より早くイテレーションを行うことができます。

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

このビルドが実行されている間に、 2.3 を進めることができます。

2.3 コードリポジトリでモデル訓練ロジックを作成する方法

Foundry のモデルは、モデル作成物(モデル訓練ジョブで生成されたモデルファイル)とモデルアダプター(Foundry が推論を実行するためにモデル作成物とどのようにやり取りするべきかを記述する Python クラス)の2つのコンポーネントで構成されています。

モデル訓練テンプレートは、訓練ジョブのための model_training モジュールとモデルアダプターのための model_adapters モジュールの2つで構成されています。

モデルの依存関係

モデル訓練はほぼ常に、モデル訓練、シリアライゼーション、推論、または評価ロジックを含む Python 依存関係の追加を必要とします。Foundry は Conda を通じて依存関係の仕様を追加することをサポートしています。これらの依存関係仕様は、モデル訓練ジョブを実行するための解決された Python 環境を作成するために使用されます。

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

アクション:左側のバーで Libraries を選択し、 scikit-learn = 1.2.0pandas = 1.5.2dill = 0.3.7 の依存関係を追加します。次に、Commit を選択して解決された Python 環境を作成します。

Palantir Foundry の Model Training コードリポジトリテンプレートにモデルの依存関係を追加

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

モデルアダプターは、Foundry 内のすべてのモデルに対して標準のインターフェースを提供します。この標準インターフェースにより、すべてのモデルは即座に本番環境のアプリケーションで使用することができます。Foundry はモデルの読み込み、Python の依存関係、API の公開、モデルとのインターフェースといったインフラストラクチャを管理します。

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

実装するべき4つの関数があります:

  1. モデルの保存と読み込み:モデルを再利用するためには、モデルの保存方法と読み込み方法を定義する必要があります。Palantir は多くの デフォルトの方法 を提供していますが、より複雑なケースでは カスタムのシリアライゼーション ロジックを実装することができます。
  2. load:モデルの読み込み方法を定義します。load メソッドは state_reader を提供されます。これはモデルアダプターが save 時にファイルを永続化したのと同じファイルシステムです。
  3. api:モデルの API を定義し、モデルが必要とする入力データのタイプを Foundry に告げます。
  4. 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 25 26 27 28 29 30 31 32 33 34 35 # Palantirのモデルをインポート import palantir_models as pm # Palantirのモデルのシリアライザをインポート from palantir_models_serializers import DillSerializer class SklearnRegressionAdapter(pm.ModelAdapter): # Sklearnの回帰モデルをアダプタにするクラス @pm.auto_serialize( # モデルの自動シリアライズデコレータ model=DillSerializer() # モデルのシリアライザにDillSerializerを指定 ) def __init__(self, model): # 初期化メソッド self.model = model # モデルをインスタンス変数に代入 @classmethod def api(cls): # APIの定義 # 入力データのカラム定義 columns = [ ('median_income', float), # 中央値の収入 ('housing_median_age', float), # 住宅の中央値年齢 ('total_rooms', float), # 総部屋数 ] # 入力データの定義 inputs = {"df_in": pm.Pandas(columns=columns)} # 出力データの定義 outputs = {"df_out": pm.Pandas(columns=columns + [('prediction', float)])} return inputs, outputs # 入力と出力を返す def predict(self, df_in): # 予測メソッド # 入力データから予測値を計算 predictions = self.model.predict( df_in[['median_income', 'housing_median_age', 'total_rooms']] ) df_in['prediction'] = predictions # 予測値を入力データに追加 return df_in # 予測値を含む入力データを返す

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

Palantir Foundry の Model Training コードリポジトリテンプレートにおけるモデルアダプタロジック

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

依存関係が設定され、モデルアダプタも作成されたので、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 47 48 49 50 from transforms.api import transform, Input from palantir_models.transforms import ModelOutput from main.model_adapters.adapter import SklearnRegressionAdapter # モデルを学習し、Foundryに書き込む @transform( 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 ) # モデル学習関数 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

オプション: モデルトレーニングとモデルアダプタロジックを反復処理している際に、ビルドを実行する前にトレーニングデータの一部で変更内容をテストすると便利です。コードをテストするには、画面左上のプレビューを選択してください。

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

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

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

2.4 コードリポジトリで推論ロジックをテストする方法

モデルトレーニングロジックが完了したら、コードリポジトリ内で直接予測(別名推論)を生成できます。

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 from palantir_models.transforms import ModelInput @transform( # テストデータを入力として定義します 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, model_input, predictions_output): # モデルを使用してテストデータの予測を行います inference_outputs = model_input.transform(testing_data_input) # 予測結果を出力します predictions_output.write_pandas(inference_outputs.df_out)

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

Palantir Foundry のコードリポジトリアプリケーションでモデル推論をビルド

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

Palantir Foundry のコードリポジトリアプリケーションでモデル推論を表示

2.5 モデルの表示方法とモデリング目標への提出方法

モデルがビルドされた後、 model_training/model_training.py ファイルの linear_regression_model を選択するか、以前に作成したフォルダー構造でモデルに移動することでモデルを開くことができます。

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

モデルビューには、モデルが訓練されたソース、このモデルを生成するために使用された訓練データセット、モデル API、このモデルが公開されたモデルアダプターが表示されます。重要なことに、同じモデルに対して多くの異なるバージョンを公開できます。これらのモデルバージョンは、左側のサイドバーのドロップダウンメニューで利用できます。

モデルバージョンは、訓練中に使用された特定のモデルアダプターに接続されているため、モデルアダプターロジックに変更を適用するためには、モデル訓練プロセスを再公開およびビルドする必要があります。

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

モデルができたので、そのモデルをモデリング目標に提出し、管理、評価、運用アプリケーションへのリリースを行うことができます。

アクション: コード内の linear_regression_model を選択して、作成したモデルアセットに移動し、モデリング目標に提出 を選択し、そのモデルを このチュートリアルのステップ 1 で作成したモデリング目標に提出します。提出名と提出者を提供するように求められます。これは、モデリング目標内でモデルを一意に追跡するために使用されるメタデータです。モデル名を linear_regression_model とし、提出者に自分をマークします。

モデリング目標にモデルを提出

次のステップ

Foundry でモデルを訓練したので、次にモデル管理、テスト、モデル評価に移ります。モデルのパフォーマンスを評価する