Source code for paddlets.models.model_loader

# !/usr/bin/env python3
# -*- coding:utf-8 -*-

import os
import json

from paddlets.logger import raise_if, raise_if_not, raise_log


[docs]def load(path: str): """ Loads a saved model from a file path. Args: path(str): A path string containing a model file name. Returns: Union[BaseModel, AnomalyBaseModel, StatisticalBase, ReprBaseModel]: Loaded model. """ abs_model_path = os.path.abspath(path) raise_if_not(os.path.exists(abs_model_path), "path not exists: %s" % abs_model_path) raise_if(os.path.isdir(abs_model_path), "path must be a file path, not a directory: %s" % abs_model_path) abs_root_path = os.path.dirname(abs_model_path) abs_model_path = os.path.join(abs_root_path, os.path.basename(abs_model_path)) modelname = os.path.basename(abs_model_path) abs_modelmeta_path = os.path.join(abs_root_path, "%s_%s" % (modelname, "model_meta")) try: with open(abs_modelmeta_path, "r") as f: model_meta_map = json.load(f) except Exception as e: raise_log(ValueError("failed to open file: %s, err: %s" % (abs_modelmeta_path, str(e)))) modelmeta_key_ancestor_classname_set = "ancestor_classname_set" modelmeta_key_modulename = "modulename" missed_keys = {modelmeta_key_ancestor_classname_set, modelmeta_key_modulename} - model_meta_map.keys() raise_if( len(missed_keys) > 0, "unable to get meta info %s, file path: %s, content: %s" % (missed_keys, abs_modelmeta_path, model_meta_map) ) # class name string ("MLBaseModel") vs class.__name__ (MLBaseModel): # str "MLBaseModel": supports lazy import. # class MLBaseModel.__class__: can avoid misspelling issue, etc., but cannot support lazy import. # (currently deprecated) if MLBaseModel.__name__ in model_meta_map["ancestor_classname_set"] if "MLBaseModel" in model_meta_map[modelmeta_key_ancestor_classname_set]: # lazy import from paddlets.models.forecasting.ml.ml_base import MLBaseModel return MLBaseModel.load(abs_model_path) if "PaddleBaseModel" in model_meta_map[modelmeta_key_ancestor_classname_set]: # lazy import from paddlets.models.forecasting.dl.paddle_base import PaddleBaseModel return PaddleBaseModel.load(abs_model_path) if "AnomalyBaseModel" in model_meta_map[modelmeta_key_ancestor_classname_set]: # lazy import from paddlets.models.anomaly.dl.anomaly_base import AnomalyBaseModel return AnomalyBaseModel.load(abs_model_path) if "StatisticalBase" in model_meta_map[modelmeta_key_ancestor_classname_set]: # lazy import from paddlets.models.anomaly.ml.statistical_base import StatisticalBase return StatisticalBase.load(abs_model_path) if "ReprBaseModel" in model_meta_map[modelmeta_key_ancestor_classname_set]: # lazy import from paddlets.models.representation.dl.repr_base import ReprBaseModel return ReprBaseModel.load(abs_model_path) raise_log(ValueError( "The given model class is not supported: %s.%s" % ( model_meta_map[modelmeta_key_modulename], # model_meta_map["ancestor_classname_set"] = [child, parent, grandparent, ancestor] model_meta_map[modelmeta_key_ancestor_classname_set][0] ) ))