注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このチュートリアルのステップを始める前に、 モデリングプロジェクトの設定を完了している必要があります。
このチュートリアルのステップでは、 コードリポジトリでモデルを訓練します。このステップは必須で、以下の内容をカバーします:
Foundry のコードリポジトリアプリケーションは、データパイプラインと機械学習ロジックを作成するためのWebベースの開発環境です。Foundry は Model Training
テンプレートという機械学習用のテンプレートリポジトリを提供しています。
アクション: このチュートリアルの前のステップで作成した code
フォルダーで、+ New > Code repository を選択します。コードリポジトリは訓練しているモデルに関連した名前をつけるべきです。この場合、リポジトリの名前を "median_house_price_model_repo"とします。Model Training テンプレートを選択し、Initialize をクリックします。
モデル訓練テンプレートには、このチュートリアルに適応させるサンプル構造が含まれています。左側のファイルを展開して、サンプルプロジェクトを確認できます。
監視された機械学習プロジェクトの最初のステップは、ラベル付きの特徴データを訓練とテストのための別々のデータセットに分割することです。最終的に、新しいデータに対するモデルのパフォーマンスをどの程度良く推定できるか(パフォーマンスメトリクスを作成する)ことで、このモデルがプロダクション環境で使用するのに十分な良さであるか、そして結果の信頼度を他の利害関係者とどの程度共有できるかを判断したいと思います。この検証のためには別々のデータを使用する必要があります。これにより、パフォーマンスメトリクスが実際の世界で見ることになるものを代表していることを確認するのに役立ちます。
したがって、ラベル付きの特徴データを取り、これを訓練とテストの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
を進めることができます。
Foundry のモデルは、モデル作成物(モデル訓練ジョブで生成されたモデルファイル)とモデルアダプター(Foundry が推論を実行するためにモデル作成物とどのようにやり取りするべきかを記述する Python クラス)の2つのコンポーネントで構成されています。
モデル訓練テンプレートは、訓練ジョブのための model_training
モジュールとモデルアダプターのための model_adapters
モジュールの2つで構成されています。
モデル訓練はほぼ常に、モデル訓練、シリアライゼーション、推論、または評価ロジックを含む Python 依存関係の追加を必要とします。Foundry は Conda を通じて依存関係の仕様を追加することをサポートしています。これらの依存関係仕様は、モデル訓練ジョブを実行するための解決された Python 環境を作成するために使用されます。
Foundry では、これらの解決された依存関係は自動的にユーザーのモデルと一緒にパッケージ化されるため、モデルが推論(予測の生成)を実行するために必要なすべてのロジックを自動的に持つことが保証されます。この例では、モデルを生成するために pandas
と scikit-learn
を使用し、モデルを保存するために dill
を使用します。
アクション:左側のバーで Libraries を選択し、 scikit-learn = 1.2.0
、 pandas = 1.5.2
、 dill = 0.3.7
の依存関係を追加します。次に、Commit を選択して解決された Python 環境を作成します。
モデルアダプターは、Foundry 内のすべてのモデルに対して標準のインターフェースを提供します。この標準インターフェースにより、すべてのモデルは即座に本番環境のアプリケーションで使用することができます。Foundry はモデルの読み込み、Python の依存関係、API の公開、モデルとのインターフェースといったインフラストラクチャを管理します。
これを可能にするために、通信レイヤーとして機能する ModelAdapter
クラスのインスタンスを作成する必要があります。
実装するべき4つの関数があります:
state_reader
を提供されます。これはモデルアダプターが save 時にファイルを永続化したのと同じファイルシステムです。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
ファイルを開き、上記のロジックをファイルに貼り付けます。
依存関係が設定され、モデルアダプタも作成されたので、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
オプション: モデルトレーニングとモデルアダプタロジックを反復処理している際に、ビルドを実行する前にトレーニングデータの一部で変更内容をテストすると便利です。コードをテストするには、画面左上のプレビューを選択してください。
アクション: リポジトリ内の model_training/model_training.py
ファイルを開き、上記のコードをリポジトリにコピーしてください。ステップ 1.1 で作成したトレーニングデータセットとモデルフォルダーを正しく指すようにパスを更新してください。画面左上のビルドを選択して、コードを実行してください。
モデルトレーニングロジックが完了したら、コードリポジトリ内で直接予測(別名推論)を生成できます。
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
ファイルを開き、上記のコードをリポジトリにコピーします。以前に作成したモデルアセットとテストデータセットを正しく指すようにパスを更新します。コードを実行するために、左上の ビルド を選択します。
ビルドが完了したら、ビルド出力パネルで生成された予測を確認できます。
モデルがビルドされた後、 model_training/model_training.py
ファイルの linear_regression_model
を選択するか、以前に作成したフォルダー構造でモデルに移動することでモデルを開くことができます。
モデルビューには、モデルが訓練されたソース、このモデルを生成するために使用された訓練データセット、モデル API、このモデルが公開されたモデルアダプターが表示されます。重要なことに、同じモデルに対して多くの異なるバージョンを公開できます。これらのモデルバージョンは、左側のサイドバーのドロップダウンメニューで利用できます。
モデルバージョンは、訓練中に使用された特定のモデルアダプターに接続されているため、モデルアダプターロジックに変更を適用するためには、モデル訓練プロセスを再公開およびビルドする必要があります。
モデルができたので、そのモデルをモデリング目標に提出し、管理、評価、運用アプリケーションへのリリースを行うことができます。
アクション: コード内の linear_regression_model を選択して、作成したモデルアセットに移動し、モデリング目標に提出 を選択し、そのモデルを このチュートリアルのステップ 1 で作成したモデリング目標に提出します。提出名と提出者を提供するように求められます。これは、モデリング目標内でモデルを一意に追跡するために使用されるメタデータです。モデル名を linear_regression_model
とし、提出者に自分をマークします。
Foundry でモデルを訓練したので、次にモデル管理、テスト、モデル評価に移ります。モデルのパフォーマンスを評価する。