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
mlrun/artifacts/plots.py CHANGED
@@ -12,14 +12,16 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import base64
15
+ import typing
16
+ import warnings
15
17
  from io import BytesIO
16
18
 
17
- from deprecated import deprecated
18
-
19
19
  import mlrun
20
20
 
21
- from ..utils import dict_to_json
22
- from .base import Artifact, LegacyArtifact
21
+ from .base import Artifact
22
+
23
+ if typing.TYPE_CHECKING:
24
+ from plotly.graph_objs import Figure
23
25
 
24
26
 
25
27
  class PlotArtifact(Artifact):
@@ -33,6 +35,12 @@ class PlotArtifact(Artifact):
33
35
  def __init__(
34
36
  self, key=None, body=None, is_inline=False, target_path=None, title=None
35
37
  ):
38
+ if key or body or is_inline or target_path:
39
+ warnings.warn(
40
+ "Artifact constructor parameters are deprecated and will be removed in 1.9.0. "
41
+ "Use the metadata and spec parameters instead.",
42
+ DeprecationWarning,
43
+ )
36
44
  super().__init__(key, body, format="html", target_path=target_path)
37
45
  self.metadata.description = title
38
46
 
@@ -66,138 +74,6 @@ class PlotArtifact(Artifact):
66
74
  )
67
75
 
68
76
 
69
- # TODO: remove in 1.7.0
70
- @deprecated(
71
- version="1.5.0",
72
- reason="'ChartArtifact' will be removed in 1.7.0, use 'Artifact' instead",
73
- category=FutureWarning,
74
- )
75
- class ChartArtifact(Artifact):
76
- kind = "chart"
77
-
78
- _TEMPLATE = """
79
- <html>
80
- <head>
81
- <script
82
- type="text/javascript"
83
- src="https://www.gstatic.com/charts/loader.js"></script>
84
- <script type="text/javascript">
85
- google.charts.load('current', {'packages':['corechart']});
86
- google.charts.setOnLoadCallback(drawChart);
87
- function drawChart() {
88
- var data = google.visualization.arrayToDataTable($data$);
89
- var options = $opts$;
90
- var chart = new google.visualization.$chart$(
91
- document.getElementById('chart_div'));
92
- chart.draw(data, options);
93
- }
94
- </script>
95
- </head>
96
- <body>
97
- <div id="chart_div" style="width: 100%; height: 500px;"></div>
98
- </body>
99
- </html>
100
- """
101
-
102
- def __init__(
103
- self,
104
- key=None,
105
- data=None,
106
- header=None,
107
- options=None,
108
- title=None,
109
- chart=None,
110
- target_path=None,
111
- ):
112
- data = [] if data is None else data
113
- options = {} if options is None else options
114
- super().__init__(key, target_path=target_path)
115
- self.viewer = "chart"
116
- self.header = header or []
117
- self.title = title
118
- self.rows = []
119
- if data:
120
- if header:
121
- self.rows = data
122
- else:
123
- self.header = data[0]
124
- self.rows = data[1:]
125
- self.options = options
126
- self.chart = chart or "LineChart"
127
- self.format = "html"
128
-
129
- def add_row(self, row):
130
- self.rows += [row]
131
-
132
- def get_body(self):
133
- if not self.options.get("title"):
134
- self.options["title"] = self.title or self.key
135
- data = [self.header] + self.rows
136
- return (
137
- self._TEMPLATE.replace("$data$", dict_to_json(data))
138
- .replace("$opts$", dict_to_json(self.options))
139
- .replace("$chart$", self.chart)
140
- )
141
-
142
-
143
- # TODO: remove in 1.7.0
144
- @deprecated(
145
- version="1.5.0",
146
- reason="'BokehArtifact' will be removed in 1.7.0, use 'Artifact' instead",
147
- category=FutureWarning,
148
- )
149
- class BokehArtifact(Artifact):
150
- """
151
- Bokeh artifact is an artifact for saving Bokeh generated figures. They will be stored in a html format.
152
- """
153
-
154
- kind = "bokeh"
155
-
156
- def __init__(
157
- self,
158
- figure=None,
159
- key: str = None,
160
- target_path: str = None,
161
- ):
162
- """
163
- Initialize a Bokeh artifact with the given figure.
164
-
165
- :param figure: Bokeh figure ('bokeh.plotting.Figure' object) to save as an artifact.
166
- :param key: Key for the artifact to be stored in the database.
167
- :param target_path: Path to save the artifact.
168
- """
169
- # Validate input:
170
- try:
171
- from bokeh.plotting import Figure
172
- except (ModuleNotFoundError, ImportError) as Error:
173
- raise Error(
174
- "Using 'BokehArtifact' requires bokeh package. Use pip install mlrun[bokeh] to install it."
175
- )
176
- if figure is not None and not isinstance(figure, Figure):
177
- raise ValueError(
178
- "BokehArtifact requires the figure parameter to be a "
179
- "'bokeh.plotting.Figure' but received '{}'".format(type(figure))
180
- )
181
-
182
- # Call the artifact initializer:
183
- super().__init__(key=key, target_path=target_path, viewer="bokeh")
184
-
185
- # Continue initializing the bokeh artifact:
186
- self._figure = figure
187
- self.spec.format = "html"
188
-
189
- def get_body(self):
190
- """
191
- Get the artifact's body - the bokeh figure's html code.
192
-
193
- :return: The figure's html code.
194
- """
195
- from bokeh.embed import file_html
196
- from bokeh.resources import CDN
197
-
198
- return file_html(self._figure, CDN, self.metadata.key)
199
-
200
-
201
77
  class PlotlyArtifact(Artifact):
