mlrun 1.6.4rc2__py3-none-any.whl → 1.7.0rc20__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 (291) hide show
  1. mlrun/__init__.py +11 -1
  2. mlrun/__main__.py +26 -112
  3. mlrun/alerts/__init__.py +15 -0
  4. mlrun/alerts/alert.py +144 -0
  5. mlrun/api/schemas/__init__.py +5 -4
  6. mlrun/artifacts/__init__.py +8 -3
  7. mlrun/artifacts/base.py +46 -257
  8. mlrun/artifacts/dataset.py +11 -192
  9. mlrun/artifacts/manager.py +47 -48
  10. mlrun/artifacts/model.py +31 -159
  11. mlrun/artifacts/plots.py +23 -380
  12. mlrun/common/constants.py +69 -0
  13. mlrun/common/db/sql_session.py +2 -3
  14. mlrun/common/formatters/__init__.py +19 -0
  15. mlrun/common/formatters/artifact.py +21 -0
  16. mlrun/common/formatters/base.py +78 -0
  17. mlrun/common/formatters/function.py +41 -0
  18. mlrun/common/formatters/pipeline.py +53 -0
  19. mlrun/common/formatters/project.py +51 -0
  20. mlrun/common/helpers.py +1 -2
  21. mlrun/common/model_monitoring/helpers.py +9 -5
  22. mlrun/{runtimes → common/runtimes}/constants.py +37 -9
  23. mlrun/common/schemas/__init__.py +24 -4
  24. mlrun/common/schemas/alert.py +203 -0
  25. mlrun/common/schemas/api_gateway.py +148 -0
  26. mlrun/common/schemas/artifact.py +18 -8
  27. mlrun/common/schemas/auth.py +11 -5
  28. mlrun/common/schemas/background_task.py +1 -1
  29. mlrun/common/schemas/client_spec.py +4 -1
  30. mlrun/common/schemas/feature_store.py +16 -16
  31. mlrun/common/schemas/frontend_spec.py +8 -7
  32. mlrun/common/schemas/function.py +5 -1
  33. mlrun/common/schemas/hub.py +11 -18
  34. mlrun/common/schemas/memory_reports.py +2 -2
  35. mlrun/common/schemas/model_monitoring/__init__.py +18 -3
  36. mlrun/common/schemas/model_monitoring/constants.py +83 -26
  37. mlrun/common/schemas/model_monitoring/grafana.py +13 -9
  38. mlrun/common/schemas/model_monitoring/model_endpoints.py +99 -16
  39. mlrun/common/schemas/notification.py +4 -4
  40. mlrun/common/schemas/object.py +2 -2
  41. mlrun/{runtimes/mpijob/v1alpha1.py → common/schemas/pagination.py} +10 -13
  42. mlrun/common/schemas/pipeline.py +1 -10
  43. mlrun/common/schemas/project.py +24 -23
  44. mlrun/common/schemas/runtime_resource.py +8 -12
  45. mlrun/common/schemas/schedule.py +3 -3
  46. mlrun/common/schemas/tag.py +1 -2
  47. mlrun/common/schemas/workflow.py +2 -2
  48. mlrun/common/types.py +7 -1
  49. mlrun/config.py +54 -17
  50. mlrun/data_types/to_pandas.py +10 -12
  51. mlrun/datastore/__init__.py +5 -8
  52. mlrun/datastore/alibaba_oss.py +130 -0
  53. mlrun/datastore/azure_blob.py +17 -5
  54. mlrun/datastore/base.py +62 -39
  55. mlrun/datastore/datastore.py +28 -9
  56. mlrun/datastore/datastore_profile.py +146 -20
  57. mlrun/datastore/filestore.py +0 -1
  58. mlrun/datastore/google_cloud_storage.py +6 -2
  59. mlrun/datastore/hdfs.py +56 -0
  60. mlrun/datastore/inmem.py +2 -2
  61. mlrun/datastore/redis.py +6 -2
  62. mlrun/datastore/s3.py +9 -0
  63. mlrun/datastore/snowflake_utils.py +43 -0
  64. mlrun/datastore/sources.py +201 -96
  65. mlrun/datastore/spark_utils.py +1 -2
  66. mlrun/datastore/store_resources.py +7 -7
  67. mlrun/datastore/targets.py +358 -104
  68. mlrun/datastore/utils.py +72 -58
  69. mlrun/datastore/v3io.py +5 -1
  70. mlrun/db/base.py +185 -35
  71. mlrun/db/factory.py +1 -1
  72. mlrun/db/httpdb.py +614 -179
  73. mlrun/db/nopdb.py +210 -26
  74. mlrun/errors.py +12 -1
  75. mlrun/execution.py +41 -24
  76. mlrun/feature_store/__init__.py +0 -2
  77. mlrun/feature_store/api.py +40 -72
  78. mlrun/feature_store/common.py +1 -1
  79. mlrun/feature_store/feature_set.py +76 -55
  80. mlrun/feature_store/feature_vector.py +28 -30
  81. mlrun/feature_store/ingestion.py +7 -6
  82. mlrun/feature_store/retrieval/base.py +16 -11
  83. mlrun/feature_store/retrieval/conversion.py +11 -13
  84. mlrun/feature_store/retrieval/dask_merger.py +2 -0
  85. mlrun/feature_store/retrieval/job.py +9 -3
  86. mlrun/feature_store/retrieval/local_merger.py +2 -0
  87. mlrun/feature_store/retrieval/spark_merger.py +34 -24
  88. mlrun/feature_store/steps.py +37 -34
  89. mlrun/features.py +9 -20
  90. mlrun/frameworks/_common/artifacts_library.py +9 -9
  91. mlrun/frameworks/_common/mlrun_interface.py +5 -5
  92. mlrun/frameworks/_common/model_handler.py +48 -48
  93. mlrun/frameworks/_common/plan.py +2 -3
  94. mlrun/frameworks/_common/producer.py +3 -4
  95. mlrun/frameworks/_common/utils.py +5 -5
  96. mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
  97. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
  98. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
  99. mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
  100. mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
  101. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
  102. mlrun/frameworks/_ml_common/model_handler.py +24 -24
  103. mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
  104. mlrun/frameworks/_ml_common/plan.py +1 -1
  105. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
  106. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
  107. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  108. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
  109. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  110. mlrun/frameworks/_ml_common/utils.py +4 -4
  111. mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
  112. mlrun/frameworks/huggingface/model_server.py +4 -4
  113. mlrun/frameworks/lgbm/__init__.py +33 -33
  114. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  115. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
  116. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
  117. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
  118. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
  119. mlrun/frameworks/lgbm/model_handler.py +10 -10
  120. mlrun/frameworks/lgbm/model_server.py +6 -6
  121. mlrun/frameworks/lgbm/utils.py +5 -5
  122. mlrun/frameworks/onnx/dataset.py +8 -8
  123. mlrun/frameworks/onnx/mlrun_interface.py +3 -3
  124. mlrun/frameworks/onnx/model_handler.py +6 -6
  125. mlrun/frameworks/onnx/model_server.py +7 -7
  126. mlrun/frameworks/parallel_coordinates.py +4 -3
  127. mlrun/frameworks/pytorch/__init__.py +18 -18
  128. mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
  129. mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
  130. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
  131. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
  132. mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
  133. mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
  134. mlrun/frameworks/pytorch/model_handler.py +17 -17
  135. mlrun/frameworks/pytorch/model_server.py +7 -7
  136. mlrun/frameworks/sklearn/__init__.py +13 -13
  137. mlrun/frameworks/sklearn/estimator.py +4 -4
  138. mlrun/frameworks/sklearn/metrics_library.py +14 -14
  139. mlrun/frameworks/sklearn/mlrun_interface.py +3 -6
  140. mlrun/frameworks/sklearn/model_handler.py +2 -2
  141. mlrun/frameworks/tf_keras/__init__.py +10 -7
  142. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
  143. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
  144. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
  145. mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
  146. mlrun/frameworks/tf_keras/model_handler.py +14 -14
  147. mlrun/frameworks/tf_keras/model_server.py +6 -6
  148. mlrun/frameworks/xgboost/__init__.py +13 -13
  149. mlrun/frameworks/xgboost/model_handler.py +6 -6
  150. mlrun/k8s_utils.py +14 -16
  151. mlrun/launcher/__init__.py +1 -1
  152. mlrun/launcher/base.py +16 -15
  153. mlrun/launcher/client.py +8 -6
  154. mlrun/launcher/factory.py +1 -1
  155. mlrun/launcher/local.py +17 -11
  156. mlrun/launcher/remote.py +16 -10
  157. mlrun/lists.py +7 -6
  158. mlrun/model.py +238 -73
  159. mlrun/model_monitoring/__init__.py +1 -1
  160. mlrun/model_monitoring/api.py +138 -315
  161. mlrun/model_monitoring/application.py +5 -296
  162. mlrun/model_monitoring/applications/__init__.py +24 -0
  163. mlrun/model_monitoring/applications/_application_steps.py +157 -0
  164. mlrun/model_monitoring/applications/base.py +282 -0
  165. mlrun/model_monitoring/applications/context.py +214 -0
  166. mlrun/model_monitoring/applications/evidently_base.py +211 -0
  167. mlrun/model_monitoring/applications/histogram_data_drift.py +349 -0
  168. mlrun/model_monitoring/applications/results.py +99 -0
  169. mlrun/model_monitoring/controller.py +104 -84
  170. mlrun/model_monitoring/controller_handler.py +13 -5
  171. mlrun/model_monitoring/db/__init__.py +18 -0
  172. mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -36
  173. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  174. mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +64 -40
  175. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  176. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
  177. mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +109 -5
  178. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +88 -0
  179. mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
  180. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +684 -0
  181. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  182. mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +310 -165
  183. mlrun/model_monitoring/db/tsdb/__init__.py +100 -0
  184. mlrun/model_monitoring/db/tsdb/base.py +329 -0
  185. mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
  186. mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
  187. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +240 -0
  188. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +45 -0
  189. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +397 -0
  190. mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
  191. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +117 -0
  192. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +630 -0
  193. mlrun/model_monitoring/evidently_application.py +6 -118
  194. mlrun/model_monitoring/features_drift_table.py +134 -106
  195. mlrun/model_monitoring/helpers.py +127 -28
  196. mlrun/model_monitoring/metrics/__init__.py +13 -0
  197. mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
  198. mlrun/model_monitoring/model_endpoint.py +3 -2
  199. mlrun/model_monitoring/prometheus.py +1 -4
  200. mlrun/model_monitoring/stream_processing.py +62 -231
  201. mlrun/model_monitoring/tracking_policy.py +9 -2
  202. mlrun/model_monitoring/writer.py +152 -124
  203. mlrun/package/__init__.py +6 -6
  204. mlrun/package/context_handler.py +5 -5
  205. mlrun/package/packager.py +7 -7
  206. mlrun/package/packagers/default_packager.py +6 -6
  207. mlrun/package/packagers/numpy_packagers.py +15 -15
  208. mlrun/package/packagers/pandas_packagers.py +5 -5
  209. mlrun/package/packagers/python_standard_library_packagers.py +10 -10
  210. mlrun/package/packagers_manager.py +19 -23
  211. mlrun/package/utils/_formatter.py +6 -6
  212. mlrun/package/utils/_pickler.py +2 -2
  213. mlrun/package/utils/_supported_format.py +4 -4
  214. mlrun/package/utils/log_hint_utils.py +2 -2
  215. mlrun/package/utils/type_hint_utils.py +4 -9
  216. mlrun/platforms/__init__.py +11 -10
  217. mlrun/platforms/iguazio.py +24 -203
  218. mlrun/projects/operations.py +35 -21
  219. mlrun/projects/pipelines.py +68 -99
  220. mlrun/projects/project.py +830 -266
  221. mlrun/render.py +3 -11
  222. mlrun/run.py +162 -166
  223. mlrun/runtimes/__init__.py +62 -7
  224. mlrun/runtimes/base.py +39 -32
  225. mlrun/runtimes/daskjob.py +8 -8
  226. mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
  227. mlrun/runtimes/databricks_job/databricks_runtime.py +7 -7
  228. mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
  229. mlrun/runtimes/funcdoc.py +0 -28
  230. mlrun/runtimes/function_reference.py +1 -1
  231. mlrun/runtimes/kubejob.py +28 -122
  232. mlrun/runtimes/local.py +6 -3
  233. mlrun/runtimes/mpijob/__init__.py +0 -20
  234. mlrun/runtimes/mpijob/abstract.py +9 -10
  235. mlrun/runtimes/mpijob/v1.py +1 -1
  236. mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
  237. mlrun/runtimes/nuclio/api_gateway.py +709 -0
  238. mlrun/runtimes/nuclio/application/__init__.py +15 -0
  239. mlrun/runtimes/nuclio/application/application.py +523 -0
  240. mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
  241. mlrun/runtimes/{function.py → nuclio/function.py} +112 -73
  242. mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
  243. mlrun/runtimes/{serving.py → nuclio/serving.py} +45 -51
  244. mlrun/runtimes/pod.py +286 -88
  245. mlrun/runtimes/remotesparkjob.py +2 -2
  246. mlrun/runtimes/sparkjob/spark3job.py +51 -34
  247. mlrun/runtimes/utils.py +7 -75
  248. mlrun/secrets.py +9 -5
  249. mlrun/serving/remote.py +2 -7
  250. mlrun/serving/routers.py +13 -10
  251. mlrun/serving/server.py +22 -26
  252. mlrun/serving/states.py +99 -25
  253. mlrun/serving/utils.py +3 -3
  254. mlrun/serving/v1_serving.py +6 -7
  255. mlrun/serving/v2_serving.py +59 -20
  256. mlrun/track/tracker.py +2 -1
  257. mlrun/track/tracker_manager.py +3 -3
  258. mlrun/track/trackers/mlflow_tracker.py +1 -2
  259. mlrun/utils/async_http.py +5 -7
  260. mlrun/utils/azure_vault.py +1 -1
  261. mlrun/utils/clones.py +1 -2
  262. mlrun/utils/condition_evaluator.py +3 -3
  263. mlrun/utils/db.py +3 -3
  264. mlrun/utils/helpers.py +183 -197
  265. mlrun/utils/http.py +2 -5
  266. mlrun/utils/logger.py +76 -14
  267. mlrun/utils/notifications/notification/__init__.py +17 -12
  268. mlrun/utils/notifications/notification/base.py +14 -2
  269. mlrun/utils/notifications/notification/console.py +2 -0
  270. mlrun/utils/notifications/notification/git.py +3 -1
  271. mlrun/utils/notifications/notification/ipython.py +3 -1
  272. mlrun/utils/notifications/notification/slack.py +101 -21
  273. mlrun/utils/notifications/notification/webhook.py +11 -1
  274. mlrun/utils/notifications/notification_pusher.py +155 -30
  275. mlrun/utils/retryer.py +208 -0
  276. mlrun/utils/singleton.py +1 -1
  277. mlrun/utils/v3io_clients.py +2 -4
  278. mlrun/utils/version/version.json +2 -2
  279. mlrun/utils/version/version.py +2 -6
  280. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/METADATA +31 -19
  281. mlrun-1.7.0rc20.dist-info/RECORD +353 -0
  282. mlrun/kfpops.py +0 -868
  283. mlrun/model_monitoring/batch.py +0 -1095
  284. mlrun/model_monitoring/stores/models/__init__.py +0 -27
  285. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
  286. mlrun/platforms/other.py +0 -306
  287. mlrun-1.6.4rc2.dist-info/RECORD +0 -314
  288. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/LICENSE +0 -0
  289. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/WHEEL +0 -0
  290. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/entry_points.txt +0 -0
  291. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,41 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.types
