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.

Files changed (32) hide show
  1. mlrun/common/schemas/__init__.py +2 -0
  2. mlrun/common/schemas/feature_store.py +78 -28
  3. mlrun/db/base.py +1 -0
  4. mlrun/db/httpdb.py +9 -6
  5. mlrun/db/nopdb.py +1 -0
  6. mlrun/errors.py +1 -3
  7. mlrun/frameworks/__init__.py +0 -6
  8. mlrun/model_monitoring/db/stores/__init__.py +27 -21
  9. mlrun/model_monitoring/db/stores/base/store.py +1 -0
  10. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +8 -8
  11. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +8 -8
  12. mlrun/model_monitoring/db/tsdb/__init__.py +1 -1
  13. mlrun/model_monitoring/db/tsdb/base.py +1 -1
  14. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +2 -3
  15. mlrun/model_monitoring/helpers.py +8 -4
  16. mlrun/model_monitoring/stream_processing.py +9 -11
  17. mlrun/model_monitoring/writer.py +10 -6
  18. mlrun/package/__init__.py +1 -13
  19. mlrun/package/packagers/__init__.py +1 -6
  20. mlrun/projects/project.py +5 -1
  21. mlrun/runtimes/nuclio/application/application.py +0 -2
  22. mlrun/runtimes/nuclio/serving.py +9 -6
  23. mlrun/serving/v2_serving.py +54 -38
  24. mlrun/utils/notifications/notification/base.py +39 -7
  25. mlrun/utils/notifications/notification/slack.py +1 -14
  26. mlrun/utils/version/version.json +2 -2
  27. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/METADATA +1 -1
  28. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/RECORD +32 -32
  29. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/LICENSE +0 -0
  30. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/WHEEL +0 -0
  31. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/entry_points.txt +0 -0
  32. {mlrun-1.7.0rc22.dist-info → mlrun-1.7.0rc23.dist-info}/top_level.txt +0 -0
@@ -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
- from pydantic import BaseModel, Extra, Field
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 Feature(BaseModel):
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 Entity(BaseModel):
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(BaseModel):
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(BaseModel):
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(BaseModel):
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(BaseModel):
121
+ class FeatureSetsOutput(FeatureStoreBaseModel):
92
122
  feature_sets: list[FeatureSet]
93
123
 
94
124
 
95
- class FeatureSetsTagsOutput(BaseModel):
125
+ class FeatureSetsTagsOutput(FeatureStoreBaseModel):
96
126
  tags: list[str] = []
97
127
 
98
128
 
99
- class FeatureSetDigestSpec(BaseModel):
129
+ class FeatureSetDigestSpec(FeatureStoreBaseModel):
100
130
  entities: list[Entity]
101
131
  features: list[Feature]
102
132
 
103
133
 
104
- class FeatureSetDigestOutput(BaseModel):
134
+ class FeatureSetDigestOutput(FeatureStoreBaseModel):
105
135
  metadata: ObjectMetadata
106
136
  spec: FeatureSetDigestSpec
107
137
 
108
138
 
109
- class FeatureListOutput(BaseModel):
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(BaseModel):
154
+ class FeaturesOutput(FeatureStoreBaseModel):
115
155
  features: list[FeatureListOutput]
116
156
 
117
157
 
118
- class EntityListOutput(BaseModel):
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 EntitiesOutput(BaseModel):
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(BaseModel):
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(BaseModel):
192
+ class FeatureVectorsOutput(FeatureStoreBaseModel):
143
193
  feature_vectors: list[FeatureVector]
144
194
 
145
195
 
146
- class FeatureVectorsTagsOutput(BaseModel):
196
+ class FeatureVectorsTagsOutput(FeatureStoreBaseModel):
147
197
  tags: list[str] = []
148
198
 
149
199
 
150
- class DataSource(BaseModel):
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(BaseModel):
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(BaseModel):
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(BaseModel):
225
+ class FeatureSetIngestOutput(FeatureStoreBaseModel):
176
226
  feature_set: FeatureSet
177
227
  run_object: dict
mlrun/db/base.py CHANGED
@@ -838,6 +838,7 @@ class RunDBInterface(ABC):
838
838
  base_period: int = 10,
839
839
  image: str = "mlrun/mlrun",
840
840
  deploy_histogram_data_drift_app: bool = True,
841
+ rebuild_images: bool = False,
841
842
  ) -> None:
842
843
  pass
843
844
 
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: Project name.
3333
- :param base_period: The time period in minutes in which the model monitoring controller function
3334
- triggers. By default, the base period is 10 minutes.
3335
- :param image: The image of the model monitoring controller, writer & monitoring
3336
- stream functions, which are real time nuclio functions.
3337
- By default, the image is mlrun/mlrun.
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
@@ -675,6 +675,7 @@ class NopDB(RunDBInterface):
675
675
  base_period: int = 10,