202
78
  """
203
79
  Plotly artifact is an artifact for saving Plotly generated figures. They will be stored in a html format.
@@ -207,10 +83,10 @@ class PlotlyArtifact(Artifact):
207
83
 
208
84
  def __init__(
209
85
  self,
210
- figure=None,
211
- key: str = None,
212
- target_path: str = None,
213
- ):
86
+ figure: typing.Optional["Figure"] = None,
87
+ key: typing.Optional[str] = None,
88
+ target_path: typing.Optional[str] = None,
89
+ ) -> None:
214
90
  """
215
91
  Initialize a Plotly artifact with the given figure.
216
92
 
@@ -218,6 +94,12 @@ class PlotlyArtifact(Artifact):
218
94
  :param key: Key for the artifact to be stored in the database.
219
95
  :param target_path: Path to save the artifact.
220
96
  """
97
+ if key or target_path:
98
+ warnings.warn(
99
+ "Artifact constructor parameters are deprecated and will be removed in 1.9.0. "
100
+ "Use the metadata and spec parameters instead.",
101
+ DeprecationWarning,
102
+ )
221
103
  # Validate the plotly package:
222
104
  try:
223
105
  from plotly.graph_objs import Figure
@@ -247,249 +129,10 @@ class PlotlyArtifact(Artifact):
247
129
  self._figure = figure
248
130
  self.spec.format = "html"
249
131
 
250
- def get_body(self):
132
+ def get_body(self) -> str:
251
133
  """
252
134
  Get the artifact's body - the Plotly figure's html code.
253
135
 
254
136
  :return: The figure's html code.
