mlrun 1.6.4rc8__py3-none-any.whl → 1.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/__init__.py +11 -1
- mlrun/__main__.py +40 -122
- mlrun/alerts/__init__.py +15 -0
- mlrun/alerts/alert.py +248 -0
- mlrun/api/schemas/__init__.py +5 -4
- mlrun/artifacts/__init__.py +8 -3
- mlrun/artifacts/base.py +47 -257
- mlrun/artifacts/dataset.py +11 -192
- mlrun/artifacts/manager.py +79 -47
- mlrun/artifacts/model.py +31 -159
- mlrun/artifacts/plots.py +23 -380
- mlrun/common/constants.py +74 -1
- mlrun/common/db/sql_session.py +5 -5
- mlrun/common/formatters/__init__.py +21 -0
- mlrun/common/formatters/artifact.py +45 -0
- mlrun/common/formatters/base.py +113 -0
- mlrun/common/formatters/feature_set.py +33 -0
- mlrun/common/formatters/function.py +46 -0
- mlrun/common/formatters/pipeline.py +53 -0
- mlrun/common/formatters/project.py +51 -0
- mlrun/common/formatters/run.py +29 -0
- mlrun/common/helpers.py +12 -3
- mlrun/common/model_monitoring/helpers.py +9 -5
- mlrun/{runtimes → common/runtimes}/constants.py +37 -9
- mlrun/common/schemas/__init__.py +31 -5
- mlrun/common/schemas/alert.py +202 -0
- mlrun/common/schemas/api_gateway.py +196 -0
- mlrun/common/schemas/artifact.py +25 -4
- mlrun/common/schemas/auth.py +16 -5
- mlrun/common/schemas/background_task.py +1 -1
- mlrun/common/schemas/client_spec.py +4 -2
- mlrun/common/schemas/common.py +7 -4
- mlrun/common/schemas/constants.py +3 -0
- mlrun/common/schemas/feature_store.py +74 -44
- mlrun/common/schemas/frontend_spec.py +15 -7
- mlrun/common/schemas/function.py +12 -1
- mlrun/common/schemas/hub.py +11 -18
- mlrun/common/schemas/memory_reports.py +2 -2
- mlrun/common/schemas/model_monitoring/__init__.py +20 -4
- mlrun/common/schemas/model_monitoring/constants.py +123 -42
- mlrun/common/schemas/model_monitoring/grafana.py +13 -9
- mlrun/common/schemas/model_monitoring/model_endpoints.py +101 -54
- mlrun/common/schemas/notification.py +71 -14
- mlrun/common/schemas/object.py +2 -2
- mlrun/{model_monitoring/controller_handler.py → common/schemas/pagination.py} +9 -12
- mlrun/common/schemas/pipeline.py +8 -1
- mlrun/common/schemas/project.py +69 -18
- mlrun/common/schemas/runs.py +7 -1
- mlrun/common/schemas/runtime_resource.py +8 -12
- mlrun/common/schemas/schedule.py +4 -4
- mlrun/common/schemas/tag.py +1 -2
- mlrun/common/schemas/workflow.py +12 -4
- mlrun/common/types.py +14 -1
- mlrun/config.py +154 -69
- mlrun/data_types/data_types.py +6 -1
- mlrun/data_types/spark.py +2 -2
- mlrun/data_types/to_pandas.py +67 -37
- mlrun/datastore/__init__.py +6 -8
- mlrun/datastore/alibaba_oss.py +131 -0
- mlrun/datastore/azure_blob.py +143 -42
- mlrun/datastore/base.py +102 -58
- mlrun/datastore/datastore.py +34 -13
- mlrun/datastore/datastore_profile.py +146 -20
- mlrun/datastore/dbfs_store.py +3 -7
- mlrun/datastore/filestore.py +1 -4
- mlrun/datastore/google_cloud_storage.py +97 -33
- mlrun/datastore/hdfs.py +56 -0
- mlrun/datastore/inmem.py +6 -3
- mlrun/datastore/redis.py +7 -2
- mlrun/datastore/s3.py +34 -12
- mlrun/datastore/snowflake_utils.py +45 -0
- mlrun/datastore/sources.py +303 -111
- mlrun/datastore/spark_utils.py +31 -2
- mlrun/datastore/store_resources.py +9 -7
- mlrun/datastore/storeytargets.py +151 -0
- mlrun/datastore/targets.py +453 -176
- mlrun/datastore/utils.py +72 -58
- mlrun/datastore/v3io.py +6 -1
- mlrun/db/base.py +274 -41
- mlrun/db/factory.py +1 -1
- mlrun/db/httpdb.py +893 -225
- mlrun/db/nopdb.py +291 -33
- mlrun/errors.py +36 -6
- mlrun/execution.py +115 -42
- mlrun/feature_store/__init__.py +0 -2
- mlrun/feature_store/api.py +65 -73
- mlrun/feature_store/common.py +7 -12
- mlrun/feature_store/feature_set.py +76 -55
- mlrun/feature_store/feature_vector.py +39 -31
- mlrun/feature_store/ingestion.py +7 -6
- mlrun/feature_store/retrieval/base.py +16 -11
- mlrun/feature_store/retrieval/dask_merger.py +2 -0
- mlrun/feature_store/retrieval/job.py +13 -4
- mlrun/feature_store/retrieval/local_merger.py +2 -0
- mlrun/feature_store/retrieval/spark_merger.py +24 -32
- mlrun/feature_store/steps.py +45 -34
- mlrun/features.py +11 -21
- mlrun/frameworks/_common/artifacts_library.py +9 -9
- mlrun/frameworks/_common/mlrun_interface.py +5 -5
- mlrun/frameworks/_common/model_handler.py +48 -48
- mlrun/frameworks/_common/plan.py +5 -6
- mlrun/frameworks/_common/producer.py +3 -4
- mlrun/frameworks/_common/utils.py +5 -5
- mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
- mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
- mlrun/frameworks/_ml_common/model_handler.py +24 -24
- mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
- mlrun/frameworks/_ml_common/plan.py +2 -2
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
- mlrun/frameworks/_ml_common/utils.py +4 -4
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
- mlrun/frameworks/huggingface/model_server.py +4 -4
- mlrun/frameworks/lgbm/__init__.py +33 -33
- mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
- mlrun/frameworks/lgbm/model_handler.py +10 -10
- mlrun/frameworks/lgbm/model_server.py +6 -6
- mlrun/frameworks/lgbm/utils.py +5 -5
- mlrun/frameworks/onnx/dataset.py +8 -8
- mlrun/frameworks/onnx/mlrun_interface.py +3 -3
- mlrun/frameworks/onnx/model_handler.py +6 -6
- mlrun/frameworks/onnx/model_server.py +7 -7
- mlrun/frameworks/parallel_coordinates.py +6 -6
- mlrun/frameworks/pytorch/__init__.py +18 -18
- mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
- mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
- mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
- mlrun/frameworks/pytorch/model_handler.py +17 -17
- mlrun/frameworks/pytorch/model_server.py +7 -7
- mlrun/frameworks/sklearn/__init__.py +13 -13
- mlrun/frameworks/sklearn/estimator.py +4 -4
- mlrun/frameworks/sklearn/metrics_library.py +14 -14
- mlrun/frameworks/sklearn/mlrun_interface.py +16 -9
- mlrun/frameworks/sklearn/model_handler.py +2 -2
- mlrun/frameworks/tf_keras/__init__.py +10 -7
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
- mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
- mlrun/frameworks/tf_keras/model_handler.py +14 -14
- mlrun/frameworks/tf_keras/model_server.py +6 -6
- mlrun/frameworks/xgboost/__init__.py +13 -13
- mlrun/frameworks/xgboost/model_handler.py +6 -6
- mlrun/k8s_utils.py +61 -17
- mlrun/launcher/__init__.py +1 -1
- mlrun/launcher/base.py +16 -15
- mlrun/launcher/client.py +13 -11
- mlrun/launcher/factory.py +1 -1
- mlrun/launcher/local.py +23 -13
- mlrun/launcher/remote.py +17 -10
- mlrun/lists.py +7 -6
- mlrun/model.py +478 -103
- mlrun/model_monitoring/__init__.py +1 -1
- mlrun/model_monitoring/api.py +163 -371
- mlrun/{runtimes/mpijob/v1alpha1.py → model_monitoring/applications/__init__.py} +9 -15
- mlrun/model_monitoring/applications/_application_steps.py +188 -0
- mlrun/model_monitoring/applications/base.py +108 -0
- mlrun/model_monitoring/applications/context.py +341 -0
- mlrun/model_monitoring/{evidently_application.py → applications/evidently_base.py} +27 -22
- mlrun/model_monitoring/applications/histogram_data_drift.py +354 -0
- mlrun/model_monitoring/applications/results.py +99 -0
- mlrun/model_monitoring/controller.py +131 -278
- mlrun/model_monitoring/db/__init__.py +18 -0
- mlrun/model_monitoring/db/stores/__init__.py +136 -0
- mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
- mlrun/model_monitoring/db/stores/base/store.py +213 -0
- mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
- mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
- mlrun/model_monitoring/db/stores/sqldb/models/base.py +190 -0
- mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +103 -0
- mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
- mlrun/model_monitoring/db/stores/sqldb/sql_store.py +659 -0
- mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
- mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +726 -0
- mlrun/model_monitoring/db/tsdb/__init__.py +105 -0
- mlrun/model_monitoring/db/tsdb/base.py +448 -0
- mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
- mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +279 -0
- mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +42 -0
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +507 -0
- mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +158 -0
- mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +849 -0
- mlrun/model_monitoring/features_drift_table.py +134 -106
- mlrun/model_monitoring/helpers.py +199 -55
- mlrun/model_monitoring/metrics/__init__.py +13 -0
- mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
- mlrun/model_monitoring/model_endpoint.py +3 -2
- mlrun/model_monitoring/stream_processing.py +134 -398
- mlrun/model_monitoring/tracking_policy.py +9 -2
- mlrun/model_monitoring/writer.py +161 -125
- mlrun/package/__init__.py +6 -6
- mlrun/package/context_handler.py +5 -5
- mlrun/package/packager.py +7 -7
- mlrun/package/packagers/default_packager.py +8 -8
- mlrun/package/packagers/numpy_packagers.py +15 -15
- mlrun/package/packagers/pandas_packagers.py +5 -5
- mlrun/package/packagers/python_standard_library_packagers.py +10 -10
- mlrun/package/packagers_manager.py +19 -23
- mlrun/package/utils/_formatter.py +6 -6
- mlrun/package/utils/_pickler.py +2 -2
- mlrun/package/utils/_supported_format.py +4 -4
- mlrun/package/utils/log_hint_utils.py +2 -2
- mlrun/package/utils/type_hint_utils.py +4 -9
- mlrun/platforms/__init__.py +11 -10
- mlrun/platforms/iguazio.py +24 -203
- mlrun/projects/operations.py +52 -25
- mlrun/projects/pipelines.py +191 -197
- mlrun/projects/project.py +1227 -400
- mlrun/render.py +16 -19
- mlrun/run.py +209 -184
- mlrun/runtimes/__init__.py +83 -15
- mlrun/runtimes/base.py +51 -35
- mlrun/runtimes/daskjob.py +17 -10
- mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
- mlrun/runtimes/databricks_job/databricks_runtime.py +8 -7
- mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
- mlrun/runtimes/funcdoc.py +1 -29
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/kubejob.py +34 -128
- mlrun/runtimes/local.py +40 -11
- mlrun/runtimes/mpijob/__init__.py +0 -20
- mlrun/runtimes/mpijob/abstract.py +9 -10
- mlrun/runtimes/mpijob/v1.py +1 -1
- mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
- mlrun/runtimes/nuclio/api_gateway.py +769 -0
- mlrun/runtimes/nuclio/application/__init__.py +15 -0
- mlrun/runtimes/nuclio/application/application.py +758 -0
- mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
- mlrun/runtimes/{function.py → nuclio/function.py} +200 -83
- mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
- mlrun/runtimes/{serving.py → nuclio/serving.py} +65 -68
- mlrun/runtimes/pod.py +281 -101
- mlrun/runtimes/remotesparkjob.py +12 -9
- mlrun/runtimes/sparkjob/spark3job.py +67 -51
- mlrun/runtimes/utils.py +41 -75
- mlrun/secrets.py +9 -5
- mlrun/serving/__init__.py +8 -1
- mlrun/serving/remote.py +2 -7
- mlrun/serving/routers.py +85 -69
- mlrun/serving/server.py +69 -44
- mlrun/serving/states.py +209 -36
- mlrun/serving/utils.py +22 -14
- mlrun/serving/v1_serving.py +6 -7
- mlrun/serving/v2_serving.py +133 -54
- mlrun/track/tracker.py +2 -1
- mlrun/track/tracker_manager.py +3 -3
- mlrun/track/trackers/mlflow_tracker.py +6 -2
- mlrun/utils/async_http.py +6 -8
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +1 -2
- mlrun/utils/condition_evaluator.py +3 -3
- mlrun/utils/db.py +21 -3
- mlrun/utils/helpers.py +405 -225
- mlrun/utils/http.py +3 -6
- mlrun/utils/logger.py +112 -16
- mlrun/utils/notifications/notification/__init__.py +17 -13
- mlrun/utils/notifications/notification/base.py +50 -2
- mlrun/utils/notifications/notification/console.py +2 -0
- mlrun/utils/notifications/notification/git.py +24 -1
- mlrun/utils/notifications/notification/ipython.py +3 -1
- mlrun/utils/notifications/notification/slack.py +96 -21
- mlrun/utils/notifications/notification/webhook.py +59 -2
- mlrun/utils/notifications/notification_pusher.py +149 -30
- mlrun/utils/regex.py +9 -0
- mlrun/utils/retryer.py +208 -0
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +4 -6
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +2 -6
- mlrun-1.7.0.dist-info/METADATA +378 -0
- mlrun-1.7.0.dist-info/RECORD +351 -0
- {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/WHEEL +1 -1
- mlrun/feature_store/retrieval/conversion.py +0 -273
- mlrun/kfpops.py +0 -868
- mlrun/model_monitoring/application.py +0 -310
- mlrun/model_monitoring/batch.py +0 -1095
- mlrun/model_monitoring/prometheus.py +0 -219
- mlrun/model_monitoring/stores/__init__.py +0 -111
- mlrun/model_monitoring/stores/kv_model_endpoint_store.py +0 -576
- mlrun/model_monitoring/stores/model_endpoint_store.py +0 -147
- mlrun/model_monitoring/stores/models/__init__.py +0 -27
- mlrun/model_monitoring/stores/models/base.py +0 -84
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
- mlrun/platforms/other.py +0 -306
- mlrun-1.6.4rc8.dist-info/METADATA +0 -272
- mlrun-1.6.4rc8.dist-info/RECORD +0 -314
- {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/LICENSE +0 -0
- {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/top_level.txt +0 -0
mlrun/execution.py
CHANGED
|
@@ -12,16 +12,19 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import logging
|
|
15
16
|
import os
|
|
16
17
|
import uuid
|
|
17
18
|
from copy import deepcopy
|
|
18
|
-
from typing import
|
|
19
|
+
from typing import Union
|
|
19
20
|
|
|
20
21
|
import numpy as np
|
|
21
22
|
import yaml
|
|
22
23
|
from dateutil import parser
|
|
23
24
|
|
|
24
25
|
import mlrun
|
|
26
|
+
import mlrun.common.constants as mlrun_constants
|
|
27
|
+
import mlrun.common.formatters
|
|
25
28
|
from mlrun.artifacts import ModelArtifact
|
|
26
29
|
from mlrun.datastore.store_resources import get_store_resource
|
|
27
30
|
from mlrun.errors import MLRunInvalidArgumentError
|
|
@@ -33,19 +36,19 @@ from .features import Feature
|
|
|
33
36
|
from .model import HyperParamOptions
|
|
34
37
|
from .secrets import SecretsStore
|
|
35
38
|
from .utils import (
|
|
39
|
+
RunKeys,
|
|
36
40
|
dict_to_json,
|
|
37
41
|
dict_to_yaml,
|
|
38
42
|
get_in,
|
|
39
43
|
is_relative_path,
|
|
40
44
|
logger,
|
|
41
45
|
now_date,
|
|
42
|
-
run_keys,
|
|
43
46
|
to_date_str,
|
|
44
47
|
update_in,
|
|
45
48
|
)
|
|
46
49
|
|
|
47
50
|
|
|
48
|
-
class MLClientCtx
|
|
51
|
+
class MLClientCtx:
|
|
49
52
|
"""ML Execution Client Context
|
|
50
53
|
|
|
51
54
|
The context is generated and injected to the function using the ``function.run()``
|
|
@@ -77,13 +80,13 @@ class MLClientCtx(object):
|
|
|
77
80
|
self._tmpfile = tmp
|
|
78
81
|
self._logger = log_stream or logger
|
|
79
82
|
self._log_level = "info"
|
|
80
|
-
self._matrics_db = None
|
|
81
83
|
self._autocommit = autocommit
|
|
82
84
|
self._notifications = []
|
|
83
85
|
self._state_thresholds = {}
|
|
84
86
|
|
|
85
87
|
self._labels = {}
|
|
86
88
|
self._annotations = {}
|
|
89
|
+
self._node_selector = {}
|
|
87
90
|
|
|
88
91
|
self._function = ""
|
|
89
92
|
self._parameters = {}
|
|
@@ -101,8 +104,7 @@ class MLClientCtx(object):
|
|
|
101
104
|
self._error = None
|
|
102
105
|
self._commit = ""
|
|
103
106
|
self._host = None
|
|
104
|
-
self._start_time = now_date()
|
|
105
|
-
self._last_update = now_date()
|
|
107
|
+
self._start_time = self._last_update = now_date()
|
|
106
108
|
self._iteration_results = None
|
|
107
109
|
self._children = []
|
|
108
110
|
self._parent = None
|
|
@@ -110,6 +112,7 @@ class MLClientCtx(object):
|
|
|
110
112
|
|
|
111
113
|
self._project_object = None
|
|
112
114
|
self._allow_empty_resources = None
|
|
115
|
+
self._reset_on_run = None
|
|
113
116
|
|
|
114
117
|
def __enter__(self):
|
|
115
118
|
return self
|
|
@@ -129,7 +132,9 @@ class MLClientCtx(object):
|
|
|
129
132
|
@property
|
|
130
133
|
def tag(self):
|
|
131
134
|
"""Run tag (uid or workflow id if exists)"""
|
|
132
|
-
return
|
|
135
|
+
return (
|
|
136
|
+
self._labels.get(mlrun_constants.MLRunInternalLabels.workflow) or self._uid
|
|
137
|
+
)
|
|
133
138
|
|
|
134
139
|
@property
|
|
135
140
|
def state(self):
|
|
@@ -165,6 +170,8 @@ class MLClientCtx(object):
|
|
|
165
170
|
@log_level.setter
|
|
166
171
|
def log_level(self, value: str):
|
|
167
172
|
"""Set the logging level, e.g. 'debug', 'info', 'error'"""
|
|
173
|
+
level = logging.getLevelName(value.upper())
|
|
174
|
+
self._logger.set_logger_level(level)
|
|
168
175
|
self._log_level = value
|
|
169
176
|
|
|
170
177
|
@property
|
|
@@ -203,6 +210,11 @@ class MLClientCtx(object):
|
|
|
203
210
|
"""Dictionary with labels (read-only)"""
|
|
204
211
|
return deepcopy(self._labels)
|
|
205
212
|
|
|
213
|
+
@property
|
|
214
|
+
def node_selector(self):
|
|
215
|
+
"""Dictionary with node selectors (read-only)"""
|
|
216
|
+
return deepcopy(self._node_selector)
|
|
217
|
+
|
|
206
218
|
@property
|
|
207
219
|
def annotations(self):
|
|
208
220
|
"""Dictionary with annotations (read-only)"""
|
|
@@ -224,12 +236,12 @@ class MLClientCtx(object):
|
|
|
224
236
|
with context.get_child_context(myparam=param) as child:
|
|
225
237
|
accuracy = child_handler(child, df, **child.parameters)
|
|
226
238
|
accuracy_sum += accuracy
|
|
227
|
-
child.log_result(
|
|
239
|
+
child.log_result("accuracy", accuracy)
|
|
228
240
|
if accuracy > best_accuracy:
|
|
229
241
|
child.mark_as_best()
|
|
230
242
|
best_accuracy = accuracy
|
|
231
243
|
|
|
232
|
-
context.log_result(
|
|
244
|
+
context.log_result("avg_accuracy", accuracy_sum / len(param_list))
|
|
233
245
|
|
|
234
246
|
:param params: Extra (or override) params to parent context
|
|
235
247
|
:param with_parent_params: Child will copy the parent parameters and add to them
|
|
@@ -289,7 +301,9 @@ class MLClientCtx(object):
|
|
|
289
301
|
|
|
290
302
|
Example::
|
|
291
303
|
|
|
292
|
-
feature_vector = context.get_store_resource(
|
|
304
|
+
feature_vector = context.get_store_resource(
|
|
305
|
+
"store://feature-vectors/default/myvec"
|
|
306
|
+
)
|
|
293
307
|
dataset = context.get_store_resource("store://artifacts/default/mydata")
|
|
294
308
|
|
|
295
309
|
:param url: Store resource uri/path, store://<type>/<project>/<name>:<version>
|
|
@@ -325,10 +339,12 @@ class MLClientCtx(object):
|
|
|
325
339
|
"name": self.name,
|
|
326
340
|
"kind": "run",
|
|
327
341
|
"uri": uri,
|
|
328
|
-
"owner": get_in(self._labels,
|
|
342
|
+
"owner": get_in(self._labels, mlrun_constants.MLRunInternalLabels.owner),
|
|
329
343
|
}
|
|
330
|
-
if
|
|
331
|
-
resp[
|
|
344
|
+
if mlrun_constants.MLRunInternalLabels.workflow in self._labels:
|
|
345
|
+
resp[mlrun_constants.MLRunInternalLabels.workflow] = self._labels[
|
|
346
|
+
mlrun_constants.MLRunInternalLabels.workflow
|
|
347
|
+
]
|
|
332
348
|
return resp
|
|
333
349
|
|
|
334
350
|
@classmethod
|
|
@@ -357,7 +373,7 @@ class MLClientCtx(object):
|
|
|
357
373
|
self._labels = meta.get("labels", self._labels)
|
|
358
374
|
spec = attrs.get("spec")
|
|
359
375
|
if spec:
|
|
360
|
-
self._secrets_manager = SecretsStore.from_list(spec.get(
|
|
376
|
+
self._secrets_manager = SecretsStore.from_list(spec.get(RunKeys.secrets))
|
|
361
377
|
self._log_level = spec.get("log_level", self._log_level)
|
|
362
378
|
self._function = spec.get("function", self._function)
|
|
363
379
|
self._parameters = spec.get("parameters", self._parameters)
|
|
@@ -375,13 +391,15 @@ class MLClientCtx(object):
|
|
|
375
391
|
self._allow_empty_resources = spec.get(
|
|
376
392
|
"allow_empty_resources", self._allow_empty_resources
|
|
377
393
|
)
|
|
378
|
-
self.artifact_path = spec.get(
|
|
379
|
-
self._in_path = spec.get(
|
|
380
|
-
inputs = spec.get(
|
|
394
|
+
self.artifact_path = spec.get(RunKeys.output_path, self.artifact_path)
|
|
395
|
+
self._in_path = spec.get(RunKeys.input_path, self._in_path)
|
|
396
|
+
inputs = spec.get(RunKeys.inputs)
|
|
381
397
|
self._notifications = spec.get("notifications", self._notifications)
|
|
382
398
|
self._state_thresholds = spec.get(
|
|
383
399
|
"state_thresholds", self._state_thresholds
|
|
384
400
|
)
|
|
401
|
+
self._node_selector = spec.get("node_selector", self._node_selector)
|
|
402
|
+
self._reset_on_run = spec.get("reset_on_run", self._reset_on_run)
|
|
385
403
|
|
|
386
404
|
self._init_dbs(rundb)
|
|
387
405
|
|
|
@@ -394,7 +412,7 @@ class MLClientCtx(object):
|
|
|
394
412
|
self._set_input(k, v)
|
|
395
413
|
|
|
396
414
|
if host and not is_api:
|
|
397
|
-
self.set_label(
|
|
415
|
+
self.set_label(mlrun_constants.MLRunInternalLabels.host, host)
|
|
398
416
|
|
|
399
417
|
start = get_in(attrs, "status.start_time")
|
|
400
418
|
if start:
|
|
@@ -421,7 +439,7 @@ class MLClientCtx(object):
|
|
|
421
439
|
|
|
422
440
|
Example::
|
|
423
441
|
|
|
424
|
-
data_path=context.artifact_subpath(
|
|
442
|
+
data_path = context.artifact_subpath("data")
|
|
425
443
|
|
|
426
444
|
"""
|
|
427
445
|
return os.path.join(self.artifact_path, *subpaths)
|
|
@@ -525,7 +543,7 @@ class MLClientCtx(object):
|
|
|
525
543
|
|
|
526
544
|
Example::
|
|
527
545
|
|
|
528
|
-
context.log_result(
|
|
546
|
+
context.log_result("accuracy", 0.85)
|
|
529
547
|
|
|
530
548
|
:param key: Result key
|
|
531
549
|
:param value: Result value
|
|
@@ -539,7 +557,7 @@ class MLClientCtx(object):
|
|
|
539
557
|
|
|
540
558
|
Example::
|
|
541
559
|
|
|
542
|
-
context.log_results({
|
|
560
|
+
context.log_results({"accuracy": 0.85, "loss": 0.2})
|
|
543
561
|
|
|
544
562
|
:param results: Key/value dict or results
|
|
545
563
|
:param commit: Commit (write to DB now vs wait for the end of the run)
|
|
@@ -558,7 +576,7 @@ class MLClientCtx(object):
|
|
|
558
576
|
self._results["best_iteration"] = best
|
|
559
577
|
for k, v in get_in(task, ["status", "results"], {}).items():
|
|
560
578
|
self._results[k] = v
|
|
561
|
-
for artifact in get_in(task, ["status",
|
|
579
|
+
for artifact in get_in(task, ["status", RunKeys.artifacts], []):
|
|
562
580
|
self._artifacts_manager.artifacts[artifact["metadata"]["key"]] = (
|
|
563
581
|
artifact
|
|
564
582
|
)
|
|
@@ -617,7 +635,9 @@ class MLClientCtx(object):
|
|
|
617
635
|
:param viewer: Kubeflow viewer type
|
|
618
636
|
:param target_path: Absolute target path (instead of using artifact_path + local_path)
|
|
619
637
|
:param src_path: Deprecated, use local_path
|
|
620
|
-
:param upload:
|
|
638
|
+
:param upload: Whether to upload the artifact to the datastore. If not provided, and the `local_path`
|
|
639
|
+
is not a directory, upload occurs by default. Directories are uploaded only when this
|
|
640
|
+
flag is explicitly set to `True`.
|
|
621
641
|
:param labels: A set of key/value labels to tag the artifact with
|
|
622
642
|
:param format: Optional, format to use (e.g. csv, parquet, ..)
|
|
623
643
|
:param db_key: The key to use in the artifact DB table, by default its run name + '_' + key
|
|
@@ -674,7 +694,9 @@ class MLClientCtx(object):
|
|
|
674
694
|
"age": [42, 52, 36, 24, 73],
|
|
675
695
|
"testScore": [25, 94, 57, 62, 70],
|
|
676
696
|
}
|
|
677
|
-
df = pd.DataFrame(
|
|
697
|
+
df = pd.DataFrame(
|
|
698
|
+
raw_data, columns=["first_name", "last_name", "age", "testScore"]
|
|
699
|
+
)
|
|
678
700
|
context.log_dataset("mydf", df=df, stats=True)
|
|
679
701
|
|
|
680
702
|
:param key: Artifact key
|
|
@@ -738,8 +760,8 @@ class MLClientCtx(object):
|
|
|
738
760
|
artifact_path=None,
|
|
739
761
|
upload=True,
|
|
740
762
|
labels=None,
|
|
741
|
-
inputs:
|
|
742
|
-
outputs:
|
|
763
|
+
inputs: list[Feature] = None,
|
|
764
|
+
outputs: list[Feature] = None,
|
|
743
765
|
feature_vector: str = None,
|
|
744
766
|
feature_weights: list = None,
|
|
745
767
|
training_set=None,
|
|
@@ -752,13 +774,16 @@ class MLClientCtx(object):
|
|
|
752
774
|
|
|
753
775
|
Example::
|
|
754
776
|
|
|
755
|
-
context.log_model(
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
777
|
+
context.log_model(
|
|
778
|
+
"model",
|
|
779
|
+
body=dumps(model),
|
|
780
|
+
model_file="model.pkl",
|
|
781
|
+
metrics=context.results,
|
|
782
|
+
training_set=training_df,
|
|
783
|
+
label_column="label",
|
|
784
|
+
feature_vector=feature_vector_uri,
|
|
785
|
+
labels={"app": "fraud"},
|
|
786
|
+
)
|
|
762
787
|
|
|
763
788
|
:param key: Artifact key or artifact class ()
|
|
764
789
|
:param body: Will use the body as the artifact content
|
|
@@ -902,6 +927,43 @@ class MLClientCtx(object):
|
|
|
902
927
|
updates, self._uid, self.project, iter=self._iteration
|
|
903
928
|
)
|
|
904
929
|
|
|
930
|
+
def get_notifications(self, unmask_secret_params=False):
|
|
931
|
+
"""
|
|
932
|
+
Get the list of notifications
|
|
933
|
+
|
|
934
|
+
:param unmask_secret_params: Used as a workaround for sending notification from workflow-runner.
|
|
935
|
+
When used, if the notification will be saved again a new secret will be created.
|
|
936
|
+
"""
|
|
937
|
+
|
|
938
|
+
# Get the full notifications from the DB since the run context does not contain the params due to bloating
|
|
939
|
+
run = self._rundb.read_run(
|
|
940
|
+
self.uid, format_=mlrun.common.formatters.RunFormat.notifications
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
notifications = []
|
|
944
|
+
for notification in run["spec"]["notifications"]:
|
|
945
|
+
notification: mlrun.model.Notification = mlrun.model.Notification.from_dict(
|
|
946
|
+
notification
|
|
947
|
+
)
|
|
948
|
+
# Fill the secret params from the project secret. We cannot use the server side internal secret mechanism
|
|
949
|
+
# here as it is the client side.
|
|
950
|
+
# TODO: This is a workaround to allow the notification to get the secret params from project secret
|
|
951
|
+
# instead of getting them from the internal project secret that should be mounted.
|
|
952
|
+
# We should mount the internal project secret that was created to the workflow-runner
|
|
953
|
+
# and get the secret from there.
|
|
954
|
+
if unmask_secret_params:
|
|
955
|
+
try:
|
|
956
|
+
notification.enrich_unmasked_secret_params_from_project_secret()
|
|
957
|
+
notifications.append(notification)
|
|
958
|
+
except mlrun.errors.MLRunValueError:
|
|
959
|
+
logger.warning(
|
|
960
|
+
"Failed to fill secret params from project secret for notification."
|
|
961
|
+
"Skip this notification.",
|
|
962
|
+
notification=notification.name,
|
|
963
|
+
)
|
|
964
|
+
|
|
965
|
+
return notifications
|
|
966
|
+
|
|
905
967
|
def to_dict(self):
|
|
906
968
|
"""Convert the run context to a dictionary"""
|
|
907
969
|
|
|
@@ -925,10 +987,11 @@ class MLClientCtx(object):
|
|
|
925
987
|
"parameters": self._parameters,
|
|
926
988
|
"handler": self._handler,
|
|
927
989
|
"outputs": self._outputs,
|
|
928
|
-
|
|
929
|
-
|
|
990
|
+
RunKeys.output_path: self.artifact_path,
|
|
991
|
+
RunKeys.inputs: self._inputs,
|
|
930
992
|
"notifications": self._notifications,
|
|
931
993
|
"state_thresholds": self._state_thresholds,
|
|
994
|
+
"node_selector": self._node_selector,
|
|
932
995
|
},
|
|
933
996
|
"status": {
|
|
934
997
|
"results": self._results,
|
|
@@ -950,7 +1013,7 @@ class MLClientCtx(object):
|
|
|
950
1013
|
set_if_not_none(struct["status"], "commit", self._commit)
|
|
951
1014
|
set_if_not_none(struct["status"], "iterations", self._iteration_results)
|
|
952
1015
|
|
|
953
|
-
struct["status"][
|
|
1016
|
+
struct["status"][RunKeys.artifacts] = self._artifacts_manager.artifact_list()
|
|
954
1017
|
self._data_stores.to_dict(struct["spec"])
|
|
955
1018
|
return struct
|
|
956
1019
|
|
|
@@ -983,10 +1046,15 @@ class MLClientCtx(object):
|
|
|
983
1046
|
# If it's a OpenMPI job, get the global rank and compare to the logging rank (worker) set in MLRun's
|
|
984
1047
|
# configuration:
|
|
985
1048
|
labels = self.labels
|
|
986
|
-
if
|
|
1049
|
+
if (
|
|
1050
|
+
mlrun_constants.MLRunInternalLabels.host in labels
|
|
1051
|
+
and labels.get(mlrun_constants.MLRunInternalLabels.kind, "job") == "mpijob"
|
|
1052
|
+
):
|
|
987
1053
|
# The host (pod name) of each worker is created by k8s, and by default it uses the rank number as the id in
|
|
988
1054
|
# the following template: ...-worker-<rank>
|
|
989
|
-
rank = int(
|
|
1055
|
+
rank = int(
|
|
1056
|
+
labels[mlrun_constants.MLRunInternalLabels.host].rsplit("-", 1)[1]
|
|
1057
|
+
)
|
|
990
1058
|
return rank == mlrun.mlconf.packagers.logging_worker
|
|
991
1059
|
|
|
992
1060
|
# Single worker is always the logging worker:
|
|
@@ -1022,9 +1090,14 @@ class MLClientCtx(object):
|
|
|
1022
1090
|
"status.last_update": to_date_str(self._last_update),
|
|
1023
1091
|
}
|
|
1024
1092
|
|
|
1025
|
-
#
|
|
1026
|
-
# multiple executions for a single run (e.g. mpi)
|
|
1027
|
-
|
|
1093
|
+
# Completion of runs is decided by the API runs monitoring as there may be
|
|
1094
|
+
# multiple executions for a single run (e.g. mpi).
|
|
1095
|
+
# For kinds that are not monitored by the API (local) we allow changing the state.
|
|
1096
|
+
run_kind = self.labels.get(mlrun_constants.MLRunInternalLabels.kind, "")
|
|
1097
|
+
if (
|
|
1098
|
+
mlrun.runtimes.RuntimeKinds.is_local_runtime(run_kind)
|
|
1099
|
+
or self._state != "completed"
|
|
1100
|
+
):
|
|
1028
1101
|
struct["status.state"] = self._state
|
|
1029
1102
|
|
|
1030
1103
|
if self.is_logging_worker():
|
|
@@ -1034,7 +1107,7 @@ class MLClientCtx(object):
|
|
|
1034
1107
|
set_if_not_none(struct, "status.commit", self._commit)
|
|
1035
1108
|
set_if_not_none(struct, "status.iterations", self._iteration_results)
|
|
1036
1109
|
|
|
1037
|
-
struct[f"status.{
|
|
1110
|
+
struct[f"status.{RunKeys.artifacts}"] = self._artifacts_manager.artifact_list()
|
|
1038
1111
|
return struct
|
|
1039
1112
|
|
|
1040
1113
|
def _init_dbs(self, rundb):
|
mlrun/feature_store/__init__.py
CHANGED
|
@@ -19,7 +19,6 @@ __all__ = [
|
|
|
19
19
|
"get_online_feature_service",
|
|
20
20
|
"ingest",
|
|
21
21
|
"preview",
|
|
22
|
-
"deploy_ingestion_service",
|
|
23
22
|
"deploy_ingestion_service_v2",
|
|
24
23
|
"delete_feature_set",
|
|
25
24
|
"delete_feature_vector",
|
|
@@ -41,7 +40,6 @@ from ..features import Entity, Feature
|
|
|
41
40
|
from .api import (
|
|
42
41
|
delete_feature_set,
|
|
43
42
|
delete_feature_vector,
|
|
44
|
-
deploy_ingestion_service,
|
|
45
43
|
deploy_ingestion_service_v2,
|
|
46
44
|
get_feature_set,
|
|
47
45
|
get_feature_vector,
|