注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
ワークフロー間でモデルを再利用するには、Palantir が保存された重みをデシリアル化できる必要があります。シリアル化のプロセスはモデルの種類によって異なる場合があるため、モデルアダプターの作成者は、その実行方法を詳しく定義する必要があります。ただし、シリアル化が通常コンテナのライフサイクルの一部となるコンテナモデルと、重みが外部でホストされる外部モデルは例外です。
プラットフォーム内でモデルの重みのシリアル化とデシリアル化を簡素化するため、Palantir はモデルの保存と読み込みに使用するデフォルトのシリアル化メソッドを用意しています。
モデルアダプターの __init__ メソッドに @auto_serialize 注釈を付けると、デフォルトのシリアライザーを使用できます。デフォルトでは、Palantir は Dill シリアライザーを使用して、__init__ メソッドの各入力を自動的に保存および読み込みます。@auto_serialize 注釈に引数を指定することで、__init__ メソッドの各引数に使用するシリアライザーメソッドを指定できます。この方法でシリアライザーの引数を指定する場合、__init__ メソッドのすべての引数に対応する引数を @auto_serialize の定義に含める必要があります。
競合の可能性を避けるため、palantir_models.serializers パッケージには、dill を除き、以下のシリアル化フレームワークへの依存関係が含まれていません。palantir_models.serializers パッケージのほかのシリアライザーを使用する場合は、関連するシリアル化パッケージへの依存関係を追加する必要があります。
auto_serialization を使用したモデル定義の例以下は、モデルを学習して公開する有効な Python トランスフォームです。AutoSerializationAdapter は引数なしの @auto_serialize デコレーターを使用してモデルをシリアル化するため、__init__ メソッドの model 引数は Dill を使用してシリアル化されます。
0.1536.0 より前のバージョンの palantir_models を使用する場合は、すべてのシリアライザーを @auto_serialize デコレーターの引数として定義する必要があります。
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 44from transforms.api import transform from palantir_models.transforms import ModelOutput from sklearn.linear_model import LinearRegression import numpy as np @transform( model_output=ModelOutput("/Foundry/path/to/model_asset"), ) def compute(model_output): x_values = [i for i in range(100)] y_values = [2 * i for i in x_values] X = np.array(x_values, dtype=np.float32).reshape(-1, 1) y = np.array(y_values, dtype=np.float32).reshape(-1, 1) model = LinearRegression() model.fit(X, y) model_output.publish( model_adapter=AutoSerializationAdapter( model, {'prediction_column': 'prediction'} ) ) import palantir_models as pm class AutoSerializationAdapter(pm.ModelAdapter): @pm.auto_serialize def __init__(self, model): self.model = model @classmethod def api(cls): inputs = {"df_in": pm.Pandas()} outputs = {"df_out": pm.Pandas()} return inputs, outputs def predict(self, df_in): df_in['prediction'] = self.model.predict(df_in) return df_in
auto_serialization を使用したモデル定義の例以下のモデルアダプターは、__init__ メソッドの各入力に対して異なるシリアライザーメソッドを定義しています。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22import palantir_models as pm from palantir_models.serializers import DillSerializer, JsonSerializer class AutoSerializationAdapter(pm.ModelAdapter): @pm.auto_serialize( model=DillSerializer(), config=JsonSerializer() ) def __init__(self, model, config={}): self.model = model self.prediction_column = config['prediction_column'] if 'prediction_column' in config else 'prediction' @classmethod def api(cls): inputs = {"df_in": pm.Pandas()} outputs = {"df_out": pm.Pandas()} return inputs, outputs def predict(self, df_in): df_in[self.prediction_column] = self.model.predict(df_in) return df_in
palantir_models.serializers.DillSerializer は、dill.dump と dill.load を呼び出して、dill ↗ で Python オブジェクトをシリアル化し、オブジェクトをディスクに保存したり、ディスクから読み込んだりします。
DillSerializer クラスは、scikit-learn や statsmodels を含む多くの Python オブジェクトのシリアル化に使用できます。
palantir_models.serializers.CloudPickleSerializer は、cloudpickle.dump と cloudpickle.load を呼び出して、Cloudpickle ↗ で Python オブジェクトをシリアル化し、オブジェクトをディスクに保存したり、ディスクから読み込んだりします。
CloudPickleSerializer クラスは、scikit-learn や statsmodels を含む多くの Python オブジェクトのシリアル化に使用できます。
palantir_models.serializers.JsonSerializer は、Python の辞書に対して yaml.safe_dump と json.safe_load を呼び出し、その辞書を JSON としてシリアル化します。
palantir_models.serializers.YamlSerializer は、Python の辞書に対して yaml.safe_dump と yaml.safe_load を呼び出し、その辞書を JSON でシリアル化します。
palantir_models.serializers ライブラリは現在、Hugging Face モデル ↗用に3つのデフォルトのシリアライザーを提供しています。HfPipelineSerializer、HfAutoTokenizerSerializer、HfAutoModelSerializer です。3つの Hugging Face シリアライザーはいずれも、Python 環境に transformers ライブラリを依存関係として追加する必要があります。
palantir_models.serializers.HfPipelineSerializer は、save_pretrained で transformers.pipeline ↗ オブジェクトをシリアル化し、読み込み時にパイプラインオブジェクトを再インスタンス化します。
HfPipelineSerializer には、パイプラインのタスク ↗を表す必須の文字列パラメーターが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 palantir_models as pm from palantir_models.serializers import HfPipelineSerializer from transformers import pipeline import pandas as pd class HFNerAdapter(pm.ModelAdapter): @pm.auto_serialize( pipeline=HfPipelineSerializer("ner"), ) def __init__(self, pipeline): self.pipeline = pipeline @classmethod def api(cls): inputs = {"df_in" : pm.Pandas([("text", str)])} outputs = {"df_out" : pm.Pandas([("text", str), ("generation", str)])} return inputs, outputs def predict(self, df_in: pd.DataFrame): result = self.pipeline(df_in["text"].tolist()) df_in["generation"] = result return df_in
palantir_models.serializers.HfAutoModelSerializer と palantir_models.serializers.HfAutoTokenizerSerializer は、save_pretrained と from_pretrained で transformers.AutoModel と transformers.AutoTokenizer のモデルをシリアル化します。
一部のモデルやトークナイザーでは、汎用クラスではなく専用のモデルクラスやトークナイザークラスを使用することを推奨します。この場合、専用クラスをシリアライザーの最初の model_class 引数として渡すことができます。
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 35import palantir_models as pm from palantir_models.serializers import HfAutoModelSerializer, HfAutoTokenizerSerializer from transformers import AutoModelForSeq2SeqLM import pandas as pd import torch class HFTextGenerationAdapter(pm.ModelAdapter): @pm.auto_serialize( model=HfAutoModelSerializer(AutoModelForSeq2SeqLM), tokenizer=HfAutoTokenizerSerializer() ) def __init__(self, model, tokenizer): self.model = model self.tokenizer = tokenizer @classmethod def api(cls): inputs = {"df_in" : pm.Pandas([("text", str)])} outputs = {"df_out" : pm.Pandas([("text", str), ("generation", str)])} return inputs, outputs def predict(self, df_in: pd.DataFrame): input_ids = self.tokenizer( df_in["text"].tolist(), return_tensors="pt", padding=True ).input_ids outputs = self.model.generate(input_ids) result = self.tokenizer.batch_decode(outputs, skip_special_tokens=True) df_in["generation"] = result return df_in
palantir_models.serializers.PytorchStateSerializer は、torch.save と torch.load で torch.nn.Module ↗ をシリアル化し、オブジェクトをディスクに保存したり、ディスクから読み込んだりします。
palantir_models.serializers.TensorflowKerasSerializer は、obj.save と tensorflow.keras.models.load_model で tensorflow.keras.Model ↗ をシリアル化し、モデルをディスクに保存したり、ディスクから読み込んだりします。モデルのデシリアル化時に、Foundry は obj.compile() を呼び出します。
palantir_models.serializers.XGBoostSerializer は、save_model と load_model で xgboost.sklearn.XGBModel ↗ をシリアル化し、モデルをディスクに保存したり、ディスクから読み込んだりします。XGBModel クラスは、xgboost.XGBClassifier、xgboost.XGBRegressor、xgboost.XGBRanker を含む多くの XGBoost モデルの基底クラスです。
palantir_models.serializers.SparkMLAutoSerializer は、pyspark.ml.PipelineModel.write().overwrite().save() メソッドと pyspark.ml.PipelineModel.read().load() メソッドを使用して、pyspark.ml.pipeline.Pipeline ↗ オブジェクトをシリアル化します。どの Spark MLlib モデルも Pipeline オブジェクトでラップできるため、このシリアライザーは Spark 用の汎用シリアライザーとして使用することを意図しています。
各シリアライザーの完全な実装と、新しいデフォルトのシリアライザーを追加する方法のドキュメントを参照してください。
上記の一覧にないデフォルトのシリアライザーを追加すべきとお考えの場合は、Palantir の担当者にお問い合わせください。
デフォルトのシリアライザーでは不十分な場合、ユーザーは load() メソッドと save() メソッドを実装できます。詳細と例については、API リファレンスを参照してください。