注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
モデルアダプターの api() メソッドは、このモデルアダプターの推論ロジックを実行するために期待される入力と出力を指定します。入力と出力は別々に指定します。
実行時には、指定された入力でモデルアダプターの predict() メソッドが呼び出されます。
api() の実装例次の例は、input_dataframe という名前の入力1個と、output_dataframe という名前の出力1個を指定する API を示しています。入力オブジェクトと出力オブジェクトはどちらも Pandas データフレームとして指定されています。入力データフレームには、input_feature という名前の float 型の列が1列あります。出力データフレームには、(1) input_feature という名前の float 型の列と、(2) output_feature という名前の int 型の列の2列があります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17import palantir_models as pm class ExampleModelAdapter(pm.ModelAdapter): ... @classmethod def api(cls): inputs = { "input_dataframe": pm.Pandas(columns=[("input_feature", float)]) } outputs = { "output_dataframe": pm.Pandas(columns=[("input_feature", float), ("prediction", float)]) } return inputs, outputs ...
API 定義を拡張して、任意のデータ型の複数の入力や出力をサポートすることもできます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18import palantir_models as pm class ExampleModelAdapter(pm.ModelAdapter): ... @classmethod def api(cls): inputs = { "input_dataframe": pm.Pandas(columns=[("input_feature", float)]), "input_parameter": pm.Parameter(float, default=1.0) } outputs = { "output_dataframe": pm.Pandas(columns=[("input_feature", float), ("prediction", float)]) } return inputs, outputs ...
モデルアダプター API の入力と出力のデータ型は、以下のクラスで指定できます。各クラスの詳細は後述します。
pm.Pandas:Pandas データフレーム用 (*)pm.Spark:Spark データフレーム用 (*)pm.Parameter:単一の値を持つ定数パラメーター用pm.FileSystem:Foundry データセットのファイルシステムへのアクセス用pm.MediaReference:Media Reference での使用用pm.Object:オントロジーオブジェクトでの使用用pm.ObjectSet:オントロジーのオブジェクトセットでの使用用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 54 55# 次のクラスは `palantir_models` または `pm` 経由でアクセスできます。 class Pandas: def __init__(self, columns: List[Union[str, Tuple[str, type]]]): """ Pandas Dataframe の入力または出力を定義します。列名とデータ型の定義は、この型のパラメーターとして指定できます。 """ class Spark: def __init__(self, columns: List[Union[str, Tuple[str, type]]] = []): """ Spark Dataframe (pyspark.sql.Dataframe) の入力または出力を定義します。列名とデータ型の定義は、この型のパラメーターとして指定できます。 """ class Parameter: def __init__(self, type: type = Any, default = None): """ 定数の単一値パラメーターの入力または出力を定義します。このパラメーターのデータ型(デフォルトは Any)とデフォルト値は、この型のパラメーターとして指定できます。 """ class FileSystem: def __init__(self): """ FileSystem にアクセスする入力または出力オブジェクトを定義します。この型は、モデルアダプターの `transform()` または `transform_write()` メソッドを Foundry データセットオブジェクトで呼び出した場合にのみ利用できます。 入力として使用すると、データセットの FileSystem 表現が返されます。 出力として使用すると、`open()` メソッドを持つオブジェクトを使用して出力データセットにファイルを書き込みます。 FileSystem 出力は、`.transform_write()` の呼び出しでのみ利用できることに注意してください。 """ class MediaReference: def __init__(self): """ 入力オブジェクトを MediaReference 型として定義します。この入力には、Media Reference オブジェクトの JSON 表現を文字列化したもの、または辞書表現を渡すことが期待されます。 この型は API 出力としては利用できません。 """ class Object: def __init__(self): """ 入力オブジェクトを Object 型として定義します。この入力には、指定された Object 型の主キー、または Object 型自体のインスタンスを渡すことが期待されます。 この型は API 出力としては利用できません。 """ class ObjectSet: def __init__(self): """ 入力オブジェクトを ObjectSet 型として定義します。この入力には、指定された Object 型のオブジェクトセットの rid、または ObjectSet 自体のインスタンスを渡すことが期待されます。 この型は API 出力としては利用できません。 """
(*) モデルを関数として公開する際にこれらのデータ型を使用する場合は、後述の要件を確認してください。
Pandas または Spark の入力と出力では、列名を指定する strings のリスト、または (<name>, <type>) 形式の2個のオブジェクトからなる tuples のリストとして列を指定できます。ここで、<name> は列名を表す文字列で、<type> は列内のデータの型を表す Python のデータ型です。列定義に文字列を指定した場合、そのデータ型のデフォルトは Any です。
表形式の列では、以下のデータ型がサポートされています。
strintfloatboollist (*)dict(*)datetime.datedatetime.timedatetime.datetimetyping.Any (*)MediaReferenceライブ推論とは異なり、バッチ推論では通常、列のデータ型は強制_されません_。主に、このモデルアダプターを利用するユーザー向けのドキュメントとして使用されます。API の強制適用に関する仕様の詳細は、モデルアダプターのリファレンスを参照してください。
(*) モデルを関数として公開する際にこれらのデータ型を使用する場合は、後述の要件を確認してください。
Parameter の入力と出力では、以下のデータ型がサポートされています。
strintfloatboollist(*)dict(*)typing.Any(*)pm.NDArray(shape: list[int], dtype: numpy.typing.DTypeLike)パラメーターのデータ型は強制適用され、model.transform() に入力されたパラメーターが指定されたデータ型に対応していない場合は、実行時エラーが発生します。
(*) モデルを関数として公開する際にこれらのデータ型を使用する場合は、後述の要件を確認してください。
モデル API では、pm.NDArray(shape, dtype) パラメーターのデータ型定義を通じて、NumPy ndarray ↗(N 次元配列)型がサポートされています。ndarray 入力には、形状と dtype の両方を指定する必要があります。
以下の NumPy dtype がサポートされています。
np.str_np.bool_np.int8np.int16np.int32np.int64np.float16np.float32np.float64形状は list[int] として指定し、各要素が次元を表します。任意の次元に -1 を指定すると、その次元の形状チェックが無視されます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23import numpy as np import palantir_models as pm class NumpyModelAdapter(pm.ModelAdapter): ... @classmethod def api(cls): inputs = { "ndarray_in": pm.Parameter( type=pm.NDArray([1, 1, 2], np.int8), default=np.array([[[1, -5]]], dtype=np.int8) ) } outputs = { "ndarray_out": pm.Parameter(type=pm.NDArray([1, 1, 2], np.int8)) } return inputs, outputs def predict(self, ndarray_in): # ndarray に対してモデルを呼び出します。 return self.model.process(ndarray_in)
トランスフォームでは、np.ndarray オブジェクト、または ndarray を表すリストのいずれかを入力として指定できます。
Copied!1 2 3 4 5 6 7 8 9# numpy 配列を直接使用します。 ndarray = np.array([[[-95, -63]]], dtype=np.int8) model_output = model.predict(ndarray_in=ndarray) type(model_output["ndarray_out"]) # <class 'numpy.ndarray'> # リスト表現を使用します(自動的に変換されます)。 model_output = model.transform(ndarray_in=ndarray.tolist()) type(model_output["ndarray_out"]) # <class 'numpy.ndarray'>
Functions で NDArray 入力を持つモデルを使用する場合は、入力を必ず JSON に対応したネストされたリストとして指定する必要があります。出力が np.ndarray の場合、出力もネストされたリストとして返されます。
Copied!1 2 3 4 5 6 7 8import { model } from "<...>/models"; @Function() public async ndarray_model_example(input: Integer[][][]): Promise<Integer[][][]> { return await model({ "ndarray_in": input }); }
Object または ObjectSet の入力では、モデルアダプター API で入力を定義する際にオブジェクトタイプを指定します。このオブジェクトタイプは、選択したオントロジー用に生成されたオントロジー SDKからインポートされます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21from ontology_sdk.ontology.objects import ExampleRestaurant class ExampleModelAdapter(pm.ModelAdapter): ... @classmethod def api(cls): inputs = { "input_object": pm.Object(ExampleRestaurant), "input_object_set": pm.ObjectSet(ExampleRestaurant) } outputs = { "output_dataframe": pm.Pandas(columns=[("input_feature", float), ("prediction", float)]) } return inputs, outputs def predict(self, input_object: ExampleRestaurant, input_object_set: ExampleRestaurantObjectSet): outputs = ... return outputs ...
predict() の実装例この例では、パラメーターとともに、Pandas データフレームを入力と出力に使用します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18class ExampleModelAdapter(pm.ModelAdapter): ... @classmethod def api(cls): inputs = { "input_dataframe": pm.Pandas(columns=[("input_feature", float)]), "input_parameter": pm.Parameter(float, default=1.0) } outputs = { "output_dataframe": pm.Pandas(columns=[("input_feature", float), ("prediction", float)]) } return inputs, outputs def predict(self, input_dataframe, input_parameter): input_dataframe["prediction"] = self.model.predict(input_dataframe) * input_parameter return input_dataframe ...
input_feature 列と extra_column 列を持つデータフレームを渡すと、input_feature、extra_column、prediction の列を持つデータフレームが返されます。Modeling Objectives アプリケーションでバッチデプロイメントと自動モデル評価を直接設定できるのは、表形式データセットの入力が1個のみのモデルに限られます。モデルアダプターで複数の入力が必要な場合は、Python トランスフォーム内でバッチ推論を設定できます。
Modeling Objectives での評価では、表形式の入力と出力がそれぞれ1個であることを想定しています。評価セット内の正解データと予測を比較してメトリクスを計算できるように、入力と出力の両方にラベル列を含める必要があります。モデルアダプターを評価に対応させるには、次のルールに留意する必要があります。
predict メソッドでラベル列や正解データの列を削除しないでください。
predict メソッドの推論出力に対して実行される評価ロジックで、比較に使用するラベルが利用できなくなります。例として、回帰タスク用の次のアダプターを考えます。
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 43import palantir_models as pm from palantir_models.serializers import DillSerializer class LinearRegressionModelAdapter(pm.ModelAdapter): @pm.auto_serialize( model=DillSerializer() ) def __init__(self, model): self.model = model @classmethod def api(cls): input_columns = [ ('median_income', float), ('housing_median_age', float), ('total_rooms', float), # 目的変数を API に明示的に含めないでください。 # アダプターのロジックは、ライブ推論で # ラベルが見つからない場合にエラーをスローするためです。 # これは、モデルをトレーニングセットまたは評価セット # 以外に適用すると必ず発生します。 # ('house_price', float) # should not be included ] output_columns = columns + [('predicted_house_price', float)] return {'df_in': pm.Pandas(input_columns)}, \ {'df_out': pm.Pandas(output_columns)} def predict(self, df_in): cols_to_keep = ['median_income', 'housing_median_age', 'total_rooms'] # これを行わないと、次の行で # 'house_price' 列が暗黙的に削除されます。 # この列は「ラベル」または目的変数を表すため、 # このアダプターは Modeling Objectives の # Evaluation での使用に適さなくなります。 if 'house_price' in df_in.columns: cols_to_keep.append('house_price') df_in['prediction'] = self.model.predict( df_in[cols_to_keep] ) return df_in
関数が公開済みのモデルの API を変更した場合、モデル関数ガイドで説明されているとおり、その関数の利用側を更新する必要があります。
モデルを関数として公開できるようにするには、次の条件を満たす必要があります。
Typing.Any 型を含めてはいけません。pm.Pandas() または pm.Spark() を使用することはできません。これらは暗黙的に TypeScript の Array<any> として解釈されるためです。list や dict などのコレクション型では、要素のデータ型を指定する必要があります(たとえば、list[str] や dict[str, str] を使用します)。指定しない場合、要素のデータ型は any 型として解釈されます。