19
+
20
+ from .base import ObjectFormat
21
+
22
+
23
+ class FunctionFormat(ObjectFormat, mlrun.common.types.StrEnum):
24
+ minimal = "minimal"
25
+
26
+ @staticmethod
27
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
28
+ return {
29
+ FunctionFormat.full: None,
30
+ FunctionFormat.minimal: FunctionFormat.filter_obj_method(
31
+ [
32
+ ["kind"],
33
+ ["metadata"],
34
+ ["status"],
35
+ ["spec", "description"],
36
+ ["spec", "image"],
37
+ ["spec", "default_handler"],
38
+ ["spec", "entry_points"],
39
+ ]
40
+ ),
41
+ }[_format]
@@ -0,0 +1,53 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun_pipelines.common.ops
19
+ import mlrun_pipelines.models
20
+
21
+ import mlrun.common.types
22
+
23
+ from .base import ObjectFormat
24
+
25
+
26
+ class PipelineFormat(ObjectFormat, mlrun.common.types.StrEnum):
27
+ full = "full"
28
+ metadata_only = "metadata_only"
29
+ name_only = "name_only"
30
+ summary = "summary"
31
+
32
+ @staticmethod
33
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
34
+ def _full(run: mlrun_pipelines.models.PipelineRun) -> dict:
35
+ return run.to_dict()
36
+
37
+ def _metadata_only(run: mlrun_pipelines.models.PipelineRun) -> dict:
38
+ return mlrun.utils.helpers.format_run(run, with_project=True)
39
+
40
+ def _name_only(run: mlrun_pipelines.models.PipelineRun) -> str:
41
+ return run.get("name")
42
+
43
+ def _summary(run: mlrun_pipelines.models.PipelineRun) -> dict:
44
+ return mlrun_pipelines.common.ops.format_summary_from_kfp_run(
45
+ run, run["project"]
46
+ )
47
+
48
+ return {
49
+ PipelineFormat.full: _full,
50
+ PipelineFormat.metadata_only: _metadata_only,
51
+ PipelineFormat.name_only: _name_only,
52
+ PipelineFormat.summary: _summary,
53
+ }[_format]
@@ -0,0 +1,51 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.schemas
19
+ import mlrun.common.types
20
+
21
+ from .base import ObjectFormat
22
+
23
+
24
+ class ProjectFormat(ObjectFormat, mlrun.common.types.StrEnum):
25
+ full = "full"
26
+ name_only = "name_only"
27
+ # minimal format removes large fields from the response (e.g. functions, workflows, artifacts)
28
+ # and is used for faster response times (in the UI)
29
+ minimal = "minimal"
30
+ # internal - allowed only in follower mode, only for the leader for upgrade purposes
31
+ leader = "leader"
32
+
33
+ @staticmethod
34
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
35
+ def _name_only(project: mlrun.common.schemas.Project) -> str:
36
+ return project.metadata.name
37
+
38
+ def _minimal(
39
+ project: mlrun.common.schemas.Project,
40
+ ) -> mlrun.common.schemas.Project:
41
+ project.spec.functions = None
42
+ project.spec.workflows = None
43
+ project.spec.artifacts = None
44
+ return project
45
+
46
+ return {
47
+ ProjectFormat.full: None,
48
+ ProjectFormat.name_only: _name_only,
49
+ ProjectFormat.minimal: _minimal,
50
+ ProjectFormat.leader: None,
51
+ }[_format]
mlrun/common/helpers.py CHANGED
@@ -12,12 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #
15
- import typing
16
15
 
