From 46c45ea0e4bcdf53ed76f4caa3e91674e0a8aa1b Mon Sep 17 00:00:00 2001 From: Clement Date: Wed, 22 Sep 2021 16:36:17 +0200 Subject: [PATCH 1/2] Selectable code env for MLFlow models --- dataikuapi/dss/savedmodel.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dataikuapi/dss/savedmodel.py b/dataikuapi/dss/savedmodel.py index 84a0ba43..2cc32be0 100644 --- a/dataikuapi/dss/savedmodel.py +++ b/dataikuapi/dss/savedmodel.py @@ -117,7 +117,7 @@ def get_origin_ml_task(self): if fmi is not None: return DSSMLTask.from_full_model_id(self.client, fmi, project_key=self.project_key) - def import_mlflow_version_from_path(self, version_id, path): + def import_mlflow_version_from_path(self, version_id, path, code_env_name = "INHERIT"): """ Create a new version for this saved model from a path containing a MLFlow model. @@ -125,7 +125,9 @@ def import_mlflow_version_from_path(self, version_id, path): :param str version_id: Identifier of the version to create :param str path: An absolute path on the local filesystem. Must be a folder, and must contain a MLFlow model - + :param str code_env_name: Name of the code env to use for this model version. The code env must contain at least + mlflow and the package(s) corresponding to the used MLFlow-compatible frameworks. + If value is "INHERIT", the default active code env of the project will be used :return a :class:MLFlowVersionHandler in order to interact with the new MLFlow model version """ # TODO: Add a check that it's indeed a MLFlow model folder @@ -135,7 +137,7 @@ def import_mlflow_version_from_path(self, version_id, path): shutil.make_archive("tmpmodel", "zip", path) #[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) with open("tmpmodel.zip", "rb") as fp: - self.client._perform_empty("POST", "/projects/%s/savedmodels/%s/versions/%s" % (self.project_key, self.sm_id, version_id), + self.client._perform_empty("POST", "/projects/%s/savedmodels/%s/versions/%s?codeEnvName=%s" % (self.project_key, self.sm_id, version_id, code_env_name), files={"file":("tmpmodel.zip", fp)}) return self.get_mlflow_version_handler(version_id) From e76cc908c37d3cbc55cdcf544d476247e2df425d Mon Sep 17 00:00:00 2001 From: Clement Date: Thu, 23 Sep 2021 14:26:26 +0200 Subject: [PATCH 2/2] Class to interact with MLFlow model metrics params --- dataikuapi/dss/savedmodel.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dataikuapi/dss/savedmodel.py b/dataikuapi/dss/savedmodel.py index 2cc32be0..6c804477 100644 --- a/dataikuapi/dss/savedmodel.py +++ b/dataikuapi/dss/savedmodel.py @@ -234,6 +234,22 @@ def delete(self): """ return self.client._perform_empty("DELETE", "/projects/%s/savedmodels/%s" % (self.project_key, self.sm_id)) +class MLFlowVersionSettings: + """Handle for the settings of an imported MLFlow model version""" + + def __init__(self, version_handler, data): + self.version_handler = version_handler + self.data = data + + @property + def raw(self): + return self.data + + def save(self): + self.version_handler.saved_model.client._perform_empty("PUT", + "/projects/%s/savedmodels/%s/versions/%s/external-ml/metadata" % (self.version_handler.saved_model.project_key, self.version_handler.saved_model.sm_id, self.version_handler.version_id), + body=self.data) + class MLFlowVersionHandler: """Handler to interact with an imported MLFlow model version""" def __init__(self, saved_model, version_id): @@ -241,6 +257,10 @@ def __init__(self, saved_model, version_id): self.saved_model = saved_model self.version_id = version_id + def get_settings(self): + metadata = self.saved_model.client._perform_json("GET", "/projects/%s/savedmodels/%s/versions/%s/external-ml/metadata" % (self.saved_model.project_key, self.saved_model.sm_id, self.version_id)) + return MLFlowVersionSettings(self, metadata) + def set_core_metadata(self, target_column_name, class_labels = None, get_features_from_dataset=None, features_list = None,