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

API: palantir_models.serializers リファレンス

palantir_models.serializers ライブラリは、Foundry 内で学習したモデルを保存して読み込むためのデフォルトのシリアライズメソッドを多数提供しています。ほとんどのモデルでは、デフォルトのモデルシリアライザーのいずれかを使用できるはずです。

モデルシリアライザーを記述する方法

再利用可能な auto_serializer を作成すると便利な場合があります。たとえば、組織で再利用され、モデルとして Foundry に頻繁に統合されるモデル形式がある場合、再利用可能な auto_serializer を作成することで、異なるモデルやチーム間でコードを標準化し、重複を減らせます。

auto_serializer を作成するには、palantir_models.models._serialization.ModelSerializer 基底クラスを拡張し、__init__、serialize、deserialize メソッドを実装します。

auto_serializer は、共有 Python ライブラリとして公開してください。

提供されているシリアライザーの実装

参考として、palantir_models.serializers にある既存のデフォルトシリアライザーの実装を示します。

palantir_models.serializers.CloudPickleSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import importlib from types import ModuleType from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateWriter, ModelStateReader class CloudPickleSerializer(ModelSerializer[object]): """汎用オブジェクトに cloudpickle ライブラリを使用するシリアライザー""" file_name = "cloudpickle.pkl" cloudpickle: ModuleType def __init__(self): self.cloudpickle = importlib.import_module("cloudpickle") def serialize(self, writer: ModelStateWriter, obj: object): with writer.open(self.file_name, "wb") as cloudpickle_file: self.cloudpickle.dump(obj, cloudpickle_file) def deserialize(self, reader: ModelStateReader) -> object: with reader.open(self.file_name, "rb") as cloudpickle_file: obj = self.cloudpickle.load(cloudpickle_file) return obj

palantir_models.serializers.DillSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import importlib from types import ModuleType from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateWriter, ModelStateReader class DillSerializer(ModelSerializer[object]): """汎用オブジェクトに dill ライブラリを使用するシリアライザー""" file_name = "dill.pkl" dill: ModuleType def __init__(self): self.dill = importlib.import_module("dill") def serialize(self, writer: ModelStateWriter, obj: object): with writer.open(self.file_name, "wb") as dill_file: self.dill.dump(obj, dill_file, recurse=True) def deserialize(self, reader: ModelStateReader) -> object: with reader.open(self.file_name, "rb") as dill_file: obj = self.dill.load(dill_file) return obj

palantir_models.serializers.HfAutoModelSerializer

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 class HfAutoModelSerializer(ModelSerializer): """ huggingface transformers の AutoModel クラス用のシリアライザーで、 from_pretrained および save_pretrained メソッドを使用します。 特定のサブクラス(例: AutoModelForSequenceClassification または BertForTokenClassification)の設定と、from_pretrained への追加の kwargs の受け渡しができます (例: num_labels=2)。 """ DIR_NAME = "model" def __init__(self, model_class=None, **load_kwargs): if model_class is None: transformers = importlib.import_module("transformers") model_class = transformers.AutoModel self.model_class = model_class self.load_kwargs = load_kwargs def serialize(self, writer: ModelStateWriter, obj): model_dir = writer.mkdir(self.DIR_NAME) obj.save_pretrained(model_dir) def deserialize(self, reader: ModelStateReader): model_dir = reader.dir(self.DIR_NAME) return self.model_class.from_pretrained(model_dir, **self.load_kwargs)

palantir_models.serializers.HfAutoTokenizerSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class HfAutoTokenizerSerializer(ModelSerializer): """ huggingface transformers の AutoTokenizer 用のシリアライザー。 """ DIR_NAME = "tokenizer" def __init__(self, tokenizer_class=None, **load_kwargs): if tokenizer_class is None: transformers = importlib.import_module("transformers") tokenizer_class = transformers.AutoTokenizer self.tokenizer_class = tokenizer_class self.load_kwargs = load_kwargs def serialize(self, writer: ModelStateWriter, obj): tokenizer_dir = writer.mkdir(self.DIR_NAME) obj.save_pretrained(tokenizer_dir) def deserialize(self, reader: ModelStateReader): tokenizer_dir = reader.dir(self.DIR_NAME) return self.tokenizer_class.from_pretrained(tokenizer_dir, **self.load_kwargs)

palantir_models.serializers.HfPipelineSerializer

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 importlib from palantir_models import ModelSerializer, ModelStateReader, ModelStateWriter class HfPipelineSerializer(ModelSerializer): """ huggingface transformers のパイプライン用のシリアライザー。 パイプラインのタスク(例: sentiment-analysis)を設定できます。 """ DIR_NAME = "pipeline" def __init__(self, pipeline_type, **load_kwargs): self.transformers = importlib.import_module("transformers") self.pipeline_type = pipeline_type self.load_kwargs = load_kwargs def serialize(self, writer: ModelStateWriter, obj): pipeline_dir = writer.mkdir(self.DIR_NAME) obj.save_pretrained(pipeline_dir) def deserialize(self, reader: ModelStateReader): pipeline_dir = reader.dir(self.DIR_NAME) return self.transformers.pipeline(self.pipeline_type, model=pipeline_dir, **self.load_kwargs)