17
16
 
18
17
  def parse_versioned_object_uri(
19
18
  uri: str, default_project: str = ""
20
- ) -> typing.Tuple[str, str, str, str]:
19
+ ) -> tuple[str, str, str, str]:
21
20
  project = default_project
22
21
  tag = ""
23
22
  hash_key = ""
@@ -16,6 +16,7 @@ import sys
16
16
  import typing
17
17
 
18
18
  import mlrun.common
19
+ import mlrun.common.schemas.model_monitoring.constants as mm_constants
19
20
  from mlrun.common.schemas.model_monitoring import (
20
21
  EndpointUID,
21
22
  FunctionURI,
@@ -64,7 +65,7 @@ def parse_model_endpoint_store_prefix(store_prefix: str):
64
65
 
65
66
 
66
67
  def parse_monitoring_stream_path(
67
- stream_uri: str, project: str, application_name: str = None
68
+ stream_uri: str, project: str, function_name: str = None
68
69
  ):
69
70
  if stream_uri.startswith("kafka://"):
70
71
  if "?topic" in stream_uri:
@@ -72,14 +73,17 @@ def parse_monitoring_stream_path(
72
73
  "Custom kafka topic is not allowed"
73
74
  )
74
75
  # Add topic to stream kafka uri
75
- if application_name is None:
76
+ if (
77
+ function_name is None
78
+ or function_name == mm_constants.MonitoringFunctionNames.STREAM
79
+ ):
76
80
  stream_uri += f"?topic=monitoring_stream_{project}"
77
81
  else:
78
- stream_uri += f"?topic=monitoring_stream_{project}_{application_name}"
82
+ stream_uri += f"?topic=monitoring_stream_{project}_{function_name}"
79
83
 
80
84
  elif stream_uri.startswith("v3io://") and mlrun.mlconf.is_ce_mode():
81
85
  # V3IO is not supported in CE mode, generating a default http stream path
82
- if application_name is None:
86
+ if function_name is None:
83
87
  stream_uri = (
84
88
  mlrun.mlconf.model_endpoint_monitoring.default_http_sink.format(
85
89
  project=project, namespace=mlrun.mlconf.namespace
@@ -89,7 +93,7 @@ def parse_monitoring_stream_path(
89
93
  stream_uri = (
90
94
  mlrun.mlconf.model_endpoint_monitoring.default_http_sink_app.format(
91
95
  project=project,
92
- application_name=application_name,
96
+ application_name=function_name,
93
97
  namespace=mlrun.mlconf.namespace,
94
98
  )
95
99
  )
@@ -15,6 +15,10 @@
15
15
  import enum
16
16
  import typing
17
17
 
18
+ import mlrun_pipelines.common.models
19
+
20
+ import mlrun.common.constants as mlrun_constants
21
+
18
22
 
19
23
  class PodPhases:
20
24
  """
@@ -75,7 +79,7 @@ class ThresholdStates:
75
79
  ]
76
80
 
77
81
  @staticmethod
78
- def from_pod_phase(pod_phase: str, pod: typing.Dict) -> typing.Optional[str]:
82
+ def from_pod_phase(pod_phase: str, pod: dict) -> typing.Optional[str]:
79
83
  if pod_phase == PodPhases.pending:
80
84
  if ThresholdStates.is_pod_in_image_pull_backoff(pod):
81
85
  return ThresholdStates.image_pull_backoff
@@ -90,7 +94,7 @@ class ThresholdStates:
90
94
  return None
91
95
 
92
96
  @staticmethod
93
- def is_pod_scheduled(pod: typing.Dict):
97
+ def is_pod_scheduled(pod: dict):
94
98
  conditions = pod["status"].get("conditions", []) or []
95
99
  for condition in conditions:
96
100
  if condition["type"] == "PodScheduled" and condition["status"] == "True":
@@ -98,7 +102,7 @@ class ThresholdStates:
98
102
  return False
99
103
 
100
104
  @staticmethod
101
- def is_pod_in_image_pull_backoff(pod: typing.Dict):
105
+ def is_pod_in_image_pull_backoff(pod: dict):
102
106
  container_statuses = pod.get("status").get("container_statuses", []) or []
103
107
  for container_status in container_statuses:
104
108
  state_waiting = container_status.get("state", {}).get("waiting", {}) or {}
@@ -107,7 +111,7 @@ class ThresholdStates:
107
111
  return False
108
112
 
109
113
 
110
- class MPIJobCRDVersions(object):
114
+ class MPIJobCRDVersions:
111
115
  v1 = "v1"
112
116
  v1alpha1 = "v1alpha1"
113
117
 
@@ -122,12 +126,12 @@ class MPIJobCRDVersions(object):
122
126
  @staticmethod
123
127
  def role_label_by_version(version):
124
128
  return {
125
- MPIJobCRDVersions.v1alpha1: "mpi_role_type",
126
- MPIJobCRDVersions.v1: "mpi-job-role",
129
+ MPIJobCRDVersions.v1alpha1: mlrun_constants.MLRunInternalLabels.mpi_role_type,
130
+ MPIJobCRDVersions.v1: mlrun_constants.MLRunInternalLabels.mpi_job_role,
127
131
  }[version]
128
132
 
129
133
 
130
- class RunStates(object):
134
+ class RunStates:
131
135
  completed = "completed"
132
136
  error = "error"
133
137
  running = "running"
@@ -136,6 +140,7 @@ class RunStates(object):
136
140
  unknown = "unknown"
137
141
  aborted = "aborted"
138
142
  aborting = "aborting"
143
+ skipped = "skipped"
139
144
 
140
145
  @staticmethod
141
146
  def all():
@@ -148,6 +153,7 @@ class RunStates(object):
148
153
  RunStates.unknown,
149
154
  RunStates.aborted,
150
155
  RunStates.aborting,
156
+ RunStates.skipped,
151
157
  ]
152
158
 
153
159
  @staticmethod
@@ -156,6 +162,7 @@ class RunStates(object):
156
162
  RunStates.completed,
157
163
  RunStates.error,
158
164
  RunStates.aborted,
165
+ RunStates.skipped,
159
166
  ]
160
167
 
161
168
  @staticmethod
@@ -188,10 +195,31 @@ class RunStates(object):
188
195
  # TODO: add aborting state once we have it
189
196
  ]
190
197
 
198
+ @staticmethod
199
+ def run_state_to_pipeline_run_status(run_state: str):
200
+ if not run_state:
201
+ return mlrun_pipelines.common.models.RunStatuses.runtime_state_unspecified
191
202
 
203
+ if run_state not in RunStates.all():
204
+ raise ValueError(f"Invalid run state: {run_state}")
205
+
206
+ return {
207
+ RunStates.completed: mlrun_pipelines.common.models.RunStatuses.succeeded,
208
+ RunStates.error: mlrun_pipelines.common.models.RunStatuses.failed,
209
+ RunStates.running: mlrun_pipelines.common.models.RunStatuses.running,
210
+ RunStates.created: mlrun_pipelines.common.models.RunStatuses.pending,
211
+ RunStates.pending: mlrun_pipelines.common.models.RunStatuses.pending,
212
+ RunStates.unknown: mlrun_pipelines.common.models.RunStatuses.runtime_state_unspecified,
213
+ RunStates.aborted: mlrun_pipelines.common.models.RunStatuses.canceled,
214
+ RunStates.aborting: mlrun_pipelines.common.models.RunStatuses.canceling,
215
+ RunStates.skipped: mlrun_pipelines.common.models.RunStatuses.skipped,
216
+ }[run_state]
217
+
218
+
219
+ # TODO: remove this class in 1.9.0 - use only MlrunInternalLabels
192
220
  class RunLabels(enum.Enum):
193
- owner = "owner"
194
- v3io_user = "v3io_user"
221
+ owner = mlrun_constants.MLRunInternalLabels.owner
222
+ v3io_user = mlrun_constants.MLRunInternalLabels.v3io_user
195
223
 
196
224
  @staticmethod
197
225
  def all():
@@ -14,12 +14,29 @@
14
14
  #
15
15
  # flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
16
16
 
17
+ from .alert import (
18
+ AlertActiveState,
19
+ AlertConfig,
20
+ AlertNotification,
21
+ AlertTemplate,
22
+ Event,
23
+ )
24
+ from .api_gateway import (
25
+ APIGateway,
26
+ APIGatewayAuthenticationMode,
27
+ APIGatewayBasicAuth,
28
+ APIGatewayMetadata,
29
+ APIGatewaysOutput,
30
+ APIGatewaySpec,
31
+ APIGatewayState,
32
+ APIGatewayStatus,
33
+ APIGatewayUpstream,
34
+ )
17
35
  from .artifact import (
18
36
  Artifact,
19
37
  ArtifactCategories,
20
38
  ArtifactIdentifier,
21
39
  ArtifactMetadata,
22
- ArtifactsFormat,
23
40
  ArtifactSpec,
24
41
  )
25
42
  from .auth import (
@@ -130,7 +147,9 @@ from .model_monitoring import (
130
147
  ModelMonitoringMode,
131
148
  ModelMonitoringStoreKinds,
132
149
  MonitoringFunctionNames,
133
- TimeSeriesTarget,
150
+ PrometheusEndpoints,
151
+ TSDBTarget,
152
+ V3IOTSDBTables,
134
153
  )
135
154
  from .notification import (
136
155
  Notification,
@@ -140,14 +159,15 @@ from .notification import (
140
159
  SetNotificationRequest,
141
160
  )
142
161
  from .object import ObjectKind, ObjectMetadata, ObjectSpec, ObjectStatus
143
- from .pipeline import PipelinesFormat, PipelinesOutput, PipelinesPagination
162
+ from .pagination import PaginationInfo
163
+ from .pipeline import PipelinesOutput, PipelinesPagination
144
164
  from .project import (
145
165
  IguazioProject,
146
166
  Project,
147
167
  ProjectDesiredState,
148
168
  ProjectMetadata,
169
+ ProjectOutput,
149
170
  ProjectOwner,
150
- ProjectsFormat,
151
171
  ProjectsOutput,
152
172
  ProjectSpec,
153
173
  ProjectState,
@@ -0,0 +1,203 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ from datetime import datetime
16
+ from typing import Annotated, Optional, Union
17
+
18
+ import pydantic
19
+
20
+ from mlrun.common.schemas.notification import Notification
21
+ from mlrun.common.types import StrEnum
22
+
23
+
24
+ class EventEntityKind(StrEnum):
25
+ MODEL_ENDPOINT_RESULT = "model-endpoint-result"
26
+ JOB = "job"
27
+
28
+
29
+ class EventEntities(pydantic.BaseModel):
30
+ kind: EventEntityKind
31
+ project: str
32
+ ids: pydantic.conlist(str, min_items=1, max_items=1)
33
+
34
+
35
+ class EventKind(StrEnum):
36
+ DATA_DRIFT_DETECTED = "data_drift_detected"
37
+ DATA_DRIFT_SUSPECTED = "data_drift_suspected"
38
+ CONCEPT_DRIFT_DETECTED = "concept_drift_detected"
39
+ CONCEPT_DRIFT_SUSPECTED = "concept_drift_suspected"
40
+ MODEL_PERFORMANCE_DETECTED = "model_performance_detected"
41
+ MODEL_PERFORMANCE_SUSPECTED = "model_performance_suspected"
42
+ MODEL_SERVING_PERFORMANCE_DETECTED = "model_serving_performance_detected"
43
+ MODEL_SERVING_PERFORMANCE_SUSPECTED = "model_serving_performance_suspected"
44
+ MM_APP_ANOMALY_DETECTED = "mm_app_anomaly_detected"
45
+ MM_APP_ANOMALY_SUSPECTED = "mm_app_anomaly_suspected"
46
+ FAILED = "failed"
47
+
48
+
49
+ _event_kind_entity_map = {
50
+ EventKind.DATA_DRIFT_SUSPECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
51
+ EventKind.DATA_DRIFT_DETECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
52
+ EventKind.CONCEPT_DRIFT_DETECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
53
+ EventKind.CONCEPT_DRIFT_SUSPECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
54
+ EventKind.MODEL_PERFORMANCE_DETECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
55
+ EventKind.MODEL_PERFORMANCE_SUSPECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
56
+ EventKind.MODEL_SERVING_PERFORMANCE_DETECTED: [
57
+ EventEntityKind.MODEL_ENDPOINT_RESULT
58
+ ],
59
+ EventKind.MODEL_SERVING_PERFORMANCE_SUSPECTED: [
60
+ EventEntityKind.MODEL_ENDPOINT_RESULT
61
+ ],
62
+ EventKind.MM_APP_ANOMALY_DETECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
63
+ EventKind.MM_APP_ANOMALY_SUSPECTED: [EventEntityKind.MODEL_ENDPOINT_RESULT],
64
+ EventKind.FAILED: [EventEntityKind.JOB],
65
+ }
66
+
67
+
68
+ class Event(pydantic.BaseModel):
69
+ kind: EventKind
70
+ timestamp: Union[str, datetime] = None # occurrence time
71
+ entity: EventEntities
72
+ value_dict: Optional[dict] = pydantic.Field(default_factory=dict)
73
+
74
+ def is_valid(self):
75
+ return self.entity.kind in _event_kind_entity_map[self.kind]
76
+
77
+
78
+ class AlertActiveState(StrEnum):
79
+ ACTIVE = "active"
80
+ INACTIVE = "inactive"
81
+
82
+
83
+ class AlertSeverity(StrEnum):
84
+ LOW = "low"
85
+ MEDIUM = "medium"
86
+ HIGH = "high"
87
+
88
+
89
+ # what should trigger the alert. must be either event (at least 1), or prometheus query
90
+ class AlertTrigger(pydantic.BaseModel):
91
+ events: list[EventKind] = []
92
+ prometheus_alert: str = None
93
+
94
+ def __eq__(self, other):
95
+ return (
96
+ self.prometheus_alert == other.prometheus_alert
97
+ and self.events == other.events
98
+ )
99
+
100
+
101
+ class AlertCriteria(pydantic.BaseModel):
102
+ count: Annotated[
103
+ int,
104
+ pydantic.Field(
105
+ description="Number of events to wait until notification is sent"
106
+ ),
107
+ ] = 0
108
+ period: Annotated[
109
+ str,
110
+ pydantic.Field(
111
+ description="Time period during which event occurred. e.g. 1d, 3h, 5m, 15s"
112
+ ),
113
+ ] = None
114
+
115
+ def __eq__(self, other):
116
+ return self.count == other.count and self.period == other.period
117
+
118
+
119
+ class ResetPolicy(StrEnum):
120
+ MANUAL = "manual"
121
+ AUTO = "auto"
122
+
123
+
124
+ class AlertNotification(pydantic.BaseModel):
125
+ notification: Notification
126
+ cooldown_period: Annotated[
127
+ str,
128
+ pydantic.Field(
129
+ description="Period during which notifications "
130
+ "will not be sent after initial send. The format of this would be in time."
131
+ " e.g. 1d, 3h, 5m, 15s"
132
+ ),
133
+ ] = None
134
+
135
+
136
+ class AlertConfig(pydantic.BaseModel):
137
+ project: str
138
+ id: int = None
139
+ name: str
140
+ description: Optional[str] = ""
141
+ summary: Annotated[
142
+ str,
143
+ pydantic.Field(
144
+ description=(
145
+ "String to be sent in the notifications generated."
146
+ "e.g. 'Model {{project}}/{{entity}} is drifting.'"
147
+ "Supported variables: project, entity, name"
148
+ )
149
+ ),
150
+ ]
151
+ created: Union[str, datetime] = None
152
+ severity: AlertSeverity
153
+ entities: EventEntities
154
+ trigger: AlertTrigger
155
+ criteria: Optional[AlertCriteria]
156
+ reset_policy: ResetPolicy = ResetPolicy.MANUAL
157
+ notifications: pydantic.conlist(AlertNotification, min_items=1)
158
+ state: AlertActiveState = AlertActiveState.INACTIVE
159
+ count: Optional[int] = 0
160
+
161
+ def get_raw_notifications(self) -> list[Notification]:
162
+ return [
163
+ alert_notification.notification for alert_notification in self.notifications
164
+ ]
165
+
166
+
167
+ class AlertsModes(StrEnum):
168
+ enabled = "enabled"
169
+ disabled = "disabled"
170
+
171
+
172
+ class AlertTemplate(
173
+ pydantic.BaseModel
174
+ ): # Template fields that are not shared with created configs
175
+ template_id: int = None
176
+ template_name: str
177
+ template_description: Optional[str] = (
178
+ "String explaining the purpose of this template"
179
+ )
180
+
181
+ # A property that identifies templates that were created by the system and cannot be modified/deleted by the user
182
+ system_generated: bool = False
183
+
184
+ # AlertConfig fields that are pre-defined
185
+ summary: Optional[str] = (
186
+ "String to be sent in the generated notifications e.g. 'Model {{project}}/{{entity}} is drifting.'"
187
+ "See AlertConfig.summary description"
188
+ )
189
+ severity: AlertSeverity
190
+ trigger: AlertTrigger
191
+ criteria: Optional[AlertCriteria]
192
+ reset_policy: ResetPolicy = ResetPolicy.MANUAL
193
+
194
+ # This is slightly different than __eq__ as it doesn't compare everything
195
+ def templates_differ(self, other):
196
+ return (
197
+ self.template_description != other.template_description
198
+ or self.summary != other.summary
199
+ or self.severity != other.severity
200
+ or self.trigger != other.trigger
201
+ or self.reset_policy != other.reset_policy
202
+ or self.criteria != other.criteria
203
+ )