676
676
  image: str = "mlrun/mlrun",
677
677
  deploy_histogram_data_drift_app: bool = True,
678
+ rebuild_images: bool = False,
678
679
  ) -> None:
679
680
  pass
680
681
 
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")
@@ -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
- access_key: str = None,
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
- # Get V3IO access key from env
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
- secret_provider=secret_provider,
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
- access_key: str = None,
99
- secret_provider: typing.Callable = None,
90
+ secret_provider: typing.Optional[typing.Callable[[str], str]] = None,
91
+ **kwargs,
100
92
  ) -> StoreBase:
101
93
  """
102
- Getting the DB target type based on mlrun.config.model_endpoint_monitoring.store_type.
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 on the
109
- model monitoring record such as write, update, get and delete a model endpoint.
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
- store_type = ObjectStoreFactory(mlrun.mlconf.model_endpoint_monitoring.store_type)
119
+ store_type_fact = ObjectStoreFactory(store_type)
114
120
 
115
121
  # Convert into store target object
116
- return store_type.to_object_store(
117
- project=project, access_key=access_key, secret_provider=secret_provider
122
+ return store_type_fact.to_object_store(
123
+ project=project, secret_provider=secret_provider, **kwargs
118
124
  )
@@ -19,6 +19,7 @@ import mlrun.common.schemas.model_monitoring as mm_schemas
19
19
 
20
20
 
21
21
  class StoreBase(ABC):
22
+ type: typing.ClassVar[str]
22
23
  """
23
24
  An abstract class to handle the store object in the DB target.
24
25
  """
@@ -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(mlrun.model_monitoring.db.StoreBase):
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
- secret_provider: typing.Callable = None,
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
- self._sql_connection_string = (
59
- mlrun.model_monitoring.helpers.get_connection_string(
60
- secret_provider=secret_provider
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(mlrun.model_monitoring.db.StoreBase):
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__(self, project: str, access_key: typing.Optional[str] = None) -> None:
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, access_key=self.access_key
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
  """
@@ -25,7 +25,7 @@ from mlrun.utils import logger
25
25
 
26
26
 
27
27
  class TSDBConnector(ABC):
28
- type: str = ""
28
+ type: typing.ClassVar[str]
29
29
 
30
30
  def __init__(self, project: str):
