def get_tempo_artifacts( artifacts_folder: str) -> Tuple[Pipeline, Model, Model]: sklearn_model = Model( name="test-iris-sklearn", platform=ModelFramework.SKLearn, local_folder=f"{artifacts_folder}/{SKLearnFolder}", uri="s3://tempo/basic/sklearn", description="SKLearn Iris classification model", ) xgboost_model = Model( name="test-iris-xgboost", platform=ModelFramework.XGBoost, local_folder=f"{artifacts_folder}/{XGBFolder}", uri="s3://tempo/basic/xgboost", description="XGBoost Iris classification model", ) @pipeline( name="classifier", uri="s3://tempo/basic/pipeline", local_folder=f"{artifacts_folder}/classifier", models=PipelineModels(sklearn=sklearn_model, xgboost=xgboost_model), description= "A pipeline to use either an sklearn or xgboost model for Iris classification", ) def classifier(payload: np.ndarray) -> Tuple[np.ndarray, str]: res1 = classifier.models.sklearn(input=payload) print(res1) if res1[0] == 1: return res1, SKLearnTag else: return classifier.models.xgboost(input=payload), XGBoostTag return classifier, sklearn_model, xgboost_model
def inference_pipeline( sklearn_model, runtime: SeldonDockerRuntime, pipeline_conda_yaml: str) -> Generator[Pipeline, None, None]: @pipeline( name="inference-pipeline", models=PipelineModels(sklearn=sklearn_model), local_folder=os.path.dirname(pipeline_conda_yaml), ) async def _pipeline(payload: np.ndarray) -> np.ndarray: res1 = await _pipeline.models.sklearn(payload) if res1[0][0] > 0.7: return res1 return res1.sum(keepdims=True) _pipeline.save(save_env=True) runtime.deploy(_pipeline) runtime.wait_ready(_pipeline) time.sleep(8) yield _pipeline try: runtime.undeploy(_pipeline) except docker.errors.NotFound: # TODO: Should undeploy be idempotent as well? # Ignore if the model has already been undeployed pass
def create_explainer(model: Model): @pipeline( name="income-explainer", uri="s3://tempo/explainer/pipeline", local_folder=os.path.join(ARTIFACTS_FOLDER, EXPLAINER_FOLDER), models=PipelineModels(sklearn=model), ) class ExplainerPipeline(object): def __init__(self): pipeline = self.get_tempo() models_folder = pipeline.details.local_folder explainer_path = os.path.join(models_folder, "explainer.dill") with open(explainer_path, "rb") as f: self.explainer = dill.load(f) def update_predict_fn(self, x): if np.argmax(self.models.sklearn(x).shape) == 0: self.explainer.predictor = self.models.sklearn self.explainer.samplers[0].predictor = self.models.sklearn else: self.explainer.predictor = ArgmaxTransformer(self.models.sklearn) self.explainer.samplers[0].predictor = ArgmaxTransformer(self.models.sklearn) @predictmethod def explain(self, payload: np.ndarray, parameters: dict) -> str: print("Explain called with ", parameters) self.update_predict_fn(payload) explanation = self.explainer.explain(payload, **parameters) return explanation.to_json() # explainer = ExplainerPipeline() # return sklearn_model, explainer return ExplainerPipeline
def create_svc_cls(outlier, model): @pipeline( name="cifar10-service", protocol=KFServingV2Protocol(), uri="s3://tempo/outlier/cifar10/svc", local_folder=os.path.join(ARTIFACTS_FOLDER, "svc"), models=PipelineModels(outlier=outlier, cifar10=model), ) class Cifar10Svc(object): @predictmethod def predict(self, payload: np.ndarray) -> np.ndarray: r = self.models.outlier(payload=payload) if r["data"]["is_outlier"][0]: return np.array([]) else: return self.models.cifar10(payload) return Cifar10Svc
def get_tempo_artifacts( sklearn_local_path: str, xgboost_local_path: str, classifier_local_path: str, sklearn_url: str = "", xgboost_url: str = "", classifier_url: str = "", ) -> Tuple[Pipeline, Model, Model]: sklearn_model = Model( name="test-iris-sklearn", platform=ModelFramework.SKLearn, local_folder=sklearn_local_path, uri=sklearn_url, description="An SKLearn Iris classification model", ) xgboost_model = Model( name="test-iris-xgboost", platform=ModelFramework.XGBoost, local_folder=xgboost_local_path, uri=xgboost_url, description="An XGBoost Iris classification model", ) @pipeline( name="classifier", uri=classifier_url, local_folder=classifier_local_path, models=PipelineModels(sklearn=sklearn_model, xgboost=xgboost_model), description= "A pipeline to use either an sklearn or xgboost model for Iris classification", ) def classifier(payload: np.ndarray) -> Tuple[np.ndarray, str]: res1 = classifier.models.sklearn(input=payload) if res1[0] == 1: return res1, SKLearnTag else: return classifier.models.xgboost(input=payload), XGBoostTag return classifier, sklearn_model, xgboost_model