Source code for sagemaker.serve.detector.pickler

"""Save the object using cloudpickle"""

from __future__ import absolute_import
from typing import Any
from pathlib import Path
import cloudpickle

PKL_FILE_NAME = "serve.pkl"


[docs] def save_pkl(save_path: Path, obj: Any): """Save obj with cloudpickle under save_path""" if not save_path.exists(): save_path.mkdir(parents=True) with open(save_path.joinpath(PKL_FILE_NAME), mode="wb") as file: cloudpickle.dump(obj, file)
[docs] def save_xgboost(save_path: Path, xgb_model: Any): """Save xgboost model to json format using save_model""" if not save_path.exists(): save_path.mkdir(parents=True) xgb_model.save_model(str(save_path.joinpath("model.json")))
[docs] def save_sklearn(model_path: str, model: object) -> None: """Save sklearn model using joblib serialization.""" import joblib import os from pathlib import Path # Ensure directory exists Path(model_path).mkdir(parents=True, exist_ok=True) model_file = os.path.join(model_path, "model.joblib") joblib.dump(model, model_file)
[docs] def load_xgboost_from_json(model_save_path: str, class_name: str): """Load xgboost model from json format""" try: kls = _get_class_from_name(class_name=class_name) xgb_model = kls() xgb_model.load_model(model_save_path) return xgb_model except Exception as e: raise ValueError( ( "Unable to instantiate %s due to %s, please provide" "your custom code for loading the model with InferenceSpec" ) % (class_name, e) )
def _get_class_from_name(class_name: str): """Given a full class name like xgboost.sklearn.XGBClassifier, return the class""" parts = class_name.split(".") module = ".".join(parts[:-1]) m = __import__(module) for comp in parts[1:]: m = getattr(m, comp) return m