31
31
  """
@@ -418,9 +418,8 @@ class V3IOTSDBConnector(TSDBConnector):
418
418
  f"Available tables: {list(self.tables.keys())}"
419
419
  )
420
420
 
421
- if agg_funcs:
422
- # Frames client expects the aggregators to be a comma-separated string
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(project: str, endpoint_id: str):
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
- tsdb_service_provider: typing.Optional[typing.Callable] = None,
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 tsdb_service_provider: An optional callable function that provides the TSDB connection string.
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
- if self.model_endpoint_store_target == ModelEndpointTarget.V3IO_NOSQL:
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=tsdb_service_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, model_endpoint_store_target: str, **kwargs):
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
@@ -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 get_endpoint_record, get_result_instance_fqn
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__(self, project: str, tsdb_secret_provider=None) -> None:
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=tsdb_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
- get_endpoint_record(project=self.project, endpoint_id=endpoint_id),
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)
@@ -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: Path/url of the tracking stream e.g. v3io:///users/mike/mystream
320
- you can use the "dummy://" path for test/simulation.
321
- :param batch: Micro batch size (send micro batches of N records at a time).
322
- :param sample: Sample size (send only one of N records).
323
- :param stream_args: Stream initialization parameters, e.g. shards, retention_in_hours, ..
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 = True
337
+ self.spec.track_models = enable_tracking
335
338
 
336
339
  if stream_path:
337
340
  self.spec.parameters["log_stream"] = stream_path
@@ -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(project=project, endpoint_id=uid)
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
- logger.info("Creating a new model endpoint record", endpoint_id=uid)
551
-
552
- try:
553
- model_endpoint = mlrun.common.schemas.ModelEndpoint(
554
- metadata=mlrun.common.schemas.ModelEndpointMetadata(
555
- project=project, labels=model.labels, uid=uid
556
- ),
557
- spec=mlrun.common.schemas.ModelEndpointSpec(
558
- function_uri=graph_server.function_uri,
559
- model=versioned_model_name,
560
- model_class=model.__class__.__name__,
561
- model_uri=model.model_path,
562
- stream_path=config.model_endpoint_monitoring.store_prefixes.default.format(
563
- project=project, kind="stream"
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
- db = mlrun.get_run_db()
576
-
577
- db.create_model_endpoint(
578
- project=project,
579
- endpoint_id=uid,
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
- except Exception as e:
584
- logger.error("Failed to create endpoint record", exc=err_to_str(e))
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
- except Exception as e:
587
- logger.error("Failed to retrieve model endpoint object", exc=err_to_str(e))
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
- return (
79
- f"[{severity}] {message} for project {alert.project} "
80
- f"UID {event_data.entity.ids[0]}. Values {event_data.value_dict}"
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
- if (
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
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "0cbcbb9417af7ac58072ad981672602728fee57e",
3
- "version": "1.7.0-rc22"
2
+ "git_commit": "e2058b393890ec83e5a2a1ed99b4dfbc7d806b4e",
3
+ "version": "1.7.0-rc23"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc22
3
+ Version: 1.7.0rc23
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -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=53oT_uQliD-CEe7jxJZMFlNOT86zCTYBl802MZYluaE,7395
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=afsTyAkc-KUh-1D1WBsUHQ99D3C2RoYg2dIn9kfOUyc,5134
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=577OHVRZbV3kqYei4drVdTmCcGLJU8UXSGEpfo9FTQk,3717
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=bPlaTiiDHs4oOMQ0LJ2CEl3HyDDr82fBbawQtP6jQ0I,22366
103
+ mlrun/db/base.py,sha256=g1x5cIxuLjHocmVIsbMmUgDseS0nNfitl_aN9wixH4M,22404
104
104
  mlrun/db/factory.py,sha256=ibIrE5QkIIyzDU1FXKrfbc31cZiRLYKDZb8dqCpQwyU,2397
105
- mlrun/db/httpdb.py,sha256=nZbGcoxZ_vpo1rzBsw6GioX43HbPk7jIKLH_tOelCX8,179494
106
- mlrun/db/nopdb.py,sha256=deB-tk_r3boAwuVKD9EtV9DDF5EXnaNO_y--Xe7b5eg,19638
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=Qp9pZRiUcU-drO_NlZnr1Z3RkUSjK44ET9drfGGfiFM,1017
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=ROGQVZVoX7kgKI17dqIQSH-8r3t0K4oiwMRXPvfUGxE,11479
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=TuFb1W-WYvynxU_kJl9h3xDn5Ir9b1MUwuynak-DK58,42467
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=cAQ24HbtWGA8czzaemmjLT4WfDInJ7gPpkkIp9LePBY,10013
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=qesQRwo0tT4rDlQHMVliXFYiMRHZv2-rd-2JHvAQF-Y,4203
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=ZzzXDRBnX0VJbvBinfgUdkXDyRQJwsjgPolgiyVLfwM,5858
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=_p12LEpmGNVP6h5DTqAVwMVkwyfAbesBZigED-Lbduw,27500
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=o8P80yowPj4NRLonJ8rdSffot1OB-V6i3Ji1m_TWvzs,27399
244
- mlrun/model_monitoring/db/tsdb/__init__.py,sha256=NR895JSsEvNmINL223GLf8IbJ16b9Wn4XnxobDwivM8,3724
245
- mlrun/model_monitoring/db/tsdb/base.py,sha256=l5SNjO3btJSeglOCn4NHnckntAaP6hcZBVRhOty3KSQ,13122
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=L6XXXr4Mkfad3iTwDyfKScdeuEamL-xtTjoKSwefi7w,26194
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=_h308qe3NijbH2xymZ_G6XIJSGAa3OX24Je76gP855Q,7941
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=Mq7-KCjDFYPGcDByAROYT9dXHZx9-QDmeqCepqrwFm0,1039
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=umxA0OnsZYtVNu2lmXuXCMMA-0s6iNpsa7uv3jT7THM,181355
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=H3bSI33FmfOBkL99ZU6_xKbFx4qKdyQVdpIwwfhK5qo,29649
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=f1GwB5IeavDYls1vHeEqkaOTMkINWeffNICAVRR4htA,19193
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=l2J-kWRPf5vH6T-i96WJwmmzRF2QrWAjepmLVnq04rg,23863
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=b0nncv0oV01wNeT-3upWQkcvyVVbBbJkrFgk6PMAusw,2788
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=Vc6EHdnVAZe-p4ZWMvLc23YjMIDE3h2flf2b83ATVCA,7286
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=YTYzIsYgfu2QIFU3klixQlisgpqRt5PED9zmOJONRXA,89
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.0rc22.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
349
- mlrun-1.7.0rc22.dist-info/METADATA,sha256=1YFwgv7LW2rwwHez3LXjihC5KrpjncBo3J5DUb6iDx8,19237
350
- mlrun-1.7.0rc22.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
351
- mlrun-1.7.0rc22.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
352
- mlrun-1.7.0rc22.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
353
- mlrun-1.7.0rc22.dist-info/RECORD,,
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,,