mlrun 1.7.0rc45__py3-none-any.whl → 1.7.0rc47__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/common/formatters/__init__.py +1 -0
- mlrun/common/formatters/feature_set.py +33 -0
- mlrun/common/schemas/__init__.py +1 -0
- mlrun/common/schemas/model_monitoring/__init__.py +2 -1
- mlrun/common/schemas/model_monitoring/constants.py +23 -2
- mlrun/common/schemas/model_monitoring/model_endpoints.py +24 -47
- mlrun/datastore/s3.py +12 -9
- mlrun/datastore/storeytargets.py +7 -4
- mlrun/db/base.py +3 -0
- mlrun/db/httpdb.py +7 -0
- mlrun/db/nopdb.py +3 -0
- mlrun/model.py +12 -0
- mlrun/model_monitoring/applications/results.py +2 -2
- mlrun/model_monitoring/db/stores/base/store.py +1 -0
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +6 -6
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +15 -14
- mlrun/model_monitoring/helpers.py +6 -7
- mlrun/projects/project.py +11 -1
- mlrun/runtimes/nuclio/function.py +2 -6
- mlrun/utils/version/version.json +2 -2
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/METADATA +7 -7
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/RECORD +26 -25
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/LICENSE +0 -0
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/WHEEL +0 -0
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/entry_points.txt +0 -0
- {mlrun-1.7.0rc45.dist-info → mlrun-1.7.0rc47.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
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 FeatureSetFormat(ObjectFormat, mlrun.common.types.StrEnum):
|
|
24
|
+
minimal = "minimal"
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def format_method(_format: str) -> typing.Optional[typing.Callable]:
|
|
28
|
+
return {
|
|
29
|
+
FeatureSetFormat.full: None,
|
|
30
|
+
FeatureSetFormat.minimal: FeatureSetFormat.filter_obj_method(
|
|
31
|
+
["kind", "metadata", "spec", "status.state"]
|
|
32
|
+
),
|
|
33
|
+
}[_format]
|
mlrun/common/schemas/__init__.py
CHANGED
|
@@ -25,6 +25,7 @@ from .constants import (
|
|
|
25
25
|
FileTargetKind,
|
|
26
26
|
FunctionURI,
|
|
27
27
|
MetricData,
|
|
28
|
+
ModelEndpointMonitoringMetricType,
|
|
28
29
|
ModelEndpointTarget,
|
|
29
30
|
ModelEndpointTargetSchemas,
|
|
30
31
|
ModelMonitoringMode,
|
|
@@ -34,6 +35,7 @@ from .constants import (
|
|
|
34
35
|
ProjectSecretKeys,
|
|
35
36
|
ResultData,
|
|
36
37
|
ResultKindApp,
|
|
38
|
+
ResultStatusApp,
|
|
37
39
|
SchedulingKeys,
|
|
38
40
|
SpecialApps,
|
|
39
41
|
TDEngineSuperTables,
|
|
@@ -60,7 +62,6 @@ from .model_endpoints import (
|
|
|
60
62
|
ModelEndpointMetadata,
|
|
61
63
|
ModelEndpointMonitoringMetric,
|
|
62
64
|
ModelEndpointMonitoringMetricNoData,
|
|
63
|
-
ModelEndpointMonitoringMetricType,
|
|
64
65
|
ModelEndpointMonitoringMetricValues,
|
|
65
66
|
ModelEndpointMonitoringResultValues,
|
|
66
67
|
ModelEndpointSpec,
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import hashlib
|
|
16
|
-
|
|
16
|
+
import re
|
|
17
|
+
from dataclasses import dataclass, field
|
|
17
18
|
from enum import Enum, IntEnum
|
|
18
19
|
from typing import Optional
|
|
19
20
|
|
|
@@ -295,7 +296,7 @@ class EndpointUID:
|
|
|
295
296
|
function_hash_key: str
|
|
296
297
|
model: str
|
|
297
298
|
model_version: str
|
|
298
|
-
uid:
|
|
299
|
+
uid: str = field(init=False)
|
|
299
300
|
|
|
300
301
|
def __post_init__(self):
|
|
301
302
|
function_ref = (
|
|
@@ -372,3 +373,23 @@ _RESERVED_FUNCTION_NAMES = MonitoringFunctionNames.list() + [SpecialApps.MLRUN_I
|
|
|
372
373
|
|
|
373
374
|
|
|
374
375
|
V3IO_MODEL_MONITORING_DB = "v3io"
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
class ModelEndpointMonitoringMetricType(StrEnum):
|
|
379
|
+
RESULT = "result"
|
|
380
|
+
METRIC = "metric"
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
_FQN_PART_PATTERN = r"[a-zA-Z0-9_-]+"
|
|
384
|
+
FQN_PATTERN = (
|
|
385
|
+
rf"^(?P<project>{_FQN_PART_PATTERN})\."
|
|
386
|
+
rf"(?P<app>{_FQN_PART_PATTERN})\."
|
|
387
|
+
rf"(?P<type>{ModelEndpointMonitoringMetricType.RESULT}|{ModelEndpointMonitoringMetricType.METRIC})\."
|
|
388
|
+
rf"(?P<name>{_FQN_PART_PATTERN})$"
|
|
389
|
+
)
|
|
390
|
+
FQN_REGEX = re.compile(FQN_PATTERN)
|
|
391
|
+
|
|
392
|
+
# refer to `mlrun.utils.regex.project_name`
|
|
393
|
+
PROJECT_PATTERN = r"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"
|
|
394
|
+
|
|
395
|
+
MODEL_ENDPOINT_ID_PATTERN = r"^[a-zA-Z0-9_-]+$"
|
|
@@ -14,26 +14,32 @@
|
|
|
14
14
|
|
|
15
15
|
import enum
|
|
16
16
|
import json
|
|
17
|
-
import re
|
|
18
17
|
from datetime import datetime
|
|
19
|
-
from typing import Any, NamedTuple, Optional
|
|
18
|
+
from typing import Any, NamedTuple, Optional, TypeVar
|
|
20
19
|
|
|
21
|
-
from pydantic import BaseModel, Field, validator
|
|
22
|
-
from pydantic.main import Extra
|
|
20
|
+
from pydantic import BaseModel, Extra, Field, constr, validator
|
|
23
21
|
|
|
24
|
-
import mlrun.
|
|
22
|
+
# TODO: remove the unused import below after `mlrun.datastore` and `mlrun.utils` usage is removed.
|
|
23
|
+
# At the moment `make lint` fails if this is removed.
|
|
24
|
+
import mlrun.common.model_monitoring
|
|
25
25
|
|
|
26
26
|
from ..object import ObjectKind, ObjectSpec, ObjectStatus
|
|
27
27
|
from .constants import (
|
|
28
|
+
FQN_REGEX,
|
|
29
|
+
MODEL_ENDPOINT_ID_PATTERN,
|
|
30
|
+
PROJECT_PATTERN,
|
|
28
31
|
EndpointType,
|
|
29
32
|
EventFieldType,
|
|
30
33
|
EventKeyMetrics,
|
|
31
34
|
EventLiveStats,
|
|
35
|
+
ModelEndpointMonitoringMetricType,
|
|
32
36
|
ModelMonitoringMode,
|
|
33
37
|
ResultKindApp,
|
|
34
38
|
ResultStatusApp,
|
|
35
39
|
)
|
|
36
40
|
|
|
41
|
+
Model = TypeVar("Model", bound=BaseModel)
|
|
42
|
+
|
|
37
43
|
|
|
38
44
|
class ModelMonitoringStoreKinds:
|
|
39
45
|
# TODO: do changes in examples & demos In 1.5.0 remove
|
|
@@ -42,9 +48,9 @@ class ModelMonitoringStoreKinds:
|
|
|
42
48
|
|
|
43
49
|
|
|
44
50
|
class ModelEndpointMetadata(BaseModel):
|
|
45
|
-
project:
|
|
51
|
+
project: constr(regex=PROJECT_PATTERN)
|
|
52
|
+
uid: constr(regex=MODEL_ENDPOINT_ID_PATTERN)
|
|
46
53
|
labels: Optional[dict] = {}
|
|
47
|
-
uid: Optional[str] = ""
|
|
48
54
|
|
|
49
55
|
class Config:
|
|
50
56
|
extra = Extra.allow
|
|
@@ -57,12 +63,11 @@ class ModelEndpointMetadata(BaseModel):
|
|
|
57
63
|
:param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
|
|
58
64
|
dictionary using json.loads().
|
|
59
65
|
"""
|
|
60
|
-
new_object = cls()
|
|
61
66
|
if json_parse_values is None:
|
|
62
67
|
json_parse_values = [EventFieldType.LABELS]
|
|
63
68
|
|
|
64
69
|
return _mapping_attributes(
|
|
65
|
-
|
|
70
|
+
model_class=cls,
|
|
66
71
|
flattened_dictionary=endpoint_dict,
|
|
67
72
|
json_parse_values=json_parse_values,
|
|
68
73
|
)
|
|
@@ -89,7 +94,6 @@ class ModelEndpointSpec(ObjectSpec):
|
|
|
89
94
|
:param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
|
|
90
95
|
dictionary using json.loads().
|
|
91
96
|
"""
|
|
92
|
-
new_object = cls()
|
|
93
97
|
if json_parse_values is None:
|
|
94
98
|
json_parse_values = [
|
|
95
99
|
EventFieldType.FEATURE_NAMES,
|
|
@@ -97,7 +101,7 @@ class ModelEndpointSpec(ObjectSpec):
|
|
|
97
101
|
EventFieldType.MONITOR_CONFIGURATION,
|
|
98
102
|
]
|
|
99
103
|
return _mapping_attributes(
|
|
100
|
-
|
|
104
|
+
model_class=cls,
|
|
101
105
|
flattened_dictionary=endpoint_dict,
|
|
102
106
|
json_parse_values=json_parse_values,
|
|
103
107
|
)
|
|
@@ -191,7 +195,6 @@ class ModelEndpointStatus(ObjectStatus):
|
|
|
191
195
|
:param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
|
|
192
196
|
dictionary using json.loads().
|
|
193
197
|
"""
|
|
194
|
-
new_object = cls()
|
|
195
198
|
if json_parse_values is None:
|
|
196
199
|
json_parse_values = [
|
|
197
200
|
EventFieldType.FEATURE_STATS,
|
|
@@ -203,7 +206,7 @@ class ModelEndpointStatus(ObjectStatus):
|
|
|
203
206
|
EventFieldType.ENDPOINT_TYPE,
|
|
204
207
|
]
|
|
205
208
|
return _mapping_attributes(
|
|
206
|
-
|
|
209
|
+
model_class=cls,
|
|
207
210
|
flattened_dictionary=endpoint_dict,
|
|
208
211
|
json_parse_values=json_parse_values,
|
|
209
212
|
)
|
|
@@ -211,22 +214,13 @@ class ModelEndpointStatus(ObjectStatus):
|
|
|
211
214
|
|
|
212
215
|
class ModelEndpoint(BaseModel):
|
|
213
216
|
kind: ObjectKind = Field(ObjectKind.model_endpoint, const=True)
|
|
214
|
-
metadata: ModelEndpointMetadata
|
|
217
|
+
metadata: ModelEndpointMetadata
|
|
215
218
|
spec: ModelEndpointSpec = ModelEndpointSpec()
|
|
216
219
|
status: ModelEndpointStatus = ModelEndpointStatus()
|
|
217
220
|
|
|
218
221
|
class Config:
|
|
219
222
|
extra = Extra.allow
|
|
220
223
|
|
|
221
|
-
def __init__(self, **data: Any):
|
|
222
|
-
super().__init__(**data)
|
|
223
|
-
if self.metadata.uid is None:
|
|
224
|
-
uid = mlrun.common.model_monitoring.create_model_endpoint_uid(
|
|
225
|
-
function_uri=self.spec.function_uri,
|
|
226
|
-
versioned_model=self.spec.model,
|
|
227
|
-
)
|
|
228
|
-
self.metadata.uid = str(uid)
|
|
229
|
-
|
|
230
224
|
def flat_dict(self):
|
|
231
225
|
"""Generate a flattened `ModelEndpoint` dictionary. The flattened dictionary result is important for storing
|
|
232
226
|
the model endpoint object in the database.
|
|
@@ -267,7 +261,7 @@ class ModelEndpoint(BaseModel):
|
|
|
267
261
|
return flatten_dict
|
|
268
262
|
|
|
269
263
|
@classmethod
|
|
270
|
-
def from_flat_dict(cls, endpoint_dict: dict):
|
|
264
|
+
def from_flat_dict(cls, endpoint_dict: dict) -> "ModelEndpoint":
|
|
271
265
|
"""Create a `ModelEndpoint` object from an endpoint flattened dictionary. Because the provided dictionary
|
|
272
266
|
is flattened, we pass it as is to the subclasses without splitting the keys into spec, metadata, and status.
|
|
273
267
|
|
|
@@ -285,11 +279,6 @@ class ModelEndpointList(BaseModel):
|
|
|
285
279
|
endpoints: list[ModelEndpoint] = []
|
|
286
280
|
|
|
287
281
|
|
|
288
|
-
class ModelEndpointMonitoringMetricType(mlrun.common.types.StrEnum):
|
|
289
|
-
RESULT = "result"
|
|
290
|
-
METRIC = "metric"
|
|
291
|
-
|
|
292
|
-
|
|
293
282
|
class ModelEndpointMonitoringMetric(BaseModel):
|
|
294
283
|
project: str
|
|
295
284
|
app: str
|
|
@@ -308,18 +297,8 @@ def _compose_full_name(
|
|
|
308
297
|
return ".".join([project, app, type, name])
|
|
309
298
|
|
|
310
299
|
|
|
311
|
-
_FQN_PART_PATTERN = r"[a-zA-Z0-9_-]+"
|
|
312
|
-
_FQN_PATTERN = (
|
|
313
|
-
rf"^(?P<project>{_FQN_PART_PATTERN})\."
|
|
314
|
-
rf"(?P<app>{_FQN_PART_PATTERN})\."
|
|
315
|
-
rf"(?P<type>{ModelEndpointMonitoringMetricType.RESULT}|{ModelEndpointMonitoringMetricType.METRIC})\."
|
|
316
|
-
rf"(?P<name>{_FQN_PART_PATTERN})$"
|
|
317
|
-
)
|
|
318
|
-
_FQN_REGEX = re.compile(_FQN_PATTERN)
|
|
319
|
-
|
|
320
|
-
|
|
321
300
|
def _parse_metric_fqn_to_monitoring_metric(fqn: str) -> ModelEndpointMonitoringMetric:
|
|
322
|
-
match =
|
|
301
|
+
match = FQN_REGEX.fullmatch(fqn)
|
|
323
302
|
if match is None:
|
|
324
303
|
raise ValueError("The fully qualified name is not in the expected format")
|
|
325
304
|
return ModelEndpointMonitoringMetric.parse_obj(
|
|
@@ -364,20 +343,18 @@ class ModelEndpointMonitoringMetricNoData(_ModelEndpointMonitoringMetricValuesBa
|
|
|
364
343
|
|
|
365
344
|
|
|
366
345
|
def _mapping_attributes(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
json_parse_values: list = None,
|
|
370
|
-
):
|
|
346
|
+
model_class: type[Model], flattened_dictionary: dict, json_parse_values: list
|
|
347
|
+
) -> Model:
|
|
371
348
|
"""Generate a `BaseModel` object with the provided dictionary attributes.
|
|
372
349
|
|
|
373
|
-
:param
|
|
350
|
+
:param model_class: `BaseModel` class (e.g. `ModelEndpointMetadata`).
|
|
374
351
|
:param flattened_dictionary: Flattened dictionary that contains the model endpoint attributes.
|
|
375
352
|
:param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
|
|
376
353
|
dictionary using json.loads().
|
|
377
354
|
"""
|
|
378
355
|
# Get the fields of the provided base model object. These fields will be used to filter to relevent keys
|
|
379
356
|
# from the flattened dictionary.
|
|
380
|
-
wanted_keys =
|
|
357
|
+
wanted_keys = model_class.__fields__.keys()
|
|
381
358
|
|
|
382
359
|
# Generate a filtered flattened dictionary that will be parsed into the BaseModel object
|
|
383
360
|
dict_to_parse = {}
|
|
@@ -391,7 +368,7 @@ def _mapping_attributes(
|
|
|
391
368
|
else:
|
|
392
369
|
dict_to_parse[field_key] = flattened_dictionary[field_key]
|
|
393
370
|
|
|
394
|
-
return
|
|
371
|
+
return model_class.parse_obj(dict_to_parse)
|
|
395
372
|
|
|
396
373
|
|
|
397
374
|
def _json_loads_if_not_none(field: Any) -> Any:
|
mlrun/datastore/s3.py
CHANGED
|
@@ -36,6 +36,7 @@ class S3Store(DataStore):
|
|
|
36
36
|
|
|
37
37
|
access_key_id = self._get_secret_or_env("AWS_ACCESS_KEY_ID")
|
|
38
38
|
secret_key = self._get_secret_or_env("AWS_SECRET_ACCESS_KEY")
|
|
39
|
+
token_file = self._get_secret_or_env("AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE")
|
|
39
40
|
endpoint_url = self._get_secret_or_env("S3_ENDPOINT_URL")
|
|
40
41
|
force_non_anonymous = self._get_secret_or_env("S3_NON_ANONYMOUS")
|
|
41
42
|
profile_name = self._get_secret_or_env("AWS_PROFILE")
|
|
@@ -94,14 +95,15 @@ class S3Store(DataStore):
|
|
|
94
95
|
self.s3 = boto3.resource(
|
|
95
96
|
"s3", region_name=region, endpoint_url=endpoint_url
|
|
96
97
|
)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
if not token_file:
|
|
99
|
+
# If not using credentials, boto will still attempt to sign the requests, and will fail any operations
|
|
100
|
+
# due to no credentials found. These commands disable signing and allow anonymous mode (same as
|
|
101
|
+
# anon in the storage_options when working with fsspec).
|
|
102
|
+
from botocore.handlers import disable_signing
|
|
103
|
+
|
|
104
|
+
self.s3.meta.client.meta.events.register(
|
|
105
|
+
"choose-signer.s3.*", disable_signing
|
|
106
|
+
)
|
|
105
107
|
|
|
106
108
|
def get_spark_options(self):
|
|
107
109
|
res = {}
|
|
@@ -139,6 +141,7 @@ class S3Store(DataStore):
|
|
|
139
141
|
endpoint_url = self._get_secret_or_env("S3_ENDPOINT_URL")
|
|
140
142
|
access_key_id = self._get_secret_or_env("AWS_ACCESS_KEY_ID")
|
|
141
143
|
secret = self._get_secret_or_env("AWS_SECRET_ACCESS_KEY")
|
|
144
|
+
token_file = self._get_secret_or_env("AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE")
|
|
142
145
|
|
|
143
146
|
if self._temp_credentials:
|
|
144
147
|
access_key_id = self._temp_credentials["AccessKeyId"]
|
|
@@ -148,7 +151,7 @@ class S3Store(DataStore):
|
|
|
148
151
|
token = None
|
|
149
152
|
|
|
150
153
|
storage_options = dict(
|
|
151
|
-
anon=not (force_non_anonymous or (access_key_id and secret)),
|
|
154
|
+
anon=not (force_non_anonymous or (access_key_id and secret) or token_file),
|
|
152
155
|
key=access_key_id,
|
|
153
156
|
secret=secret,
|
|
154
157
|
token=token,
|
mlrun/datastore/storeytargets.py
CHANGED
|
@@ -19,6 +19,7 @@ import mlrun
|
|
|
19
19
|
import mlrun.model_monitoring.helpers
|
|
20
20
|
from mlrun.datastore.base import DataStore
|
|
21
21
|
|
|
22
|
+
from ..platforms.iguazio import parse_path
|
|
22
23
|
from .utils import (
|
|
23
24
|
parse_kafka_url,
|
|
24
25
|
)
|
|
@@ -82,12 +83,14 @@ class StreamStoreyTarget(storey.StreamTarget):
|
|
|
82
83
|
def __init__(self, *args, **kwargs):
|
|
83
84
|
args = list(args)
|
|
84
85
|
|
|
85
|
-
|
|
86
|
-
endpoint, storage_options = get_url_and_storage_options(path)
|
|
86
|
+
uri = args[0] if args else kwargs.get("stream_path")
|
|
87
87
|
|
|
88
|
-
if not
|
|
88
|
+
if not uri:
|
|
89
89
|
raise mlrun.errors.MLRunInvalidArgumentError("StreamTarget requires a path")
|
|
90
90
|
|
|
91
|
+
_, storage_options = get_url_and_storage_options(uri)
|
|
92
|
+
endpoint, path = parse_path(uri)
|
|
93
|
+
|
|
91
94
|
access_key = storage_options.get("v3io_access_key")
|
|
92
95
|
storage = V3ioDriver(
|
|
93
96
|
webapi=endpoint or mlrun.mlconf.v3io_api, access_key=access_key
|
|
@@ -98,7 +101,7 @@ class StreamStoreyTarget(storey.StreamTarget):
|
|
|
98
101
|
if args:
|
|
99
102
|
args[0] = endpoint
|
|
100
103
|
if "stream_path" in kwargs:
|
|
101
|
-
kwargs["stream_path"] =
|
|
104
|
+
kwargs["stream_path"] = path
|
|
102
105
|
|
|
103
106
|
super().__init__(*args, **kwargs)
|
|
104
107
|
|
mlrun/db/base.py
CHANGED
|
@@ -395,6 +395,9 @@ class RunDBInterface(ABC):
|
|
|
395
395
|
partition_order: Union[
|
|
396
396
|
mlrun.common.schemas.OrderType, str
|
|
397
397
|
] = mlrun.common.schemas.OrderType.desc,
|
|
398
|
+
format_: Union[
|
|
399
|
+
str, mlrun.common.formatters.FeatureSetFormat
|
|
400
|
+
] = mlrun.common.formatters.FeatureSetFormat.full,
|
|
398
401
|
) -> list[dict]:
|
|
399
402
|
pass
|
|
400
403
|
|
mlrun/db/httpdb.py
CHANGED
|
@@ -2235,6 +2235,9 @@ class HTTPRunDB(RunDBInterface):
|
|
|
2235
2235
|
partition_order: Union[
|
|
2236
2236
|
mlrun.common.schemas.OrderType, str
|
|
2237
2237
|
] = mlrun.common.schemas.OrderType.desc,
|
|
2238
|
+
format_: Union[
|
|
2239
|
+
str, mlrun.common.formatters.FeatureSetFormat
|
|
2240
|
+
] = mlrun.common.formatters.FeatureSetFormat.full,
|
|
2238
2241
|
) -> list[FeatureSet]:
|
|
2239
2242
|
"""Retrieve a list of feature-sets matching the criteria provided.
|
|
2240
2243
|
|
|
@@ -2252,6 +2255,9 @@ class HTTPRunDB(RunDBInterface):
|
|
|
2252
2255
|
:param partition_sort_by: What field to sort the results by, within each partition defined by `partition_by`.
|
|
2253
2256
|
Currently the only allowed value are `created` and `updated`.
|
|
2254
2257
|
:param partition_order: Order of sorting within partitions - `asc` or `desc`. Default is `desc`.
|
|
2258
|
+
:param format_: Format of the results. Possible values are:
|
|
2259
|
+
- ``minimal`` - Return minimal feature set objects, not including stats and preview for each feature set.
|
|
2260
|
+
- ``full`` - Return full feature set objects.
|
|
2255
2261
|
:returns: List of matching :py:class:`~mlrun.feature_store.FeatureSet` objects.
|
|
2256
2262
|
"""
|
|
2257
2263
|
|
|
@@ -2264,6 +2270,7 @@ class HTTPRunDB(RunDBInterface):
|
|
|
2264
2270
|
"entity": entities or [],
|
|
2265
2271
|
"feature": features or [],
|
|
2266
2272
|
"label": labels or [],
|
|
2273
|
+
"format": format_,
|
|
2267
2274
|
}
|
|
2268
2275
|
if partition_by:
|
|
2269
2276
|
params.update(
|
mlrun/db/nopdb.py
CHANGED
|
@@ -326,6 +326,9 @@ class NopDB(RunDBInterface):
|
|
|
326
326
|
partition_order: Union[
|
|
327
327
|
mlrun.common.schemas.OrderType, str
|
|
328
328
|
] = mlrun.common.schemas.OrderType.desc,
|
|
329
|
+
format_: Union[
|
|
330
|
+
str, mlrun.common.formatters.FeatureSetFormat
|
|
331
|
+
] = mlrun.common.formatters.FeatureSetFormat.full,
|
|
329
332
|
) -> list[dict]:
|
|
330
333
|
pass
|
|
331
334
|
|
mlrun/model.py
CHANGED
|
@@ -2044,6 +2044,8 @@ class DataSource(ModelObj):
|
|
|
2044
2044
|
]
|
|
2045
2045
|
kind = None
|
|
2046
2046
|
|
|
2047
|
+
_fields_to_serialize = ["start_time", "end_time"]
|
|
2048
|
+
|
|
2047
2049
|
def __init__(
|
|
2048
2050
|
self,
|
|
2049
2051
|
name: str = None,
|
|
@@ -2072,6 +2074,16 @@ class DataSource(ModelObj):
|
|
|
2072
2074
|
def set_secrets(self, secrets):
|
|
2073
2075
|
self._secrets = secrets
|
|
2074
2076
|
|
|
2077
|
+
def _serialize_field(
|
|
2078
|
+
self, struct: dict, field_name: str = None, strip: bool = False
|
|
2079
|
+
) -> typing.Any:
|
|
2080
|
+
value = super()._serialize_field(struct, field_name, strip)
|
|
2081
|
+
# We pull the field from self and not from struct because it was excluded from the struct when looping over
|
|
2082
|
+
# the fields to save.
|
|
2083
|
+
if field_name in ("start_time", "end_time") and isinstance(value, datetime):
|
|
2084
|
+
return value.isoformat()
|
|
2085
|
+
return value
|
|
2086
|
+
|
|
2075
2087
|
|
|
2076
2088
|
class DataTargetBase(ModelObj):
|
|
2077
2089
|
"""data target spec, specify a destination for the feature set data"""
|
|
@@ -29,8 +29,8 @@ class _ModelMonitoringApplicationDataRes(ABC):
|
|
|
29
29
|
def __post_init__(self):
|
|
30
30
|
pat = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*")
|
|
31
31
|
if not re.fullmatch(pat, self.name):
|
|
32
|
-
raise mlrun.errors.
|
|
33
|
-
"Attribute name must
|
|
32
|
+
raise mlrun.errors.MLRunValueError(
|
|
33
|
+
"Attribute name must comply with the regex `[a-zA-Z_][a-zA-Z0-9_]*`"
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
@abstractmethod
|
|
@@ -94,20 +94,20 @@ class TDEngineSchema:
|
|
|
94
94
|
tags = ", ".join(f"{col} {val}" for col, val in self.tags.items())
|
|
95
95
|
return f"CREATE STABLE if NOT EXISTS {self.database}.{self.super_table} ({columns}) TAGS ({tags});"
|
|
96
96
|
|
|
97
|
-
def
|
|
97
|
+
def _create_subtable_sql(
|
|
98
98
|
self,
|
|
99
99
|
subtable: str,
|
|
100
100
|
values: dict[str, Union[str, int, float, datetime.datetime]],
|
|
101
101
|
) -> str:
|
|
102
102
|
try:
|
|
103
|
-
|
|
103
|
+
tags = ", ".join(f"'{values[val]}'" for val in self.tags)
|
|
104
104
|
except KeyError:
|
|
105
105
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
106
106
|
f"values must contain all tags: {self.tags.keys()}"
|
|
107
107
|
)
|
|
108
|
-
return f"CREATE TABLE if NOT EXISTS {self.database}.{subtable} USING {self.super_table} TAGS ({
|
|
108
|
+
return f"CREATE TABLE if NOT EXISTS {self.database}.{subtable} USING {self.super_table} TAGS ({tags});"
|
|
109
109
|
|
|
110
|
-
def
|
|
110
|
+
def _insert_subtable_stmt(
|
|
111
111
|
self,
|
|
112
112
|
connection: taosws.Connection,
|
|
113
113
|
subtable: str,
|
|
@@ -116,7 +116,7 @@ class TDEngineSchema:
|
|
|
116
116
|
stmt = connection.statement()
|
|
117
117
|
question_marks = ", ".join("?" * len(self.columns))
|
|
118
118
|
stmt.prepare(f"INSERT INTO ? VALUES ({question_marks});")
|
|
119
|
-
stmt.
|
|
119
|
+
stmt.set_tbname(subtable)
|
|
120
120
|
|
|
121
121
|
bind_params = []
|
|
122
122
|
|
|
@@ -211,7 +211,7 @@ class TDEngineSchema:
|
|
|
211
211
|
if filter_query:
|
|
212
212
|
query.write(f"{filter_query} AND ")
|
|
213
213
|
if start:
|
|
214
|
-
query.write(f"{timestamp_column} >= '{start}'
|
|
214
|
+
query.write(f"{timestamp_column} >= '{start}' AND ")
|
|
215
215
|
if end:
|
|
216
216
|
query.write(f"{timestamp_column} <= '{end}'")
|
|
217
217
|
if interval:
|
|
@@ -97,7 +97,7 @@ class TDEngineConnector(TSDBConnector):
|
|
|
97
97
|
self,
|
|
98
98
|
event: dict,
|
|
99
99
|
kind: mm_schemas.WriterEventKind = mm_schemas.WriterEventKind.RESULT,
|
|
100
|
-
):
|
|
100
|
+
) -> None:
|
|
101
101
|
"""
|
|
102
102
|
Write a single result or metric to TSDB.
|
|
103
103
|
"""
|
|
@@ -113,7 +113,7 @@ class TDEngineConnector(TSDBConnector):
|
|
|
113
113
|
# Write a new result
|
|
114
114
|
table = self.tables[mm_schemas.TDEngineSuperTables.APP_RESULTS]
|
|
115
115
|
table_name = (
|
|
116
|
-
f"{table_name}_
|
|
116
|
+
f"{table_name}_{event[mm_schemas.ResultData.RESULT_NAME]}"
|
|
117
117
|
).replace("-", "_")
|
|
118
118
|
event.pop(mm_schemas.ResultData.CURRENT_STATS, None)
|
|
119
119
|
|
|
@@ -121,9 +121,13 @@ class TDEngineConnector(TSDBConnector):
|
|
|
121
121
|
# Write a new metric
|
|
122
122
|
table = self.tables[mm_schemas.TDEngineSuperTables.METRICS]
|
|
123
123
|
table_name = (
|
|
124
|
-
f"{table_name}_
|
|
124
|
+
f"{table_name}_{event[mm_schemas.MetricData.METRIC_NAME]}"
|
|
125
125
|
).replace("-", "_")
|
|
126
126
|
|
|
127
|
+
# Escape the table name for case-sensitivity (ML-7908)
|
|
128
|
+
# https://github.com/taosdata/taos-connector-python/issues/260
|
|
129
|
+
table_name = f"`{table_name}`"
|
|
130
|
+
|
|
127
131
|
# Convert the datetime strings to datetime objects
|
|
128
132
|
event[mm_schemas.WriterEvent.END_INFER_TIME] = self._convert_to_datetime(
|
|
129
133
|
val=event[mm_schemas.WriterEvent.END_INFER_TIME]
|
|
@@ -132,15 +136,11 @@ class TDEngineConnector(TSDBConnector):
|
|
|
132
136
|
val=event[mm_schemas.WriterEvent.START_INFER_TIME]
|
|
133
137
|
)
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
)
|
|
138
|
-
self.connection.execute(create_table_query)
|
|
139
|
+
create_table_sql = table._create_subtable_sql(subtable=table_name, values=event)
|
|
140
|
+
self.connection.execute(create_table_sql)
|
|
139
141
|
|
|
140
|
-
insert_statement = table.
|
|
141
|
-
self.connection,
|
|
142
|
-
subtable=table_name,
|
|
143
|
-
values=event,
|
|
142
|
+
insert_statement = table._insert_subtable_stmt(
|
|
143
|
+
self.connection, subtable=table_name, values=event
|
|
144
144
|
)
|
|
145
145
|
insert_statement.add_batch()
|
|
146
146
|
insert_statement.execute()
|
|
@@ -262,7 +262,7 @@ class TDEngineConnector(TSDBConnector):
|
|
|
262
262
|
|
|
263
263
|
project_condition = f"project = '{self.project}'"
|
|
264
264
|
filter_query = (
|
|
265
|
-
f"{filter_query} AND {project_condition}"
|
|
265
|
+
f"({filter_query}) AND ({project_condition})"
|
|
266
266
|
if filter_query
|
|
267
267
|
else project_condition
|
|
268
268
|
)
|
|
@@ -280,6 +280,7 @@ class TDEngineConnector(TSDBConnector):
|
|
|
280
280
|
timestamp_column=timestamp_column,
|
|
281
281
|
database=self.database,
|
|
282
282
|
)
|
|
283
|
+
logger.debug("Querying TDEngine", query=full_query)
|
|
283
284
|
try:
|
|
284
285
|
query_result = self.connection.query(full_query)
|
|
285
286
|
except taosws.QueryError as e:
|
|
@@ -336,11 +337,11 @@ class TDEngineConnector(TSDBConnector):
|
|
|
336
337
|
|
|
337
338
|
metrics_condition = " OR ".join(
|
|
338
339
|
[
|
|
339
|
-
f"({mm_schemas.WriterEvent.APPLICATION_NAME}
|
|
340
|
+
f"({mm_schemas.WriterEvent.APPLICATION_NAME}='{metric.app}' AND {name}='{metric.name}')"
|
|
340
341
|
for metric in metrics
|
|
341
342
|
]
|
|
342
343
|
)
|
|
343
|
-
filter_query = f"endpoint_id='{endpoint_id}' AND ({metrics_condition})"
|
|
344
|
+
filter_query = f"(endpoint_id='{endpoint_id}') AND ({metrics_condition})"
|
|
344
345
|
|
|
345
346
|
df = self._get_records(
|
|
346
347
|
table=table,
|
|
@@ -18,6 +18,10 @@ import typing
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
import pandas as pd
|
|
20
20
|
|
|
21
|
+
if typing.TYPE_CHECKING:
|
|
22
|
+
from mlrun.db.base import RunDBInterface
|
|
23
|
+
from mlrun.projects import MlrunProject
|
|
24
|
+
|
|
21
25
|
import mlrun
|
|
22
26
|
import mlrun.artifacts
|
|
23
27
|
import mlrun.common.model_monitoring.helpers
|
|
@@ -26,16 +30,11 @@ import mlrun.data_types.infer
|
|
|
26
30
|
import mlrun.model_monitoring
|
|
27
31
|
from mlrun.common.schemas.model_monitoring.model_endpoints import (
|
|
28
32
|
ModelEndpointMonitoringMetric,
|
|
29
|
-
ModelEndpointMonitoringMetricType,
|
|
30
33
|
_compose_full_name,
|
|
31
34
|
)
|
|
32
35
|
from mlrun.model_monitoring.model_endpoint import ModelEndpoint
|
|
33
36
|
from mlrun.utils import logger
|
|
34
37
|
|
|
35
|
-
if typing.TYPE_CHECKING:
|
|
36
|
-
from mlrun.db.base import RunDBInterface
|
|
37
|
-
from mlrun.projects import MlrunProject
|
|
38
|
-
|
|
39
38
|
|
|
40
39
|
class _BatchDict(typing.TypedDict):
|
|
41
40
|
minutes: int
|
|
@@ -301,7 +300,7 @@ def get_invocations_fqn(project: str) -> str:
|
|
|
301
300
|
project=project,
|
|
302
301
|
app=mm_constants.SpecialApps.MLRUN_INFRA,
|
|
303
302
|
name=mm_constants.PredictionsQueryConstants.INVOCATIONS,
|
|
304
|
-
type=ModelEndpointMonitoringMetricType.METRIC,
|
|
303
|
+
type=mm_constants.ModelEndpointMonitoringMetricType.METRIC,
|
|
305
304
|
)
|
|
306
305
|
|
|
307
306
|
|
|
@@ -315,7 +314,7 @@ def get_invocations_metric(project: str) -> ModelEndpointMonitoringMetric:
|
|
|
315
314
|
return ModelEndpointMonitoringMetric(
|
|
316
315
|
project=project,
|
|
317
316
|
app=mm_constants.SpecialApps.MLRUN_INFRA,
|
|
318
|
-
type=ModelEndpointMonitoringMetricType.METRIC,
|
|
317
|
+
type=mm_constants.ModelEndpointMonitoringMetricType.METRIC,
|
|
319
318
|
name=mm_constants.PredictionsQueryConstants.INVOCATIONS,
|
|
320
319
|
full_name=get_invocations_fqn(project),
|
|
321
320
|
)
|
mlrun/projects/project.py
CHANGED
|
@@ -1552,7 +1552,7 @@ class MlrunProject(ModelObj):
|
|
|
1552
1552
|
url = path.normpath(path.join(self.spec.get_code_path(), url))
|
|
1553
1553
|
|
|
1554
1554
|
if (not in_context or check_path_in_context) and not path.isfile(url):
|
|
1555
|
-
raise
|
|
1555
|
+
raise FileNotFoundError(f"{url} not found")
|
|
1556
1556
|
|
|
1557
1557
|
return url, in_context
|
|
1558
1558
|
|
|
@@ -2900,6 +2900,16 @@ class MlrunProject(ModelObj):
|
|
|
2900
2900
|
continue
|
|
2901
2901
|
|
|
2902
2902
|
raise mlrun.errors.MLRunMissingDependencyError(message) from exc
|
|
2903
|
+
|
|
2904
|
+
except Exception as exc:
|
|
2905
|
+
if silent:
|
|
2906
|
+
logger.warn(
|
|
2907
|
+
"Failed to instantiate function",
|
|
2908
|
+
name=name,
|
|
2909
|
+
error=mlrun.utils.err_to_str(exc),
|
|
2910
|
+
)
|
|
2911
|
+
continue
|
|
2912
|
+
raise exc
|
|
2903
2913
|
else:
|
|
2904
2914
|
message = f"Function {name} must be an object or dict."
|
|
2905
2915
|
if silent:
|
|
@@ -525,12 +525,8 @@ class RemoteRuntime(KubeResource):
|
|
|
525
525
|
extra_attributes["ackWindowSize"] = ack_window_size
|
|
526
526
|
|
|
527
527
|
access_key = kwargs.pop("access_key", None)
|
|
528
|
-
if access_key:
|
|
529
|
-
|
|
530
|
-
"The access_key parameter is deprecated and will be ignored, "
|
|
531
|
-
"use the V3IO_ACCESS_KEY environment variable instead"
|
|
532
|
-
)
|
|
533
|
-
access_key = self._resolve_v3io_access_key()
|
|
528
|
+
if not access_key:
|
|
529
|
+
access_key = self._resolve_v3io_access_key()
|
|
534
530
|
|
|
535
531
|
self.add_trigger(
|
|
536
532
|
name,
|
mlrun/utils/version/version.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mlrun
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.0rc47
|
|
4
4
|
Summary: Tracking and config of machine learning runs
|
|
5
5
|
Home-page: https://github.com/mlrun/mlrun
|
|
6
6
|
Author: Yaron Haviv
|
|
@@ -31,7 +31,7 @@ Requires-Dist: ipython ~=8.10
|
|
|
31
31
|
Requires-Dist: nuclio-jupyter ~=0.10.4
|
|
32
32
|
Requires-Dist: numpy <1.27.0,>=1.16.5
|
|
33
33
|
Requires-Dist: pandas <2.2,>=1.2
|
|
34
|
-
Requires-Dist: pyarrow <
|
|
34
|
+
Requires-Dist: pyarrow <18,>=10.0
|
|
35
35
|
Requires-Dist: pyyaml <7,>=5.4.1
|
|
36
36
|
Requires-Dist: requests ~=2.32
|
|
37
37
|
Requires-Dist: tabulate ~=0.8.6
|
|
@@ -43,7 +43,7 @@ Requires-Dist: semver ~=3.0
|
|
|
43
43
|
Requires-Dist: dependency-injector ~=4.41
|
|
44
44
|
Requires-Dist: fsspec <2024.7,>=2023.9.2
|
|
45
45
|
Requires-Dist: v3iofs ~=0.1.17
|
|
46
|
-
Requires-Dist: storey ~=1.7.
|
|
46
|
+
Requires-Dist: storey ~=1.7.27
|
|
47
47
|
Requires-Dist: inflection ~=0.5.0
|
|
48
48
|
Requires-Dist: python-dotenv ~=0.17.0
|
|
49
49
|
Requires-Dist: setuptools ~=71.0
|
|
@@ -84,7 +84,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'all'
|
|
|
84
84
|
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'all'
|
|
85
85
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'all'
|
|
86
86
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
|
|
87
|
-
Requires-Dist: taos-ws-py ~=0.3.
|
|
87
|
+
Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'all'
|
|
88
88
|
Provides-Extra: api
|
|
89
89
|
Requires-Dist: uvicorn ~=0.27.1 ; extra == 'api'
|
|
90
90
|
Requires-Dist: dask-kubernetes ~=0.11.0 ; extra == 'api'
|
|
@@ -137,7 +137,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'complete'
|
|
|
137
137
|
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete'
|
|
138
138
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete'
|
|
139
139
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
|
|
140
|
-
Requires-Dist: taos-ws-py ~=0.3.
|
|
140
|
+
Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'complete'
|
|
141
141
|
Provides-Extra: complete-api
|
|
142
142
|
Requires-Dist: adlfs ==2023.9.0 ; extra == 'complete-api'
|
|
143
143
|
Requires-Dist: aiobotocore <2.16,>=2.5.0 ; extra == 'complete-api'
|
|
@@ -174,7 +174,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
|
|
|
174
174
|
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete-api'
|
|
175
175
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete-api'
|
|
176
176
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
|
|
177
|
-
Requires-Dist: taos-ws-py ~=0.3.
|
|
177
|
+
Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'complete-api'
|
|
178
178
|
Requires-Dist: timelength ~=1.1 ; extra == 'complete-api'
|
|
179
179
|
Requires-Dist: uvicorn ~=0.27.1 ; extra == 'complete-api'
|
|
180
180
|
Requires-Dist: memray ~=1.12 ; (sys_platform != "win32") and extra == 'complete-api'
|
|
@@ -209,7 +209,7 @@ Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'snowflake'
|
|
|
209
209
|
Provides-Extra: sqlalchemy
|
|
210
210
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'sqlalchemy'
|
|
211
211
|
Provides-Extra: tdengine
|
|
212
|
-
Requires-Dist: taos-ws-py ~=0.3.
|
|
212
|
+
Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'tdengine'
|
|
213
213
|
|
|
214
214
|
<a id="top"></a>
|
|
215
215
|
[](https://github.com/mlrun/mlrun/actions/workflows/build.yaml?query=branch%3Adevelopment)
|
|
@@ -6,7 +6,7 @@ mlrun/execution.py,sha256=EGsEeSqOFnSxYFL4_YVKv8DEx2YsmJ9aA1gXBAV5W5A,42563
|
|
|
6
6
|
mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
|
|
7
7
|
mlrun/k8s_utils.py,sha256=mRQMs6NzPq36vx1n5_2BfFapXysc8wv3NcrZ77_2ANA,8949
|
|
8
8
|
mlrun/lists.py,sha256=3PqBdcajdwhTe1XuFsAaHTuFVM2kjwepf31qqE82apg,8384
|
|
9
|
-
mlrun/model.py,sha256=
|
|
9
|
+
mlrun/model.py,sha256=pWE8L9SIaNu3pAgoqVTea5i-MRXcWqorOWvL0AiwM5E,81226
|
|
10
10
|
mlrun/render.py,sha256=940H9fBBFeghH4dlifbURvtjlvw4GlWdAXezN6ky4rI,13275
|
|
11
11
|
mlrun/run.py,sha256=hNxV-TnixbH8MCos2jqz8jdTDlK7dBSvJMil_QoGKQI,43616
|
|
12
12
|
mlrun/secrets.py,sha256=ibtCK79u7JVBZF6F0SP1-xXXF5MyrLEUs_TCWiJAnlc,7798
|
|
@@ -26,9 +26,10 @@ mlrun/common/secrets.py,sha256=vc8WV82EZsCB5ENjUkObFOzZP59aZ1w8F82PTnqwBnc,5181
|
|
|
26
26
|
mlrun/common/types.py,sha256=APVFvumnHpCG-yXlt6OSioMfkyT-DADPiW3dGG3dUFQ,1057
|
|
27
27
|
mlrun/common/db/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
|
|
28
28
|
mlrun/common/db/sql_session.py,sha256=J6b-0xrnFb-8n_xdksPXeA8kArSMfAiSDN4n7iOhtus,2708
|
|
29
|
-
mlrun/common/formatters/__init__.py,sha256=
|
|
29
|
+
mlrun/common/formatters/__init__.py,sha256=topwMC5auQYTDBq8dwa31-5e8bWvHcLYmUqyXysXVWQ,835
|
|
30
30
|
mlrun/common/formatters/artifact.py,sha256=t4LmoWCFjPJ_YzzQCC2aMJwOeeLi84le979m6OTRyoM,1401
|
|
31
31
|
mlrun/common/formatters/base.py,sha256=LHwWWnQJCmvlnOCCmG8YtJ_xzs0xBI8PujYDL5Ky9H4,4101
|
|
32
|
+
mlrun/common/formatters/feature_set.py,sha256=lH5RL9Mo6weRexHrruUnmL1qqv_mZocBOQcyVOtXoIk,1056
|
|
32
33
|
mlrun/common/formatters/function.py,sha256=fGa5m5aI_XvQdvrUr73dmUwrEJrE_8wM4_P4q8RgBTg,1477
|
|
33
34
|
mlrun/common/formatters/pipeline.py,sha256=hGUV_3wcTEMa-JouspbjgJ1JGKa2Wc5cXSaH2XhOdMc,1763
|
|
34
35
|
mlrun/common/formatters/project.py,sha256=rdGf7fq_CfwFwd8iKWl8sW-tqTJilK3gJtV5oLdaY-M,1756
|
|
@@ -36,7 +37,7 @@ mlrun/common/formatters/run.py,sha256=eEBy1NEwGT9b98TWS2OetEbDnDrnHBIBVMrlXsxveo
|
|
|
36
37
|
mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
|
|
37
38
|
mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
|
|
38
39
|
mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
|
|
39
|
-
mlrun/common/schemas/__init__.py,sha256=
|
|
40
|
+
mlrun/common/schemas/__init__.py,sha256=QZMyVHjIoa88JmyVy45JGkNGz5K39XX7A72TUnXrLNA,5267
|
|
40
41
|
mlrun/common/schemas/alert.py,sha256=qWYCISNYMdkgAARVQNxshVr9d-s8LGscfLKpczkTBms,6749
|
|
41
42
|
mlrun/common/schemas/api_gateway.py,sha256=9ilorgLOiWxFZbv89-dbPNfVdaChlGOIdC4SLTxQwNI,7118
|
|
42
43
|
mlrun/common/schemas/artifact.py,sha256=V3ngobnzI1v2eoOroWBEedjAZu0ntCSIQ-LzsOK1Z9k,3570
|
|
@@ -67,10 +68,10 @@ mlrun/common/schemas/schedule.py,sha256=nD9kxH2KjXkbGZPNfzVNlNSxbyFZmZUlwtT04_z2
|
|
|
67
68
|
mlrun/common/schemas/secret.py,sha256=51tCN1F8DFTq4y_XdHIMDy3I1TnMEBX8kO8BHKavYF4,1484
|
|
68
69
|
mlrun/common/schemas/tag.py,sha256=OAn9Qt6z8ibqw8uU8WQSvuwY8irUv45Dhx2Ko5FzUss,884
|
|
69
70
|
mlrun/common/schemas/workflow.py,sha256=WxmlwtwrzwL4lfHYjQTOp03uv6PWYMpZ4cNBMOA6N6E,1897
|
|
70
|
-
mlrun/common/schemas/model_monitoring/__init__.py,sha256=
|
|
71
|
-
mlrun/common/schemas/model_monitoring/constants.py,sha256=
|
|
71
|
+
mlrun/common/schemas/model_monitoring/__init__.py,sha256=q2icasMdgI7OG-p5eVwCu6sBuPrBMpRxByC6rxYk0DM,1813
|
|
72
|
+
mlrun/common/schemas/model_monitoring/constants.py,sha256=KD6gaw24EAKFow5LPl0JkMlSXHUMca3DS-S41sWAre8,10158
|
|
72
73
|
mlrun/common/schemas/model_monitoring/grafana.py,sha256=SG13MFUUz_tk6-mWeSx17qcdEW4ekicxqNtnMSwRTCY,1559
|
|
73
|
-
mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=
|
|
74
|
+
mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=5vvjNX1bV98VSGdT4jwHr5ArKC9v_c1iHlaTf82fSUY,13198
|
|
74
75
|
mlrun/data_types/__init__.py,sha256=EkxfkFoHb91zz3Aymq-KZfCHlPMzEc3bBqgzPUwmHWY,1087
|
|
75
76
|
mlrun/data_types/data_types.py,sha256=3dmmIxJ2_uKzf-dbbgOwbYJx8cvUYrPiQan40vcSqJo,4948
|
|
76
77
|
mlrun/data_types/infer.py,sha256=z2EbSpR6xWEE5-HRUtDZkapHQld3xMbzXtTX83K-690,6134
|
|
@@ -88,13 +89,13 @@ mlrun/datastore/google_cloud_storage.py,sha256=Lkr3jud2REXAf-ohI3Or7bbTKbb_MCKOW
|
|
|
88
89
|
mlrun/datastore/hdfs.py,sha256=TfL1zUWVRxEHF9kswZtOzrMdDmhSfiSVIAjz7fxWyVw,1876
|
|
89
90
|
mlrun/datastore/inmem.py,sha256=d2dIvHlOQylhc-i4B5Kk9e9ayXnF7DICc5yUlHcNwqs,2873
|
|
90
91
|
mlrun/datastore/redis.py,sha256=vTjqtn8l6AvVXqjN0DroumnYFxlMhzVnqsW96p15c-0,5630
|
|
91
|
-
mlrun/datastore/s3.py,sha256=
|
|
92
|
+
mlrun/datastore/s3.py,sha256=CBBgZlZDX_PyvQBbJRjY4gSaLpGWMygt_fG8n-xY28c,8994
|
|
92
93
|
mlrun/datastore/snowflake_utils.py,sha256=Wohvnlmq8j1d98RCaknll-iWdZZpSlCrKhUOEy0_-CA,1483
|
|
93
94
|
mlrun/datastore/sources.py,sha256=op90ksx95wqaBtoiORpHnqEgw4iGEDPsJ3_lI8ftS-E,48801
|
|
94
95
|
mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
|
|
95
96
|
mlrun/datastore/spark_utils.py,sha256=_AsVoU5Ix_-W7Gyq8io8V-2GTk0m8THJNDP3WGGaWJY,2865
|
|
96
97
|
mlrun/datastore/store_resources.py,sha256=rcLoG506AMmR8qPJU_gE-G5d34VJVV_vNlZ3VHqho6c,6869
|
|
97
|
-
mlrun/datastore/storeytargets.py,sha256=
|
|
98
|
+
mlrun/datastore/storeytargets.py,sha256=uNYG4nCBD3JIfa51CG4cDe9ryc9oIcqUdUXKvCPB6uE,5086
|
|
98
99
|
mlrun/datastore/targets.py,sha256=TkG2HG4h7SaQ3qG2sKAHAuJJyj_gnE-eChaIsyjlq1o,80450
|
|
99
100
|
mlrun/datastore/utils.py,sha256=l9dLZb_VCbHs_htqMFRv4qiestZ8z8K-4eY1MxHS8wE,7720
|
|
100
101
|
mlrun/datastore/v3io.py,sha256=HxP6mygiYM6leDAbQ9KdTxObLCt9yGMro0YhfdU6KUo,8157
|
|
@@ -102,10 +103,10 @@ mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev
|
|
|
102
103
|
mlrun/datastore/wasbfs/fs.py,sha256=MnSj7Q4OKA2L55ihCmUnj2t3GA3B77oLMdAw-yxvN9w,6151
|
|
103
104
|
mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
|
|
104
105
|
mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
|
|
105
|
-
mlrun/db/base.py,sha256=
|
|
106
|
+
mlrun/db/base.py,sha256=lUfJrCWbuRUErIrUUXAKI2sSlrwfB-dHDz-Ck_cnZHU,24297
|
|
106
107
|
mlrun/db/factory.py,sha256=ibIrE5QkIIyzDU1FXKrfbc31cZiRLYKDZb8dqCpQwyU,2397
|
|
107
|
-
mlrun/db/httpdb.py,sha256=
|
|
108
|
-
mlrun/db/nopdb.py,sha256=
|
|
108
|
+
mlrun/db/httpdb.py,sha256=5-xdym1Ls6iaR_5DD4Iv805fQAKH0Zx-4oc4n9Z6p8Y,184623
|
|
109
|
+
mlrun/db/nopdb.py,sha256=1oCZR2EmQQDkwXUgmyI3SB76zvOwA6Ml3Lk_xvuwHfc,21620
|
|
109
110
|
mlrun/feature_store/__init__.py,sha256=FhHRc8NdqL_HWpCs7A8dKruxJS5wEm55Gs3dcgBiRUg,1522
|
|
110
111
|
mlrun/feature_store/api.py,sha256=SWBbFD4KU2U4TUaAbD2hRLSquFWxX46mZGCToI0GfFQ,49994
|
|
111
112
|
mlrun/feature_store/common.py,sha256=mSlfEj_LIbtM-pNiIWUGIdX0Z0y5ZoH5nKow7KMc5VQ,12673
|
|
@@ -216,7 +217,7 @@ mlrun/model_monitoring/application.py,sha256=RJ8HeAPfGO3P2A_dEZYNg60c1wKTADh2YSv
|
|
|
216
217
|
mlrun/model_monitoring/controller.py,sha256=ZKp3mWMhj6irCuREs-OH1MYYh5DzqNEDe04kVPVrZzw,27971
|
|
217
218
|
mlrun/model_monitoring/evidently_application.py,sha256=iOc42IVjj8m6PDBmVcKIMWm46Bu0EdO9SDcH40Eqhyo,769
|
|
218
219
|
mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
|
|
219
|
-
mlrun/model_monitoring/helpers.py,sha256=
|
|
220
|
+
mlrun/model_monitoring/helpers.py,sha256=KsbSH0kEjCPajvLUpv3q5GWyvx0bZj-JkghGJlzbLZI,12757
|
|
220
221
|
mlrun/model_monitoring/model_endpoint.py,sha256=7VX0cBATqLsA4sSinDzouf41ndxqh2mf5bO9BW0G5Z4,4017
|
|
221
222
|
mlrun/model_monitoring/stream_processing.py,sha256=0eu1Gq1Obq87LFno6eIZ55poXoFaeloqYTLiQgyfd0k,38687
|
|
222
223
|
mlrun/model_monitoring/tracking_policy.py,sha256=sQq956akAQpntkrJwIgFWcEq-JpyVcg0FxgNa4h3V70,5502
|
|
@@ -227,11 +228,11 @@ mlrun/model_monitoring/applications/base.py,sha256=snr3xYdqv6Po19yS0Z1VktyoLrbl8
|
|
|
227
228
|
mlrun/model_monitoring/applications/context.py,sha256=jTZaRdPZBc2m8-rcC3gKFkSsaQByWn6ZCQuqCOOWdWo,12747
|
|
228
229
|
mlrun/model_monitoring/applications/evidently_base.py,sha256=6hzfO6s0jEVHj4R_pujcn_p6LvdkKUDb9S4B6j2XEUY,8024
|
|
229
230
|
mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=OOPojE-KIP9rAPZ6va6uJOjqJOb3c8K_VAmITXZd918,13341
|
|
230
|
-
mlrun/model_monitoring/applications/results.py,sha256=
|
|
231
|
+
mlrun/model_monitoring/applications/results.py,sha256=B0YuLig4rgBzBs3OAh01yLavhtNgj8Oz1RD8UfEkENU,3590
|
|
231
232
|
mlrun/model_monitoring/db/__init__.py,sha256=6Ic-X3Fh9XLPYMytmevGNSs-Hii1rAjLLoFTSPwTguw,736
|
|
232
233
|
mlrun/model_monitoring/db/stores/__init__.py,sha256=m6Z6rPQyaufq5oXF3HVUYGDN34biAX1JE1F6OxLN9B8,4752
|
|
233
234
|
mlrun/model_monitoring/db/stores/base/__init__.py,sha256=JufJETW3BXzPhFwbRa8dMf7BFGGZKceIWIMgr5x9n9c,599
|
|
234
|
-
mlrun/model_monitoring/db/stores/base/store.py,sha256=
|
|
235
|
+
mlrun/model_monitoring/db/stores/base/store.py,sha256=KDNiAil7wF7zTEp3KytyJeMGGT4oblt4-q1CvJlhB1k,7518
|
|
235
236
|
mlrun/model_monitoring/db/stores/sqldb/__init__.py,sha256=6CsTXAxeLbbf8yfCADTaxmiavqwrLEdYFJ-qc5kgDAY,569
|
|
236
237
|
mlrun/model_monitoring/db/stores/sqldb/sql_store.py,sha256=9YjYqLue1GV1K4G2VRLVFObySEaIDnGqivvvXDM29to,26154
|
|
237
238
|
mlrun/model_monitoring/db/stores/sqldb/models/__init__.py,sha256=lCiGw9WKPtHAIgrtNS2jyvM5OZvZvogBh76iurNYblg,2453
|
|
@@ -244,9 +245,9 @@ mlrun/model_monitoring/db/tsdb/__init__.py,sha256=Zqh_27I2YAEHk9nl0Z6lUxP7VEfrgr
|
|
|
244
245
|
mlrun/model_monitoring/db/tsdb/base.py,sha256=X89X763sDrShfRXE1N-p8k97E8NBs7O1QJFiO-CffLM,18583
|
|
245
246
|
mlrun/model_monitoring/db/tsdb/helpers.py,sha256=0oUXc4aUkYtP2SGP6jTb3uPPKImIUsVsrb9otX9a7O4,1189
|
|
246
247
|
mlrun/model_monitoring/db/tsdb/tdengine/__init__.py,sha256=vgBdsKaXUURKqIf3M0y4sRatmSVA4CQiJs7J5dcVBkQ,620
|
|
247
|
-
mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=
|
|
248
|
+
mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=7yZFn42sF597TBumVM-xhh1bjIQCbIo6qIvMK5WpWO0,10503
|
|
248
249
|
mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py,sha256=Hb0vcCBP-o0ET78mU4P32fnhUL65QZv-pMuv2lnCby4,1586
|
|
249
|
-
mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=
|
|
250
|
+
mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=L4cDFfuGOVyF_bnPbUJ_xhMEt_DGwY6FWwoO4VEXSW4,18671
|
|
250
251
|
mlrun/model_monitoring/db/tsdb/v3io/__init__.py,sha256=aL3bfmQsUQ-sbvKGdNihFj8gLCK3mSys0qDcXtYOwgc,616
|
|
251
252
|
mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py,sha256=mbmhN4f_F58ptVjhwoMF6ifZSdnZWhK7x8eNsWS39IA,6217
|
|
252
253
|
mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py,sha256=1H-IBXPNJPRAaxDMGWpUU25QqfR87LpZbJ03vaJkICs,32858
|
|
@@ -274,7 +275,7 @@ mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13
|
|
|
274
275
|
mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
|
|
275
276
|
mlrun/projects/operations.py,sha256=UEpiW4bDscth4pwWcLWF1xz-IU7bnZfckPR7sXp3O-g,19441
|
|
276
277
|
mlrun/projects/pipelines.py,sha256=tFqmE_diKiGURwZPCHVPZmwEKza_gyfpr7F8bLS3plA,40173
|
|
277
|
-
mlrun/projects/project.py,sha256=
|
|
278
|
+
mlrun/projects/project.py,sha256=rw0QQ2XtBUevW3cv8baCGDGsqISxsHYYziPcOABLOpg,190604
|
|
278
279
|
mlrun/runtimes/__init__.py,sha256=egLM94cDMUyQ1GVABdFGXUQcDhU70lP3k7qSnM_UnHY,9008
|
|
279
280
|
mlrun/runtimes/base.py,sha256=JXWmTIcm3b0klGUOHDlyFNa3bUgsNzQIgWhUQpSZoE0,37692
|
|
280
281
|
mlrun/runtimes/daskjob.py,sha256=Ka_xqim8LkCYjp-M_WgteJy6ZN_3qfmLLHvXs7N6pa4,19411
|
|
@@ -295,7 +296,7 @@ mlrun/runtimes/mpijob/abstract.py,sha256=kDWo-IY1FKLZhI30j38Xx9HMhlUvHezfd1DT2Sh
|
|
|
295
296
|
mlrun/runtimes/mpijob/v1.py,sha256=1XQZC7AIMGX_AQCbApcwpH8I7y39-v0v2O35MvxjXoo,3213
|
|
296
297
|
mlrun/runtimes/nuclio/__init__.py,sha256=gx1kizzKv8pGT5TNloN1js1hdbxqDw3rM90sLVYVffY,794
|
|
297
298
|
mlrun/runtimes/nuclio/api_gateway.py,sha256=2sHtkVHSS3L1DuV2KNWatJJRxvoGSBOjB6tnqv6SA5w,26730
|
|
298
|
-
mlrun/runtimes/nuclio/function.py,sha256=
|
|
299
|
+
mlrun/runtimes/nuclio/function.py,sha256=TQt6RyxK_iyzNJr2r57BRtVXuy2GMrhdeFOlFjb2AZg,52106
|
|
299
300
|
mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
|
|
300
301
|
mlrun/runtimes/nuclio/serving.py,sha256=X0fYJnidH0S5xrupoTC74OhZz7Tym34iw6hFSzahMCk,29720
|
|
301
302
|
mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
|
|
@@ -342,11 +343,11 @@ mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT
|
|
|
342
343
|
mlrun/utils/notifications/notification/slack.py,sha256=wqpFGr5BTvFO5KuUSzFfxsgmyU1Ohq7fbrGeNe9TXOk,7006
|
|
343
344
|
mlrun/utils/notifications/notification/webhook.py,sha256=cb9w1Mc8ENfJBdgan7iiVHK9eVls4-R3tUxmXM-P-8I,4746
|
|
344
345
|
mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
|
|
345
|
-
mlrun/utils/version/version.json,sha256=
|
|
346
|
+
mlrun/utils/version/version.json,sha256=q5cEJlSDRoZA0OSLYB_pHTa6NDst7rvigtmJRxEHYLw,89
|
|
346
347
|
mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
|
|
347
|
-
mlrun-1.7.
|
|
348
|
-
mlrun-1.7.
|
|
349
|
-
mlrun-1.7.
|
|
350
|
-
mlrun-1.7.
|
|
351
|
-
mlrun-1.7.
|
|
352
|
-
mlrun-1.7.
|
|
348
|
+
mlrun-1.7.0rc47.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
349
|
+
mlrun-1.7.0rc47.dist-info/METADATA,sha256=mFz9Rh9j0hxTRo8fwrTziz_722E5JijvBB8K32E3X7s,19943
|
|
350
|
+
mlrun-1.7.0rc47.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
351
|
+
mlrun-1.7.0rc47.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
|
|
352
|
+
mlrun-1.7.0rc47.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
|
|
353
|
+
mlrun-1.7.0rc47.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|