mlrun 1.8.0rc35__py3-none-any.whl → 1.8.0rc37__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.

@@ -208,9 +208,6 @@ ModelEndpointList = DeprecationHelper(mlrun.common.schemas.ModelEndpointList)
208
208
  ModelEndpointMetadata = DeprecationHelper(mlrun.common.schemas.ModelEndpointMetadata)
209
209
  ModelEndpointSpec = DeprecationHelper(mlrun.common.schemas.ModelEndpointSpec)
210
210
  ModelEndpointStatus = DeprecationHelper(mlrun.common.schemas.ModelEndpointStatus)
211
- ModelMonitoringStoreKinds = DeprecationHelper(
212
- mlrun.common.schemas.ModelMonitoringStoreKinds
213
- )
214
211
  NotificationSeverity = DeprecationHelper(mlrun.common.schemas.NotificationSeverity)
215
212
  NotificationStatus = DeprecationHelper(mlrun.common.schemas.NotificationStatus)
216
213
  ObjectKind = DeprecationHelper(mlrun.common.schemas.ObjectKind)
mlrun/artifacts/model.py CHANGED
@@ -279,7 +279,11 @@ class ModelArtifact(Artifact):
279
279
  )
280
280
  if label_columns:
281
281
  inferer.infer_schema(
282
- df[label_columns], self.spec.outputs, {}, options=InferOptions.Features
282
+ df[label_columns],
283
+ self.spec.outputs,
284
+ {},
285
+ options=InferOptions.Features,
286
+ push_at_start=True,
283
287
  )
284
288
  if with_stats:
