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.
- mlrun/__init__.py +11 -1
- mlrun/__main__.py +26 -112
- mlrun/alerts/__init__.py +15 -0
- mlrun/alerts/alert.py +144 -0
- mlrun/api/schemas/__init__.py +5 -4
- mlrun/artifacts/__init__.py +8 -3
- mlrun/artifacts/base.py +46 -257
- mlrun/artifacts/dataset.py +11 -192
- mlrun/artifacts/manager.py +47 -48
- mlrun/artifacts/model.py +31 -159
- mlrun/artifacts/plots.py +23 -380
- mlrun/common/constants.py +69 -0
- mlrun/common/db/sql_session.py +2 -3
- mlrun/common/formatters/__init__.py +19 -0
- mlrun/common/formatters/artifact.py +21 -0
- mlrun/common/formatters/base.py +78 -0
- mlrun/common/formatters/function.py +41 -0
- mlrun/common/formatters/pipeline.py +53 -0
- mlrun/common/formatters/project.py +51 -0
- mlrun/common/helpers.py +1 -2
- mlrun/common/model_monitoring/helpers.py +9 -5
- mlrun/{runtimes → common/runtimes}/constants.py +37 -9
- mlrun/common/schemas/__init__.py +24 -4
- mlrun/common/schemas/alert.py +203 -0
- mlrun/common/schemas/api_gateway.py +148 -0
- mlrun/common/schemas/artifact.py +18 -8
- mlrun/common/schemas/auth.py +11 -5
- mlrun/common/schemas/background_task.py +1 -1
- mlrun/common/schemas/client_spec.py +4 -1
- mlrun/common/schemas/feature_store.py +16 -16
- mlrun/common/schemas/frontend_spec.py +8 -7
- mlrun/common/schemas/function.py +5 -1
- mlrun/common/schemas/hub.py +11 -18
- mlrun/common/schemas/memory_reports.py +2 -2
- mlrun/common/schemas/model_monitoring/__init__.py +18 -3
- mlrun/common/schemas/model_monitoring/constants.py +83 -26
- mlrun/common/schemas/model_monitoring/grafana.py +13 -9
- mlrun/common/schemas/model_monitoring/model_endpoints.py +99 -16
- mlrun/common/schemas/notification.py +4 -4
- mlrun/common/schemas/object.py +2 -2
- mlrun/{runtimes/mpijob/v1alpha1.py → common/schemas/pagination.py} +10 -13
- mlrun/common/schemas/pipeline.py +1 -10
- mlrun/common/schemas/project.py +24 -23
- mlrun/common/schemas/runtime_resource.py +8 -12
- mlrun/common/schemas/schedule.py +3 -3
- mlrun/common/schemas/tag.py +1 -2
- mlrun/common/schemas/workflow.py +2 -2
- mlrun/common/types.py +7 -1
- mlrun/config.py +54 -17
- mlrun/data_types/to_pandas.py +10 -12
- mlrun/datastore/__init__.py +5 -8
- mlrun/datastore/alibaba_oss.py +130 -0
- mlrun/datastore/azure_blob.py +17 -5
- mlrun/datastore/base.py +62 -39
- mlrun/datastore/datastore.py +28 -9
- mlrun/datastore/datastore_profile.py +146 -20
- mlrun/datastore/filestore.py +0 -1
- mlrun/datastore/google_cloud_storage.py +6 -2
- mlrun/datastore/hdfs.py +56 -0
- mlrun/datastore/inmem.py +2 -2
- mlrun/datastore/redis.py +6 -2
- mlrun/datastore/s3.py +9 -0
- mlrun/datastore/snowflake_utils.py +43 -0
- mlrun/datastore/sources.py +201 -96
- mlrun/datastore/spark_utils.py +1 -2
- mlrun/datastore/store_resources.py +7 -7
- mlrun/datastore/targets.py +358 -104
- mlrun/datastore/utils.py +72 -58
- mlrun/datastore/v3io.py +5 -1
- mlrun/db/base.py +185 -35
- mlrun/db/factory.py +1 -1
- mlrun/db/httpdb.py +614 -179
- mlrun/db/nopdb.py +210 -26
- mlrun/errors.py +12 -1
- mlrun/execution.py +41 -24
- mlrun/feature_store/__init__.py +0 -2
- mlrun/feature_store/api.py +40 -72
- mlrun/feature_store/common.py +1 -1
- mlrun/feature_store/feature_set.py +76 -55
- mlrun/feature_store/feature_vector.py +28 -30
- mlrun/feature_store/ingestion.py +7 -6
- mlrun/feature_store/retrieval/base.py +16 -11
- mlrun/feature_store/retrieval/conversion.py +11 -13
- mlrun/feature_store/retrieval/dask_merger.py +2 -0
- mlrun/feature_store/retrieval/job.py +9 -3
- mlrun/feature_store/retrieval/local_merger.py +2 -0
- mlrun/feature_store/retrieval/spark_merger.py +34 -24
- mlrun/feature_store/steps.py +37 -34
- mlrun/features.py +9 -20
- mlrun/frameworks/_common/artifacts_library.py +9 -9
- mlrun/frameworks/_common/mlrun_interface.py +5 -5
- mlrun/frameworks/_common/model_handler.py +48 -48
- mlrun/frameworks/_common/plan.py +2 -3
- mlrun/frameworks/_common/producer.py +3 -4
- mlrun/frameworks/_common/utils.py +5 -5
- mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
- mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
- mlrun/frameworks/_ml_common/model_handler.py +24 -24
- mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
- mlrun/frameworks/_ml_common/plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
- mlrun/frameworks/_ml_common/utils.py +4 -4
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
- mlrun/frameworks/huggingface/model_server.py +4 -4
- mlrun/frameworks/lgbm/__init__.py +33 -33
- mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
- mlrun/frameworks/lgbm/model_handler.py +10 -10
- mlrun/frameworks/lgbm/model_server.py +6 -6
- mlrun/frameworks/lgbm/utils.py +5 -5
- mlrun/frameworks/onnx/dataset.py +8 -8
- mlrun/frameworks/onnx/mlrun_interface.py +3 -3
- mlrun/frameworks/onnx/model_handler.py +6 -6
- mlrun/frameworks/onnx/model_server.py +7 -7
- mlrun/frameworks/parallel_coordinates.py +4 -3
- mlrun/frameworks/pytorch/__init__.py +18 -18
- mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
- mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
- mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
- mlrun/frameworks/pytorch/model_handler.py +17 -17
- mlrun/frameworks/pytorch/model_server.py +7 -7
- mlrun/frameworks/sklearn/__init__.py +13 -13
- mlrun/frameworks/sklearn/estimator.py +4 -4
- mlrun/frameworks/sklearn/metrics_library.py +14 -14
- mlrun/frameworks/sklearn/mlrun_interface.py +3 -6
- mlrun/frameworks/sklearn/model_handler.py +2 -2
- mlrun/frameworks/tf_keras/__init__.py +10 -7
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
- mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
- mlrun/frameworks/tf_keras/model_handler.py +14 -14
- mlrun/frameworks/tf_keras/model_server.py +6 -6
- mlrun/frameworks/xgboost/__init__.py +13 -13
- mlrun/frameworks/xgboost/model_handler.py +6 -6
- mlrun/k8s_utils.py +14 -16
- mlrun/launcher/__init__.py +1 -1
- mlrun/launcher/base.py +16 -15
- mlrun/launcher/client.py +8 -6
- mlrun/launcher/factory.py +1 -1
- mlrun/launcher/local.py +17 -11
- mlrun/launcher/remote.py +16 -10
- mlrun/lists.py +7 -6
- mlrun/model.py +238 -73
- mlrun/model_monitoring/__init__.py +1 -1
- mlrun/model_monitoring/api.py +138 -315
- mlrun/model_monitoring/application.py +5 -296
- mlrun/model_monitoring/applications/__init__.py +24 -0
- mlrun/model_monitoring/applications/_application_steps.py +157 -0
- mlrun/model_monitoring/applications/base.py +282 -0
- mlrun/model_monitoring/applications/context.py +214 -0
- mlrun/model_monitoring/applications/evidently_base.py +211 -0
- mlrun/model_monitoring/applications/histogram_data_drift.py +349 -0
- mlrun/model_monitoring/applications/results.py +99 -0
- mlrun/model_monitoring/controller.py +104 -84
- mlrun/model_monitoring/controller_handler.py +13 -5
- mlrun/model_monitoring/db/__init__.py +18 -0
- mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -36
- mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
- mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +64 -40
- mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
- mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
- mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +109 -5
- mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +88 -0
- mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
- mlrun/model_monitoring/db/stores/sqldb/sql_store.py +684 -0
- mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
- mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +310 -165
- mlrun/model_monitoring/db/tsdb/__init__.py +100 -0
- mlrun/model_monitoring/db/tsdb/base.py +329 -0
- mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
- mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +240 -0
- mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +45 -0
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +397 -0
- mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +117 -0
- mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +630 -0
- mlrun/model_monitoring/evidently_application.py +6 -118
- mlrun/model_monitoring/features_drift_table.py +134 -106
- mlrun/model_monitoring/helpers.py +127 -28
- mlrun/model_monitoring/metrics/__init__.py +13 -0
- mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
- mlrun/model_monitoring/model_endpoint.py +3 -2
- mlrun/model_monitoring/prometheus.py +1 -4
- mlrun/model_monitoring/stream_processing.py +62 -231
- mlrun/model_monitoring/tracking_policy.py +9 -2
- mlrun/model_monitoring/writer.py +152 -124
- mlrun/package/__init__.py +6 -6
- mlrun/package/context_handler.py +5 -5
- mlrun/package/packager.py +7 -7
- mlrun/package/packagers/default_packager.py +6 -6
- mlrun/package/packagers/numpy_packagers.py +15 -15
- mlrun/package/packagers/pandas_packagers.py +5 -5
- mlrun/package/packagers/python_standard_library_packagers.py +10 -10
- mlrun/package/packagers_manager.py +19 -23
- mlrun/package/utils/_formatter.py +6 -6
- mlrun/package/utils/_pickler.py +2 -2
- mlrun/package/utils/_supported_format.py +4 -4
- mlrun/package/utils/log_hint_utils.py +2 -2
- mlrun/package/utils/type_hint_utils.py +4 -9
- mlrun/platforms/__init__.py +11 -10
- mlrun/platforms/iguazio.py +24 -203
- mlrun/projects/operations.py +35 -21
- mlrun/projects/pipelines.py +68 -99
- mlrun/projects/project.py +830 -266
- mlrun/render.py +3 -11
- mlrun/run.py +162 -166
- mlrun/runtimes/__init__.py +62 -7
- mlrun/runtimes/base.py +39 -32
- mlrun/runtimes/daskjob.py +8 -8
- mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
- mlrun/runtimes/databricks_job/databricks_runtime.py +7 -7
- mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
- mlrun/runtimes/funcdoc.py +0 -28
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/kubejob.py +28 -122
- mlrun/runtimes/local.py +6 -3
- mlrun/runtimes/mpijob/__init__.py +0 -20
- mlrun/runtimes/mpijob/abstract.py +9 -10
- mlrun/runtimes/mpijob/v1.py +1 -1
- mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
- mlrun/runtimes/nuclio/api_gateway.py +709 -0
- mlrun/runtimes/nuclio/application/__init__.py +15 -0
- mlrun/runtimes/nuclio/application/application.py +523 -0
- mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
- mlrun/runtimes/{function.py → nuclio/function.py} +112 -73
- mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
- mlrun/runtimes/{serving.py → nuclio/serving.py} +45 -51
- mlrun/runtimes/pod.py +286 -88
- mlrun/runtimes/remotesparkjob.py +2 -2
- mlrun/runtimes/sparkjob/spark3job.py +51 -34
- mlrun/runtimes/utils.py +7 -75
- mlrun/secrets.py +9 -5
- mlrun/serving/remote.py +2 -7
- mlrun/serving/routers.py +13 -10
- mlrun/serving/server.py +22 -26
- mlrun/serving/states.py +99 -25
- mlrun/serving/utils.py +3 -3
- mlrun/serving/v1_serving.py +6 -7
- mlrun/serving/v2_serving.py +59 -20
- mlrun/track/tracker.py +2 -1
- mlrun/track/tracker_manager.py +3 -3
- mlrun/track/trackers/mlflow_tracker.py +1 -2
- mlrun/utils/async_http.py +5 -7
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +1 -2
- mlrun/utils/condition_evaluator.py +3 -3
- mlrun/utils/db.py +3 -3
- mlrun/utils/helpers.py +183 -197
- mlrun/utils/http.py +2 -5
- mlrun/utils/logger.py +76 -14
- mlrun/utils/notifications/notification/__init__.py +17 -12
- mlrun/utils/notifications/notification/base.py +14 -2
- mlrun/utils/notifications/notification/console.py +2 -0
- mlrun/utils/notifications/notification/git.py +3 -1
- mlrun/utils/notifications/notification/ipython.py +3 -1
- mlrun/utils/notifications/notification/slack.py +101 -21
- mlrun/utils/notifications/notification/webhook.py +11 -1
- mlrun/utils/notifications/notification_pusher.py +155 -30
- mlrun/utils/retryer.py +208 -0
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +2 -4
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +2 -6
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/METADATA +31 -19
- mlrun-1.7.0rc20.dist-info/RECORD +353 -0
- mlrun/kfpops.py +0 -868
- mlrun/model_monitoring/batch.py +0 -1095
- mlrun/model_monitoring/stores/models/__init__.py +0 -27
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
- mlrun/platforms/other.py +0 -306
- mlrun-1.6.4rc2.dist-info/RECORD +0 -314
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/LICENSE +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/WHEEL +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/entry_points.txt +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2024 Iguazio
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -11,27 +11,28 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
#
|
|
15
14
|
|
|
16
15
|
import typing
|
|
17
16
|
from abc import ABC, abstractmethod
|
|
18
17
|
|
|
18
|
+
import mlrun.common.schemas.model_monitoring as mm_schemas
|
|
19
|
+
|
|
19
20
|
|
|
20
|
-
class
|
|
21
|
+
class StoreBase(ABC):
|
|
21
22
|
"""
|
|
22
|
-
An abstract class to handle the
|
|
23
|
+
An abstract class to handle the store object in the DB target.
|
|
23
24
|
"""
|
|
24
25
|
|
|
25
26
|
def __init__(self, project: str):
|
|
26
27
|
"""
|
|
27
|
-
Initialize a new
|
|
28
|
+
Initialize a new store target.
|
|
28
29
|
|
|
29
|
-
:param project:
|
|
30
|
+
:param project: The name of the project.
|
|
30
31
|
"""
|
|
31
32
|
self.project = project
|
|
32
33
|
|
|
33
34
|
@abstractmethod
|
|
34
|
-
def write_model_endpoint(self, endpoint:
|
|
35
|
+
def write_model_endpoint(self, endpoint: dict[str, typing.Any]):
|
|
35
36
|
"""
|
|
36
37
|
Create a new endpoint record in the DB table.
|
|
37
38
|
|
|
@@ -41,7 +42,7 @@ class ModelEndpointStore(ABC):
|
|
|
41
42
|
|
|
42
43
|
@abstractmethod
|
|
43
44
|
def update_model_endpoint(
|
|
44
|
-
self, endpoint_id: str, attributes:
|
|
45
|
+
self, endpoint_id: str, attributes: dict[str, typing.Any]
|
|
45
46
|
):
|
|
46
47
|
"""
|
|
47
48
|
Update a model endpoint record with a given attributes.
|
|
@@ -63,14 +64,10 @@ class ModelEndpointStore(ABC):
|
|
|
63
64
|
pass
|
|
64
65
|
|
|
65
66
|
@abstractmethod
|
|
66
|
-
def delete_model_endpoints_resources(
|
|
67
|
-
self, endpoints: typing.List[typing.Dict[str, typing.Any]]
|
|
68
|
-
):
|
|
67
|
+
def delete_model_endpoints_resources(self):
|
|
69
68
|
"""
|
|
70
69
|
Delete all model endpoints resources.
|
|
71
70
|
|
|
72
|
-
:param endpoints: A list of model endpoints flattened dictionaries.
|
|
73
|
-
|
|
74
71
|
"""
|
|
75
72
|
pass
|
|
76
73
|
|
|
@@ -78,7 +75,7 @@ class ModelEndpointStore(ABC):
|
|
|
78
75
|
def get_model_endpoint(
|
|
79
76
|
self,
|
|
80
77
|
endpoint_id: str,
|
|
81
|
-
) ->
|
|
78
|
+
) -> dict[str, typing.Any]:
|
|
82
79
|
"""
|
|
83
80
|
Get a single model endpoint record.
|
|
84
81
|
|
|
@@ -93,10 +90,10 @@ class ModelEndpointStore(ABC):
|
|
|
93
90
|
self,
|
|
94
91
|
model: str = None,
|
|
95
92
|
function: str = None,
|
|
96
|
-
labels:
|
|
93
|
+
labels: list[str] = None,
|
|
97
94
|
top_level: bool = None,
|
|
98
|
-
uids:
|
|
99
|
-
) ->
|
|
95
|
+
uids: list = None,
|
|
96
|
+
) -> list[dict[str, typing.Any]]:
|
|
100
97
|
"""
|
|
101
98
|
Returns a list of model endpoint dictionaries, supports filtering by model, function, labels or top level.
|
|
102
99
|
By default, when no filters are applied, all available model endpoints for the given project will
|
|
@@ -115,33 +112,60 @@ class ModelEndpointStore(ABC):
|
|
|
115
112
|
pass
|
|
116
113
|
|
|
117
114
|
@abstractmethod
|
|
118
|
-
def
|
|
115
|
+
def write_application_event(
|
|
119
116
|
self,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
117
|
+
event: dict[str, typing.Any],
|
|
118
|
+
kind: mm_schemas.WriterEventKind = mm_schemas.WriterEventKind.RESULT,
|
|
119
|
+
) -> None:
|
|
120
|
+
"""
|
|
121
|
+
Write a new event in the target table.
|
|
122
|
+
|
|
123
|
+
:param event: An event dictionary that represents the application result, should be corresponded to the
|
|
124
|
+
schema defined in the :py:class:`~mlrun.common.schemas.model_monitoring.constants.WriterEvent`
|
|
125
|
+
object.
|
|
126
|
+
:param kind: The type of the event, can be either "result" or "metric".
|
|
126
127
|
"""
|
|
127
|
-
|
|
128
|
-
|
|
128
|
+
|
|
129
|
+
@abstractmethod
|
|
130
|
+
def get_last_analyzed(self, endpoint_id: str, application_name: str) -> int:
|
|
131
|
+
"""
|
|
132
|
+
Get the last analyzed time for the provided model endpoint and application.
|
|
129
133
|
|
|
130
134
|
:param endpoint_id: The unique id of the model endpoint.
|
|
131
|
-
:param
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
earliest time.
|
|
136
|
-
:param end: The end time of the metrics. Can be represented by a string containing an RFC 3339
|
|
137
|
-
time, a Unix timestamp in milliseconds, a relative time (`'now'` or
|
|
138
|
-
`'now-[0-9]+[mhd]'`, where `m` = minutes, `h` = hours, and `'d'` = days), or 0 for the
|
|
139
|
-
earliest time.
|
|
140
|
-
:param access_key: V3IO access key that will be used for generating Frames client object. If not
|
|
141
|
-
provided, the access key will be retrieved from the environment variables.
|
|
142
|
-
|
|
143
|
-
:return: A dictionary of metrics in which the key is a metric name and the value is a list of tuples that
|
|
144
|
-
includes timestamps and the values.
|
|
135
|
+
:param application_name: Registered application name.
|
|
136
|
+
|
|
137
|
+
:return: Timestamp as a Unix time.
|
|
138
|
+
:raise: MLRunNotFoundError if last analyzed value is not found.
|
|
145
139
|
"""
|
|
140
|
+
pass
|
|
146
141
|
|
|
142
|
+
@abstractmethod
|
|
143
|
+
def update_last_analyzed(
|
|
144
|
+
self,
|
|
145
|
+
endpoint_id: str,
|
|
146
|
+
application_name: str,
|
|
147
|
+
last_analyzed: int,
|
|
148
|
+
):
|
|
149
|
+
"""
|
|
150
|
+
Update the last analyzed time for the provided model endpoint and application.
|
|
151
|
+
|
|
152
|
+
:param endpoint_id: The unique id of the model endpoint.
|
|
153
|
+
:param application_name: Registered application name.
|
|
154
|
+
:param last_analyzed: Timestamp as a Unix time that represents the last analyzed time of a certain
|
|
155
|
+
application and model endpoint.
|
|
156
|
+
|
|
157
|
+
"""
|
|
147
158
|
pass
|
|
159
|
+
|
|
160
|
+
@abstractmethod
|
|
161
|
+
def get_model_endpoint_metrics(
|
|
162
|
+
self, endpoint_id: str, type: mm_schemas.ModelEndpointMonitoringMetricType
|
|
163
|
+
) -> list[mm_schemas.ModelEndpointMonitoringMetric]:
|
|
164
|
+
"""
|
|
165
|
+
Get the model monitoring results and metrics of the requested model endpoint.
|
|
166
|
+
|
|
167
|
+
:param: endpoint_id: The model endpoint identifier.
|
|
168
|
+
:param: type: The type of the requested metrics ("result" or "metric").
|
|
169
|
+
|
|
170
|
+
:return: A list of the available metrics.
|
|
171
|
+
"""
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -0,0 +1,71 @@
|
|
|
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 functools import partial
|
|
16
|
+
from typing import Optional, TypeVar, Union
|
|
17
|
+
|
|
18
|
+
from .mysql import ApplicationMetricsTable as MySQLApplicationMetricsTable
|
|
19
|
+
from .mysql import ApplicationResultTable as MySQLApplicationResultTable
|
|
20
|
+
from .mysql import ModelEndpointsTable as MySQLModelEndpointsTable
|
|
21
|
+
from .mysql import MonitoringSchedulesTable as MySQLMonitoringSchedulesTable
|
|
22
|
+
from .sqlite import ApplicationMetricsTable as SQLiteApplicationMetricsTable
|
|
23
|
+
from .sqlite import ApplicationResultTable as SQLiteApplicationResultTable
|
|
24
|
+
from .sqlite import ModelEndpointsTable as SQLiteModelEndpointsTable
|
|
25
|
+
from .sqlite import MonitoringSchedulesTable as SQLiteMonitoringSchedulesTable
|
|
26
|
+
|
|
27
|
+
MySQLTableType = TypeVar("MySQLTableType")
|
|
28
|
+
SQLiteTableType = TypeVar("SQLiteTableType")
|
|
29
|
+
|
|
30
|
+
_MYSQL_SCHEME = "mysql:"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _get_sql_table(
|
|
34
|
+
*,
|
|
35
|
+
mysql_table: MySQLTableType,
|
|
36
|
+
sqlite_table: SQLiteTableType,
|
|
37
|
+
connection_string: Optional[str] = None,
|
|
38
|
+
) -> Union[MySQLTableType, SQLiteTableType]:
|
|
39
|
+
"""
|
|
40
|
+
Return a SQLAlchemy table for MySQL or SQLite according to the connection string.
|
|
41
|
+
Note: this function should not be directly used in other modules.
|
|
42
|
+
"""
|
|
43
|
+
if connection_string and _MYSQL_SCHEME in connection_string:
|
|
44
|
+
return mysql_table
|
|
45
|
+
return sqlite_table
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
_get_model_endpoints_table = partial(
|
|
49
|
+
_get_sql_table,
|
|
50
|
+
mysql_table=MySQLModelEndpointsTable,
|
|
51
|
+
sqlite_table=SQLiteModelEndpointsTable,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
_get_application_result_table = partial(
|
|
56
|
+
_get_sql_table,
|
|
57
|
+
mysql_table=MySQLApplicationResultTable,
|
|
58
|
+
sqlite_table=SQLiteApplicationResultTable,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
_get_application_metrics_table = partial(
|
|
62
|
+
_get_sql_table,
|
|
63
|
+
mysql_table=MySQLApplicationMetricsTable,
|
|
64
|
+
sqlite_table=SQLiteApplicationMetricsTable,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
_get_monitoring_schedules_table = partial(
|
|
68
|
+
_get_sql_table,
|
|
69
|
+
mysql_table=MySQLMonitoringSchedulesTable,
|
|
70
|
+
sqlite_table=SQLiteMonitoringSchedulesTable,
|
|
71
|
+
)
|
|
@@ -11,10 +11,24 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
from sqlalchemy import (
|
|
15
|
+
TIMESTAMP,
|
|
16
|
+
Boolean,
|
|
17
|
+
Column,
|
|
18
|
+
Float,
|
|
19
|
+
Integer,
|
|
20
|
+
String,
|
|
21
|
+
Text,
|
|
22
|
+
)
|
|
14
23
|
|
|
15
|
-
from
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
from mlrun.common.schemas.model_monitoring import (
|
|
25
|
+
EventFieldType,
|
|
26
|
+
FileTargetKind,
|
|
27
|
+
MetricData,
|
|
28
|
+
ResultData,
|
|
29
|
+
SchedulingKeys,
|
|
30
|
+
WriterEvent,
|
|
31
|
+
)
|
|
18
32
|
from mlrun.utils.db import BaseModel
|
|
19
33
|
|
|
20
34
|
|
|
@@ -76,9 +90,99 @@ class ModelEndpointsBaseTable(BaseModel):
|
|
|
76
90
|
metrics = Column(EventFieldType.METRICS, Text)
|
|
77
91
|
first_request = Column(
|
|
78
92
|
EventFieldType.FIRST_REQUEST,
|
|
79
|
-
TIMESTAMP,
|
|
93
|
+
TIMESTAMP(timezone=True),
|
|
80
94
|
)
|
|
81
95
|
last_request = Column(
|
|
82
96
|
EventFieldType.LAST_REQUEST,
|
|
83
|
-
TIMESTAMP,
|
|
97
|
+
TIMESTAMP(timezone=True),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class ApplicationResultBaseTable(BaseModel):
|
|
102
|
+
__tablename__ = FileTargetKind.APP_RESULTS
|
|
103
|
+
|
|
104
|
+
uid = Column(EventFieldType.UID, String(120), primary_key=True)
|
|
105
|
+
|
|
106
|
+
application_name = Column(
|
|
107
|
+
WriterEvent.APPLICATION_NAME,
|
|
108
|
+
String(40),
|
|
109
|
+
nullable=True,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
endpoint_id = Column(
|
|
113
|
+
WriterEvent.ENDPOINT_ID,
|
|
114
|
+
String(40),
|
|
115
|
+
nullable=True,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
result_name = Column(
|
|
119
|
+
ResultData.RESULT_NAME,
|
|
120
|
+
String(40),
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
start_infer_time = Column(
|
|
124
|
+
WriterEvent.START_INFER_TIME,
|
|
125
|
+
TIMESTAMP(timezone=True),
|
|
126
|
+
)
|
|
127
|
+
end_infer_time = Column(
|
|
128
|
+
WriterEvent.END_INFER_TIME,
|
|
129
|
+
TIMESTAMP(timezone=True),
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
result_status = Column(ResultData.RESULT_STATUS, String(10))
|
|
133
|
+
result_kind = Column(ResultData.RESULT_KIND, String(40))
|
|
134
|
+
result_value = Column(ResultData.RESULT_VALUE, Float)
|
|
135
|
+
result_extra_data = Column(ResultData.RESULT_EXTRA_DATA, Text)
|
|
136
|
+
current_stats = Column(ResultData.CURRENT_STATS, Text)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class ApplicationMetricsBaseTable(BaseModel):
|
|
140
|
+
__tablename__ = FileTargetKind.APP_METRICS
|
|
141
|
+
|
|
142
|
+
uid = Column(EventFieldType.UID, String(120), primary_key=True)
|
|
143
|
+
application_name = Column(
|
|
144
|
+
WriterEvent.APPLICATION_NAME,
|
|
145
|
+
String(40),
|
|
146
|
+
nullable=True,
|
|
147
|
+
)
|
|
148
|
+
endpoint_id = Column(
|
|
149
|
+
WriterEvent.ENDPOINT_ID,
|
|
150
|
+
String(40),
|
|
151
|
+
nullable=True,
|
|
152
|
+
)
|
|
153
|
+
start_infer_time = Column(
|
|
154
|
+
WriterEvent.START_INFER_TIME,
|
|
155
|
+
TIMESTAMP(timezone=True),
|
|
156
|
+
)
|
|
157
|
+
end_infer_time = Column(
|
|
158
|
+
WriterEvent.END_INFER_TIME,
|
|
159
|
+
TIMESTAMP(timezone=True),
|
|
160
|
+
)
|
|
161
|
+
metric_name = Column(
|
|
162
|
+
MetricData.METRIC_NAME,
|
|
163
|
+
String(40),
|
|
164
|
+
)
|
|
165
|
+
metric_value = Column(MetricData.METRIC_VALUE, Float)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class MonitoringSchedulesBaseTable(BaseModel):
|
|
169
|
+
__tablename__ = FileTargetKind.MONITORING_SCHEDULES
|
|
170
|
+
|
|
171
|
+
uid = Column(SchedulingKeys.UID, String(32), primary_key=True)
|
|
172
|
+
|
|
173
|
+
application_name = Column(
|
|
174
|
+
SchedulingKeys.APPLICATION_NAME,
|
|
175
|
+
String(40),
|
|
176
|
+
nullable=False,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
endpoint_id = Column(
|
|
180
|
+
SchedulingKeys.ENDPOINT_ID,
|
|
181
|
+
String(40),
|
|
182
|
+
nullable=False,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
last_analyzed = Column(
|
|
186
|
+
SchedulingKeys.LAST_ANALYZED,
|
|
187
|
+
Integer,
|
|
84
188
|
)
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
import sqlalchemy.dialects.mysql
|
|
16
|
+
from sqlalchemy import Column, ForeignKey, String
|
|
17
|
+
from sqlalchemy.ext.declarative import declarative_base, declared_attr
|
|
18
|
+
|
|
19
|
+
from mlrun.common.schemas.model_monitoring import (
|
|
20
|
+
EventFieldType,
|
|
21
|
+
WriterEvent,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from .base import (
|
|
25
|
+
ApplicationMetricsBaseTable,
|
|
26
|
+
ApplicationResultBaseTable,
|
|
27
|
+
ModelEndpointsBaseTable,
|
|
28
|
+
MonitoringSchedulesBaseTable,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
Base = declarative_base()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ModelEndpointsTable(Base, ModelEndpointsBaseTable):
|
|
35
|
+
first_request = Column(
|
|
36
|
+
EventFieldType.FIRST_REQUEST,
|
|
37
|
+
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
|
|
38
|
+
)
|
|
39
|
+
last_request = Column(
|
|
40
|
+
EventFieldType.LAST_REQUEST,
|
|
41
|
+
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class _ApplicationResultOrMetric:
|
|
46
|
+
"""
|
|
47
|
+
This class sets common columns of `ApplicationResultTable` and `ApplicationMetricsTable`
|
|
48
|
+
to the correct values in MySQL.
|
|
49
|
+
Note: This class must come before the base tables in the inheritance order to override
|
|
50
|
+
the relevant columns.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
start_infer_time = Column(
|
|
54
|
+
WriterEvent.START_INFER_TIME,
|
|
55
|
+
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
|
|
56
|
+
)
|
|
57
|
+
end_infer_time = Column(
|
|
58
|
+
WriterEvent.END_INFER_TIME,
|
|
59
|
+
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@declared_attr
|
|
63
|
+
def endpoint_id(self):
|
|
64
|
+
return Column(
|
|
65
|
+
String(40),
|
|
66
|
+
ForeignKey(f"{EventFieldType.MODEL_ENDPOINTS}.{EventFieldType.UID}"),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ApplicationResultTable(
|
|
71
|
+
Base, _ApplicationResultOrMetric, ApplicationResultBaseTable
|
|
72
|
+
):
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class ApplicationMetricsTable(
|
|
77
|
+
Base, _ApplicationResultOrMetric, ApplicationMetricsBaseTable
|
|
78
|
+
):
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class MonitoringSchedulesTable(Base, MonitoringSchedulesBaseTable):
|
|
83
|
+
@declared_attr
|
|
84
|
+
def endpoint_id(self):
|
|
85
|
+
return Column(
|
|
86
|
+
String(40),
|
|
87
|
+
ForeignKey(f"{EventFieldType.MODEL_ENDPOINTS}.{EventFieldType.UID}"),
|
|
88
|
+
)
|
|
@@ -12,23 +12,29 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
import sqlalchemy.dialects.mysql
|
|
16
|
-
from sqlalchemy import Column
|
|
17
15
|
from sqlalchemy.ext.declarative import declarative_base
|
|
18
16
|
|
|
19
|
-
from
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
from .base import (
|
|
18
|
+
ApplicationMetricsBaseTable,
|
|
19
|
+
ApplicationResultBaseTable,
|
|
20
|
+
ModelEndpointsBaseTable,
|
|
21
|
+
MonitoringSchedulesBaseTable,
|
|
22
|
+
)
|
|
22
23
|
|
|
23
24
|
Base = declarative_base()
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
class ModelEndpointsTable(Base, ModelEndpointsBaseTable):
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ApplicationResultTable(Base, ApplicationResultBaseTable):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ApplicationMetricsTable(Base, ApplicationMetricsBaseTable):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MonitoringSchedulesTable(Base, MonitoringSchedulesBaseTable):
|
|
40
|
+
pass
|