255
137
  """
256
138
  return self._figure.to_html()
257
-
258
-
259
- # TODO: remove in 1.7.0
260
- @deprecated(
261
- version="1.3.0",
262
- reason="'LegacyPlotArtifact' will be removed in 1.7.0, use 'PlotArtifact' instead",
263
- category=FutureWarning,
264
- )
265
- class LegacyPlotArtifact(LegacyArtifact):
266
- _TEMPLATE = """
267
- <h3 style="text-align:center">{}</h3>
268
- <img title="{}" src="data:image/png;base64,{}">
269
- """
270
- kind = "plot"
271
-
272
- def __init__(
273
- self, key=None, body=None, is_inline=False, target_path=None, title=None
274
- ):
275
- super().__init__(key, body, format="html", target_path=target_path)
276
- self.description = title
277
-
278
- def before_log(self):
279
- self.viewer = "chart"
280
- import matplotlib
281
-
282
- if not self._body or not isinstance(
283
- self._body, (bytes, matplotlib.figure.Figure)
284
- ):
285
- raise ValueError(
286
- "matplotlib fig or png bytes must be provided as artifact body"
287
- )
288
-
289
- def get_body(self):
290
- """Convert Matplotlib figure 'fig' into a <img> tag for HTML use
291
- using base64 encoding."""
292
- if isinstance(self._body, bytes):
293
- data = self._body
294
- else:
295
- from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
296
-
297
- canvas = FigureCanvas(self._body)
298
- png_output = BytesIO()
299
- canvas.print_png(png_output)
300
- data = png_output.getvalue()
301
-
302
- data_uri = base64.b64encode(data).decode("utf-8")
303
- return self._TEMPLATE.format(self.description or self.key, self.key, data_uri)
304
-
305
-
306
- # TODO: remove in 1.7.0
307
- @deprecated(
308
- version="1.3.0",
309
- reason="'LegacyChartArtifact' will be removed in 1.7.0, use 'ChartArtifact' instead",
310
- category=FutureWarning,
311
- )
312
- class LegacyChartArtifact(LegacyArtifact):
313
- _TEMPLATE = """
314
- <html>
315
- <head>
316
- <script
317
- type="text/javascript"
318
- src="https://www.gstatic.com/charts/loader.js"></script>
319
- <script type="text/javascript">
320
- google.charts.load('current', {'packages':['corechart']});
321
- google.charts.setOnLoadCallback(drawChart);
322
- function drawChart() {
323
- var data = google.visualization.arrayToDataTable($data$);
324
- var options = $opts$;
325
- var chart = new google.visualization.$chart$(
326
- document.getElementById('chart_div'));
327
- chart.draw(data, options);
328
- }
329
- </script>
330
- </head>
331
- <body>
332
- <div id="chart_div" style="width: 100%; height: 500px;"></div>
333
- </body>
334
- </html>
335
- """
336
-
337
- kind = "chart"
338
-
339
- def __init__(
340
- self,
341
- key=None,
342
- data=None,
343
- header=None,
344
- options=None,
345
- title=None,
346
- chart=None,
347
- target_path=None,
348
- ):
349
- data = [] if data is None else data
350
- options = {} if options is None else options
351
- super().__init__(key, target_path=target_path)
352
- self.viewer = "chart"
353
- self.header = header or []
354
- self.title = title
355
- self.rows = []
356
- if data:
357
- if header:
358
- self.rows = data
359
- else:
360
- self.header = data[0]
361
- self.rows = data[1:]
362
- self.options = options
363
- self.chart = chart or "LineChart"
364
- self.format = "html"
365
-
366
- def add_row(self, row):
367
- self.rows += [row]
368
-
369
- def get_body(self):
370
- if not self.options.get("title"):
371
- self.options["title"] = self.title or self.key
372
- data = [self.header] + self.rows
373
- return (
374
- self._TEMPLATE.replace("$data$", dict_to_json(data))
375
- .replace("$opts$", dict_to_json(self.options))
376
- .replace("$chart$", self.chart)
377
- )
378
-
379
-
380
- # TODO: remove in 1.7.0
381
- @deprecated(
382
- version="1.3.0",
383
- reason="'LegacyBokehArtifact' will be removed in 1.7.0, use 'BokehArtifact' instead",
384
- category=FutureWarning,
385
- )
386
- class LegacyBokehArtifact(LegacyArtifact):
387
- """
388
- Bokeh artifact is an artifact for saving Bokeh generated figures. They will be stored in a html format.
389
- """
390
-
391
- kind = "bokeh"
392
-
393
- def __init__(
394
- self,
395
- figure=None,
396
- key: str = None,
397
- target_path: str = None,
398
- ):
399
- """
400
- Initialize a Bokeh artifact with the given figure.
401
- :param figure: Bokeh figure ('bokeh.plotting.Figure' object) to save as an artifact.
402
- :param key: Key for the artifact to be stored in the database.
403
- :param target_path: Path to save the artifact.
404
- """
405
- # Validate input:
406
- try:
407
- from bokeh.plotting import Figure
408
- except (ModuleNotFoundError, ImportError) as Error:
409
- raise Error(
410
- "Using 'BokehArtifact' requires bokeh package. Use pip install mlrun[bokeh] to install it."
411
- )
412
- if figure is not None and not isinstance(figure, Figure):
413
- raise ValueError(
414
- "BokehArtifact requires the figure parameter to be a "
415
- "'bokeh.plotting.Figure' but received '{}'".format(type(figure))
416
- )
417
-
418
- # Call the artifact initializer:
419
- super().__init__(key=key, target_path=target_path, viewer="bokeh")
420
-
421
- # Continue initializing the bokeh artifact:
422
- self._figure = figure
423
- self.format = "html"
424
-
425
- def get_body(self):
426
- """
427
- Get the artifact's body - the bokeh figure's html code.
428
- :return: The figure's html code.
429
- """
430
- from bokeh.embed import file_html
431
- from bokeh.resources import CDN
432
-
433
- return file_html(self._figure, CDN, self.key)
434
-
435
-
436
- # TODO: remove in 1.7.0
437
- @deprecated(
438
- version="1.3.0",
439
- reason="'LegacyPlotlyArtifact' will be removed in 1.7.0, use 'PlotlyArtifact' instead",
440
- category=FutureWarning,
441
- )
442
- class LegacyPlotlyArtifact(LegacyArtifact):
443
- """
444
- Plotly artifact is an artifact for saving Plotly generated figures. They will be stored in a html format.
445
- """
446
-
447
- kind = "plotly"
448
-
449
- def __init__(
450
- self,
451
- figure=None,
452
- key: str = None,
453
- target_path: str = None,
454
- ):
455
- """
456
- Initialize a Plotly artifact with the given figure.
457
- :param figure: Plotly figure ('plotly.graph_objs.Figure' object) to save as an artifact.
458
- :param key: Key for the artifact to be stored in the database.
459
- :param target_path: Path to save the artifact.
460
- """
461
- # Validate the plotly package:
462
- try:
463
- from plotly.graph_objs import Figure
464
- except ModuleNotFoundError:
465
- raise mlrun.errors.MLRunMissingDependencyError(
466
- "Using `PlotlyArtifact` requires plotly package. Use `pip install mlrun[plotly]` to install it."
467
- )
468
- except ImportError:
469
- import plotly
470
-
471
- raise mlrun.errors.MLRunMissingDependencyError(
472
- f"Using `PlotlyArtifact` requires plotly version >= 5.4.0 but found version {plotly.__version__}. "
473
- f"Use `pip install -U mlrun[plotly]` to install it."
474
- )
475
-
476
- # Call the artifact initializer:
477
- super().__init__(key=key, target_path=target_path, viewer="plotly")
478
-
479
- # Validate input:
480
- if figure is not None and not isinstance(figure, Figure):
481
- raise mlrun.errors.MLRunInvalidArgumentError(
482
- f"PlotlyArtifact requires the figure parameter to be a "
483
- f"`plotly.graph_objs.Figure` but received '{type(figure)}'"
484
- )
485
-
486
- # Continue initializing the plotly artifact:
487
- self._figure = figure
488
- self.format = "html"
489
-
490
- def get_body(self):
491
- """
492
- Get the artifact's body - the Plotly figure's html code.
493
- :return: The figure's html code.
494
- """
495
- return self._figure.to_html()
mlrun/common/constants.py CHANGED
@@ -12,4 +12,73 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #
15
+
15
16
  IMAGE_NAME_ENRICH_REGISTRY_PREFIX = "." # prefix for image name to enrich with registry
17
+ MLRUN_SERVING_CONF = "serving-conf"
18
+ MLRUN_SERVING_SPEC_MOUNT_PATH = f"/tmp/mlrun/{MLRUN_SERVING_CONF}"
19
+ MLRUN_SERVING_SPEC_FILENAME = "serving_spec.json"
20
+ MLRUN_SERVING_SPEC_PATH = (
21
+ f"{MLRUN_SERVING_SPEC_MOUNT_PATH}/{MLRUN_SERVING_SPEC_FILENAME}"
22
+ )
23
+ MLRUN_FUNCTIONS_ANNOTATION = "mlrun/mlrun-functions"
24
+ MYSQL_MEDIUMBLOB_SIZE_BYTES = 16 * 1024 * 1024
25
+ MLRUN_LABEL_PREFIX = "mlrun/"
26
+ DASK_LABEL_PREFIX = "dask.org/"
27
+ NUCLIO_LABEL_PREFIX = "nuclio.io/"
28
+
29
+
30
+ class MLRunInternalLabels:
31
+ ### dask
32
+ dask_cluster_name = f"{DASK_LABEL_PREFIX}cluster-name"
33
+ dask_component = f"{DASK_LABEL_PREFIX}component"
34
+
35
+ ### spark
36
+ spark_role = "spark-role"
37
+
38
+ ### mpi
39
+ mpi_job_name = "mpi-job-name"
40
+ mpi_job_role = "mpi-job-role"
41
+ mpi_role_type = "mpi_role_type"
42
+
43
+ ### nuclio
44
+ nuclio_project_name = f"{NUCLIO_LABEL_PREFIX}project-name"
45
+ nuclio_class = f"{NUCLIO_LABEL_PREFIX}class"
46
+
47
+ ### mlrun
48
+ mlrun_auth_key = "mlrun-auth-key"
49
+ mlrun_class = f"{MLRUN_LABEL_PREFIX}class"
50
+ client_python_version = f"{MLRUN_LABEL_PREFIX}client_python_version"
51
+ client_version = f"{MLRUN_LABEL_PREFIX}client_version"
52
+ function = f"{MLRUN_LABEL_PREFIX}function"
53
+ job = f"{MLRUN_LABEL_PREFIX}job"
54
+ name = f"{MLRUN_LABEL_PREFIX}name"
55
+ mlrun_owner = f"{MLRUN_LABEL_PREFIX}owner"
56
+ owner_domain = f"{MLRUN_LABEL_PREFIX}owner_domain"
57
+ project = f"{MLRUN_LABEL_PREFIX}project"
58
+ runner_pod = f"{MLRUN_LABEL_PREFIX}runner-pod"
59
+ schedule_name = f"{MLRUN_LABEL_PREFIX}schedule-name"
60
+ scrape_metrics = f"{MLRUN_LABEL_PREFIX}scrape-metrics"
61
+ tag = f"{MLRUN_LABEL_PREFIX}tag"
62
+ uid = f"{MLRUN_LABEL_PREFIX}uid"
63
+ username = f"{MLRUN_LABEL_PREFIX}username"
64
+ username_domain = f"{MLRUN_LABEL_PREFIX}username_domain"
65
+ task_name = f"{MLRUN_LABEL_PREFIX}task-name"
66
+ host = "host"
67
+ job_type = "job-type"
68
+ kind = "kind"
69
+ component = "component"
70
+ resource_name = "resource_name"
71
+ created = "mlrun-created"
72
+
73
+ owner = "owner"
74
+ v3io_user = "v3io_user"
75
+ workflow = "workflow"
76
+ feature_vector = "feature-vector"
77
+
78
+ @classmethod
79
+ def all(cls):
80
+ return [
81
+ value
82
+ for key, value in cls.__dict__.items()
83
+ if not key.startswith("__") and isinstance(value, str)
84
+ ]
@@ -13,7 +13,6 @@
13
13
  # limitations under the License.
14
14
  #
15
15
 
16
- import typing
17
16
 
18
17
  from sqlalchemy import create_engine
19
18
  from sqlalchemy.engine import Engine
@@ -23,8 +22,8 @@ from sqlalchemy.orm import sessionmaker as SessionMaker
23
22
  from mlrun.config import config
24
23
 
25
24
  # TODO: wrap the following functions in a singleton class
26
- _engines: typing.Dict[str, Engine] = {}
27
- _session_makers: typing.Dict[str, SessionMaker] = {}
25
+ _engines: dict[str, Engine] = {}
26
+ _session_makers: dict[str, SessionMaker] = {}
28
27
 
29
28
 
30
29
  # doing lazy load to allow tests to initialize the engine
@@ -0,0 +1,19 @@
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
+ from .artifact import ArtifactFormat # noqa
17
+ from .function import FunctionFormat # noqa
18
+ from .pipeline import PipelineFormat # noqa
19
+ from .project import ProjectFormat # noqa
@@ -0,0 +1,21 @@
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 mlrun.common.types
17
+
18
+
19
+ # TODO: add a format that returns a minimal response with ObjectFormat
20
+ class ArtifactFormat(mlrun.common.types.StrEnum):
21
+ full = "full"
@@ -0,0 +1,78 @@
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.errors
19
+
20
+
21
+ class ObjectFormat:
22
+ full = "full"
23
+
24
+ @staticmethod
25
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
26
+ return {
27
+ ObjectFormat.full: None,
28
+ }[_format]
29
+
30
+ @classmethod
31
+ def format_obj(
32
+ cls,
33
+ obj: typing.Any,
34
+ _format: str,
35
+ exclude_formats: typing.Optional[list[str]] = None,
36
+ ) -> typing.Any:
37
+ exclude_formats = exclude_formats or []
38
+ _format = _format or cls.full
39
+ invalid_format_exc = mlrun.errors.MLRunBadRequestError(
40
+ f"Provided format is not supported. format={_format}"
41
+ )
42
+
43
+ if _format in exclude_formats:
44
+ raise invalid_format_exc
45
+
46
+ try:
47
+ format_method = cls.format_method(_format)
48
+ except KeyError:
49
+ raise invalid_format_exc
50
+
51
+ if not format_method:
52
+ return obj
53
+
54
+ return format_method(obj)
55
+
56
+ @staticmethod
57
+ def filter_obj_method(_filter: list[list[str]]) -> typing.Callable:
58
+ def _filter_method(obj: dict) -> dict:
59
+ formatted_obj = {}
60
+ for key_list in _filter:
61
+ obj_recursive_iterator = obj
62
+ formatted_obj_recursive_iterator = formatted_obj
63
+ for idx, key in enumerate(key_list):
64
+ if key not in obj_recursive_iterator:
65
+ break
66
+ value = (
67
+ {} if idx < len(key_list) - 1 else obj_recursive_iterator[key]
68
+ )
69
+ formatted_obj_recursive_iterator.setdefault(key, value)
70
+
71
+ obj_recursive_iterator = obj_recursive_iterator[key]
72
+ formatted_obj_recursive_iterator = formatted_obj_recursive_iterator[
73
+ key
74
+ ]
75
+
76
+ return formatted_obj
77
+
78
+ return _filter_method