mlrun 1.7.0rc22__py3-none-any.whl → 1.7.0rc23__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/schemas/__init__.py +2 -0
- mlrun/common/schemas/feature_store.py +78 -28
- mlrun/db/base.py +1 -0
- mlrun/db/httpdb.py +9 -6
- mlrun/db/nopdb.py +1 -0
- mlrun/errors.py +1 -3
- mlrun/frameworks/__init__.py +0 -6
- mlrun/model_monitoring/db/stores/__init__.py +27 -21
- mlrun/model_monitoring/db/stores/base/store.py +1 -0
- mlrun/model_monitoring/db/stores/sqldb/sql_store.py +8 -8
- mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +8 -8
- mlrun/model_monitoring/db/tsdb/__init__.py +1 -1
- mlrun/model_monitoring/db/tsdb/base.py +1 -1
- mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +2 -3
- mlrun/model_monitoring/helpers.py +8 -4
- mlrun/model_monitoring/stream_processing.py +9 -11
- mlrun/model_monitoring/writer.py +10 -6
- mlrun/package/__init__.py +1 -13
- mlrun/package/packagers/__init__.py +1 -6
- mlrun/projects/project.py +5 -1
- mlrun/runtimes/nuclio/application/application.py +0 -2
- mlrun/runtimes/nuclio/serving.py +9 -6
- mlrun/serving/v2_serving.py +54 -38
- mlrun/utils/notifications/notification/base.py +39 -7
- mlrun/utils/notifications/notification/slack.py +1 -14
- mlrun/utils/version/version.json +2 -2
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/METADATA +1 -1
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/RECORD +32 -32
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/LICENSE +0 -0
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/WHEEL +0 -0
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/entry_points.txt +0 -0
- {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/top_level.txt +0 -0
mlrun/common/schemas/__init__.py
CHANGED
|
@@ -82,6 +82,7 @@ from .events import (
|
|
|
82
82
|
)
|
|
83
83
|
from .feature_store import (
|
|
84
84
|
EntitiesOutput,
|
|
85
|
+
EntitiesOutputV2,
|
|
85
86
|
Entity,
|
|
86
87
|
EntityListOutput,
|
|
87
88
|
EntityRecord,
|
|
@@ -98,6 +99,7 @@ from .feature_store import (
|
|
|
98
99
|
FeatureSetSpec,
|
|
99
100
|
FeatureSetsTagsOutput,
|
|
100
101
|
FeaturesOutput,
|
|
102
|
+
FeaturesOutputV2,
|
|
101
103
|
FeatureVector,
|
|
102
104
|
FeatureVectorRecord,
|
|
103
105
|
FeatureVectorsOutput,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
from typing import Optional
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
import pydantic
|
|
18
18
|
|
|
19
19
|
from .auth import AuthorizationResourceTypes, Credentials
|
|
20
20
|
from .object import (
|
|
@@ -27,32 +27,62 @@ from .object import (
|
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
class
|
|
30
|
+
class FeatureStoreBaseModel(pydantic.BaseModel):
|
|
31
|
+
"""
|
|
32
|
+
Intermediate base class, in order to override pydantic's configuration, as per
|
|
33
|
+
https://docs.pydantic.dev/1.10/usage/model_config/#change-behaviour-globally
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
class Config:
|
|
37
|
+
copy_on_model_validation = "none"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Feature(FeatureStoreBaseModel):
|
|
41
|
+
name: str
|
|
42
|
+
value_type: str
|
|
43
|
+
labels: Optional[dict] = {}
|
|
44
|
+
|
|
45
|
+
class Config:
|
|
46
|
+
extra = pydantic.Extra.allow
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class QualifiedFeature(FeatureStoreBaseModel):
|
|
50
|
+
name: str
|
|
51
|
+
value_type: str
|
|
52
|
+
feature_set_index: int
|
|
53
|
+
labels: Optional[dict] = {}
|
|
54
|
+
|
|
55
|
+
class Config:
|
|
56
|
+
extra = pydantic.Extra.allow
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class Entity(FeatureStoreBaseModel):
|
|
31
60
|
name: str
|
|
32
61
|
value_type: str
|
|
33
62
|
labels: Optional[dict] = {}
|
|
34
63
|
|
|
35
64
|
class Config:
|
|
36
|
-
extra = Extra.allow
|
|
65
|
+
extra = pydantic.Extra.allow
|
|
37
66
|
|
|
38
67
|
|
|
39
|
-
class
|
|
68
|
+
class QualifiedEntity(FeatureStoreBaseModel):
|
|
40
69
|
name: str
|
|
41
70
|
value_type: str
|
|
71
|
+
feature_set_index: int
|
|
42
72
|
labels: Optional[dict] = {}
|
|
43
73
|
|
|
44
74
|
class Config:
|
|
45
|
-
extra = Extra.allow
|
|
75
|
+
extra = pydantic.Extra.allow
|
|
46
76
|
|
|
47
77
|
|
|
48
78
|
class FeatureSetSpec(ObjectSpec):
|
|
49
79
|
entities: list[Entity] = []
|
|
50
80
|
features: list[Feature] = []
|
|
51
|
-
engine: Optional[str] = Field(default="storey")
|
|
81
|
+
engine: Optional[str] = pydantic.Field(default="storey")
|
|
52
82
|
|
|
53
83
|
|
|
54
|
-
class FeatureSet(
|
|
55
|
-
kind: ObjectKind = Field(ObjectKind.feature_set, const=True)
|
|
84
|
+
class FeatureSet(FeatureStoreBaseModel):
|
|
85
|
+
kind: ObjectKind = pydantic.Field(ObjectKind.feature_set, const=True)
|
|
56
86
|
metadata: ObjectMetadata
|
|
57
87
|
spec: FeatureSetSpec
|
|
58
88
|
status: ObjectStatus
|
|
@@ -62,7 +92,7 @@ class FeatureSet(BaseModel):
|
|
|
62
92
|
return AuthorizationResourceTypes.feature_set
|
|
63
93
|
|
|
64
94
|
|
|
65
|
-
class EntityRecord(
|
|
95
|
+
class EntityRecord(FeatureStoreBaseModel):
|
|
66
96
|
name: str
|
|
67
97
|
value_type: str
|
|
68
98
|
labels: list[LabelRecord]
|
|
@@ -71,7 +101,7 @@ class EntityRecord(BaseModel):
|
|
|
71
101
|
orm_mode = True
|
|
72
102
|
|
|
73
103
|
|
|
74
|
-
class FeatureRecord(
|
|
104
|
+
class FeatureRecord(FeatureStoreBaseModel):
|
|
75
105
|
name: str
|
|
76
106
|
value_type: str
|
|
77
107
|
labels: list[LabelRecord]
|
|
@@ -88,44 +118,64 @@ class FeatureSetRecord(ObjectRecord):
|
|
|
88
118
|
orm_mode = True
|
|
89
119
|
|
|
90
120
|
|
|
91
|
-
class FeatureSetsOutput(
|
|
121
|
+
class FeatureSetsOutput(FeatureStoreBaseModel):
|
|
92
122
|
feature_sets: list[FeatureSet]
|
|
93
123
|
|
|
94
124
|
|
|
95
|
-
class FeatureSetsTagsOutput(
|
|
125
|
+
class FeatureSetsTagsOutput(FeatureStoreBaseModel):
|
|
96
126
|
tags: list[str] = []
|
|
97
127
|
|
|
98
128
|
|
|
99
|
-
class FeatureSetDigestSpec(
|
|
129
|
+
class FeatureSetDigestSpec(FeatureStoreBaseModel):
|
|
100
130
|
entities: list[Entity]
|
|
101
131
|
features: list[Feature]
|
|
102
132
|
|
|
103
133
|
|
|
104
|
-
class FeatureSetDigestOutput(
|
|
134
|
+
class FeatureSetDigestOutput(FeatureStoreBaseModel):
|
|
105
135
|
metadata: ObjectMetadata
|
|
106
136
|
spec: FeatureSetDigestSpec
|
|
107
137
|
|
|
108
138
|
|
|
109
|
-
class
|
|
139
|
+
class FeatureSetDigestSpecV2(FeatureStoreBaseModel):
|
|
140
|
+
entities: list[Entity]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class FeatureSetDigestOutputV2(FeatureStoreBaseModel):
|
|
144
|
+
feature_set_index: int
|
|
145
|
+
metadata: ObjectMetadata
|
|
146
|
+
spec: FeatureSetDigestSpecV2
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class FeatureListOutput(FeatureStoreBaseModel):
|
|
110
150
|
feature: Feature
|
|
111
151
|
feature_set_digest: FeatureSetDigestOutput
|
|
112
152
|
|
|
113
153
|
|
|
114
|
-
class FeaturesOutput(
|
|
154
|
+
class FeaturesOutput(FeatureStoreBaseModel):
|
|
115
155
|
features: list[FeatureListOutput]
|
|
116
156
|
|
|
117
157
|
|
|
118
|
-
class
|
|
158
|
+
class FeaturesOutputV2(FeatureStoreBaseModel):
|
|
159
|
+
features: list[QualifiedFeature]
|
|
160
|
+
feature_set_digests: list[FeatureSetDigestOutputV2]
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class EntityListOutput(FeatureStoreBaseModel):
|
|
119
164
|
entity: Entity
|
|
120
165
|
feature_set_digest: FeatureSetDigestOutput
|
|
121
166
|
|
|
122
167
|
|
|
123
|
-
class
|
|
168
|
+
class EntitiesOutputV2(FeatureStoreBaseModel):
|
|
169
|
+
entities: list[QualifiedEntity]
|
|
170
|
+
feature_set_digests: list[FeatureSetDigestOutputV2]
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class EntitiesOutput(FeatureStoreBaseModel):
|
|
124
174
|
entities: list[EntityListOutput]
|
|
125
175
|
|
|
126
176
|
|
|
127
|
-
class FeatureVector(
|
|
128
|
-
kind: ObjectKind = Field(ObjectKind.feature_vector, const=True)
|
|
177
|
+
class FeatureVector(FeatureStoreBaseModel):
|
|
178
|
+
kind: ObjectKind = pydantic.Field(ObjectKind.feature_vector, const=True)
|
|
129
179
|
metadata: ObjectMetadata
|
|
130
180
|
spec: ObjectSpec
|
|
131
181
|
status: ObjectStatus
|
|
@@ -139,39 +189,39 @@ class FeatureVectorRecord(ObjectRecord):
|
|
|
139
189
|
pass
|
|
140
190
|
|
|
141
191
|
|
|
142
|
-
class FeatureVectorsOutput(
|
|
192
|
+
class FeatureVectorsOutput(FeatureStoreBaseModel):
|
|
143
193
|
feature_vectors: list[FeatureVector]
|
|
144
194
|
|
|
145
195
|
|
|
146
|
-
class FeatureVectorsTagsOutput(
|
|
196
|
+
class FeatureVectorsTagsOutput(FeatureStoreBaseModel):
|
|
147
197
|
tags: list[str] = []
|
|
148
198
|
|
|
149
199
|
|
|
150
|
-
class DataSource(
|
|
200
|
+
class DataSource(FeatureStoreBaseModel):
|
|
151
201
|
kind: str
|
|
152
202
|
name: str
|
|
153
203
|
path: str
|
|
154
204
|
|
|
155
205
|
class Config:
|
|
156
|
-
extra = Extra.allow
|
|
206
|
+
extra = pydantic.Extra.allow
|
|
157
207
|
|
|
158
208
|
|
|
159
|
-
class DataTarget(
|
|
209
|
+
class DataTarget(FeatureStoreBaseModel):
|
|
160
210
|
kind: str
|
|
161
211
|
name: str
|
|
162
212
|
path: Optional[str]
|
|
163
213
|
|
|
164
214
|
class Config:
|
|
165
|
-
extra = Extra.allow
|
|
215
|
+
extra = pydantic.Extra.allow
|
|
166
216
|
|
|
167
217
|
|
|
168
|
-
class FeatureSetIngestInput(
|
|
218
|
+
class FeatureSetIngestInput(FeatureStoreBaseModel):
|
|
169
219
|
source: Optional[DataSource]
|
|
170
220
|
targets: Optional[list[DataTarget]]
|
|
171
221
|
infer_options: Optional[int]
|
|
172
222
|
credentials: Credentials = Credentials()
|
|
173
223
|
|
|
174
224
|
|
|
175
|
-
class FeatureSetIngestOutput(
|
|
225
|
+
class FeatureSetIngestOutput(FeatureStoreBaseModel):
|
|
176
226
|
feature_set: FeatureSet
|
|
177
227
|
run_object: dict
|
mlrun/db/base.py
CHANGED
mlrun/db/httpdb.py
CHANGED
|
@@ -3320,6 +3320,7 @@ class HTTPRunDB(RunDBInterface):
|
|
|
3320
3320
|
base_period: int = 10,
|
|
3321
3321
|
image: str = "mlrun/mlrun",
|
|
3322
3322
|
deploy_histogram_data_drift_app: bool = True,
|
|
3323
|
+
rebuild_images: bool = False,
|
|
3323
3324
|
) -> None:
|
|
3324
3325
|
"""
|
|
3325
3326
|
Deploy model monitoring application controller, writer and stream functions.
|
|
@@ -3329,13 +3330,14 @@ class HTTPRunDB(RunDBInterface):
|
|
|
3329
3330
|
The stream function goal is to monitor the log of the data stream. It is triggered when a new log entry
|
|
3330
3331
|
is detected. It processes the new events into statistics that are then written to statistics databases.
|
|
3331
3332
|
|
|
3332
|
-
:param project:
|
|
3333
|
-
:param base_period:
|
|
3334
|
-
|
|
3335
|
-
:param image:
|
|
3336
|
-
|
|
3337
|
-
|
|
3333
|
+
:param project: Project name.
|
|
3334
|
+
:param base_period: The time period in minutes in which the model monitoring controller
|
|
3335
|
+
function triggers. By default, the base period is 10 minutes.
|
|
3336
|
+
:param image: The image of the model monitoring controller, writer & monitoring
|
|
3337
|
+
stream functions, which are real time nuclio functions.
|
|
3338
|
+
By default, the image is mlrun/mlrun.
|
|
3338
3339
|
:param deploy_histogram_data_drift_app: If true, deploy the default histogram-based data drift application.
|
|
3340
|
+
:param rebuild_images: If true, force rebuild of model monitoring infrastructure images.
|
|
3339
3341
|
"""
|
|
3340
3342
|
self.api_call(
|
|
3341
3343
|
method=mlrun.common.types.HTTPMethod.POST,
|
|
@@ -3344,6 +3346,7 @@ class HTTPRunDB(RunDBInterface):
|
|
|
3344
3346
|
"base_period": base_period,
|
|
3345
3347
|
"image": image,
|
|
3346
3348
|
"deploy_histogram_data_drift_app": deploy_histogram_data_drift_app,
|
|
3349
|
+
"rebuild_images": rebuild_images,
|
|
3347
3350
|
},
|
|
3348
3351
|
)
|
|
3349
3352
|
|
mlrun/db/nopdb.py
CHANGED
mlrun/errors.py
CHANGED
|
@@ -92,9 +92,7 @@ def raise_for_status(
|
|
|
92
92
|
try:
|
|
93
93
|
response.raise_for_status()
|
|
94
94
|
except (requests.HTTPError, aiohttp.ClientResponseError) as exc:
|
|
95
|
-
error_message = err_to_str(exc)
|
|
96
|
-
if message:
|
|
97
|
-
error_message = f"{error_message}: {message}"
|
|
95
|
+
error_message = err_to_str(exc) if not message else message
|
|
98
96
|
status_code = (
|
|
99
97
|
response.status_code
|
|
100
98
|
if hasattr(response, "status_code")
|
mlrun/frameworks/__init__.py
CHANGED
|
@@ -12,11 +12,5 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
"""
|
|
16
|
-
MLRun provides a quick and easy integration into your code with mlrun.frameworks: a collection of sub-modules
|
|
17
|
-
for the most commonly used machine and deep learning frameworks, providing features such as automatic logging,
|
|
18
|
-
model management, and distributed training.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
15
|
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
22
16
|
from .parallel_coordinates import compare_db_runs, compare_run_objects
|
|
@@ -31,17 +31,12 @@ class ObjectStoreFactory(enum.Enum):
|
|
|
31
31
|
def to_object_store(
|
|
32
32
|
self,
|
|
33
33
|
project: str,
|
|
34
|
-
|
|
35
|
-
secret_provider: typing.Callable = None,
|
|
34
|
+
**kwargs,
|
|
36
35
|
) -> StoreBase:
|
|
37
36
|
"""
|
|
38
37
|
Return a StoreBase object based on the provided enum value.
|
|
39
38
|
|
|
40
39
|
:param project: The name of the project.
|
|
41
|
-
:param access_key: Access key with permission to the DB table. Note that if access key is None
|
|
42
|
-
and the endpoint target is from type KV then the access key will be
|
|
43
|
-
retrieved from the environment variable.
|
|
44
|
-
:param secret_provider: An optional secret provider to get the connection string secret.
|
|
45
40
|
|
|
46
41
|
:return: `StoreBase` object.
|
|
47
42
|
|
|
@@ -50,10 +45,7 @@ class ObjectStoreFactory(enum.Enum):
|
|
|
50
45
|
if self == self.v3io_nosql:
|
|
51
46
|
from mlrun.model_monitoring.db.stores.v3io_kv.kv_store import KVStoreBase
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
access_key = access_key or mlrun.mlconf.get_v3io_access_key()
|
|
55
|
-
|
|
56
|
-
return KVStoreBase(project=project, access_key=access_key)
|
|
48
|
+
return KVStoreBase(project=project)
|
|
57
49
|
|
|
58
50
|
# Assuming SQL store target if store type is not KV.
|
|
59
51
|
# Update these lines once there are more than two store target types.
|
|
@@ -62,7 +54,7 @@ class ObjectStoreFactory(enum.Enum):
|
|
|
62
54
|
|
|
63
55
|
return SQLStoreBase(
|
|
64
56
|
project=project,
|
|
65
|
-
|
|
57
|
+
**kwargs,
|
|
66
58
|
)
|
|
67
59
|
|
|
68
60
|
@classmethod
|
|
@@ -79,7 +71,7 @@ class ObjectStoreFactory(enum.Enum):
|
|
|
79
71
|
def get_model_endpoint_store(
|
|
80
72
|
project: str,
|
|
81
73
|
access_key: str = None,
|
|
82
|
-
secret_provider: typing.Callable = None,
|
|
74
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
83
75
|
) -> StoreBase:
|
|
84
76
|
# Leaving here for backwards compatibility
|
|
85
77
|
warnings.warn(
|
|
@@ -95,24 +87,38 @@ def get_model_endpoint_store(
|
|
|
95
87
|
|
|
96
88
|
def get_store_object(
|
|
97
89
|
project: str,
|
|
98
|
-
|
|
99
|
-
|
|
90
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
91
|
+
**kwargs,
|
|
100
92
|
) -> StoreBase:
|
|
101
93
|
"""
|
|
102
|
-
|
|
94
|
+
Generate a store object. If a connection string is provided, the store type will be updated according to the
|
|
95
|
+
connection string. Currently, the supported store types are SQL and v3io-nosql.
|
|
103
96
|
|
|
104
97
|
:param project: The name of the project.
|
|
105
|
-
:param access_key: Access key with permission to the DB table.
|
|
106
98
|
:param secret_provider: An optional secret provider to get the connection string secret.
|
|
107
99
|
|
|
108
|
-
:return: `StoreBase` object. Using this object, the user can apply different operations
|
|
109
|
-
|
|
100
|
+
:return: `StoreBase` object. Using this object, the user can apply different operations such as write, update, get
|
|
101
|
+
and delete a model endpoint record.
|
|
110
102
|
"""
|
|
111
103
|
|
|
104
|
+
store_connection_string = mlrun.model_monitoring.helpers.get_connection_string(
|
|
105
|
+
secret_provider=secret_provider
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if store_connection_string and (
|
|
109
|
+
store_connection_string.startswith("mysql")
|
|
110
|
+
or store_connection_string.startswith("sqlite")
|
|
111
|
+
):
|
|
112
|
+
store_type = mlrun.common.schemas.model_monitoring.ModelEndpointTarget.SQL
|
|
113
|
+
kwargs["store_connection_string"] = store_connection_string
|
|
114
|
+
else:
|
|
115
|
+
# Set the default store type if no connection has been set
|
|
116
|
+
store_type = mlrun.mlconf.model_endpoint_monitoring.store_type
|
|
117
|
+
|
|
112
118
|
# Get store type value from ObjectStoreFactory enum class
|
|
113
|
-
|
|
119
|
+
store_type_fact = ObjectStoreFactory(store_type)
|
|
114
120
|
|
|
115
121
|
# Convert into store target object
|
|
116
|
-
return
|
|
117
|
-
project=project,
|
|
122
|
+
return store_type_fact.to_object_store(
|
|
123
|
+
project=project, secret_provider=secret_provider, **kwargs
|
|
118
124
|
)
|
|
@@ -25,14 +25,15 @@ from sqlalchemy.sql.elements import BinaryExpression
|
|
|
25
25
|
|
|
26
26
|
import mlrun.common.model_monitoring.helpers
|
|
27
27
|
import mlrun.common.schemas.model_monitoring as mm_schemas
|
|
28
|
-
import mlrun.model_monitoring.db
|
|
29
28
|
import mlrun.model_monitoring.db.stores.sqldb.models
|
|
30
29
|
import mlrun.model_monitoring.helpers
|
|
31
30
|
from mlrun.common.db.sql_session import create_session, get_engine
|
|
31
|
+
from mlrun.model_monitoring.db import StoreBase
|
|
32
32
|
from mlrun.utils import datetime_now, logger
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
class SQLStoreBase(
|
|
35
|
+
class SQLStoreBase(StoreBase):
|
|
36
|
+
type: typing.ClassVar[str] = mm_schemas.ModelEndpointTarget.SQL
|
|
36
37
|
"""
|
|
37
38
|
Handles the DB operations when the DB target is from type SQL. For the SQL operations, we use SQLAlchemy, a Python
|
|
38
39
|
SQL toolkit that handles the communication with the database. When using SQL for storing the model monitoring
|
|
@@ -44,23 +45,22 @@ class SQLStoreBase(mlrun.model_monitoring.db.StoreBase):
|
|
|
44
45
|
def __init__(
|
|
45
46
|
self,
|
|
46
47
|
project: str,
|
|
47
|
-
|
|
48
|
+
**kwargs,
|
|
48
49
|
):
|
|
49
50
|
"""
|
|
50
51
|
Initialize SQL store target object.
|
|
51
52
|
|
|
52
53
|
:param project: The name of the project.
|
|
53
|
-
:param secret_provider: An optional secret provider to get the connection string secret.
|
|
54
54
|
"""
|
|
55
55
|
|
|
56
56
|
super().__init__(project=project)
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
mlrun.
|
|
60
|
-
|
|
58
|
+
if "store_connection_string" not in kwargs:
|
|
59
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
60
|
+
"connection_string is a required parameter for SQLStoreBase."
|
|
61
61
|
)
|
|
62
|
-
)
|
|
63
62
|
|
|
63
|
+
self._sql_connection_string = kwargs.get("store_connection_string")
|
|
64
64
|
self._engine = get_engine(dsn=self._sql_connection_string)
|
|
65
65
|
|
|
66
66
|
def _init_tables(self):
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
-
import os
|
|
17
16
|
import typing
|
|
18
17
|
from dataclasses import dataclass
|
|
19
18
|
from http import HTTPStatus
|
|
@@ -24,8 +23,8 @@ import v3io.dataplane.response
|
|
|
24
23
|
|
|
25
24
|
import mlrun.common.model_monitoring.helpers
|
|
26
25
|
import mlrun.common.schemas.model_monitoring as mm_schemas
|
|
27
|
-
import mlrun.model_monitoring.db
|
|
28
26
|
import mlrun.utils.v3io_clients
|
|
27
|
+
from mlrun.model_monitoring.db import StoreBase
|
|
29
28
|
from mlrun.utils import logger
|
|
30
29
|
|
|
31
30
|
# Fields to encode before storing in the KV table or to decode after retrieving
|
|
@@ -89,18 +88,21 @@ _KIND_TO_SCHEMA_PARAMS: dict[mm_schemas.WriterEventKind, SchemaParams] = {
|
|
|
89
88
|
_EXCLUDE_SCHEMA_FILTER_EXPRESSION = '__name!=".#schema"'
|
|
90
89
|
|
|
91
90
|
|
|
92
|
-
class KVStoreBase(
|
|
91
|
+
class KVStoreBase(StoreBase):
|
|
92
|
+
type: typing.ClassVar[str] = "v3io-nosql"
|
|
93
93
|
"""
|
|
94
94
|
Handles the DB operations when the DB target is from type KV. For the KV operations, we use an instance of V3IO
|
|
95
95
|
client and usually the KV table can be found under v3io:///users/pipelines/project-name/model-endpoints/endpoints/.
|
|
96
96
|
"""
|
|
97
97
|
|
|
98
|
-
def __init__(
|
|
98
|
+
def __init__(
|
|
99
|
+
self,
|
|
100
|
+
project: str,
|
|
101
|
+
) -> None:
|
|
99
102
|
super().__init__(project=project)
|
|
100
103
|
# Initialize a V3IO client instance
|
|
101
|
-
self.access_key = access_key or os.environ.get("V3IO_ACCESS_KEY")
|
|
102
104
|
self.client = mlrun.utils.v3io_clients.get_v3io_client(
|
|
103
|
-
endpoint=mlrun.mlconf.v3io_api,
|
|
105
|
+
endpoint=mlrun.mlconf.v3io_api,
|
|
104
106
|
)
|
|
105
107
|
# Get the KV table path and container
|
|
106
108
|
self.path, self.container = self._get_path_and_container()
|
|
@@ -186,7 +188,6 @@ class KVStoreBase(mlrun.model_monitoring.db.StoreBase):
|
|
|
186
188
|
table_path=self.path,
|
|
187
189
|
key=endpoint_id,
|
|
188
190
|
raise_for_status=v3io.dataplane.RaiseForStatus.never,
|
|
189
|
-
access_key=self.access_key,
|
|
190
191
|
)
|
|
191
192
|
endpoint = endpoint.output.item
|
|
192
193
|
|
|
@@ -499,7 +500,6 @@ class KVStoreBase(mlrun.model_monitoring.db.StoreBase):
|
|
|
499
500
|
|
|
500
501
|
def _get_frames_client(self):
|
|
501
502
|
return mlrun.utils.v3io_clients.get_frames_client(
|
|
502
|
-
token=self.access_key,
|
|
503
503
|
address=mlrun.mlconf.v3io_framesd,
|
|
504
504
|
container=self.container,
|
|
505
505
|
)
|
|
@@ -65,7 +65,7 @@ class ObjectTSDBFactory(enum.Enum):
|
|
|
65
65
|
def get_tsdb_connector(
|
|
66
66
|
project: str,
|
|
67
67
|
tsdb_connector_type: str = "",
|
|
68
|
-
secret_provider: typing.Optional[typing.Callable] = None,
|
|
68
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
69
69
|
**kwargs,
|
|
70
70
|
) -> TSDBConnector:
|
|
71
71
|
"""
|
|
@@ -418,9 +418,8 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
418
418
|
f"Available tables: {list(self.tables.keys())}"
|
|
419
419
|
)
|
|
420
420
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
aggregators = ",".join(agg_funcs)
|
|
421
|
+
# Frames client expects the aggregators to be a comma-separated string
|
|
422
|
+
aggregators = ",".join(agg_funcs) if agg_funcs else None
|
|
424
423
|
table_path = self.tables[table]
|
|
425
424
|
try:
|
|
426
425
|
df = self._frames_client.read(
|
|
@@ -97,7 +97,7 @@ def get_monitoring_parquet_path(
|
|
|
97
97
|
return parquet_path
|
|
98
98
|
|
|
99
99
|
|
|
100
|
-
def get_connection_string(secret_provider: typing.Callable = None) -> str:
|
|
100
|
+
def get_connection_string(secret_provider: typing.Callable[[str], str] = None) -> str:
|
|
101
101
|
"""Get endpoint store connection string from the project secret. If wasn't set, take it from the system
|
|
102
102
|
configurations.
|
|
103
103
|
|
|
@@ -117,7 +117,7 @@ def get_connection_string(secret_provider: typing.Callable = None) -> str:
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def get_tsdb_connection_string(
|
|
120
|
-
secret_provider: typing.Optional[typing.Callable] = None,
|
|
120
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
121
121
|
) -> str:
|
|
122
122
|
"""Get TSDB connection string from the project secret. If wasn't set, take it from the system
|
|
123
123
|
configurations.
|
|
@@ -278,9 +278,13 @@ def calculate_inputs_statistics(
|
|
|
278
278
|
return inputs_statistics
|
|
279
279
|
|
|
280
280
|
|
|
281
|
-
def get_endpoint_record(
|
|
281
|
+
def get_endpoint_record(
|
|
282
|
+
project: str,
|
|
283
|
+
endpoint_id: str,
|
|
284
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
285
|
+
) -> dict[str, typing.Any]:
|
|
282
286
|
model_endpoint_store = mlrun.model_monitoring.get_store_object(
|
|
283
|
-
project=project,
|
|
287
|
+
project=project, secret_provider=secret_provider
|
|
284
288
|
)
|
|
285
289
|
return model_endpoint_store.get_model_endpoint(endpoint_id=endpoint_id)
|
|
286
290
|
|
|
@@ -66,10 +66,6 @@ class EventStreamProcessor:
|
|
|
66
66
|
self.parquet_batching_max_events = parquet_batching_max_events
|
|
67
67
|
self.parquet_batching_timeout_secs = parquet_batching_timeout_secs
|
|
68
68
|
|
|
69
|
-
self.model_endpoint_store_target = (
|
|
70
|
-
mlrun.mlconf.model_endpoint_monitoring.store_type
|
|
71
|
-
)
|
|
72
|
-
|
|
73
69
|
logger.info(
|
|
74
70
|
"Initializing model monitoring event stream processor",
|
|
75
71
|
parquet_path=self.parquet_path,
|
|
@@ -139,7 +135,7 @@ class EventStreamProcessor:
|
|
|
139
135
|
def apply_monitoring_serving_graph(
|
|
140
136
|
self,
|
|
141
137
|
fn: mlrun.runtimes.ServingRuntime,
|
|
142
|
-
|
|
138
|
+
secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
|
|
143
139
|
) -> None:
|
|
144
140
|
"""
|
|
145
141
|
Apply monitoring serving graph to a given serving function. The following serving graph includes about 4 main
|
|
@@ -167,7 +163,8 @@ class EventStreamProcessor:
|
|
|
167
163
|
using CE, the parquet target path is based on the defined MLRun artifact path.
|
|
168
164
|
|
|
169
165
|
:param fn: A serving function.
|
|
170
|
-
:param
|
|
166
|
+
:param secret_provider: An optional callable function that provides the connection string from the project
|
|
167
|
+
secret.
|
|
171
168
|
"""
|
|
172
169
|
|
|
173
170
|
graph = typing.cast(
|
|
@@ -293,7 +290,6 @@ class EventStreamProcessor:
|
|
|
293
290
|
name="UpdateEndpoint",
|
|
294
291
|
after="ProcessBeforeEndpointUpdate",
|
|
295
292
|
project=self.project,
|
|
296
|
-
model_endpoint_store_target=self.model_endpoint_store_target,
|
|
297
293
|
)
|
|
298
294
|
|
|
299
295
|
apply_update_endpoint()
|
|
@@ -310,7 +306,10 @@ class EventStreamProcessor:
|
|
|
310
306
|
table=self.kv_path,
|
|
311
307
|
)
|
|
312
308
|
|
|
313
|
-
|
|
309
|
+
store_object = mlrun.model_monitoring.get_store_object(
|
|
310
|
+
project=self.project, secret_provider=secret_provider
|
|
311
|
+
)
|
|
312
|
+
if store_object.type == ModelEndpointTarget.V3IO_NOSQL:
|
|
314
313
|
apply_infer_schema()
|
|
315
314
|
|
|
316
315
|
# Emits the event in window size of events based on sample_window size (10 by default)
|
|
@@ -328,7 +327,7 @@ class EventStreamProcessor:
|
|
|
328
327
|
# TSDB branch (skip to Prometheus if in CE env)
|
|
329
328
|
if not mlrun.mlconf.is_ce_mode():
|
|
330
329
|
tsdb_connector = mlrun.model_monitoring.get_tsdb_connector(
|
|
331
|
-
project=self.project, secret_provider=
|
|
330
|
+
project=self.project, secret_provider=secret_provider
|
|
332
331
|
)
|
|
333
332
|
tsdb_connector.apply_monitoring_stream_steps(graph=graph)
|
|
334
333
|
|
|
@@ -904,7 +903,7 @@ class MapFeatureNames(mlrun.feature_store.steps.MapClass):
|
|
|
904
903
|
|
|
905
904
|
|
|
906
905
|
class UpdateEndpoint(mlrun.feature_store.steps.MapClass):
|
|
907
|
-
def __init__(self, project: str,
|
|
906
|
+
def __init__(self, project: str, **kwargs):
|
|
908
907
|
"""
|
|
909
908
|
Update the model endpoint record in the DB. Note that the event at this point includes metadata and stats about
|
|
910
909
|
the average latency and the amount of predictions over time. This data will be used in the monitoring dashboards
|
|
@@ -914,7 +913,6 @@ class UpdateEndpoint(mlrun.feature_store.steps.MapClass):
|
|
|
914
913
|
"""
|
|
915
914
|
super().__init__(**kwargs)
|
|
916
915
|
self.project = project
|
|
917
|
-
self.model_endpoint_store_target = model_endpoint_store_target
|
|
918
916
|
|
|
919
917
|
def do(self, event: dict):
|
|
920
918
|
# Remove labels from the event
|
mlrun/model_monitoring/writer.py
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
-
from typing import Any, NewType
|
|
16
|
+
from typing import Any, Callable, NewType
|
|
17
17
|
|
|
18
18
|
import mlrun.common.model_monitoring
|
|
19
19
|
import mlrun.common.schemas
|
|
@@ -30,7 +30,7 @@ from mlrun.common.schemas.model_monitoring.constants import (
|
|
|
30
30
|
WriterEventKind,
|
|
31
31
|
)
|
|
32
32
|
from mlrun.common.schemas.notification import NotificationKind, NotificationSeverity
|
|
33
|
-
from mlrun.model_monitoring.helpers import
|
|
33
|
+
from mlrun.model_monitoring.helpers import get_result_instance_fqn
|
|
34
34
|
from mlrun.serving.utils import StepToDict
|
|
35
35
|
from mlrun.utils import logger
|
|
36
36
|
from mlrun.utils.notifications.notification_pusher import CustomNotificationPusher
|
|
@@ -102,7 +102,11 @@ class ModelMonitoringWriter(StepToDict):
|
|
|
102
102
|
|
|
103
103
|
kind = "monitoring_application_stream_pusher"
|
|
104
104
|
|
|
105
|
-
def __init__(
|
|
105
|
+
def __init__(
|
|
106
|
+
self,
|
|
107
|
+
project: str,
|
|
108
|
+
secret_provider: Callable = None,
|
|
109
|
+
) -> None:
|
|
106
110
|
self.project = project
|
|
107
111
|
self.name = project # required for the deployment process
|
|
108
112
|
|
|
@@ -111,10 +115,10 @@ class ModelMonitoringWriter(StepToDict):
|
|
|
111
115
|
)
|
|
112
116
|
|
|
113
117
|
self._app_result_store = mlrun.model_monitoring.get_store_object(
|
|
114
|
-
project=self.project
|
|
118
|
+
project=self.project, secret_provider=secret_provider
|
|
115
119
|
)
|
|
116
120
|
self._tsdb_connector = mlrun.model_monitoring.get_tsdb_connector(
|
|
117
|
-
project=self.project, secret_provider=
|
|
121
|
+
project=self.project, secret_provider=secret_provider
|
|
118
122
|
)
|
|
119
123
|
self._endpoints_records = {}
|
|
120
124
|
|
|
@@ -223,7 +227,7 @@ class ModelMonitoringWriter(StepToDict):
|
|
|
223
227
|
endpoint_id = event[WriterEvent.ENDPOINT_ID]
|
|
224
228
|
endpoint_record = self._endpoints_records.setdefault(
|
|
225
229
|
endpoint_id,
|
|
226
|
-
|
|
230
|
+
self._app_result_store.get_model_endpoint(endpoint_id=endpoint_id),
|
|
227
231
|
)
|
|
228
232
|
event_value = {
|
|
229
233
|
"app_name": event[WriterEvent.APPLICATION_NAME],
|
mlrun/package/__init__.py
CHANGED
|
@@ -12,19 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
|
|
16
|
-
MLRun package enables fully-automated experiment and pipeline tracking and reproducibility, and easy passing of
|
|
17
|
-
python objects between remote jobs, while not requiring any form of editing to the actual function original code.
|
|
18
|
-
Simply set the function code in a project and run it, MLRun takes care of the rest.
|
|
19
|
-
|
|
20
|
-
MLRun uses packagers: classes that perform 2 tasks:
|
|
21
|
-
|
|
22
|
-
#. **Parsing inputs** - automatically cast the runtime's inputs (user's input passed to the function via
|
|
23
|
-
the ``inputs`` parameter of the ``run`` method) to the relevant hinted type. (Does not require handling of data items.)
|
|
24
|
-
#. **Logging outputs** - automatically save, log, and upload the function's returned objects by the provided
|
|
25
|
-
log hints (user's input passed to the function via the ``returns`` parameter of the ``run`` method).
|
|
26
|
-
(Does not require handling of files and artifacts.)
|
|
27
|
-
"""
|
|
15
|
+
|
|
28
16
|
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
29
17
|
|
|
30
18
|
import functools
|
|
@@ -12,12 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
r"""
|
|
16
|
-
MLRun comes with the following list of modules, out of the box. All of the packagers listed here
|
|
17
|
-
use the implementation of :ref:`DefaultPackager <mlrun.package.packagers.default\_packager.DefaultPackager>` and are
|
|
18
|
-
available by default at the start of each run.
|
|
19
|
-
"""
|
|
20
|
-
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
21
15
|
|
|
16
|
+
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
22
17
|
from .default_packager import DefaultPackager
|
|
23
18
|
from .numpy_packagers import NumPySupportedFormat
|
mlrun/projects/project.py
CHANGED
|
@@ -2116,6 +2116,7 @@ class MlrunProject(ModelObj):
|
|
|
2116
2116
|
*,
|
|
2117
2117
|
deploy_histogram_data_drift_app: bool = True,
|
|
2118
2118
|
wait_for_deployment: bool = False,
|
|
2119
|
+
rebuild_images: bool = False,
|
|
2119
2120
|
) -> None:
|
|
2120
2121
|
"""
|
|
2121
2122
|
Deploy model monitoring application controller, writer and stream functions.
|
|
@@ -2135,6 +2136,7 @@ class MlrunProject(ModelObj):
|
|
|
2135
2136
|
:param wait_for_deployment: If true, return only after the deployment is done on the backend.
|
|
2136
2137
|
Otherwise, deploy the model monitoring infrastructure on the
|
|
2137
2138
|
background, including the histogram data drift app if selected.
|
|
2139
|
+
:param rebuild_images: If true, force rebuild of model monitoring infrastructure images.
|
|
2138
2140
|
"""
|
|
2139
2141
|
if default_controller_image != "mlrun/mlrun":
|
|
2140
2142
|
# TODO: Remove this in 1.9.0
|
|
@@ -2150,6 +2152,7 @@ class MlrunProject(ModelObj):
|
|
|
2150
2152
|
image=image,
|
|
2151
2153
|
base_period=base_period,
|
|
2152
2154
|
deploy_histogram_data_drift_app=deploy_histogram_data_drift_app,
|
|
2155
|
+
rebuild_images=rebuild_images,
|
|
2153
2156
|
)
|
|
2154
2157
|
|
|
2155
2158
|
if wait_for_deployment:
|
|
@@ -3192,7 +3195,8 @@ class MlrunProject(ModelObj):
|
|
|
3192
3195
|
tsdb_connection: Optional[str] = None,
|
|
3193
3196
|
):
|
|
3194
3197
|
"""Set the credentials that will be used by the project's model monitoring
|
|
3195
|
-
infrastructure functions.
|
|
3198
|
+
infrastructure functions. Important to note that you have to set the credentials before deploying any
|
|
3199
|
+
model monitoring or serving function.
|
|
3196
3200
|
|
|
3197
3201
|
:param access_key: Model Monitoring access key for managing user permissions
|
|
3198
3202
|
:param endpoint_store_connection: Endpoint store connection string
|
|
@@ -263,7 +263,6 @@ class ApplicationRuntime(RemoteRuntime):
|
|
|
263
263
|
is_kfp=False,
|
|
264
264
|
mlrun_version_specifier=None,
|
|
265
265
|
show_on_failure: bool = False,
|
|
266
|
-
skip_access_key_auth: bool = False,
|
|
267
266
|
direct_port_access: bool = False,
|
|
268
267
|
authentication_mode: schemas.APIGatewayAuthenticationMode = None,
|
|
269
268
|
authentication_creds: tuple[str] = None,
|
|
@@ -283,7 +282,6 @@ class ApplicationRuntime(RemoteRuntime):
|
|
|
283
282
|
:param is_kfp: Deploy as part of a kfp pipeline
|
|
284
283
|
:param mlrun_version_specifier: Which mlrun package version to include (if not current)
|
|
285
284
|
:param show_on_failure: Show logs only in case of build failure
|
|
286
|
-
:param skip_access_key_auth: Skip adding access key auth to the API Gateway
|
|
287
285
|
:param direct_port_access: Set True to allow direct port access to the application sidecar
|
|
288
286
|
:param authentication_mode: API Gateway authentication mode
|
|
289
287
|
:param authentication_creds: API Gateway authentication credentials as a tuple (username, password)
|
mlrun/runtimes/nuclio/serving.py
CHANGED
|
@@ -312,15 +312,18 @@ class ServingRuntime(RemoteRuntime):
|
|
|
312
312
|
sample: Optional[int] = None,
|
|
313
313
|
stream_args: Optional[dict] = None,
|
|
314
314
|
tracking_policy: Optional[Union["TrackingPolicy", dict]] = None,
|
|
315
|
+
enable_tracking: bool = True,
|
|
315
316
|
) -> None:
|
|
316
317
|
"""apply on your serving function to monitor a deployed model, including real-time dashboards to detect drift
|
|
317
318
|
and analyze performance.
|
|
318
319
|
|
|
319
|
-
:param stream_path:
|
|
320
|
-
|
|
321
|
-
:param batch:
|
|
322
|
-
:param sample:
|
|
323
|
-
:param stream_args:
|
|
320
|
+
:param stream_path: Path/url of the tracking stream e.g. v3io:///users/mike/mystream
|
|
321
|
+
you can use the "dummy://" path for test/simulation.
|
|
322
|
+
:param batch: Micro batch size (send micro batches of N records at a time).
|
|
323
|
+
:param sample: Sample size (send only one of N records).
|
|
324
|
+
:param stream_args: Stream initialization parameters, e.g. shards, retention_in_hours, ..
|
|
325
|
+
:param enable_tracking: Enabled/Disable model-monitoring tracking.
|
|
326
|
+
Default True (tracking enabled).
|
|
324
327
|
|
|
325
328
|
example::
|
|
326
329
|
|
|
@@ -331,7 +334,7 @@ class ServingRuntime(RemoteRuntime):
|
|
|
331
334
|
|
|
332
335
|
"""
|
|
333
336
|
# Applying model monitoring configurations
|
|
334
|
-
self.spec.track_models =
|
|
337
|
+
self.spec.track_models = enable_tracking
|
|
335
338
|
|
|
336
339
|
if stream_path:
|
|
337
340
|
self.spec.parameters["log_stream"] = stream_path
|
mlrun/serving/v2_serving.py
CHANGED
|
@@ -542,48 +542,64 @@ def _init_endpoint_record(
|
|
|
542
542
|
function_uri=graph_server.function_uri, versioned_model=versioned_model_name
|
|
543
543
|
).uid
|
|
544
544
|
|
|
545
|
-
# If model endpoint object was found in DB, skip the creation process.
|
|
546
545
|
try:
|
|
547
|
-
mlrun.get_run_db().get_model_endpoint(
|
|
548
|
-
|
|
546
|
+
model_ep = mlrun.get_run_db().get_model_endpoint(
|
|
547
|
+
project=project, endpoint_id=uid
|
|
548
|
+
)
|
|
549
549
|
except mlrun.errors.MLRunNotFoundError:
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
active=True,
|
|
566
|
-
monitoring_mode=mlrun.common.schemas.model_monitoring.ModelMonitoringMode.enabled
|
|
567
|
-
if model.context.server.track_models
|
|
568
|
-
else mlrun.common.schemas.model_monitoring.ModelMonitoringMode.disabled,
|
|
569
|
-
),
|
|
570
|
-
status=mlrun.common.schemas.ModelEndpointStatus(
|
|
571
|
-
endpoint_type=mlrun.common.schemas.model_monitoring.EndpointType.NODE_EP
|
|
550
|
+
model_ep = None
|
|
551
|
+
|
|
552
|
+
if model.context.server.track_models and not model_ep:
|
|
553
|
+
logger.debug("Creating a new model endpoint record", endpoint_id=uid)
|
|
554
|
+
model_endpoint = mlrun.common.schemas.ModelEndpoint(
|
|
555
|
+
metadata=mlrun.common.schemas.ModelEndpointMetadata(
|
|
556
|
+
project=project, labels=model.labels, uid=uid
|
|
557
|
+
),
|
|
558
|
+
spec=mlrun.common.schemas.ModelEndpointSpec(
|
|
559
|
+
function_uri=graph_server.function_uri,
|
|
560
|
+
model=versioned_model_name,
|
|
561
|
+
model_class=model.__class__.__name__,
|
|
562
|
+
model_uri=model.model_path,
|
|
563
|
+
stream_path=config.model_endpoint_monitoring.store_prefixes.default.format(
|
|
564
|
+
project=project, kind="stream"
|
|
572
565
|
),
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
model_endpoint=model_endpoint.dict(),
|
|
581
|
-
)
|
|
566
|
+
active=True,
|
|
567
|
+
monitoring_mode=mlrun.common.schemas.model_monitoring.ModelMonitoringMode.enabled,
|
|
568
|
+
),
|
|
569
|
+
status=mlrun.common.schemas.ModelEndpointStatus(
|
|
570
|
+
endpoint_type=mlrun.common.schemas.model_monitoring.EndpointType.NODE_EP
|
|
571
|
+
),
|
|
572
|
+
)
|
|
582
573
|
|
|
583
|
-
|
|
584
|
-
|
|
574
|
+
db = mlrun.get_run_db()
|
|
575
|
+
db.create_model_endpoint(
|
|
576
|
+
project=project,
|
|
577
|
+
endpoint_id=uid,
|
|
578
|
+
model_endpoint=model_endpoint.dict(),
|
|
579
|
+
)
|
|
585
580
|
|
|
586
|
-
|
|
587
|
-
|
|
581
|
+
elif (
|
|
582
|
+
model_ep
|
|
583
|
+
and (
|
|
584
|
+
model_ep.spec.monitoring_mode
|
|
585
|
+
== mlrun.common.schemas.model_monitoring.ModelMonitoringMode.enabled
|
|
586
|
+
)
|
|
587
|
+
!= model.context.server.track_models
|
|
588
|
+
):
|
|
589
|
+
monitoring_mode = (
|
|
590
|
+
mlrun.common.schemas.model_monitoring.ModelMonitoringMode.enabled
|
|
591
|
+
if model.context.server.track_models
|
|
592
|
+
else mlrun.common.schemas.model_monitoring.ModelMonitoringMode.disabled
|
|
593
|
+
)
|
|
594
|
+
db = mlrun.get_run_db()
|
|
595
|
+
db.patch_model_endpoint(
|
|
596
|
+
project=project,
|
|
597
|
+
endpoint_id=uid,
|
|
598
|
+
attributes={"monitoring_mode": monitoring_mode},
|
|
599
|
+
)
|
|
600
|
+
logger.debug(
|
|
601
|
+
f"Updating model endpoint monitoring_mode to {monitoring_mode}",
|
|
602
|
+
endpoint_id=uid,
|
|
603
|
+
)
|
|
588
604
|
|
|
589
605
|
return uid
|
|
@@ -69,16 +69,27 @@ class NotificationBase:
|
|
|
69
69
|
if custom_html:
|
|
70
70
|
return custom_html
|
|
71
71
|
|
|
72
|
-
if self.name:
|
|
73
|
-
message = f"{self.name}: {message}"
|
|
74
|
-
|
|
75
72
|
if alert:
|
|
76
73
|
if not event_data:
|
|
77
74
|
return f"[{severity}] {message}"
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
75
|
+
|
|
76
|
+
html = f"<h3>[{severity}] {message}</h3>"
|
|
77
|
+
html += f"<br>{alert.name} alert has occurred<br>"
|
|
78
|
+
html += f"<br><h4>Project:</h4>{alert.project}<br>"
|
|
79
|
+
html += f"<br><h4>ID:</h4>{event_data.entity.ids[0]}<br>"
|
|
80
|
+
html += f"<br><h4>Summary:</h4>{mlrun.utils.helpers.format_alert_summary(alert, event_data)}<br>"
|
|
81
|
+
|
|
82
|
+
if event_data.value_dict:
|
|
83
|
+
html += "<br><h4>Event data:</h4>"
|
|
84
|
+
for key, value in event_data.value_dict.items():
|
|
85
|
+
html += f"{key}: {value}<br>"
|
|
86
|
+
|
|
87
|
+
overview_type, url = self._get_overview_type_and_url(alert, event_data)
|
|
88
|
+
html += f"<br><h4>Overview:</h4><a href={url}>{overview_type}</a>"
|
|
89
|
+
return html
|
|
90
|
+
|
|
91
|
+
if self.name:
|
|
92
|
+
message = f"{self.name}: {message}"
|
|
82
93
|
|
|
83
94
|
if not runs:
|
|
84
95
|
return f"[{severity}] {message}"
|
|
@@ -90,3 +101,24 @@ class NotificationBase:
|
|
|
90
101
|
html += "<br>click the hyper links below to see detailed results<br>"
|
|
91
102
|
html += runs.show(display=False, short=True)
|
|
92
103
|
return html
|
|
104
|
+
|
|
105
|
+
def _get_overview_type_and_url(
|
|
106
|
+
self,
|
|
107
|
+
alert: mlrun.common.schemas.AlertConfig,
|
|
108
|
+
event_data: mlrun.common.schemas.Event,
|
|
109
|
+
) -> (str, str):
|
|
110
|
+
if (
|
|
111
|
+
event_data.entity.kind == mlrun.common.schemas.alert.EventEntityKind.JOB
|
|
112
|
+
): # JOB entity
|
|
113
|
+
uid = event_data.value_dict.get("uid")
|
|
114
|
+
url = mlrun.utils.helpers.get_ui_url(alert.project, uid)
|
|
115
|
+
overview_type = "Job overview"
|
|
116
|
+
else: # MODEL entity
|
|
117
|
+
model_name = event_data.value_dict.get("model")
|
|
118
|
+
model_endpoint_id = event_data.value_dict.get("model_endpoint_id")
|
|
119
|
+
url = mlrun.utils.helpers.get_model_endpoint_url(
|
|
120
|
+
alert.project, model_name, model_endpoint_id
|
|
121
|
+
)
|
|
122
|
+
overview_type = "Model endpoint"
|
|
123
|
+
|
|
124
|
+
return overview_type, url
|
|
@@ -153,20 +153,7 @@ class SlackNotification(NotificationBase):
|
|
|
153
153
|
data_text = "\n".join(data_lines)
|
|
154
154
|
line.append(self._get_slack_row(f"*Event data:*\n{data_text}"))
|
|
155
155
|
|
|
156
|
-
|
|
157
|
-
event_data.entity.kind == mlrun.common.schemas.alert.EventEntityKind.JOB
|
|
158
|
-
): # JOB entity
|
|
159
|
-
uid = event_data.value_dict.get("uid")
|
|
160
|
-
url = mlrun.utils.helpers.get_ui_url(alert.project, uid)
|
|
161
|
-
overview_type = "Job overview"
|
|
162
|
-
else: # MODEL entity
|
|
163
|
-
model_name = event_data.value_dict.get("model")
|
|
164
|
-
model_endpoint_id = event_data.value_dict.get("model_endpoint_id")
|
|
165
|
-
url = mlrun.utils.helpers.get_model_endpoint_url(
|
|
166
|
-
alert.project, model_name, model_endpoint_id
|
|
167
|
-
)
|
|
168
|
-
overview_type = "Model endpoint"
|
|
169
|
-
|
|
156
|
+
overview_type, url = self._get_overview_type_and_url(alert, event_data)
|
|
170
157
|
line.append(self._get_slack_row(f"*Overview:*\n<{url}|*{overview_type}*>"))
|
|
171
158
|
|
|
172
159
|
return line
|
mlrun/utils/version/version.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
mlrun/__init__.py,sha256=y08M1JcKXy5-9_5WaI9fn5aV5BxIQ5QkbduJK0OxWbA,7470
|
|
2
2
|
mlrun/__main__.py,sha256=F65N1MUdAn5hO4qFuJ1v5M3XSCLHUKv7C010toZd-P4,45852
|
|
3
3
|
mlrun/config.py,sha256=sG_gjNcQ8UPoa9-nTfeT2UMLcZhbezcojs4RMHN4Xvk,65499
|
|
4
|
-
mlrun/errors.py,sha256=
|
|
4
|
+
mlrun/errors.py,sha256=Y26Czt93m5HCSPd6CyrHFiWO4R7spiTrOnk4FqaUUxE,7345
|
|
5
5
|
mlrun/execution.py,sha256=ZSk61dXqnEmxnUYxaAjtSzobMlD1yF9VaW56KLmaiUs,41717
|
|
6
6
|
mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
|
|
7
7
|
mlrun/k8s_utils.py,sha256=WdUajadvAhTR7sAMQdwFqKeJMimuTyqm02VdwK1A4xU,7023
|
|
@@ -35,7 +35,7 @@ mlrun/common/formatters/project.py,sha256=rdGf7fq_CfwFwd8iKWl8sW-tqTJilK3gJtV5oL
|
|
|
35
35
|
mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
|
|
36
36
|
mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
|
|
37
37
|
mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
|
|
38
|
-
mlrun/common/schemas/__init__.py,sha256=
|
|
38
|
+
mlrun/common/schemas/__init__.py,sha256=Vg3S4JKA41y43S4nxCYfGOkpAw86sC9tn6BsD5qe_s4,5178
|
|
39
39
|
mlrun/common/schemas/alert.py,sha256=yzXcmrhW8EHb-NxArVSlH0pRPrBLyqpMCTgMCDz4ExM,6644
|
|
40
40
|
mlrun/common/schemas/api_gateway.py,sha256=CEvDsGHRH9okB52HeGx5HJXYxnDzPta1atwNECJq8NM,4797
|
|
41
41
|
mlrun/common/schemas/artifact.py,sha256=hlKBK3L1Rg4Hv2XSu3u_gxdrsm0NbsaPjIS9cE_Equ4,3247
|
|
@@ -47,7 +47,7 @@ mlrun/common/schemas/common.py,sha256=00upzVLPN7O511Q87yt-fvRcDQFbXra4j0_lqMGg6r
|
|
|
47
47
|
mlrun/common/schemas/constants.py,sha256=UnnhyLeF-SSjy8KaV5a-TBw4Ws675gueYGiP1fr5NfU,6476
|
|
48
48
|
mlrun/common/schemas/datastore_profile.py,sha256=hJ8q54A8VZKsnOvSIjcllj4MZ1bBhb_EmBgsqpwSF_Y,750
|
|
49
49
|
mlrun/common/schemas/events.py,sha256=ROHJLo_fqYjc96pek7yhAUPpPRIuAR76lwxvNz8LIr8,1026
|
|
50
|
-
mlrun/common/schemas/feature_store.py,sha256=
|
|
50
|
+
mlrun/common/schemas/feature_store.py,sha256=Y_83p3tQmlIj-GiymkDbm056I9DHeocSqL_kO7TXza8,5189
|
|
51
51
|
mlrun/common/schemas/frontend_spec.py,sha256=CNPq3YV0U1jCbCMbb84_Oid2Snow5EXYt1F5wsuhgD8,2454
|
|
52
52
|
mlrun/common/schemas/function.py,sha256=Khd5Jd6ept1nHWkW1WdIy1u8iK4O8_Ddf3a7cv3Hf1I,4652
|
|
53
53
|
mlrun/common/schemas/http.py,sha256=1PtYFhF6sqLSBRcuPMtYcUGmroBhaleqLmYidSdL9LM,705
|
|
@@ -100,10 +100,10 @@ mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev
|
|
|
100
100
|
mlrun/datastore/wasbfs/fs.py,sha256=MnSj7Q4OKA2L55ihCmUnj2t3GA3B77oLMdAw-yxvN9w,6151
|
|
101
101
|
mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
|
|
102
102
|
mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
|
|
103
|
-
mlrun/db/base.py,sha256=
|
|
103
|
+
mlrun/db/base.py,sha256=g1x5cIxuLjHocmVIsbMmUgDseS0nNfitl_aN9wixH4M,22404
|
|
104
104
|
mlrun/db/factory.py,sha256=ibIrE5QkIIyzDU1FXKrfbc31cZiRLYKDZb8dqCpQwyU,2397
|
|
105
|
-
mlrun/db/httpdb.py,sha256=
|
|
106
|
-
mlrun/db/nopdb.py,sha256=
|
|
105
|
+
mlrun/db/httpdb.py,sha256=52rjQ0e0MnZHEegwcmwjsCm9vx7dbMNcMlckwB1YWWQ,179816
|
|
106
|
+
mlrun/db/nopdb.py,sha256=fO34H7vxiy2tmSu37EQ8lxm6OW_yz8AwUEtTJjANblo,19676
|
|
107
107
|
mlrun/feature_store/__init__.py,sha256=FhHRc8NdqL_HWpCs7A8dKruxJS5wEm55Gs3dcgBiRUg,1522
|
|
108
108
|
mlrun/feature_store/api.py,sha256=uYheyPkJOVCrz1jivvpGatgy_JBAq0It0XZqPpNVQkE,48699
|
|
109
109
|
mlrun/feature_store/common.py,sha256=DKmoRk04NCS1gv7qZuEUa2-g8WsfR6IWjYctcrqKVlg,12853
|
|
@@ -119,7 +119,7 @@ mlrun/feature_store/retrieval/job.py,sha256=vm50yAqvaazuTGbCOgN_e1Ax8gh-d-qQN4Eb
|
|
|
119
119
|
mlrun/feature_store/retrieval/local_merger.py,sha256=jM-8ta44PeNUc1cKMPs-TxrO9t8pXbwu_Tw8MZrLxUY,4513
|
|
120
120
|
mlrun/feature_store/retrieval/spark_merger.py,sha256=I2KKEqSwao1AX1l6QqKRaXExUiry4P4ox-Vpc4AUNCg,11659
|
|
121
121
|
mlrun/feature_store/retrieval/storey_merger.py,sha256=5YM0UPrLjGOobulHkowRO-1LuvFD2cm_0GxcpnTdu0I,6314
|
|
122
|
-
mlrun/frameworks/__init__.py,sha256=
|
|
122
|
+
mlrun/frameworks/__init__.py,sha256=qRHe_nUfxpoLaSASAkIxcW6IyunMtxq5LXhjzZMO_1E,743
|
|
123
123
|
mlrun/frameworks/parallel_coordinates.py,sha256=AJ3TuvffAC4_zN-RVcyTkq1T3lomDqgeNf7hVBmscEw,11517
|
|
124
124
|
mlrun/frameworks/_common/__init__.py,sha256=7afutDCDVp999gyWSWQZMJRKGuW3VP3MFil8cobRsyg,962
|
|
125
125
|
mlrun/frameworks/_common/artifacts_library.py,sha256=f0rtDRQI3BYT2ZvXR4drSXZPYPJG19Sbej-_ru-i0II,8497
|
|
@@ -216,12 +216,12 @@ mlrun/model_monitoring/controller.py,sha256=MQ4BF3vfJSyYZv6HuTuSLt_nqaflgBYyOSwC
|
|
|
216
216
|
mlrun/model_monitoring/controller_handler.py,sha256=J9Y9ppLsQaxyYRl21165Rr7QuI9EM-mk-5veAqs4Bi0,1336
|
|
217
217
|
mlrun/model_monitoring/evidently_application.py,sha256=iOc42IVjj8m6PDBmVcKIMWm46Bu0EdO9SDcH40Eqhyo,769
|
|
218
218
|
mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
|
|
219
|
-
mlrun/model_monitoring/helpers.py,sha256=
|
|
219
|
+
mlrun/model_monitoring/helpers.py,sha256=RHelVFMoUPm9-KqOwF018ctZT0kHVQfipnigeK1k-uA,11645
|
|
220
220
|
mlrun/model_monitoring/model_endpoint.py,sha256=7VX0cBATqLsA4sSinDzouf41ndxqh2mf5bO9BW0G5Z4,4017
|
|
221
221
|
mlrun/model_monitoring/prometheus.py,sha256=cUR4y73GutJB_pA_VCBDl9YtK4PcIJp2wj2rnLVmYi4,7578
|
|
222
|
-
mlrun/model_monitoring/stream_processing.py,sha256=
|
|
222
|
+
mlrun/model_monitoring/stream_processing.py,sha256=JRZP8raWUqG47z0yqES6LzHSEFYS5wcDxNXuJeFgjSA,42336
|
|
223
223
|
mlrun/model_monitoring/tracking_policy.py,sha256=sQq956akAQpntkrJwIgFWcEq-JpyVcg0FxgNa4h3V70,5502
|
|
224
|
-
mlrun/model_monitoring/writer.py,sha256=
|
|
224
|
+
mlrun/model_monitoring/writer.py,sha256=FJYkM_phr8mmiEcHHn0Qz-DCAYNCPw3IZiGEmO2IP4U,10068
|
|
225
225
|
mlrun/model_monitoring/applications/__init__.py,sha256=i793GqYee01mRh_KD6GShvX7UbPBgdJDO4qf9Z3BXEQ,970
|
|
226
226
|
mlrun/model_monitoring/applications/_application_steps.py,sha256=-g9jxIAFM5f22iJaUAQVlM8QRSv6KFT92I4WHmZe_f0,6028
|
|
227
227
|
mlrun/model_monitoring/applications/base.py,sha256=buVKyghH4AB3chZ5py1vyMIFnTF-deY8YDf_fPC9BnQ,11307
|
|
@@ -230,19 +230,19 @@ mlrun/model_monitoring/applications/evidently_base.py,sha256=AE_eIz-GEYm3AZTrMCi
|
|
|
230
230
|
mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=HZmNg09SCjAKkIlKmJwqR7hr-8sXrwFEqXgJCitVbXc,13039
|
|
231
231
|
mlrun/model_monitoring/applications/results.py,sha256=VVlu9Si7Tj2LNJzPQrp4_Qeyh9mxOVMu1Jwb5K2LfvY,3577
|
|
232
232
|
mlrun/model_monitoring/db/__init__.py,sha256=6Ic-X3Fh9XLPYMytmevGNSs-Hii1rAjLLoFTSPwTguw,736
|
|
233
|
-
mlrun/model_monitoring/db/stores/__init__.py,sha256=
|
|
233
|
+
mlrun/model_monitoring/db/stores/__init__.py,sha256=8lCEvKBJsOa2DPiqw4Y9D___nkfYM8T_-OuD5AAlKa4,4144
|
|
234
234
|
mlrun/model_monitoring/db/stores/base/__init__.py,sha256=JufJETW3BXzPhFwbRa8dMf7BFGGZKceIWIMgr5x9n9c,599
|
|
235
|
-
mlrun/model_monitoring/db/stores/base/store.py,sha256=
|
|
235
|
+
mlrun/model_monitoring/db/stores/base/store.py,sha256=x4hv2agOz3Ru2oL7PtuX6vV1IP-jWjP9VvlOMFrUIxk,5889
|
|
236
236
|
mlrun/model_monitoring/db/stores/sqldb/__init__.py,sha256=6CsTXAxeLbbf8yfCADTaxmiavqwrLEdYFJ-qc5kgDAY,569
|
|
237
|
-
mlrun/model_monitoring/db/stores/sqldb/sql_store.py,sha256=
|
|
237
|
+
mlrun/model_monitoring/db/stores/sqldb/sql_store.py,sha256=j_IGyaOApwJHiTTpXe4a0Og6anTesmBkDX90IPX8boM,27523
|
|
238
238
|
mlrun/model_monitoring/db/stores/sqldb/models/__init__.py,sha256=lCiGw9WKPtHAIgrtNS2jyvM5OZvZvogBh76iurNYblg,2453
|
|
239
239
|
mlrun/model_monitoring/db/stores/sqldb/models/base.py,sha256=YKRWgWvi8yyzXvratpePqSZ3ZVjgfZ6Q_QhgaLUnAsE,5215
|
|
240
240
|
mlrun/model_monitoring/db/stores/sqldb/models/mysql.py,sha256=86D1WX016u6TQdxhNDtlGn3QvJJHOQrXiw1hcSMq0Ao,2570
|
|
241
241
|
mlrun/model_monitoring/db/stores/sqldb/models/sqlite.py,sha256=yJJZppbKj3PsOANS_DXAQFFHKX4cQcm6Pz2DoxRiXMk,1104
|
|
242
242
|
mlrun/model_monitoring/db/stores/v3io_kv/__init__.py,sha256=6CsTXAxeLbbf8yfCADTaxmiavqwrLEdYFJ-qc5kgDAY,569
|
|
243
|
-
mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py,sha256=
|
|
244
|
-
mlrun/model_monitoring/db/tsdb/__init__.py,sha256=
|
|
245
|
-
mlrun/model_monitoring/db/tsdb/base.py,sha256=
|
|
243
|
+
mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py,sha256=Ijm5W_P3C66inT4Y0jZ43mqKLS2TS2slbUMAM3eCTac,27230
|
|
244
|
+
mlrun/model_monitoring/db/tsdb/__init__.py,sha256=0Da4WhlseFRTeUmfss_95DOsP2ijBaEtu4WxIWd5bsA,3736
|
|
245
|
+
mlrun/model_monitoring/db/tsdb/base.py,sha256=sESs5U71a-iJKI-999sAloYH-mjOR3uSEQG7BxRs6No,13134
|
|
246
246
|
mlrun/model_monitoring/db/tsdb/helpers.py,sha256=0oUXc4aUkYtP2SGP6jTb3uPPKImIUsVsrb9otX9a7O4,1189
|
|
247
247
|
mlrun/model_monitoring/db/tsdb/tdengine/__init__.py,sha256=vgBdsKaXUURKqIf3M0y4sRatmSVA4CQiJs7J5dcVBkQ,620
|
|
248
248
|
mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=94u886UtyK40YNtdOX8WiJUImDytygdaqIzFwo_ExzI,8881
|
|
@@ -250,15 +250,15 @@ mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py,sha256=x1cWM2ystgh
|
|
|
250
250
|
mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=oplt9s-C-OGa__V456nkHwvyBe5YHxcuIJcYV9GFQHY,15521
|
|
251
251
|
mlrun/model_monitoring/db/tsdb/v3io/__init__.py,sha256=aL3bfmQsUQ-sbvKGdNihFj8gLCK3mSys0qDcXtYOwgc,616
|
|
252
252
|
mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py,sha256=qbiyBzrdWLJAKLmJV4K8jUxsAMbKGZ1vip7WNfRcpXM,4764
|
|
253
|
-
mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py,sha256=
|
|
253
|
+
mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py,sha256=nlINlf-nHpUWzYnCyFVdYyPtGQUmImu2_ocve9ubt4o,26187
|
|
254
254
|
mlrun/model_monitoring/metrics/__init__.py,sha256=6CsTXAxeLbbf8yfCADTaxmiavqwrLEdYFJ-qc5kgDAY,569
|
|
255
255
|
mlrun/model_monitoring/metrics/histogram_distance.py,sha256=E9_WIl2vd6qNvoHVHoFcnuQk3ekbFWOdi8aU7sHrfk4,4724
|
|
256
|
-
mlrun/package/__init__.py,sha256=
|
|
256
|
+
mlrun/package/__init__.py,sha256=uWILzN42bcq5vFRk6ptxEmn1I5uBWAnhaJr7e4H834w,7082
|
|
257
257
|
mlrun/package/context_handler.py,sha256=Z8v7cXAZXa5l3Tgg6IiEVm74Qbp5cOxx30jvkAY3dwo,14589
|
|
258
258
|
mlrun/package/errors.py,sha256=LKF8SSaRIdbkB7JQz6b9U4mZV42Ebnf6ZHu4wKuWqK4,1204
|
|
259
259
|
mlrun/package/packager.py,sha256=xE7U1njB2RXhmiA0kCSmA4i5j84Dd7Bt-H4Fk5OcVLk,15064
|
|
260
260
|
mlrun/package/packagers_manager.py,sha256=g4XuqpKJGrGKYrA38FXZd9gquDv8KUcW1eXA-DesaMA,37161
|
|
261
|
-
mlrun/package/packagers/__init__.py,sha256=
|
|
261
|
+
mlrun/package/packagers/__init__.py,sha256=rpxpuATMoxCMgHDaVamm0uwocy71e0CSXm85Q5X9tkU,769
|
|
262
262
|
mlrun/package/packagers/default_packager.py,sha256=QaZyxm03fRTJy5OGBeyVvSpEqnWj3-hSQVbsCjlTpLM,26625
|
|
263
263
|
mlrun/package/packagers/numpy_packagers.py,sha256=k7Vke41LOp1ExbXCKf4FyahBIDlBqSiYrGPMeH0yI7M,25602
|
|
264
264
|
mlrun/package/packagers/pandas_packagers.py,sha256=KPOZj1yiHxV2b1iah4hlwoNQP4JKzt95Fe9Tn9OUPs8,35761
|
|
@@ -275,7 +275,7 @@ mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13
|
|
|
275
275
|
mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
|
|
276
276
|
mlrun/projects/operations.py,sha256=NEN4PmSvLO9QMwSG4TncmBgTKC9wJp7hGo5lA7OYN_Q,19199
|
|
277
277
|
mlrun/projects/pipelines.py,sha256=c9HhMtXk-6kmTCiY-f0Cmd3GWgL_fBFE6HXp2lrhRtE,40009
|
|
278
|
-
mlrun/projects/project.py,sha256=
|
|
278
|
+
mlrun/projects/project.py,sha256=cG8yEmViov3c6pqM0K3l8Bbs4GDMVD8X_aKw3S0Jy9k,181672
|
|
279
279
|
mlrun/runtimes/__init__.py,sha256=0-tYDkew-Cr4DM-wztvMbzDA5xq385Jjo-GrtO_84Sc,8741
|
|
280
280
|
mlrun/runtimes/base.py,sha256=SvaKfWtAKFhrX2RW7wy3B76OUAg9XdTDaJPpbCEhsdY,37323
|
|
281
281
|
mlrun/runtimes/daskjob.py,sha256=_3jQIEroNxG587ZJ0cW5nVJVBb1IcOECor_bkgZHtMk,19194
|
|
@@ -298,9 +298,9 @@ mlrun/runtimes/nuclio/__init__.py,sha256=gx1kizzKv8pGT5TNloN1js1hdbxqDw3rM90sLVY
|
|
|
298
298
|
mlrun/runtimes/nuclio/api_gateway.py,sha256=_tkqyH63cyIVcjZEiSP--bh_mOAOGGclYY7wyQ5q_JA,24683
|
|
299
299
|
mlrun/runtimes/nuclio/function.py,sha256=dZoWA4VX4izKcAP3_3F14WcICwtVYuhD3d0u3Qdu9Tg,49408
|
|
300
300
|
mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
|
|
301
|
-
mlrun/runtimes/nuclio/serving.py,sha256=
|
|
301
|
+
mlrun/runtimes/nuclio/serving.py,sha256=ucSDp2YbaKEFpuCxCTEPwOEPngPkuP-TRviHJ9J4D60,29866
|
|
302
302
|
mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
|
|
303
|
-
mlrun/runtimes/nuclio/application/application.py,sha256=
|
|
303
|
+
mlrun/runtimes/nuclio/application/application.py,sha256=8VVKKUeviZPpC_j3WBm_oiJQis4TkmxZGnWfsHGlXR8,19062
|
|
304
304
|
mlrun/runtimes/nuclio/application/reverse_proxy.go,sha256=JIIYae6bXzCLf3jXuu49KWPQYoXr_FDQ2Rbo1OWKAd0,3150
|
|
305
305
|
mlrun/runtimes/sparkjob/__init__.py,sha256=_KPvk0qefeLtHO6lxQE_AMOGiMTG_OT48eRCE4Z2ldw,709
|
|
306
306
|
mlrun/runtimes/sparkjob/spark3job.py,sha256=1bNRy72Migrh_ZASQOx7UlSZTbB-xpNc76sz4kfc9UM,41191
|
|
@@ -313,7 +313,7 @@ mlrun/serving/serving_wrapper.py,sha256=R670-S6PX_d5ER6jiHtRvacuPyFzQH0mEf2K0sBI
|
|
|
313
313
|
mlrun/serving/states.py,sha256=n3RPtzwqfQB1o4H80AoVsP5exL3L3i39ONs-CorWGyM,58539
|
|
314
314
|
mlrun/serving/utils.py,sha256=lej7XcUPX1MmHkEOi_0KZRGSpfbmpnE0GK_Sn4zLkHY,4025
|
|
315
315
|
mlrun/serving/v1_serving.py,sha256=by4myxlnwyZ0ijQ5fURilGCK1sUpdQL2Il1VR3Xqpxg,11805
|
|
316
|
-
mlrun/serving/v2_serving.py,sha256=
|
|
316
|
+
mlrun/serving/v2_serving.py,sha256=wJmDZc-YEof0vXmYHM5t8aKSaWuzUbjVtWYuVyl1hPg,24226
|
|
317
317
|
mlrun/track/__init__.py,sha256=LWRUHJt8JyFW17FyNPOVyWd-NXTf1iptzsK9KFj5fuY,765
|
|
318
318
|
mlrun/track/tracker.py,sha256=hSi9sMxB7hhZalt6Q8GXDnK4UoCbXHzKTrpUPC9hZv4,3555
|
|
319
319
|
mlrun/track/tracker_manager.py,sha256=IYBl99I62IC6VCCmG1yt6JoHNOQXa53C4DURJ2sWgio,5726
|
|
@@ -336,18 +336,18 @@ mlrun/utils/vault.py,sha256=xUiKL17dCXjwQJ33YRzQj0oadUXATlFWPzKKYAESoQk,10447
|
|
|
336
336
|
mlrun/utils/notifications/__init__.py,sha256=eUzQDBxSQmMZASRY-YAnYS6tL5801P0wEjycp3Dvoe0,990
|
|
337
337
|
mlrun/utils/notifications/notification_pusher.py,sha256=v-bB05rkDW04f52Wsh_1-UD77M2FNFukmQO9wglVIRg,26918
|
|
338
338
|
mlrun/utils/notifications/notification/__init__.py,sha256=2in3F2q8gtYDiDoQ4i9BIIE2I06OokT2EW49vs2krRA,2168
|
|
339
|
-
mlrun/utils/notifications/notification/base.py,sha256=
|
|
339
|
+
mlrun/utils/notifications/notification/base.py,sha256=Bv6tUEFlF27SdkzFr1aY9a0gYX7tIbxsHbI7vOSqTsU,4196
|
|
340
340
|
mlrun/utils/notifications/notification/console.py,sha256=MAVk7v5PJ52vdGRv76YcEPixWgV0licBPWGpR01uR40,2643
|
|
341
341
|
mlrun/utils/notifications/notification/git.py,sha256=ELZ-ZmbFDb39A0OUIhtvuSbqJoVfF_o_IOxMD5eBlv4,5351
|
|
342
342
|
mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT1U41IYwyytovv5X_LsI4,2066
|
|
343
|
-
mlrun/utils/notifications/notification/slack.py,sha256=
|
|
343
|
+
mlrun/utils/notifications/notification/slack.py,sha256=EXhIDyhFkwCSzq8trX3TqGHh5ppFKzMxItxM0s0-ukM,6728
|
|
344
344
|
mlrun/utils/notifications/notification/webhook.py,sha256=WgfxX1cpm8n2A-O08pwnsP4tzbxxv_vNUSnyXG4uKts,2752
|
|
345
345
|
mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
|
|
346
|
-
mlrun/utils/version/version.json,sha256=
|
|
346
|
+
mlrun/utils/version/version.json,sha256=0D0ZRgXjQ9n0Ol6wTHUIJk9ckFYse84wtjP_dbJwvTQ,89
|
|
347
347
|
mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
|
|
348
|
-
mlrun-1.7.
|
|
349
|
-
mlrun-1.7.
|
|
350
|
-
mlrun-1.7.
|
|
351
|
-
mlrun-1.7.
|
|
352
|
-
mlrun-1.7.
|
|
353
|
-
mlrun-1.7.
|
|
348
|
+
mlrun-1.7.0rc23.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
349
|
+
mlrun-1.7.0rc23.dist-info/METADATA,sha256=ZABqKbSkVYEvJvZ8jSwhecmgFxaROzUntGRUUov5zbc,19237
|
|
350
|
+
mlrun-1.7.0rc23.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
351
|
+
mlrun-1.7.0rc23.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
|
|
352
|
+
mlrun-1.7.0rc23.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
|
|
353
|
+
mlrun-1.7.0rc23.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|