Skip to content

Commit a093bb0

Browse files
lpenetcstenac
andauthored
Selectable code env for MLFlow models (#175)
* Selectable code env for MLFlow models * Class to interact with MLFlow model metrics params Co-authored-by: Clement <clement.stenac@dataiku.com>
1 parent 7f85e92 commit a093bb0

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

dataikuapi/dss/savedmodel.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,17 @@ def get_origin_ml_task(self):
117117
if fmi is not None:
118118
return DSSMLTask.from_full_model_id(self.client, fmi, project_key=self.project_key)
119119

120-
def import_mlflow_version_from_path(self, version_id, path):
120+
def import_mlflow_version_from_path(self, version_id, path, code_env_name = "INHERIT"):
121121
"""
122122
Create a new version for this saved model from a path containing a MLFlow model.
123123
124124
Requires the saved model to have been created using :meth:`dataikuapi.dss.project.DSSProject.create_mlflow_pyfunc_model`.
125125
126126
:param str version_id: Identifier of the version to create
127127
:param str path: An absolute path on the local filesystem. Must be a folder, and must contain a MLFlow model
128-
128+
:param str code_env_name: Name of the code env to use for this model version. The code env must contain at least
129+
mlflow and the package(s) corresponding to the used MLFlow-compatible frameworks.
130+
If value is "INHERIT", the default active code env of the project will be used
129131
:return a :class:MLFlowVersionHandler in order to interact with the new MLFlow model version
130132
"""
131133
# 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):
135137
shutil.make_archive("tmpmodel", "zip", path) #[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])
136138

137139
with open("tmpmodel.zip", "rb") as fp:
138-
self.client._perform_empty("POST", "/projects/%s/savedmodels/%s/versions/%s" % (self.project_key, self.sm_id, version_id),
140+
self.client._perform_empty("POST", "/projects/%s/savedmodels/%s/versions/%s?codeEnvName=%s" % (self.project_key, self.sm_id, version_id, code_env_name),
139141
files={"file":("tmpmodel.zip", fp)})
140142

141143
return self.get_mlflow_version_handler(version_id)
@@ -232,13 +234,33 @@ def delete(self):
232234
"""
233235
return self.client._perform_empty("DELETE", "/projects/%s/savedmodels/%s" % (self.project_key, self.sm_id))
234236

237+
class MLFlowVersionSettings:
238+
"""Handle for the settings of an imported MLFlow model version"""
239+
240+
def __init__(self, version_handler, data):
241+
self.version_handler = version_handler
242+
self.data = data
243+
244+
@property
245+
def raw(self):
246+
return self.data
247+
248+
def save(self):
249+
self.version_handler.saved_model.client._perform_empty("PUT",
250+
"/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),
251+
body=self.data)
252+
235253
class MLFlowVersionHandler:
236254
"""Handler to interact with an imported MLFlow model version"""
237255
def __init__(self, saved_model, version_id):
238256
"""Do not call this, use :meth:`DSSSavedModel.get_mlflow_version_handler`"""
239257
self.saved_model = saved_model
240258
self.version_id = version_id
241259

260+
def get_settings(self):
261+
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))
262+
return MLFlowVersionSettings(self, metadata)
263+
242264
def set_core_metadata(self,
243265
target_column_name, class_labels = None,
244266
get_features_from_dataset=None, features_list = None,

0 commit comments

Comments
 (0)