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.

Files changed (305) hide show
  1. mlrun/__init__.py +11 -1
  2. mlrun/__main__.py +40 -122
  3. mlrun/alerts/__init__.py +15 -0
  4. mlrun/alerts/alert.py +248 -0
  5. mlrun/api/schemas/__init__.py +5 -4
  6. mlrun/artifacts/__init__.py +8 -3
  7. mlrun/artifacts/base.py +47 -257
  8. mlrun/artifacts/dataset.py +11 -192
  9. mlrun/artifacts/manager.py +79 -47
  10. mlrun/artifacts/model.py +31 -159
  11. mlrun/artifacts/plots.py +23 -380
  12. mlrun/common/constants.py +74 -1
  13. mlrun/common/db/sql_session.py +5 -5
  14. mlrun/common/formatters/__init__.py +21 -0
  15. mlrun/common/formatters/artifact.py +45 -0
  16. mlrun/common/formatters/base.py +113 -0
  17. mlrun/common/formatters/feature_set.py +33 -0
  18. mlrun/common/formatters/function.py +46 -0
  19. mlrun/common/formatters/pipeline.py +53 -0
  20. mlrun/common/formatters/project.py +51 -0
  21. mlrun/common/formatters/run.py +29 -0
  22. mlrun/common/helpers.py +12 -3
  23. mlrun/common/model_monitoring/helpers.py +9 -5
  24. mlrun/{runtimes → common/runtimes}/constants.py +37 -9
  25. mlrun/common/schemas/__init__.py +31 -5
  26. mlrun/common/schemas/alert.py +202 -0
  27. mlrun/common/schemas/api_gateway.py +196 -0
  28. mlrun/common/schemas/artifact.py +25 -4
  29. mlrun/common/schemas/auth.py +16 -5
  30. mlrun/common/schemas/background_task.py +1 -1
  31. mlrun/common/schemas/client_spec.py +4 -2
  32. mlrun/common/schemas/common.py +7 -4
  33. mlrun/common/schemas/constants.py +3 -0
  34. mlrun/common/schemas/feature_store.py +74 -44
  35. mlrun/common/schemas/frontend_spec.py +15 -7
  36. mlrun/common/schemas/function.py +12 -1
  37. mlrun/common/schemas/hub.py +11 -18
  38. mlrun/common/schemas/memory_reports.py +2 -2
  39. mlrun/common/schemas/model_monitoring/__init__.py +20 -4
  40. mlrun/common/schemas/model_monitoring/constants.py +123 -42
  41. mlrun/common/schemas/model_monitoring/grafana.py +13 -9
  42. mlrun/common/schemas/model_monitoring/model_endpoints.py +101 -54
  43. mlrun/common/schemas/notification.py +71 -14
  44. mlrun/common/schemas/object.py +2 -2
  45. mlrun/{model_monitoring/controller_handler.py → common/schemas/pagination.py} +9 -12
  46. mlrun/common/schemas/pipeline.py +8 -1
  47. mlrun/common/schemas/project.py +69 -18
  48. mlrun/common/schemas/runs.py +7 -1
  49. mlrun/common/schemas/runtime_resource.py +8 -12
  50. mlrun/common/schemas/schedule.py +4 -4
  51. mlrun/common/schemas/tag.py +1 -2
  52. mlrun/common/schemas/workflow.py +12 -4
  53. mlrun/common/types.py +14 -1
  54. mlrun/config.py +154 -69
  55. mlrun/data_types/data_types.py +6 -1
  56. mlrun/data_types/spark.py +2 -2
  57. mlrun/data_types/to_pandas.py +67 -37
  58. mlrun/datastore/__init__.py +6 -8
  59. mlrun/datastore/alibaba_oss.py +131 -0
  60. mlrun/datastore/azure_blob.py +143 -42
  61. mlrun/datastore/base.py +102 -58
  62. mlrun/datastore/datastore.py +34 -13
  63. mlrun/datastore/datastore_profile.py +146 -20
  64. mlrun/datastore/dbfs_store.py +3 -7
  65. mlrun/datastore/filestore.py +1 -4
  66. mlrun/datastore/google_cloud_storage.py +97 -33
  67. mlrun/datastore/hdfs.py +56 -0
  68. mlrun/datastore/inmem.py +6 -3
  69. mlrun/datastore/redis.py +7 -2
  70. mlrun/datastore/s3.py +34 -12
  71. mlrun/datastore/snowflake_utils.py +45 -0
  72. mlrun/datastore/sources.py +303 -111
  73. mlrun/datastore/spark_utils.py +31 -2
  74. mlrun/datastore/store_resources.py +9 -7
  75. mlrun/datastore/storeytargets.py +151 -0
  76. mlrun/datastore/targets.py +453 -176
  77. mlrun/datastore/utils.py +72 -58
  78. mlrun/datastore/v3io.py +6 -1
  79. mlrun/db/base.py +274 -41
  80. mlrun/db/factory.py +1 -1
  81. mlrun/db/httpdb.py +893 -225
  82. mlrun/db/nopdb.py +291 -33
  83. mlrun/errors.py +36 -6
  84. mlrun/execution.py +115 -42
  85. mlrun/feature_store/__init__.py +0 -2
  86. mlrun/feature_store/api.py +65 -73
  87. mlrun/feature_store/common.py +7 -12
  88. mlrun/feature_store/feature_set.py +76 -55
  89. mlrun/feature_store/feature_vector.py +39 -31
  90. mlrun/feature_store/ingestion.py +7 -6
  91. mlrun/feature_store/retrieval/base.py +16 -11
  92. mlrun/feature_store/retrieval/dask_merger.py +2 -0
  93. mlrun/feature_store/retrieval/job.py +13 -4
  94. mlrun/feature_store/retrieval/local_merger.py +2 -0
  95. mlrun/feature_store/retrieval/spark_merger.py +24 -32
  96. mlrun/feature_store/steps.py +45 -34
  97. mlrun/features.py +11 -21
  98. mlrun/frameworks/_common/artifacts_library.py +9 -9
  99. mlrun/frameworks/_common/mlrun_interface.py +5 -5
  100. mlrun/frameworks/_common/model_handler.py +48 -48
  101. mlrun/frameworks/_common/plan.py +5 -6
  102. mlrun/frameworks/_common/producer.py +3 -4
  103. mlrun/frameworks/_common/utils.py +5 -5
  104. mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
  105. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
  106. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
  107. mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
  108. mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
  109. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
  110. mlrun/frameworks/_ml_common/model_handler.py +24 -24
  111. mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
  112. mlrun/frameworks/_ml_common/plan.py +2 -2
  113. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
  114. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
  115. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  116. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
  117. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  118. mlrun/frameworks/_ml_common/utils.py +4 -4
  119. mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
  120. mlrun/frameworks/huggingface/model_server.py +4 -4
  121. mlrun/frameworks/lgbm/__init__.py +33 -33
  122. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  123. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
  124. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
  125. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
  126. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
  127. mlrun/frameworks/lgbm/model_handler.py +10 -10
  128. mlrun/frameworks/lgbm/model_server.py +6 -6
  129. mlrun/frameworks/lgbm/utils.py +5 -5
  130. mlrun/frameworks/onnx/dataset.py +8 -8
  131. mlrun/frameworks/onnx/mlrun_interface.py +3 -3
  132. mlrun/frameworks/onnx/model_handler.py +6 -6
  133. mlrun/frameworks/onnx/model_server.py +7 -7
  134. mlrun/frameworks/parallel_coordinates.py +6 -6
  135. mlrun/frameworks/pytorch/__init__.py +18 -18
  136. mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
  137. mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
  138. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
  139. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
  140. mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
  141. mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
  142. mlrun/frameworks/pytorch/model_handler.py +17 -17
  143. mlrun/frameworks/pytorch/model_server.py +7 -7
  144. mlrun/frameworks/sklearn/__init__.py +13 -13
  145. mlrun/frameworks/sklearn/estimator.py +4 -4
  146. mlrun/frameworks/sklearn/metrics_library.py +14 -14
  147. mlrun/frameworks/sklearn/mlrun_interface.py +16 -9
  148. mlrun/frameworks/sklearn/model_handler.py +2 -2
  149. mlrun/frameworks/tf_keras/__init__.py +10 -7
  150. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
  151. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
  152. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
  153. mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
  154. mlrun/frameworks/tf_keras/model_handler.py +14 -14
  155. mlrun/frameworks/tf_keras/model_server.py +6 -6
  156. mlrun/frameworks/xgboost/__init__.py +13 -13
  157. mlrun/frameworks/xgboost/model_handler.py +6 -6
  158. mlrun/k8s_utils.py +61 -17
  159. mlrun/launcher/__init__.py +1 -1
  160. mlrun/launcher/base.py +16 -15
  161. mlrun/launcher/client.py +13 -11
  162. mlrun/launcher/factory.py +1 -1
  163. mlrun/launcher/local.py +23 -13
  164. mlrun/launcher/remote.py +17 -10
  165. mlrun/lists.py +7 -6
  166. mlrun/model.py +478 -103
  167. mlrun/model_monitoring/__init__.py +1 -1
  168. mlrun/model_monitoring/api.py +163 -371
  169. mlrun/{runtimes/mpijob/v1alpha1.py → model_monitoring/applications/__init__.py} +9 -15
  170. mlrun/model_monitoring/applications/_application_steps.py +188 -0
  171. mlrun/model_monitoring/applications/base.py +108 -0
  172. mlrun/model_monitoring/applications/context.py +341 -0
  173. mlrun/model_monitoring/{evidently_application.py → applications/evidently_base.py} +27 -22
  174. mlrun/model_monitoring/applications/histogram_data_drift.py +354 -0
  175. mlrun/model_monitoring/applications/results.py +99 -0
  176. mlrun/model_monitoring/controller.py +131 -278
  177. mlrun/model_monitoring/db/__init__.py +18 -0
  178. mlrun/model_monitoring/db/stores/__init__.py +136 -0
  179. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  180. mlrun/model_monitoring/db/stores/base/store.py +213 -0
  181. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  182. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
  183. mlrun/model_monitoring/db/stores/sqldb/models/base.py +190 -0
  184. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +103 -0
  185. mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
  186. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +659 -0
  187. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  188. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +726 -0
  189. mlrun/model_monitoring/db/tsdb/__init__.py +105 -0
  190. mlrun/model_monitoring/db/tsdb/base.py +448 -0
  191. mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
  192. mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
  193. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +279 -0
  194. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +42 -0
  195. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +507 -0
  196. mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
  197. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +158 -0
  198. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +849 -0
  199. mlrun/model_monitoring/features_drift_table.py +134 -106
  200. mlrun/model_monitoring/helpers.py +199 -55
  201. mlrun/model_monitoring/metrics/__init__.py +13 -0
  202. mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
  203. mlrun/model_monitoring/model_endpoint.py +3 -2
  204. mlrun/model_monitoring/stream_processing.py +134 -398
  205. mlrun/model_monitoring/tracking_policy.py +9 -2
  206. mlrun/model_monitoring/writer.py +161 -125
  207. mlrun/package/__init__.py +6 -6
  208. mlrun/package/context_handler.py +5 -5
  209. mlrun/package/packager.py +7 -7
  210. mlrun/package/packagers/default_packager.py +8 -8
  211. mlrun/package/packagers/numpy_packagers.py +15 -15
  212. mlrun/package/packagers/pandas_packagers.py +5 -5
  213. mlrun/package/packagers/python_standard_library_packagers.py +10 -10
  214. mlrun/package/packagers_manager.py +19 -23
  215. mlrun/package/utils/_formatter.py +6 -6
  216. mlrun/package/utils/_pickler.py +2 -2
  217. mlrun/package/utils/_supported_format.py +4 -4
  218. mlrun/package/utils/log_hint_utils.py +2 -2
  219. mlrun/package/utils/type_hint_utils.py +4 -9
  220. mlrun/platforms/__init__.py +11 -10
  221. mlrun/platforms/iguazio.py +24 -203
  222. mlrun/projects/operations.py +52 -25
  223. mlrun/projects/pipelines.py +191 -197
  224. mlrun/projects/project.py +1227 -400
  225. mlrun/render.py +16 -19
  226. mlrun/run.py +209 -184
  227. mlrun/runtimes/__init__.py +83 -15
  228. mlrun/runtimes/base.py +51 -35
  229. mlrun/runtimes/daskjob.py +17 -10
  230. mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
  231. mlrun/runtimes/databricks_job/databricks_runtime.py +8 -7
  232. mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
  233. mlrun/runtimes/funcdoc.py +1 -29
  234. mlrun/runtimes/function_reference.py +1 -1
  235. mlrun/runtimes/kubejob.py +34 -128
  236. mlrun/runtimes/local.py +40 -11
  237. mlrun/runtimes/mpijob/__init__.py +0 -20
  238. mlrun/runtimes/mpijob/abstract.py +9 -10
  239. mlrun/runtimes/mpijob/v1.py +1 -1
  240. mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
  241. mlrun/runtimes/nuclio/api_gateway.py +769 -0
  242. mlrun/runtimes/nuclio/application/__init__.py +15 -0
  243. mlrun/runtimes/nuclio/application/application.py +758 -0
  244. mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
  245. mlrun/runtimes/{function.py → nuclio/function.py} +200 -83
  246. mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
  247. mlrun/runtimes/{serving.py → nuclio/serving.py} +65 -68
  248. mlrun/runtimes/pod.py +281 -101
  249. mlrun/runtimes/remotesparkjob.py +12 -9
  250. mlrun/runtimes/sparkjob/spark3job.py +67 -51
  251. mlrun/runtimes/utils.py +41 -75
  252. mlrun/secrets.py +9 -5
  253. mlrun/serving/__init__.py +8 -1
  254. mlrun/serving/remote.py +2 -7
  255. mlrun/serving/routers.py +85 -69
  256. mlrun/serving/server.py +69 -44
  257. mlrun/serving/states.py +209 -36
  258. mlrun/serving/utils.py +22 -14
  259. mlrun/serving/v1_serving.py +6 -7
  260. mlrun/serving/v2_serving.py +133 -54
  261. mlrun/track/tracker.py +2 -1
  262. mlrun/track/tracker_manager.py +3 -3
  263. mlrun/track/trackers/mlflow_tracker.py +6 -2
  264. mlrun/utils/async_http.py +6 -8
  265. mlrun/utils/azure_vault.py +1 -1
  266. mlrun/utils/clones.py +1 -2
  267. mlrun/utils/condition_evaluator.py +3 -3
  268. mlrun/utils/db.py +21 -3
  269. mlrun/utils/helpers.py +405 -225
  270. mlrun/utils/http.py +3 -6
  271. mlrun/utils/logger.py +112 -16
  272. mlrun/utils/notifications/notification/__init__.py +17 -13
  273. mlrun/utils/notifications/notification/base.py +50 -2
  274. mlrun/utils/notifications/notification/console.py +2 -0
  275. mlrun/utils/notifications/notification/git.py +24 -1
  276. mlrun/utils/notifications/notification/ipython.py +3 -1
  277. mlrun/utils/notifications/notification/slack.py +96 -21
  278. mlrun/utils/notifications/notification/webhook.py +59 -2
  279. mlrun/utils/notifications/notification_pusher.py +149 -30
  280. mlrun/utils/regex.py +9 -0
  281. mlrun/utils/retryer.py +208 -0
  282. mlrun/utils/singleton.py +1 -1
  283. mlrun/utils/v3io_clients.py +4 -6
  284. mlrun/utils/version/version.json +2 -2
  285. mlrun/utils/version/version.py +2 -6
  286. mlrun-1.7.0.dist-info/METADATA +378 -0
  287. mlrun-1.7.0.dist-info/RECORD +351 -0
  288. {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/WHEEL +1 -1
  289. mlrun/feature_store/retrieval/conversion.py +0 -273
  290. mlrun/kfpops.py +0 -868
  291. mlrun/model_monitoring/application.py +0 -310
  292. mlrun/model_monitoring/batch.py +0 -1095
  293. mlrun/model_monitoring/prometheus.py +0 -219
  294. mlrun/model_monitoring/stores/__init__.py +0 -111
  295. mlrun/model_monitoring/stores/kv_model_endpoint_store.py +0 -576
  296. mlrun/model_monitoring/stores/model_endpoint_store.py +0 -147
  297. mlrun/model_monitoring/stores/models/__init__.py +0 -27
  298. mlrun/model_monitoring/stores/models/base.py +0 -84
  299. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
  300. mlrun/platforms/other.py +0 -306
  301. mlrun-1.6.4rc8.dist-info/METADATA +0 -272
  302. mlrun-1.6.4rc8.dist-info/RECORD +0 -314
  303. {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/LICENSE +0 -0
  304. {mlrun-1.6.4rc8.dist-info → mlrun-1.7.0.dist-info}/entry_points.txt +0 -0
  305. {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 List, Union
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(object):
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 self._labels.get("workflow") or self._uid
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('accuracy', accuracy)
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('avg_accuracy', accuracy_sum / len(param_list))
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("store://feature-vectors/default/myvec")
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, "owner"),
342
+ "owner": get_in(self._labels, mlrun_constants.MLRunInternalLabels.owner),
329
343
  }
330
- if "workflow" in self._labels:
331
- resp["workflow"] = self._labels["workflow"]
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(run_keys.secrets))
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(run_keys.output_path, self.artifact_path)
379
- self._in_path = spec.get(run_keys.input_path, self._in_path)
380
- inputs = spec.get(run_keys.inputs)
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("host", host)
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('data')
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('accuracy', 0.85)
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({'accuracy': 0.85, 'loss': 0.2})
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", run_keys.artifacts], []):
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: Upload to datastore (default is True)
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(raw_data, columns=["first_name", "last_name", "age", "testScore"])
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: List[Feature] = None,
742
- outputs: List[Feature] = None,
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("model", body=dumps(model),
756
- model_file="model.pkl",
757
- metrics=context.results,
758
- training_set=training_df,
759
- label_column='label',
760
- feature_vector=feature_vector_uri,
761
- labels={"app": "fraud"})
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
- run_keys.output_path: self.artifact_path,
929
- run_keys.inputs: self._inputs,
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"][run_keys.artifacts] = self._artifacts_manager.artifact_list()
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 "host" in labels and labels.get("kind", "job") == "mpijob":
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(labels["host"].rsplit("-", 1)[1])
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
- # completion of runs is not decided by the execution as there may be
1026
- # multiple executions for a single run (e.g. mpi)
1027
- if self._state != "completed":
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.{run_keys.artifacts}"] = self._artifacts_manager.artifact_list()
1110
+ struct[f"status.{RunKeys.artifacts}"] = self._artifacts_manager.artifact_list()
1038
1111
  return struct
1039
1112
 
1040
1113
  def _init_dbs(self, rundb):
@@ -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,