palantir_models.serializers.JsonSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import importlib from types import ModuleType from typing import Dict from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateWriter, ModelStateReader class JsonSerializer(ModelSerializer[Dict]): """json に変換可能なオブジェクトおよび辞書用のシリアライザー""" file_name = "config.json" json: ModuleType def __init__(self): self.json = importlib.import_module("json") def serialize(self, writer: ModelStateWriter, obj: Dict): with writer.open(self.file_name, "w") as conf: self.json.dump(obj, conf) def deserialize(self, reader: ModelStateReader) -> Dict: with reader.open(self.file_name, "r") as conf: return self.json.load(conf)

palantir_models.serializers.PytorchStateSerializer

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 import importlib from types import ModuleType from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateWriter, ModelStateReader class PytorchStateSerializer(ModelSerializer): """PyTorch の状態辞書用のシリアライザー。""" STATE_DICT_FILE_NAME = "model_state_dict.pt" torch: ModuleType def __init__(self): self.torch = importlib.import_module("torch") def serialize(self, writer: ModelStateWriter, obj: dict): """PyTorch モデルの state_dict をシリアライズします。""" with writer.open(self.STATE_DICT_FILE_NAME, "wb") as file_path: self.torch.save(obj, file_path) def deserialize(self, reader: ModelStateReader) -> dict: """PyTorch モデルの state_dict をデシリアライズします。""" with reader.open(self.STATE_DICT_FILE_NAME, "rb") as file_path: state_dict = self.torch.load(file_path) return state_dict

palantir_models.serializers.TensorflowKerasSerializer

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 56 57 58 59 60 61 62 import enum import importlib import os from types import ModuleType from typing import Any, Dict, Optional from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateReader, ModelStateWriter class TensorflowFormat(enum.Enum): DIR = 0 H5 = 1 KERAS = 2 def get_save_path(self, dir_path): if self == TensorflowFormat.DIR: return dir_path if self == TensorflowFormat.H5: return os.path.join(dir_path, "model.h5") if self == TensorflowFormat.KERAS: return os.path.join(dir_path, "model.keras") class TensorflowKerasSerializer(ModelSerializer): """Serializer for tensorflow keras models""" DIR_NAME: str = "tensorflow_saved_model_dir" __tensorflow: ModuleType def __init__(self, format=TensorflowFormat.DIR, custom_objects: Optional[Dict[str, Any]] = None): self.__tensorflow = importlib.import_module("tensorflow") self.__custom_objects = custom_objects self.__format = format def serialize(self, writer: ModelStateWriter, obj: "tensorflow.keras.Model"): dir_path = writer.mkdir(self.DIR_NAME) self._save_model(dir_path, obj) def deserialize(self, reader: ModelStateReader) -> "tensorflow.keras.Model": dir_path = reader.dir(self.DIR_NAME) obj = self._load_model(dir_path) obj.compile() return obj def _save_model(self, dir_path: str, obj: "tensorflow.keras.Model"): try: save_path = self.__format.get_save_path(dir_path) obj.save(save_path) except ValueError as exc: if "Invalid filepath extension for saving" in str(exc): raise ValueError( "Serialization failed due to invalid save format. Specify the correct file format in the TensorflowKerasSerializer constructor:\n" "\tTensorflowKerasSerializer(format=TensorflowFormat.DIR) to use directory saving. This save format is considered legacy in Tensorflow\n" "\tTensorflowKerasSerializer(format=TensorflowFormat.H5) to use .h5 file format saving\n" "\tTensorflowKerasSerializer(format=TensorflowFormat.KERAS) to use .keras file format saving\n" ) from exc raise exc def _load_model(self, dir_path: str) -> "tensorflow.keras.Model": save_path = self.__format.get_save_path(dir_path) return self.__tensorflow.keras.models.load_model(save_path, custom_objects=self.__custom_objects, compile=False)

palantir_models.serializers.XGBoostSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from palantir_models import ModelSerializer from palantir_models.models._serialization import ModelStateReader, ModelStateWriter from xgboost.sklearn import XGBModel class XGBoostSerializer(ModelSerializer[XGBModel]): """XGBoost SkLearn モデル用のシンプルなシリアライザー。""" file_name = "xgboost_model.json" def serialize(self, writer: ModelStateWriter, obj: XGBModel): with writer.open(self.file_name, "w") as xgbfile: obj.save_model(xgbfile.name) def deserialize(self, reader: ModelStateReader) -> XGBModel: model = XGBModel() with reader.open(self.file_name, "r") as xgbfile: model.load_model(xgbfile.name) return model

palantir_models.serializers.YamlSerializer

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import importlib from types import ModuleType from typing import Dict from palantir_models.models._serialization import ModelSerializer from palantir_models.models._state_accessors import ModelStateWriter, ModelStateReader class YamlSerializer(ModelSerializer[Dict]): """yaml に変換可能なオブジェクトおよび辞書用のシリアライザー""" file_name = "config.yaml" yaml: ModuleType def __init__(self): self.yaml = importlib.import_module("yaml") def serialize(self, writer: ModelStateWriter, obj: Dict): with writer.open(self.file_name, "w") as conf: self.yaml.safe_dump(obj, conf) def deserialize(self, reader: ModelStateReader) -> Dict: with reader.open(self.file_name, "r") as conf: return self.yaml.safe_load(conf)