285
289
  self.spec.feature_stats = inferer.get_stats(
@@ -139,6 +139,7 @@ from .model_monitoring import (
139
139
  Features,
140
140
  FeatureSetFeatures,
141
141
  FeatureValues,
142
+ FileTargetKind,
142
143
  GrafanaColumn,
143
144
  GrafanaNumberColumn,
144
145
  GrafanaStringColumn,
@@ -151,7 +152,6 @@ from .model_monitoring import (
151
152
  ModelEndpointSpec,
152
153
  ModelEndpointStatus,
153
154
  ModelMonitoringMode,
154
- ModelMonitoringStoreKinds,
155
155
  MonitoringFunctionNames,
156
156
  TSDBTarget,
157
157
  V3IOTSDBTables,
@@ -57,6 +57,15 @@ class ArtifactCategories(mlrun.common.types.StrEnum):
57
57
  return cls(kind)
58
58
  return cls.other
59
59
 
60
+ @staticmethod
61
+ def all():
62
+ """Return all applicable artifact categories"""
63
+ return [
64
+ ArtifactCategories.model,
65
+ ArtifactCategories.dataset,
66
+ ArtifactCategories.document,
67
+ ]
68
+
60
69
 
61
70
  class ArtifactIdentifier(pydantic.v1.BaseModel):
62
71
  # artifact kind
@@ -14,9 +14,7 @@
14
14
 
15
15
  from .constants import (
16
16
  INTERSECT_DICT_KEYS,
17
- V3IO_MODEL_MONITORING_DB,
18
17
  ApplicationEvent,
19
- ControllerPolicy,
20
18
  DriftStatus,
21
19
  EndpointType,
22
20
  EndpointUID,
@@ -30,10 +28,7 @@ from .constants import (
30
28
  ModelEndpointCreationStrategy,
31
29
  ModelEndpointMonitoringMetricType,
32
30
  ModelEndpointSchema,
33
- ModelEndpointTarget,
34
- ModelEndpointTargetSchemas,
35
31
  ModelMonitoringMode,
36
- ModelMonitoringStoreKinds,
37
32
  MonitoringFunctionNames,
38
33
  PredictionsQueryConstants,
39
34
  ProjectSecretKeys,
@@ -240,11 +240,6 @@ class EventKeyMetrics:
240
240
  REAL_TIME = "real_time"
241
241
 
242
242
 
243
- class ModelEndpointTarget(MonitoringStrEnum):
244
- V3IO_NOSQL = "v3io-nosql"
245
- SQL = "sql"
246
-
247
-
248
243
  class TSDBTarget(MonitoringStrEnum):
249
244
  V3IO_TSDB = "v3io-tsdb"
250
245
  TDEngine = "tdengine"
@@ -269,17 +264,6 @@ class GetEventsFormat(MonitoringStrEnum):
269
264
  INTERSECTION = "intersection"
270
265
 
271
266
 
272
- class ModelEndpointTargetSchemas(MonitoringStrEnum):
273
- V3IO = "v3io"
274
- MYSQL = "mysql"
275
- SQLITE = "sqlite"
276
-
277
-
278
- class ModelMonitoringStoreKinds:
279
- ENDPOINTS = "endpoints"
280
- EVENTS = "events"
281
-
282
-
283
267
  class FileTargetKind:
284
268
  ENDPOINTS = "endpoints"
285
269
  EVENTS = "events"
@@ -429,10 +413,6 @@ class ModelMonitoringAppLabel:
429
413
  return f"{self.KEY}={self.VAL}"
430
414
 
431
415
 
432
- class ControllerPolicy:
433
- BASE_PERIOD = "base_period"
434
-
435
-
436
416
  class HistogramDataDriftApplicationConstants:
437
417
  NAME = "histogram-data-drift"
438
418
  GENERAL_RESULT_NAME = "general_drift"
@@ -449,8 +429,6 @@ class SpecialApps:
449
429
 
450
430
  _RESERVED_FUNCTION_NAMES = MonitoringFunctionNames.list() + [SpecialApps.MLRUN_INFRA]
451
431
 
452
- V3IO_MODEL_MONITORING_DB = "v3io"
453
-
454
432
 
455
433
  class ModelEndpointMonitoringMetricType(StrEnum):
456
434
  RESULT = "result"
@@ -36,12 +36,6 @@ from .constants import (
36
36
  Model = TypeVar("Model", bound=BaseModel)
37
37
 
38
38
 
39
- class ModelMonitoringStoreKinds:
40
- # TODO: do changes in examples & demos In 1.5.0 remove
41
- ENDPOINTS = "endpoints"
42
- EVENTS = "events"
43
-
44
-
45
39
  class Histogram(BaseModel):
46
40
  buckets: list[float]
47
41
  counts: list[int]
mlrun/data_types/infer.py CHANGED
@@ -20,6 +20,8 @@ import pandas as pd
20
20
  import pyarrow
21
21
  from pandas.io.json._table_schema import convert_pandas_type_to_json_field
22
22
 
23
+ import mlrun.features
24
+ from mlrun.model import ObjectList
23
25
  from mlrun.utils import logger
24
26
 
25
27
  from .data_types import InferOptions, pa_type_to_value_type, pd_schema_to_value_type
@@ -29,17 +31,19 @@ default_num_bins = 20
29
31
 
30
32
  def infer_schema_from_df(
31
33
  df: pd.DataFrame,
32
- features,
34
+ features: ObjectList,
33
35
  entities,
34
36
  timestamp_key: Optional[str] = None,
35
37
  entity_columns=None,
36
38
  options: InferOptions = InferOptions.Null,
39
+ push_at_start: Optional[bool] = False,
37
40
  ):
38
41
  """infer feature set schema from dataframe"""
39
42
  timestamp_fields = []
40
43
  current_entities = list(entities.keys())
41
44
  entity_columns = entity_columns or []
42
45
  index_columns = dict()
46
+ temp_features = ObjectList(mlrun.features.Feature)
43
47
 
44
48
  def upsert_entity(name, value_type):
45
49
  if name in current_entities:
@@ -74,10 +78,14 @@ def infer_schema_from_df(
74
78
  if column in features.keys():
75
79
  features[column].value_type = value_type
76
80
  else:
77
- features[column] = {"name": column, "value_type": value_type}
81
+ temp_features[column] = {"name": column, "value_type": value_type}
78
82
  if value_type == "datetime" and not is_entity:
79
83
  timestamp_fields.append(column)
80
84
 
85
+ features.update_list(
86
+ object_list=temp_features, push_at_start=push_at_start
87
+ ) # Push to start of the Object list
88
+
81
89
  index_type = None
82
90
  if InferOptions.get_common_options(options, InferOptions.Index):
83
91
  # infer types of index fields
@@ -18,7 +18,7 @@ import warnings
18
18
  from base64 import b64encode
19
19
  from copy import copy
20
20
  from datetime import datetime
21
- from typing import Optional, Union
21
+ from typing import Any, Optional, Union
22
22
 
23
23
  import pandas as pd
24
24
  import semver
@@ -34,6 +34,7 @@ from mlrun.datastore.utils import transform_list_filters_to_tuple
34
34
  from mlrun.secrets import SecretsStore
35
35
  from mlrun.utils import logger
36
36
 
37
+ from ..common.schemas.function import Function
37
38
  from ..model import DataSource
38
39
  from ..platforms.iguazio import parse_path
39
40
  from ..utils import get_class, is_explicit_ack_supported
@@ -966,6 +967,26 @@ class OnlineSource(BaseSourceDriver):
966
967
  "This source type is not supported with ingestion service yet"
967
968
  )
968
969
 
970
+ @staticmethod
971
+ def set_explicit_ack_mode(function: Function, **extra_arguments) -> dict[str, Any]:
972
+ extra_arguments = extra_arguments or {}
973
+ engine = "sync"
974
+ if (
975
+ function.spec
976
+ and hasattr(function.spec, "graph")
977
+ and function.spec.graph
978
+ and function.spec.graph.engine
979
+ ):
980
+ engine = function.spec.graph.engine
981
+ if mlrun.mlconf.is_explicit_ack_enabled() and engine == "async":
982
+ extra_arguments["explicit_ack_mode"] = extra_arguments.get(
983
+ "explicit_ack_mode", "explicitOnly"
984
+ )
985
+ extra_arguments["worker_allocation_mode"] = extra_arguments.get(
986
+ "worker_allocation_mode", "static"
987
+ )
988
+ return extra_arguments
989
+
969
990
 
970
991
  class HttpSource(OnlineSource):
971
992
  kind = "http"
@@ -1028,15 +1049,7 @@ class StreamSource(OnlineSource):
1028
1049
  raise_for_status=v3io.dataplane.RaiseForStatus.never,
1029
1050
  )
1030
1051
  res.raise_for_status([409, 204])
1031
-
1032
- kwargs = {}
1033
- engine = "async"
1034
- if hasattr(function.spec, "graph") and function.spec.graph.engine:
1035
- engine = function.spec.graph.engine
1036
-
1037
- if mlrun.mlconf.is_explicit_ack_enabled() and engine == "async":
1038
- kwargs["explicit_ack_mode"] = "explicitOnly"
1039
- kwargs["worker_allocation_mode"] = "static"
1052
+ kwargs = self.set_explicit_ack_mode(function=function)
1040
1053
 
1041
1054
  function.add_v3io_stream_trigger(
1042
1055
  url,
@@ -1118,20 +1131,12 @@ class KafkaSource(OnlineSource):
1118
1131
  else:
1119
1132
  extra_attributes = copy(self.attributes)
1120
1133
  partitions = extra_attributes.pop("partitions", None)
1121
- explicit_ack_mode = None
1122
- engine = "async"
1123
- if hasattr(function.spec, "graph") and function.spec.graph.engine:
1124
- engine = function.spec.graph.engine
1125
1134
 
1126
- if mlrun.mlconf.is_explicit_ack_enabled() and engine == "async":
1127
- explicit_ack_mode = "explicitOnly"
1128
- extra_attributes["workerAllocationMode"] = extra_attributes.get(
1129
- "worker_allocation_mode", "static"
1130
- )
1131
- else:
1132
- extra_attributes["workerAllocationMode"] = extra_attributes.get(
1133
- "worker_allocation_mode", "pool"
1134
- )
1135
+ extra_attributes = self.set_explicit_ack_mode(function, **extra_attributes)
1136
+ explicit_ack_mode = extra_attributes.get("explicit_ack_mode")
1137
+ extra_attributes["workerAllocationMode"] = extra_attributes.get(
1138
+ "worker_allocation_mode", "pool"
1139
+ )
1135
1140
 
1136
1141
  trigger_kwargs = {}
1137
1142
 
mlrun/db/base.py CHANGED
@@ -102,7 +102,6 @@ class RunDBInterface(ABC):
102
102
  ] = None, # Backward compatibility
103
103
  states: Optional[list[mlrun.common.runtimes.constants.RunStates]] = None,
104
104
  sort: bool = True,
105
- last: int = 0,
106
105
  iter: bool = False,
107
106
  start_time_from: Optional[datetime.datetime] = None,
108
107
  start_time_to: Optional[datetime.datetime] = None,
mlrun/db/httpdb.py CHANGED
@@ -350,17 +350,10 @@ class HTTPRunDB(RunDBInterface):
350
350
  version=version,
351
351
  )
352
352
 
353
- page_params = deepcopy(params) or {}
354
-
355
- if page_params.get("page-token") is None and page_params.get("page") is None:
356
- page_params["page"] = 1
357
-
358
- if page_params.get("page-size") is None:
359
- page_params["page-size"] = config.httpdb.pagination.default_page_size
360
-
353
+ page_params = self._resolve_page_params(params)
361
354
  response = _api_call(page_params)
362
355
 
363
- # Yield only a single page of results
356
+ # yields a single page of results
364
357
  yield response
365
358
 
366
359
  if return_all:
@@ -1279,7 +1272,7 @@ class HTTPRunDB(RunDBInterface):
1279
1272
  :param rows_per_partition: How many top rows (per sorting defined by `partition_sort_by` and `partition_order`)
1280
1273
  to return per group. Default value is 1.
1281
1274
  :param partition_sort_by: What field to sort the results by, within each partition defined by `partition_by`.
1282
- Currently the only allowed values are `created` and `updated`.
1275
+ Currently, the only allowed values are `created` and `updated`.
1283
1276
  :param partition_order: Order of sorting within partitions - `asc` or `desc`. Default is `desc`.
1284
1277
  """
1285
1278
 
@@ -1302,7 +1295,7 @@ class HTTPRunDB(RunDBInterface):
1302
1295
  rows_per_partition=rows_per_partition,
1303
1296
  partition_sort_by=partition_sort_by,
1304
1297
  partition_order=partition_order,
1305
- return_all=True,
1298
+ return_all=not limit,
1306
1299
  )
1307
1300
  return artifacts
1308
1301
 
@@ -5353,6 +5346,33 @@ class HTTPRunDB(RunDBInterface):
5353
5346
  )
5354
5347
  return None
5355
5348
 
5349
+ def _resolve_page_params(self, params: typing.Optional[dict]) -> dict:
5350
+ """
5351
+ Resolve the page parameters, setting defaults where necessary.
5352
+ """
5353
+ page_params = deepcopy(params) or {}
5354
+ if page_params.get("page-token") is None and page_params.get("page") is None:
5355
+ page_params["page"] = 1
5356
+ if page_params.get("page-size") is None:
5357
+ page_size = config.httpdb.pagination.default_page_size
5358
+
5359
+ if page_params.get("limit") is not None:
5360
+ page_size = page_params["limit"]
5361
+
5362
+ # limit and page/page size are conflicting
5363
+ page_params.pop("limit")
5364
+ page_params["page-size"] = page_size
5365
+
5366
+ # this may happen only when page-size was explicitly set along with limit
5367
+ # this is to ensure we will not get stopped by API on similar below validation
5368
+ # but rather simply fallback to use page-size.
5369
+ if page_params.get("page-size") and page_params.get("limit"):
5370
+ logger.warning(
5371
+ "Both 'limit' and 'page-size' are provided, using 'page-size'."
5372
+ )
5373
+ page_params.pop("limit")
5374
+ return page_params
5375
+
5356
5376
 
5357
5377
  def _as_json(obj):
5358
5378
  fn = getattr(obj, "to_json", None)
mlrun/db/nopdb.py CHANGED
@@ -132,7 +132,6 @@ class NopDB(RunDBInterface):
132
132
  ] = None, # Backward compatibility
133
133
  states: Optional[list[mlrun.common.runtimes.constants.RunStates]] = None,
134
134
  sort: bool = True,
135
- last: int = 0,
136
135
  iter: bool = False,
137
136
  start_time_from: Optional[datetime.datetime] = None,
138
137
  start_time_to: Optional[datetime.datetime] = None,
@@ -13,11 +13,6 @@
13
13
  # limitations under the License.
14
14
 
15
15
  __all__ = [
16
- "get_offline_features",
17
- "get_online_feature_service",
18
- "ingest",
19
- "preview",
20
- "deploy_ingestion_service_v2",
21
16
  "delete_feature_set",
22
17
  "delete_feature_vector",
23
18
  "get_feature_set",
@@ -38,13 +33,8 @@ from ..features import Entity, Feature
38
33
  from .api import (
39
34
  delete_feature_set,
40
35
  delete_feature_vector,
41
- deploy_ingestion_service_v2,
42
36
  get_feature_set,
43
37
  get_feature_vector,
44
- get_offline_features,
45
- get_online_feature_service,
46
- ingest,
47
- preview,
48
38
  )
49
39
  from .common import RunConfig
50
40
  from .feature_set import FeatureSet
@@ -20,7 +20,6 @@ from datetime import datetime
20
20
  from typing import Any, Optional, Union
21
21
 
22
22
  import pandas as pd
23
- from deprecated import deprecated
24
23
 
25
24
  import mlrun
26
25
  import mlrun.errors
@@ -91,122 +90,6 @@ def _features_to_vector_and_check_permissions(features, update_stats):
91
90
  return vector
92
91
 
93
92
 
94
- @deprecated(
95
- version="1.6.0",
96
- reason="get_offline_features() will be removed in 1.8.0, please instead use "
97
- "get_feature_vector('store://feature_vector_name').get_offline_features()",
98
- category=FutureWarning,
99
- )
100
- def get_offline_features(
101
- feature_vector: Union[str, FeatureVector],
102
- entity_rows=None,
103
- entity_timestamp_column: Optional[str] = None,
104
- target: DataTargetBase = None,
105
- run_config: RunConfig = None,
106
- drop_columns: Optional[list[str]] = None,
107
- start_time: Optional[Union[str, datetime]] = None,
108
- end_time: Optional[Union[str, datetime]] = None,
109
- with_indexes: bool = False,
110
- update_stats: bool = False,
111
- engine: Optional[str] = None,
112
- engine_args: Optional[dict] = None,
113
- query: Optional[str] = None,
114
- order_by: Optional[Union[str, list[str]]] = None,
115
- spark_service: Optional[str] = None,
116
- timestamp_for_filtering: Optional[Union[str, dict[str, str]]] = None,
117
- additional_filters: Optional[list] = None,
118
- ):
119
- """retrieve offline feature vector results
120
-
121
- specify a feature vector object/uri and retrieve the desired features, their metadata
122
- and statistics. returns :py:class:`~mlrun.feature_store.OfflineVectorResponse`,
123
- results can be returned as a dataframe or written to a target
124
-
125
- The start_time and end_time attributes allow filtering the data to a given time range, they accept
126
- string values or pandas `Timestamp` objects, string values can also be relative, for example:
127
- "now", "now - 1d2h", "now+5m", where a valid pandas Timedelta string follows the verb "now",
128
- for time alignment you can use the verb "floor" e.g. "now -1d floor 1H" will align the time to the last hour
129
- (the floor string is passed to pandas.Timestamp.floor(), can use D, H, T, S for day, hour, min, sec alignment).
130
- Another option to filter the data is by the `query` argument - can be seen in the example.
131
- example::
132
-
133
- features = [
134
- "stock-quotes.bid",
135
- "stock-quotes.asks_sum_5h",
136
- "stock-quotes.ask as mycol",
137
- "stocks.*",
138
- ]
139
- vector = FeatureVector(features=features)
140
- resp = get_offline_features(
141
- vector,
142
- entity_rows=trades,
143
- entity_timestamp_column="time",
144
- query="ticker in ['GOOG'] and bid>100",
145
- )
146
- print(resp.to_dataframe())
147
- print(vector.get_stats_table())
148
- resp.to_parquet("./out.parquet")
149
-
150
- :param feature_vector: feature vector uri or FeatureVector object. passing feature vector obj requires
151
- update permissions
152
- :param entity_rows: dataframe with entity rows to join with
153
- :param target: where to write the results to
154
- :param drop_columns: list of columns to drop from the final result
155
- :param entity_timestamp_column: timestamp column name in the entity rows dataframe. can be specified
156
- only if param entity_rows was specified.
157
- :param run_config: function and/or run configuration
158
- see :py:class:`~mlrun.feature_store.RunConfig`
159
- :param start_time: datetime, low limit of time needed to be filtered. Optional.
160
- :param end_time: datetime, high limit of time needed to be filtered. Optional.
161
- :param with_indexes: Return vector with/without the entities and the timestamp_key of the feature sets
162
- and with/without entity_timestamp_column and timestamp_for_filtering columns.
163
- This property can be specified also in the feature vector spec
164
- (feature_vector.spec.with_indexes)
165
- (default False)
166
- :param update_stats: update features statistics from the requested feature sets on the vector.
167
- (default False).
168
- :param engine: processing engine kind ("local", "dask", or "spark")
169
- :param engine_args: kwargs for the processing engine
170
- :param query: The query string used to filter rows on the output
171
- :param spark_service: Name of the spark service to be used (when using a remote-spark runtime)
172
- :param order_by: Name or list of names to order by. The name or the names in the list can be the
173
- feature name or the alias of the feature you pass in the feature list.
174
- :param timestamp_for_filtering: name of the column to filter by, can be str for all the feature sets or a
175
- dictionary ({<feature set name>: <timestamp column name>, ...})
176
- that indicates the timestamp column name for each feature set. Optional.
177
- By default, the filter executes on the timestamp_key of each feature set.
178
- Note: the time filtering is performed on each feature set before the
179
- merge process using start_time and end_time params.
180
- :param additional_filters: List of additional_filter conditions as tuples.
181
- Each tuple should be in the format (column_name, operator, value).
182
- Supported operators: "=", ">=", "<=", ">", "<".
183
- Example: [("Product", "=", "Computer")]
184
- For all supported filters, please see:
185
- https://arrow.apache.org/docs/python/generated/pyarrow.parquet.ParquetDataset.html
186
-
187
-
188
- """
189
- return _get_offline_features(
190
- feature_vector,
191
- entity_rows,
192
- entity_timestamp_column,
193
- target,
194
- run_config,
195
- drop_columns,
196
- start_time,
197
- end_time,
198
- with_indexes,
199
- update_stats,
200
- engine,
201
- engine_args,
202
- query,
203
- order_by,
204
- spark_service,
205
- timestamp_for_filtering,
206
- additional_filters,
207
- )
208
-
209
-
210
93
  def _get_offline_features(
211
94
  feature_vector: Union[str, FeatureVector],
212
95
  entity_rows=None,
@@ -288,93 +171,6 @@ def _get_offline_features(
288
171
  )
289
172
 
290
173
 
291
- @deprecated(
292
- version="1.6.0",
293
- reason="get_online_feature_service() will be removed in 1.8.0, please instead use "
294
- "get_feature_vector('store://feature_vector_name').get_online_feature_service()",
295
- category=FutureWarning,
296
- )
297
- def get_online_feature_service(
298
- feature_vector: Union[str, FeatureVector],
299
- run_config: RunConfig = None,
300
- fixed_window_type: FixedWindowType = FixedWindowType.LastClosedWindow,
301
- impute_policy: Optional[dict] = None,
302
- update_stats: bool = False,
303
- entity_keys: Optional[list[str]] = None,
304
- ):
305
- """initialize and return online feature vector service api,
306
- returns :py:class:`~mlrun.feature_store.OnlineVectorService`
307
-
308
- :**usage**:
309
- There are two ways to use the function:
310
-
311
- 1. As context manager
312
-
313
- Example::
314
-
315
- with get_online_feature_service(vector_uri) as svc:
316
- resp = svc.get([{"ticker": "GOOG"}, {"ticker": "MSFT"}])
317
- print(resp)
318
- resp = svc.get([{"ticker": "AAPL"}], as_list=True)
319
- print(resp)
320
-
321
- Example with imputing::
322
-
323
- with get_online_feature_service(vector_uri, entity_keys=['id'],
324
- impute_policy={"*": "$mean", "amount": 0)) as svc:
325
- resp = svc.get([{"id": "C123487"}])
326
-
327
- 2. as simple function, note that in that option you need to close the session.
328
-
329
- Example::
330
-
331
- svc = get_online_feature_service(vector_uri, entity_keys=["ticker"])
332
- try:
333
- resp = svc.get([{"ticker": "GOOG"}, {"ticker": "MSFT"}])
334
- print(resp)
335
- resp = svc.get([{"ticker": "AAPL"}], as_list=True)
336
- print(resp)
337
-
338
- finally:
339
- svc.close()
340
-
341
- Example with imputing::
342
-
343
- svc = get_online_feature_service(vector_uri, entity_keys=['id'],
344
- impute_policy={"*": "$mean", "amount": 0))
345
- try:
346
- resp = svc.get([{"id": "C123487"}])
347
- except Exception as e:
348
- handling exception...
349
- finally:
350
- svc.close()
351
-
352
- :param feature_vector: feature vector uri or FeatureVector object. passing feature vector obj requires update
353
- permissions.
354
- :param run_config: function and/or run configuration for remote jobs/services
355
- :param impute_policy: a dict with `impute_policy` per feature, the dict key is the feature name and the dict
356
- value indicate which value will be used in case the feature is NaN/empty, the replaced
357
- value can be fixed number for constants or $mean, $max, $min, $std, $count
358
- for statistical
359
- values. "*" is used to specify the default for all features, example: `{"*": "$mean"}`
360
- :param fixed_window_type: determines how to query the fixed window values which were previously inserted by ingest
361
- :param update_stats: update features statistics from the requested feature sets on the vector.
362
- Default: False.
363
- :param entity_keys: Entity list of the first feature_set in the vector.
364
- The indexes that are used to query the online service.
365
- :return: Initialize the `OnlineVectorService`.
366
- Will be used in subclasses where `support_online=True`.
367
- """
368
- return _get_online_feature_service(
369
- feature_vector,
370
- run_config,
371
- fixed_window_type,
372
- impute_policy,
373
- update_stats,
374
- entity_keys,
375
- )
376
-
377
-
378
174
  def _get_online_feature_service(
379
175
  feature_vector: Union[str, FeatureVector],
380
176
  run_config: RunConfig = None,
@@ -448,86 +244,6 @@ def _get_namespace(run_config: RunConfig) -> dict[str, Any]:
448
244
  return get_caller_globals()
449
245
 
450
246
 
451
- def ingest(
452
- featureset: Union[FeatureSet, str] = None,
453
- source=None,
454
- targets: Optional[list[DataTargetBase]] = None,
455
- namespace=None,
456
- return_df: bool = True,
457
- infer_options: InferOptions = InferOptions.default(),
458
- run_config: RunConfig = None,
459
- mlrun_context=None,
460
- spark_context=None,
461
- overwrite=None,
462
- ) -> Optional[pd.DataFrame]:
463
- """Read local DataFrame, file, URL, or source into the feature store
464
- Ingest reads from the source, run the graph transformations, infers metadata and stats
465
- and writes the results to the default of specified targets
466
-
467
- when targets are not specified data is stored in the configured default targets
468
- (will usually be NoSQL for real-time and Parquet for offline).
469
-
470
- the `run_config` parameter allow specifying the function and job configuration,
471
- see: :py:class:`~mlrun.feature_store.RunConfig`
472
-
473
- example::
474
-
475
- stocks_set = FeatureSet("stocks", entities=[Entity("ticker")])
476
- stocks = pd.read_csv("stocks.csv")
477
- df = ingest(stocks_set, stocks, infer_options=fstore.InferOptions.default())
478
-
479
- # for running as remote job
480
- config = RunConfig(image="mlrun/mlrun")
481
- df = ingest(stocks_set, stocks, run_config=config)
482
-
483
- # specify source and targets
484
- source = CSVSource("mycsv", path="measurements.csv")
485
- targets = [CSVTarget("mycsv", path="./mycsv.csv")]
486
- ingest(measurements, source, targets)
487
-
488
- :param featureset: feature set object or featureset.uri. (uri must be of a feature set that is in the DB,
489
- call `.save()` if it's not)
490
- :param source: source dataframe or other sources (e.g. parquet source see:
491
- :py:class:`~mlrun.datastore.ParquetSource` and other classes in mlrun.datastore with suffix
492
- Source)
493
- :param targets: optional list of data target objects
494
- :param namespace: namespace or module containing graph classes
495
- :param return_df: indicate if to return a dataframe with the graph results
496
- :param infer_options: schema (for discovery of entities, features in featureset), index, stats,
497
- histogram and preview infer options (:py:class:`~mlrun.feature_store.InferOptions`)
498
- :param run_config: function and/or run configuration for remote jobs,
499
- see :py:class:`~mlrun.feature_store.RunConfig`
500
- :param mlrun_context: mlrun context (when running as a job), for internal use !
501
- :param spark_context: local spark session for spark ingestion, example for creating the spark context:
502
- `spark = SparkSession.builder.appName("Spark function").getOrCreate()`
503
- For remote spark ingestion, this should contain the remote spark service name
504
- :param overwrite: delete the targets' data prior to ingestion
505
- (default: True for non scheduled ingest - deletes the targets that are about to be ingested.
506
- False for scheduled ingest - does not delete the target)
507
- :return: if return_df is True, a dataframe will be returned based on the graph
508
- """
509
- if mlrun_context is None:
510
- deprecated(
511
- version="1.6.0",
512
- reason="Calling 'ingest' with mlrun_context=None is deprecated and will be removed in 1.8.0,\
513
- use 'FeatureSet.ingest()' instead",
514
- category=FutureWarning,
515
- )
516
-
517
- return _ingest(
518
- featureset,
519
- source,
520
- targets,
521
- namespace,
522
- return_df,
523
- infer_options,
524
- run_config,
525
- mlrun_context,
526
- spark_context,
527
- overwrite,
528
- )
529
-
530
-
531
247
  def _ingest(
532
248
  featureset: Union[FeatureSet, str] = None,
533
249
  source=None,
@@ -776,53 +492,6 @@ def _ingest(
776
492
  return df
777
493
 
778
494
 
779
- @deprecated(
780
- version="1.6.0",
781
- reason="'preview' will be removed in 1.8.0, use 'FeatureSet.preview()' instead",
782
- category=FutureWarning,
783
- )
784
- def preview(
785
- featureset: FeatureSet,
786
- source,
787
- entity_columns: Optional[list] = None,
788
- namespace=None,
789
- options: InferOptions = None,
790
- verbose: bool = False,
791
- sample_size: Optional[int] = None,
792
- ) -> pd.DataFrame:
793
- """run the ingestion pipeline with local DataFrame/file data and infer features schema and stats
794
-
795
- example::
796
-
797
- quotes_set = FeatureSet("stock-quotes", entities=[Entity("ticker")])
798
- quotes_set.add_aggregation("ask", ["sum", "max"], ["1h", "5h"], "10m")
799
- quotes_set.add_aggregation("bid", ["min", "max"], ["1h"], "10m")
800
- df = preview(
801
- quotes_set,
802
- quotes_df,
803
- entity_columns=["ticker"],
804
- )
805
-
806
- :param featureset: feature set object or uri
807
- :param source: source dataframe or csv/parquet file path
808
- :param entity_columns: list of entity (index) column names
809
- :param namespace: namespace or module containing graph classes
810
- :param options: schema (for discovery of entities, features in featureset), index, stats,
811
- histogram and preview infer options (:py:class:`~mlrun.feature_store.InferOptions`)
812
- :param verbose: verbose log
813
- :param sample_size: num of rows to sample from the dataset (for large datasets)
814
- """
815
- return _preview(
816
- featureset,
817
- source,
818
- entity_columns,
819
- namespace,
820
- options,
821
- verbose,
822
- sample_size,
823
- )
824
-
825
-
826
495
  def _preview(
827
496
  featureset: FeatureSet,
828
497
  source,
@@ -912,55 +581,6 @@ def _run_ingestion_job(
912
581
  return run_ingestion_job(name, featureset, run_config, source.schedule)
913
582
 
914
583
 
915
- @deprecated(
916
- version="1.6.0",
917
- reason="'deploy_ingestion_service_v2' will be removed in 1.8.0, "
918
- "use 'FeatureSet.deploy_ingestion_service()' instead",
919
- category=FutureWarning,
920
- )
921
- def deploy_ingestion_service_v2(
922
- featureset: Union[FeatureSet, str],
923
- source: DataSource = None,
924
- targets: Optional[list[DataTargetBase]] = None,
925
- name: Optional[str] = None,
926
- run_config: RunConfig = None,
927
- verbose=False,
928
- ) -> tuple[str, BaseRuntime]:
929
- """Start real-time ingestion service using nuclio function
930
-
931
- Deploy a real-time function implementing feature ingestion pipeline
932
- the source maps to Nuclio event triggers (http, kafka, v3io stream, etc.)
933
-
934
- the `run_config` parameter allow specifying the function and job configuration,
935
- see: :py:class:`~mlrun.feature_store.RunConfig`
936
-
937
- example::
938
-
939
- source = HTTPSource()
940
- func = mlrun.code_to_function("ingest", kind="serving").apply(mount_v3io())
941
- config = RunConfig(function=func)
942
- deploy_ingestion_service_v2(my_set, source, run_config=config)
943
-
944
- :param featureset: feature set object or uri
945
- :param source: data source object describing the online or offline source
946
- :param targets: list of data target objects
947
- :param name: name for the job/function
948
- :param run_config: service runtime configuration (function object/uri, resources, etc..)
949
- :param verbose: verbose log
950
-
951
- :return: URL to access the deployed ingestion service, and the function that was deployed (which will
952
- differ from the function passed in via the run_config parameter).
953
- """
954
- return _deploy_ingestion_service_v2(
955
- featureset,
956
- source,
957
- targets,
958
- name,
959
- run_config,
960
- verbose,
961
- )
962
-
963
-
964
584
  def _deploy_ingestion_service_v2(
965
585
  featureset: Union[FeatureSet, str],
966
586
  source: DataSource = None,
mlrun/model.py CHANGED
@@ -430,6 +430,19 @@ class ObjectList:
430
430
  self._children[child_obj.name] = child_obj
431
431
  return child_obj
432
432
 
433
+ def move_to_end(self, child, last=True):
434
+ self._children.move_to_end(child, last)
435
+
436
+ def update_list(self, object_list: "ObjectList", push_at_start: bool = False):
437
+ if push_at_start:
438
+ self._children = OrderedDict(
439
+ list(object_list._children.items()) + list(self._children.items())
440
+ )
441
+ else:
442
+ self._children = OrderedDict(
443
+ list(self._children.items()) + list(object_list._children.items())
444
+ )
445
+
433
446
 
434
447
  class Credentials(ModelObj):
435
448
  generate_access_key = "$generate"
@@ -102,10 +102,10 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
102
102
  Each metric is calculated over all the features individually and the mean is taken as the metric value.
103
103
  The average of Hellinger and total variance distance is taken as the result.
104
104
 
105
- The application logs two artifacts:
105
+ The application can log two artifacts:
106
106
 
107
- * A JSON with the general drift per feature.
108
- * A plotly table different metrics per feature.
107
+ * JSON with the general drift value per feature, produced by default.
108
+ * Plotly table with the various metrics and histograms per feature (disabled by default due to performance issues).
109
109
 
110
110
  This application is deployed by default when calling:
111
111
 
@@ -114,12 +114,18 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
114
114
  project.enable_model_monitoring()
115
115
 
116
116
  To avoid it, pass :code:`deploy_histogram_data_drift_app=False`.
117
+
118
+ If you want to change the application defaults, such as the classifier or which artifacts to produce, you
119
+ need to inherit from this class and deploy it as any other model monitoring application.
117
120
  """
118
121
 
119
122
  NAME: Final[str] = HistogramDataDriftApplicationConstants.NAME
120
123
 
121
124
  _REQUIRED_METRICS = {HellingerDistance, TotalVarianceDistance}
122
- _STATS_TYPES: tuple[StatsKind] = (StatsKind.CURRENT_STATS, StatsKind.DRIFT_MEASURES)
125
+ _STATS_TYPES: tuple[StatsKind, StatsKind] = (
126
+ StatsKind.CURRENT_STATS,
127
+ StatsKind.DRIFT_MEASURES,
128
+ )
123
129
 
124
130
  metrics: list[type[HistogramDistanceMetric]] = [
125
131
  HellingerDistance,
@@ -127,7 +133,12 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
127
133
  TotalVarianceDistance,
128
134
  ]
129
135
 
130
- def __init__(self, value_classifier: Optional[ValueClassifier] = None) -> None:
136
+ def __init__(
137
+ self,
138
+ value_classifier: Optional[ValueClassifier] = None,
139
+ produce_json_artifact: bool = True,
140
+ produce_plotly_artifact: bool = False,
141
+ ) -> None:
131
142
  """
132
143
  :param value_classifier: Classifier object that adheres to the `ValueClassifier` protocol.
133
144
  If not provided, the default `DataDriftClassifier()` is used.
@@ -137,6 +148,9 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
137
148
  self.metrics
138
149
  ), "TVD and Hellinger distance are required for the general data drift result"
139
150
 
151
+ self._produce_json_artifact = produce_json_artifact
152
+ self._produce_plotly_artifact = produce_plotly_artifact
153
+
140
154
  def _compute_metrics_per_feature(
141
155
  self, monitoring_context: mm_context.MonitoringApplicationContext
142
156
  ) -> DataFrame:
@@ -295,40 +309,43 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
295
309
  cast(str, key): (self._value_classifier.value_to_status(value), value)
296
310
  for key, value in drift_per_feature_values.items()
297
311
  }
298
- monitoring_context.logger.debug("Logging plotly artifact")
299
- monitoring_context.log_artifact(
300
- mm_drift_table.FeaturesDriftTablePlot().produce(
301
- sample_set_statistics=sample_set_statistics,
302
- inputs_statistics=inputs_statistics,
303
- metrics=metrics_per_feature.T.to_dict(), # pyright: ignore[reportArgumentType]
304
- drift_results=drift_results,
305
- )
312
+ monitoring_context.logger.debug("Producing plotly artifact")
313
+ artifact = mm_drift_table.FeaturesDriftTablePlot().produce(
314
+ sample_set_statistics=sample_set_statistics,
315
+ inputs_statistics=inputs_statistics,
316
+ metrics=metrics_per_feature.T.to_dict(), # pyright: ignore[reportArgumentType]
317
+ drift_results=drift_results,
306
318
  )
319
+ monitoring_context.logger.debug("Logging plotly artifact")
320
+ monitoring_context.log_artifact(artifact)
307
321
  monitoring_context.logger.debug("Logged plotly artifact successfully")
308
322
 
309
323
  def _log_drift_artifacts(
310
324
  self,
311
325
  monitoring_context: mm_context.MonitoringApplicationContext,
312
326
  metrics_per_feature: DataFrame,
313
- log_json_artifact: bool = True,
314
327
  ) -> None:
315
328
  """Log JSON and Plotly drift data per feature artifacts"""
329
+ if not self._produce_json_artifact and not self._produce_plotly_artifact:
330
+ return
331
+
316
332
  drift_per_feature_values = metrics_per_feature[
317
333
  [HellingerDistance.NAME, TotalVarianceDistance.NAME]
318
334
  ].mean(axis=1)
319
335
 
320
- if log_json_artifact:
336
+ if self._produce_json_artifact:
321
337
  self._log_json_artifact(drift_per_feature_values, monitoring_context)
322
338
 
323
- self._log_plotly_table_artifact(
324
- sample_set_statistics=self._get_shared_features_sample_stats(
325
- monitoring_context
326
- ),
327
- inputs_statistics=monitoring_context.feature_stats,
328
- metrics_per_feature=metrics_per_feature,
329
- drift_per_feature_values=drift_per_feature_values,
330
- monitoring_context=monitoring_context,
331
- )
339
+ if self._produce_plotly_artifact:
340
+ self._log_plotly_table_artifact(
341
+ sample_set_statistics=self._get_shared_features_sample_stats(
342
+ monitoring_context
343
+ ),
344
+ inputs_statistics=monitoring_context.feature_stats,
345
+ metrics_per_feature=metrics_per_feature,
346
+ drift_per_feature_values=drift_per_feature_values,
347
+ monitoring_context=monitoring_context,
348
+ )
332
349
 
333
350
  def do_tracking(
334
351
  self, monitoring_context: mm_context.MonitoringApplicationContext
@@ -187,6 +187,12 @@ class TDEngineConnector(TSDBConnector):
187
187
  "Invalid 'endpoint_id' filter: must be a string or a list."
188
188
  )
189
189
 
190
+ def _drop_database_query(self) -> str:
191
+ return f"DROP DATABASE IF EXISTS {self.database};"
192
+
193
+ def _get_table_name_query(self) -> str:
194
+ return f"SELECT table_name FROM information_schema.ins_tables where db_name='{self.database}' LIMIT 1;"
195
+
190
196
  def apply_monitoring_stream_steps(self, graph, **kwarg):
191
197
  """
192
198
  Apply TSDB steps on the provided monitoring graph. Throughout these steps, the graph stores live data of
@@ -297,6 +303,54 @@ class TDEngineConnector(TSDBConnector):
297
303
  project=self.project,
298
304
  )
299
305
 
306
+ # Check if database is empty and if so, drop it
307
+ self._drop_database_if_empty()
308
+
309
+ def _drop_database_if_empty(self):
310
+ query_random_table_name = self._get_table_name_query()
311
+ drop_database = False
312
+ try:
313
+ table_name = self.connection.run(
314
+ query=query_random_table_name,
315
+ timeout=self._timeout,
316
+ retries=self._retries,
317
+ )
318
+ if len(table_name.data) == 0:
319
+ # no tables were found under the database
320
+ drop_database = True
321
+
322
+ except Exception as e:
323
+ logger.warning(
324
+ "Failed to query tables in the database. You may need to drop the database manually if it is empty.",
325
+ project=self.project,
326
+ error=mlrun.errors.err_to_str(e),
327
+ )
328
+
329
+ if drop_database:
330
+ logger.debug(
331
+ "Going to drop the TDEngine database",
332
+ project=self.project,
333
+ database=self.database,
334
+ )
335
+ drop_database_query = self._drop_database_query()
336
+ try:
337
+ self.connection.run(
338
+ statements=drop_database_query,
339
+ timeout=self._timeout,
340
+ retries=self._retries,
341
+ )
342
+ logger.debug(
343
+ "The TDEngine database has been successfully dropped",
344
+ project=self.project,
345
+ database=self.database,
346
+ )
347
+ except Exception as e:
348
+ logger.warning(
349
+ "Failed to drop the database. You may need to drop it manually if it is empty.",
350
+ project=self.project,
351
+ error=mlrun.errors.err_to_str(e),
352
+ )
353
+
300
354
  def get_model_endpoint_real_time_metrics(
301
355
  self,
302
356
  endpoint_id: str,
mlrun/projects/project.py CHANGED
@@ -4678,7 +4678,6 @@ class MlrunProject(ModelObj):
4678
4678
  ] = None, # Backward compatibility
4679
4679
  states: typing.Optional[list[mlrun.common.runtimes.constants.RunStates]] = None,
4680
4680
  sort: bool = True,
4681
- last: int = 0,
4682
4681
  iter: bool = False,
4683
4682
  start_time_from: Optional[datetime.datetime] = None,
4684
4683
  start_time_to: Optional[datetime.datetime] = None,
@@ -4751,7 +4750,6 @@ class MlrunProject(ModelObj):
4751
4750
  else states or None
4752
4751
  ),
4753
4752
  sort=sort,
4754
- last=last,
4755
4753
  iter=iter,
4756
4754
  start_time_from=start_time_from,
4757
4755
  start_time_to=start_time_to,
@@ -527,6 +527,17 @@ class RemoteRuntime(KubeResource):
527
527
  access_key = kwargs.pop("access_key", None)
528
528
  if not access_key:
529
529
  access_key = self._resolve_v3io_access_key()
530
+ engine = "sync"
531
+ explicit_ack_mode = kwargs.pop("explicit_ack_mode", None)
532
+ if (
533
+ self.spec
534
+ and hasattr(self.spec, "graph")
535
+ and self.spec.graph
536
+ and self.spec.graph.engine
537
+ ):
538
+ engine = self.spec.graph.engine
539
+ if mlrun.mlconf.is_explicit_ack_enabled() and engine == "async":
540
+ explicit_ack_mode = explicit_ack_mode or "explicitOnly"
530
541
 
531
542
  self.add_trigger(
532
543
  name,
@@ -540,6 +551,7 @@ class RemoteRuntime(KubeResource):
540
551
  extra_attributes=extra_attributes,
541
552
  read_batch_size=256,
542
553
  access_key=access_key,
554
+ explicit_ack_mode=explicit_ack_mode,
543
555
  **kwargs,
544
556
  ),
545
557
  )
@@ -376,6 +376,7 @@ class ServingRuntime(RemoteRuntime):
376
376
  creation_strategy: Optional[
377
377
  schemas.ModelEndpointCreationStrategy
378
378
  ] = schemas.ModelEndpointCreationStrategy.INPLACE,
379
+ outputs: Optional[list[str]] = None,
379
380
  **class_args,
380
381
  ):
381
382
  """add ml model and/or route to the function.
@@ -408,6 +409,9 @@ class ServingRuntime(RemoteRuntime):
408
409
  * **archive**:
409
410
  1. If model endpoints with the same name exist, preserve them.
410
411
  2. Create a new model endpoint with the same name and set it to `latest`.
412
+ :param outputs: list of the model outputs (e.g. labels) ,if provided will override the outputs that been
413
+ configured in the model artifact, please note that those outputs need to be equal to the
414
+ model serving function outputs (length, and order)
411
415
  :param class_args: extra kwargs to pass to the model serving class __init__
412
416
  (can be read in the model using .get_param(key) method)
413
417
  """
@@ -443,6 +447,8 @@ class ServingRuntime(RemoteRuntime):
443
447
  if class_name and hasattr(class_name, "to_dict"):
444
448
  if model_path:
445
449
  class_name.model_path = model_path
450
+ if outputs:
451
+ class_name.outputs = outputs
446
452
  key, state = params_to_step(
447
453
  class_name,
448
454
  key,
@@ -470,6 +476,7 @@ class ServingRuntime(RemoteRuntime):
470
476
  else:
471
477
  class_args = deepcopy(class_args)
472
478
  class_args["model_path"] = model_path
479
+ class_args["outputs"] = outputs
473
480
  state = TaskStep(
474
481
  class_name,
475
482
  class_args,
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "5f9d8acdee2fae27344dc81aca121f09962d54d4",
3
- "version": "1.8.0-rc35"
2
+ "git_commit": "47544e1aeb02b81f6d3dfe7e56c3d10831956016",
3
+ "version": "1.8.0-rc37"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mlrun
3
- Version: 1.8.0rc35
3
+ Version: 1.8.0rc37
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -6,19 +6,19 @@ mlrun/execution.py,sha256=FUktsD3puSFjc3LZJU35b-OmFBrBPBNntViCLQVuwnk,50008
6
6
  mlrun/features.py,sha256=ReBaNGsBYXqcbgI012n-SO_j6oHIbk_Vpv0CGPXbUmo,15842
7
7
  mlrun/k8s_utils.py,sha256=-RmKAlSBo_qVeJa1bIiwi6TUyuEpb4AhF7wIQ_H5ZJ0,8909
8
8
  mlrun/lists.py,sha256=-nbmqScRia0v2IdSHt6Pd0fLRLSEtdB9bSxyD92BWvs,8562
9
- mlrun/model.py,sha256=Fh8aoMVDiWY7CiMsuLGaA2zCv17DklmW2dbTp3ZpG7M,85368
9
+ mlrun/model.py,sha256=5YedJfY9La867fhW8sZJdWb4FwyXPR1r1C5SqYyB4_w,85864
10
10
  mlrun/render.py,sha256=940H9fBBFeghH4dlifbURvtjlvw4GlWdAXezN6ky4rI,13275
11
11
  mlrun/run.py,sha256=NScg8Acp62329jryOK5nldu2LYVkIZgSiEEg8IJrQwo,45124
12
12
  mlrun/secrets.py,sha256=dZPdkc_zzfscVQepOHUwmzFqnBavDCBXV9DQoH_eIYM,7800
13
13
  mlrun/alerts/__init__.py,sha256=0gtG1BG0DXxFrXegIkjbM1XEN4sP9ODo0ucXrNld1hU,601
14
14
  mlrun/alerts/alert.py,sha256=9kGTtV385Ax-aTm-450HzPwEek9e0c3O3Qln-jXjhFg,15948
15
- mlrun/api/schemas/__init__.py,sha256=UHUqUkMpmGtWuLN9YEwOcRB-J7IB1e59A9gy45rX7uk,14021
15
+ mlrun/api/schemas/__init__.py,sha256=tVAnpexDkfI0JWMJNlPSnVOzoV4xqIjWGSln9UkPS4I,13921
16
16
  mlrun/artifacts/__init__.py,sha256=ofC2extBCOC1wg1YtdTzWzH3eeG_f-sFBUkHjYtZJpk,1175
17
17
  mlrun/artifacts/base.py,sha256=nz2ZqC74JGfWN0M6_hOXXQj3bXSTxNp4eUgvWHVcdvY,29979
18
18
  mlrun/artifacts/dataset.py,sha256=QTot5vCgLHatlIWwNnKbWdZ8HHTxaZ7wk4gWQDoqQ2k,16655
19
19
  mlrun/artifacts/document.py,sha256=3X1i27NYSd-cOcX-lEvaNTUvwS2UKWXW2EnlfWokrVk,17374
20
20
  mlrun/artifacts/manager.py,sha256=MgUF_JYgQ_i7su3fqvK2CZ_uMxXyCB6M1jDr_k6tAYw,16191
21
- mlrun/artifacts/model.py,sha256=pfhbEIfTpXZ0xubc_PVP2OtQDUj-EThs6HlZnzPQQJU,22144
21
+ mlrun/artifacts/model.py,sha256=cad5pvEz3jmA7xgqfRUT5ojc3co0ikSD7UzO99NypQ0,22229
22
22
  mlrun/artifacts/plots.py,sha256=dS0mHGt1b20tN2JyEH9H5o5I0oMKZkzn3Uz_3Hf4WjU,4813
23
23
  mlrun/common/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
24
24
  mlrun/common/constants.py,sha256=14xMUX9C5BB-LxsTlMTJQf_Xz2DyRjaK9yeR5dadcDU,3426
@@ -39,10 +39,10 @@ mlrun/common/formatters/run.py,sha256=Gcf9lVDqxPMNfWcPX0RJasjTC_N_U0yTBkQ02jOPJ7
39
39
  mlrun/common/model_monitoring/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
40
40
  mlrun/common/model_monitoring/helpers.py,sha256=A2svqjCsZV8FmlimnY9QI_kKIEUJINu6YI7uJfO-Kn0,3173
41
41
  mlrun/common/runtimes/constants.py,sha256=PBpCtPixbKjP9aTo6Qqtui6FjWcXbFxhbSzduV4ttc4,12324
42
- mlrun/common/schemas/__init__.py,sha256=QuMQClP_LvEcUCKp0v2nmA_xUizm644SWvlIdZaP59Q,5335
42
+ mlrun/common/schemas/__init__.py,sha256=tNeYsylPAgG-3YI_Foka80alqm0JoCpXtuS_nDZzuaU,5324
43
43
  mlrun/common/schemas/alert.py,sha256=tRsjHEQTjCb-83GS0mprsu5junvqL4aQjWN2Rt_yAaM,10183
44
44
  mlrun/common/schemas/api_gateway.py,sha256=3a0QxECLmoDkD5IiOKtXJL-uiWB26Hg55WMA3nULYuI,7127
45
- mlrun/common/schemas/artifact.py,sha256=f0NPsoZmA-WD9RtN-dcKFW6KuV0PPQB25A2psF7LbP8,4013
45
+ mlrun/common/schemas/artifact.py,sha256=T-CdBIqgDUH-i8hx1Dp-Msr8v6UGwwp3d9j8rUzb9ZM,4249
46
46
  mlrun/common/schemas/auth.py,sha256=qYOCDbK-k7GTjwLseqGoxwcR-rdIbG2k7ct29M0sPUI,6880
47
47
  mlrun/common/schemas/background_task.py,sha256=ofWRAQGGEkXEu79Dbw7tT_5GPolR09Lc3Ebg2r0fT24,1728
48
48
  mlrun/common/schemas/client_spec.py,sha256=1RV2vx3PhXfk456b0qcU9R7dz4cisHsRD-HgjKeBdg0,2797
@@ -72,13 +72,13 @@ mlrun/common/schemas/secret.py,sha256=CCxFYiPwJtDxwg2VVJH9nUG9cAZ2a34IjeuaWv-BYl
72
72
  mlrun/common/schemas/serving.py,sha256=81ZxlDHP1fm9VPmXZGkjZj2n6cVRmqEN478hsmvv5QA,744
73
73
  mlrun/common/schemas/tag.py,sha256=HRZi5QZ4vVGaCr2AMk9eJgcNiAIXmH4YDc8a4fvF770,893
74
74
  mlrun/common/schemas/workflow.py,sha256=6u9niXfXpV-_c2rZL97gFIdAnOfM5WK-OCbrM5Kk34s,2108
75
- mlrun/common/schemas/model_monitoring/__init__.py,sha256=0mgmCpEAyqytI2Hjpqvp6Q83HvqIl2lUBYN5fO4Eo7c,1849
76
- mlrun/common/schemas/model_monitoring/constants.py,sha256=CuaHnTsMaqWfJgfUKpoLsb75JmSGss7USsYlv_C9nOI,12594
75
+ mlrun/common/schemas/model_monitoring/__init__.py,sha256=SxHG-GIdcTEuFxpKzkUdT9zKaU5Xqz9qF1uCwXvZ2z8,1709
76
+ mlrun/common/schemas/model_monitoring/constants.py,sha256=dqCAZQM9dw_6WIlf61XYMHY7TFi_ujSkWt1r_8YlXmg,12207
77
77
  mlrun/common/schemas/model_monitoring/grafana.py,sha256=THQlLfPBevBksta8p5OaIsBaJtsNSXexLvHrDxOaVns,2095
78
- mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=0gBH-KnDDbGLOkiqHtk0_iNIdW-NPVy0TKJnZ1fDcEQ,11807
78
+ mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=LIRtQ_gD7n17pQbacynp7Os8HyFwqobTKIPH0lwqoUA,11663
79
79
  mlrun/data_types/__init__.py,sha256=unRo9GGwCmj0hBKBRsXJ2P4BzpQaddlQTvIrVQaKluI,984
80
80
  mlrun/data_types/data_types.py,sha256=0_oKLC6-sXL2_nnaDMP_HSXB3fD1nJAG4J2Jq6sGNNw,4998
81
- mlrun/data_types/infer.py,sha256=KdaRgWcqvLkuLjXrMuDr3ik6WY7JP5wJO0Yii_Vl5kw,6173
81
+ mlrun/data_types/infer.py,sha256=Ogp3rsENVkjU0GDaGa9J1vjGrvMxgzwbSEuG51nt61E,6477
82
82
  mlrun/data_types/spark.py,sha256=4fPpqjFCYeFgK_yHhUNM4rT-1Gw9YiXazyjTK7TtbTI,9626
83
83
  mlrun/data_types/to_pandas.py,sha256=KOy0FLXPJirsgH6szcC5BI6t70yVDCjuo6LmuYHNTuI,11429
84
84
  mlrun/datastore/__init__.py,sha256=ca-9rcmxMimZKq3EHetpptZQ5udkf4O0sm37D7NWaXE,4128
@@ -95,7 +95,7 @@ mlrun/datastore/inmem.py,sha256=IsM83nn-3CqmGdLzim7i9ZmJwG6ZGhBZGN6_hszWZnE,2951
95
95
  mlrun/datastore/redis.py,sha256=QeNMkSz3zQXiXZhFUZcEtViqqbUysGJditbqe5M-J48,5682
96
96
  mlrun/datastore/s3.py,sha256=GjJnQLrigCqU9_ukRWv1pKhxfUtrMGFBUp6fmpPXUCY,9224
97
97
  mlrun/datastore/snowflake_utils.py,sha256=Wohvnlmq8j1d98RCaknll-iWdZZpSlCrKhUOEy0_-CA,1483
98
- mlrun/datastore/sources.py,sha256=LnFeiYxcotw_H_vIwCORE8fFaJB21XGBG77iJKaYHmI,49240
98
+ mlrun/datastore/sources.py,sha256=2kgQZ_I_rOpyEb3FSivXNqR5jUO7qcgqjBEVO3u7ccU,49472
99
99
  mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
100
100
  mlrun/datastore/spark_utils.py,sha256=_AsVoU5Ix_-W7Gyq8io8V-2GTk0m8THJNDP3WGGaWJY,2865
101
101
  mlrun/datastore/store_resources.py,sha256=PFOMrZ6KH6hBOb0PiO-cHx_kv0UpHu5P2t8_mrR-lS4,6842
@@ -108,12 +108,12 @@ mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev
108
108
  mlrun/datastore/wasbfs/fs.py,sha256=ge8NK__5vTcFT-krI155_8RDUywQw4SIRX6BWATXy9Q,6299
109
109
  mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
110
110
  mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
111
- mlrun/db/base.py,sha256=ax9d2J3mLMZKGomiPHQKfIEB25ZkZXjwtmUfPxUMpz4,30736
111
+ mlrun/db/base.py,sha256=AZ7qf1SbQ3jN6Pay-ZcFYxVYJr1UxL9aXpMPmrGog1E,30713
112
112
  mlrun/db/factory.py,sha256=yP2vVmveUE7LYTCHbS6lQIxP9rW--zdISWuPd_I3d_4,2111
113
- mlrun/db/httpdb.py,sha256=mY9IxwFsUPnzzbSBiIm2USGHJ-TKWvoMySy94weYH3k,229743
114
- mlrun/db/nopdb.py,sha256=LUz6psaNY-X8isKWsnxUbnTq9vOz2REOUF8BbRl2PTQ,27171
115
- mlrun/feature_store/__init__.py,sha256=AVnY2AFUNc2dKxLLUMx2K3Wo1eGviv0brDcYlDnmtf4,1506
116
- mlrun/feature_store/api.py,sha256=qkojZpzqGAn3r9ww0ynBRKOs8ji8URaK4DSYD4SE-CE,50395
113
+ mlrun/db/httpdb.py,sha256=Yja0gp4D7RNDaj3aIYVaUo2lO_BVFtH2nVWvf7VLsXo,230688
114
+ mlrun/db/nopdb.py,sha256=QHiGM2KWnuZL-L0GZ0T9oon6ETSS2oIW0I6Eq5yfFIg,27148
115
+ mlrun/feature_store/__init__.py,sha256=MP8OZzOaRsFd_sLvlnxDhoJMW-H8AEGGprmhVCVssfY,1264
116
+ mlrun/feature_store/api.py,sha256=I52lZg1sm9c4mL7hCx2ij6XKO6ybmyHdOOuwe5OPUqk,33309
117
117
  mlrun/feature_store/common.py,sha256=Z7USI-d1fo0iwBMsqMBtJflJfyuiV3BLoDXQPSAoBAs,12826
118
118
  mlrun/feature_store/feature_set.py,sha256=lakkuKYAvYDJKDTE0xJa5n1nEipMPwpLki-J3CMk0mQ,56221
119
119
  mlrun/feature_store/feature_vector.py,sha256=9EJXdnPklwKdkYDKV0hxByIjd59K6R2S-DnP7jZlwoY,44602
@@ -228,7 +228,7 @@ mlrun/model_monitoring/applications/__init__.py,sha256=xDBxkBjl-whHSG_4t1mLkxiyp
228
228
  mlrun/model_monitoring/applications/_application_steps.py,sha256=97taCEkfGx-QO-gD9uKnRF1PDIxQhY7sjPg85GxgIpA,6628
229
229
  mlrun/model_monitoring/applications/base.py,sha256=7XL12idItWkoE3CJ_48F6cwVx5pJH3bgfG92hb8LcN8,24872
230
230
  mlrun/model_monitoring/applications/context.py,sha256=xqbKS61iXE6jBekyW8zjo_E3lxe2D8VepuXG_BA5y2k,14931
231
- mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=G26_4gQfcwDZe3S6SIZ4Uc_qyrHAJ6lDTFOQGkbfQR8,14455
231
+ mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=RnrSRkNM5WYOjhiEIdkmYmUDGNnuRL8xtV-CpJ83r1U,15233
232
232
  mlrun/model_monitoring/applications/results.py,sha256=_qmj6TWT0SR2bi7gUyRKBU418eGgGoLW2_hTJ7S-ock,5782
233
233
  mlrun/model_monitoring/applications/evidently/__init__.py,sha256=-DqdPnBSrjZhFvKOu_Ie3MiFvlur9sPTZpZ1u0_1AE8,690
234
234
  mlrun/model_monitoring/applications/evidently/base.py,sha256=C8402vQJH7jmY-i49DnYjy6p6dETWex4Tdi8ylFLecA,5097
@@ -241,7 +241,7 @@ mlrun/model_monitoring/db/tsdb/helpers.py,sha256=0oUXc4aUkYtP2SGP6jTb3uPPKImIUsV
241
241
  mlrun/model_monitoring/db/tsdb/tdengine/__init__.py,sha256=vgBdsKaXUURKqIf3M0y4sRatmSVA4CQiJs7J5dcVBkQ,620
242
242
  mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=qfKDUZhgteL0mp2A1aP1iMmcthgUMKmZqMUidZjQktQ,12649
243
243
  mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py,sha256=Uadj0UvAmln2MxDWod-kAzau1uNlqZh981rPhbUH_5M,2857
244
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=OgIA-S-DZ3DM455zOk24rUsmM2EdrKbliuKs1Lzcpuw,32793
244
+ mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=2uSpIUpUGoFRCgrSv0RLGWoR7oc69GWW_bLbmjtfYEk,34860
245
245
  mlrun/model_monitoring/db/tsdb/v3io/__init__.py,sha256=aL3bfmQsUQ-sbvKGdNihFj8gLCK3mSys0qDcXtYOwgc,616
246
246
  mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py,sha256=_-zo9relCDtjGgievxAcAP9gVN9nDWs8BzGtFwTjb9M,6284
247
247
  mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py,sha256=foxYWx7OjOfat2SHmzYrG8bIfaQ5NDnBtpDZua_NVGE,41141
@@ -269,7 +269,7 @@ mlrun/platforms/iguazio.py,sha256=6VBTq8eQ3mzT96tzjYhAtcMQ2VjF4x8LpIPW5DAcX2Q,13
269
269
  mlrun/projects/__init__.py,sha256=0Krf0WIKfnZa71WthYOg0SoaTodGg3sV_hK3f_OlTPI,1220
270
270
  mlrun/projects/operations.py,sha256=VXUlMrouFTls-I-bMhdN5pPfQ34TR7bFQ-NUSWNvl84,20029
271
271
  mlrun/projects/pipelines.py,sha256=QH2nEhaJxhafJdT0AXPzpDhTniyHtc0Cg74Spdz6Oeg,48255
272
- mlrun/projects/project.py,sha256=ox7ey4sIyEDJl1-vfaFBzZ8DQq2b2tpeEiIhAWyOwTc,234966
272
+ mlrun/projects/project.py,sha256=bNUlWONGLxL8vCsKgwOiYGPXFEgvLaVjTSAoJGROZLY,234920
273
273
  mlrun/runtimes/__init__.py,sha256=J9Sy2HiyMlztNv6VUurMzF5H2XzttNil8nRsWDsqLyg,8923
274
274
  mlrun/runtimes/base.py,sha256=K5-zfFrE_HR6AaHWs2figaOTr7eosw3-4bELkYzpRk4,37789
275
275
  mlrun/runtimes/daskjob.py,sha256=JwuGvOiPsxEDHHMMUS4Oie4hLlYYIZwihAl6DjroTY0,19521
@@ -291,9 +291,9 @@ mlrun/runtimes/mpijob/abstract.py,sha256=JGMjcJ4dvpJbctF6psU9UvYyNCutMxTMgBQeTlz
291
291
  mlrun/runtimes/mpijob/v1.py,sha256=1XQZC7AIMGX_AQCbApcwpH8I7y39-v0v2O35MvxjXoo,3213
292
292
  mlrun/runtimes/nuclio/__init__.py,sha256=gx1kizzKv8pGT5TNloN1js1hdbxqDw3rM90sLVYVffY,794
293
293
  mlrun/runtimes/nuclio/api_gateway.py,sha256=vH9ClKVP4Mb24rvA67xPuAvAhX-gAv6vVtjVxyplhdc,26969
294
- mlrun/runtimes/nuclio/function.py,sha256=QCHlcC6ESw7fb0I0nZGv__XVHvGxBGQmtzby9EXhbG8,54097
294
+ mlrun/runtimes/nuclio/function.py,sha256=EkcDj5UgNzqfNblbpgAND30qbosp4inAx4BwhYa2Jg8,54586
295
295
  mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
296
- mlrun/runtimes/nuclio/serving.py,sha256=SfvRcujt4EYYWwpNSJgozGhbn85OOSmpIrQNSOJYPCs,32222
296
+ mlrun/runtimes/nuclio/serving.py,sha256=rkNR-sJ1WKS5wEOsYNQ34pRzIENWz81QmZnXr9AuLg4,32685
297
297
  mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
298
298
  mlrun/runtimes/nuclio/application/application.py,sha256=HlEq4A6hbFqr3Ba3TL4m7nbmfMYI06Zb_NAKGjzkEFU,29242
299
299
  mlrun/runtimes/nuclio/application/reverse_proxy.go,sha256=JIIYae6bXzCLf3jXuu49KWPQYoXr_FDQ2Rbo1OWKAd0,3150
@@ -339,11 +339,11 @@ mlrun/utils/notifications/notification/mail.py,sha256=ZyJ3eqd8simxffQmXzqd3bgbAq
339
339
  mlrun/utils/notifications/notification/slack.py,sha256=eQvmctTh6wIG5xVOesLLV9S1-UUCu5UEQ9JIJOor3ts,7183
340
340
  mlrun/utils/notifications/notification/webhook.py,sha256=NeyIMSBojjjTJaUHmPbxMByp34GxYkl1-16NqzU27fU,4943
341
341
  mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
342
- mlrun/utils/version/version.json,sha256=fTXvMCOFPnwWkvjbkdV-GKnWlgjwVYT4B-biO9D6dRs,89
342
+ mlrun/utils/version/version.json,sha256=FFiu4Ob8EieKg4vHzsKJT0xi8JMKnsB2ZSCwLJgdFno,89
343
343
  mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
344
- mlrun-1.8.0rc35.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
345
- mlrun-1.8.0rc35.dist-info/METADATA,sha256=dfxit0GGLGyW9aKew_CiVd7HFbrwkyaHXPruw833wjQ,25986
346
- mlrun-1.8.0rc35.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
347
- mlrun-1.8.0rc35.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
348
- mlrun-1.8.0rc35.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
349
- mlrun-1.8.0rc35.dist-info/RECORD,,
344
+ mlrun-1.8.0rc37.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
345
+ mlrun-1.8.0rc37.dist-info/METADATA,sha256=8KzKclwmXJVyUzlVJAmAhOsxjBZHIkYVtnBqY3LC8bE,25986
346
+ mlrun-1.8.0rc37.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
347
+ mlrun-1.8.0rc37.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
348
+ mlrun-1.8.0rc37.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
349
+ mlrun-1.8.0rc37.dist-info/RECORD,,