mlrun 1.7.0rc42__py3-none-any.whl → 1.7.0rc43__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/artifacts/manager.py +6 -1
- mlrun/common/schemas/__init__.py +1 -0
- mlrun/common/schemas/frontend_spec.py +7 -0
- mlrun/common/schemas/notification.py +32 -5
- mlrun/config.py +19 -1
- mlrun/datastore/base.py +0 -3
- mlrun/datastore/storeytargets.py +2 -1
- mlrun/datastore/targets.py +17 -4
- mlrun/execution.py +4 -1
- mlrun/k8s_utils.py +48 -2
- mlrun/model.py +2 -1
- mlrun/model_monitoring/helpers.py +0 -7
- mlrun/model_monitoring/writer.py +5 -1
- mlrun/projects/project.py +125 -47
- mlrun/runtimes/local.py +4 -1
- mlrun/runtimes/nuclio/application/application.py +3 -2
- mlrun/runtimes/pod.py +2 -0
- mlrun/runtimes/sparkjob/spark3job.py +4 -0
- mlrun/utils/async_http.py +1 -1
- mlrun/utils/helpers.py +17 -0
- mlrun/utils/notifications/notification/__init__.py +0 -1
- mlrun/utils/version/version.json +2 -2
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/METADATA +10 -10
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/RECORD +28 -28
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/LICENSE +0 -0
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/WHEEL +0 -0
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/entry_points.txt +0 -0
- {mlrun-1.7.0rc42.dist-info → mlrun-1.7.0rc43.dist-info}/top_level.txt +0 -0
mlrun/artifacts/manager.py
CHANGED
|
@@ -72,7 +72,12 @@ class ArtifactProducer:
|
|
|
72
72
|
self.inputs = {}
|
|
73
73
|
|
|
74
74
|
def get_meta(self) -> dict:
|
|
75
|
-
return {
|
|
75
|
+
return {
|
|
76
|
+
"kind": self.kind,
|
|
77
|
+
"name": self.name,
|
|
78
|
+
"tag": self.tag,
|
|
79
|
+
"owner": self.owner,
|
|
80
|
+
}
|
|
76
81
|
|
|
77
82
|
@property
|
|
78
83
|
def uid(self):
|
mlrun/common/schemas/__init__.py
CHANGED
|
@@ -50,6 +50,12 @@ class FeatureFlags(pydantic.BaseModel):
|
|
|
50
50
|
preemption_nodes: PreemptionNodesFeatureFlag
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
class ArtifactLimits(pydantic.BaseModel):
|
|
54
|
+
max_chunk_size: int
|
|
55
|
+
max_preview_size: int
|
|
56
|
+
max_download_size: int
|
|
57
|
+
|
|
58
|
+
|
|
53
59
|
class FrontendSpec(pydantic.BaseModel):
|
|
54
60
|
jobs_dashboard_url: typing.Optional[str]
|
|
55
61
|
model_monitoring_dashboard_url: typing.Optional[str]
|
|
@@ -71,3 +77,4 @@ class FrontendSpec(pydantic.BaseModel):
|
|
|
71
77
|
allowed_artifact_path_prefixes_list: list[str]
|
|
72
78
|
ce: typing.Optional[dict]
|
|
73
79
|
internal_labels: list[str] = []
|
|
80
|
+
artifact_limits: ArtifactLimits
|
|
@@ -22,11 +22,38 @@ import mlrun.common.types
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class NotificationKind(mlrun.common.types.StrEnum):
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
"""Currently, the supported notification kinds and their params are as follows:"""
|
|
26
|
+
|
|
27
|
+
console: str = "console"
|
|
28
|
+
"""no params, local only"""
|
|
29
|
+
|
|
30
|
+
git: str = "git"
|
|
31
|
+
"""
|
|
32
|
+
**token** - The git token to use for the git notification.\n
|
|
33
|
+
**repo** - The git repo to which to send the notification.\n
|
|
34
|
+
**issue** - The git issue to which to send the notification.\n
|
|
35
|
+
**merge_request** -
|
|
36
|
+
In GitLab (as opposed to GitHub), merge requests and issues are separate entities.
|
|
37
|
+
If using merge request, the issue will be ignored, and vice versa.\n
|
|
38
|
+
**server** - The git server to which to send the notification.\n
|
|
39
|
+
**gitlab** - (bool) Whether the git server is GitLab or not.\n
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
ipython: str = "ipython"
|
|
43
|
+
"""no params, local only"""
|
|
44
|
+
|
|
45
|
+
slack: str = "slack"
|
|
46
|
+
"""**webhook** - The slack webhook to which to send the notification."""
|
|
47
|
+
|
|
48
|
+
webhook: str = "webhook"
|
|
49
|
+
"""
|
|
50
|
+
**url** - The webhook url to which to send the notification.\n
|
|
51
|
+
**method** - The http method to use when sending the notification (GET, POST, PUT, etc…).\n
|
|
52
|
+
**headers** - (dict) The http headers to send with the notification.\n
|
|
53
|
+
**override_body** - (dict) The body to send with the notification.\n
|
|
54
|
+
**verify_ssl** -
|
|
55
|
+
(bool) Whether SSL certificates are validated during HTTP requests or not, The default is set to True.
|
|
56
|
+
"""
|
|
30
57
|
|
|
31
58
|
|
|
32
59
|
class NotificationSeverity(mlrun.common.types.StrEnum):
|
mlrun/config.py
CHANGED
|
@@ -27,6 +27,7 @@ import copy
|
|
|
27
27
|
import json
|
|
28
28
|
import os
|
|
29
29
|
import typing
|
|
30
|
+
import warnings
|
|
30
31
|
from collections.abc import Mapping
|
|
31
32
|
from datetime import timedelta
|
|
32
33
|
from distutils.util import strtobool
|
|
@@ -35,6 +36,7 @@ from threading import Lock
|
|
|
35
36
|
|
|
36
37
|
import dotenv
|
|
37
38
|
import semver
|
|
39
|
+
import urllib3.exceptions
|
|
38
40
|
import yaml
|
|
39
41
|
|
|
40
42
|
import mlrun.common.constants
|
|
@@ -152,6 +154,11 @@ default_config = {
|
|
|
152
154
|
"datasets": {
|
|
153
155
|
"max_preview_columns": 100,
|
|
154
156
|
},
|
|
157
|
+
"limits": {
|
|
158
|
+
"max_chunk_size": 1024 * 1024 * 1, # 1MB
|
|
159
|
+
"max_preview_size": 1024 * 1024 * 10, # 10MB
|
|
160
|
+
"max_download_size": 1024 * 1024 * 100, # 100MB
|
|
161
|
+
},
|
|
155
162
|
},
|
|
156
163
|
# FIXME: Adding these defaults here so we won't need to patch the "installing component" (provazio-controller) to
|
|
157
164
|
# configure this values on field systems, for newer system this will be configured correctly
|
|
@@ -326,7 +333,7 @@ default_config = {
|
|
|
326
333
|
"http": {
|
|
327
334
|
# when True, the client will verify the server's TLS
|
|
328
335
|
# set to False for backwards compatibility.
|
|
329
|
-
"verify":
|
|
336
|
+
"verify": True,
|
|
330
337
|
},
|
|
331
338
|
"db": {
|
|
332
339
|
"commit_retry_timeout": 30,
|
|
@@ -1292,6 +1299,7 @@ def _do_populate(env=None, skip_errors=False):
|
|
|
1292
1299
|
if data:
|
|
1293
1300
|
config.update(data, skip_errors=skip_errors)
|
|
1294
1301
|
|
|
1302
|
+
_configure_ssl_verification(config.httpdb.http.verify)
|
|
1295
1303
|
_validate_config(config)
|
|
1296
1304
|
|
|
1297
1305
|
|
|
@@ -1351,6 +1359,16 @@ def _convert_str(value, typ):
|
|
|
1351
1359
|
return typ(value)
|
|
1352
1360
|
|
|
1353
1361
|
|
|
1362
|
+
def _configure_ssl_verification(verify_ssl: bool) -> None:
|
|
1363
|
+
"""Configure SSL verification warnings based on the setting."""
|
|
1364
|
+
if not verify_ssl:
|
|
1365
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
1366
|
+
else:
|
|
1367
|
+
# If the user changes the `verify` setting to `True` at runtime using `mlrun.set_env_from_file` after
|
|
1368
|
+
# importing `mlrun`, we need to reload the `mlrun` configuration and enable this warning.
|
|
1369
|
+
warnings.simplefilter("default", urllib3.exceptions.InsecureRequestWarning)
|
|
1370
|
+
|
|
1371
|
+
|
|
1354
1372
|
def read_env(env=None, prefix=env_prefix):
|
|
1355
1373
|
"""Read configuration from environment"""
|
|
1356
1374
|
env = os.environ if env is None else env
|
mlrun/datastore/base.py
CHANGED
|
@@ -24,7 +24,6 @@ import pandas as pd
|
|
|
24
24
|
import pyarrow
|
|
25
25
|
import pytz
|
|
26
26
|
import requests
|
|
27
|
-
import urllib3
|
|
28
27
|
from deprecated import deprecated
|
|
29
28
|
|
|
30
29
|
import mlrun.config
|
|
@@ -745,8 +744,6 @@ class HttpStore(DataStore):
|
|
|
745
744
|
|
|
746
745
|
verify_ssl = mlconf.httpdb.http.verify
|
|
747
746
|
try:
|
|
748
|
-
if not verify_ssl:
|
|
749
|
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
750
747
|
response = requests.get(url, headers=headers, auth=auth, verify=verify_ssl)
|
|
751
748
|
except OSError as exc:
|
|
752
749
|
raise OSError(f"error: cannot connect to {url}: {err_to_str(exc)}")
|
mlrun/datastore/storeytargets.py
CHANGED
|
@@ -137,7 +137,8 @@ class RedisNoSqlStoreyTarget(storey.NoSqlTarget):
|
|
|
137
137
|
def __init__(self, *args, **kwargs):
|
|
138
138
|
path = kwargs.pop("path")
|
|
139
139
|
endpoint, uri = mlrun.datastore.targets.RedisNoSqlTarget.get_server_endpoint(
|
|
140
|
-
path
|
|
140
|
+
path,
|
|
141
|
+
kwargs.pop("credentials_prefix", None),
|
|
141
142
|
)
|
|
142
143
|
kwargs["path"] = endpoint + "/" + uri
|
|
143
144
|
super().__init__(*args, **kwargs)
|
mlrun/datastore/targets.py
CHANGED
|
@@ -439,6 +439,12 @@ class BaseStoreTarget(DataTargetBase):
|
|
|
439
439
|
self.storage_options = storage_options
|
|
440
440
|
self.schema = schema or {}
|
|
441
441
|
self.credentials_prefix = credentials_prefix
|
|
442
|
+
if credentials_prefix:
|
|
443
|
+
warnings.warn(
|
|
444
|
+
"The 'credentials_prefix' parameter is deprecated and will be removed in "
|
|
445
|
+
"1.9.0. Please use datastore profiles instead.",
|
|
446
|
+
FutureWarning,
|
|
447
|
+
)
|
|
442
448
|
|
|
443
449
|
self._target = None
|
|
444
450
|
self._resource = None
|
|
@@ -1479,7 +1485,7 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
|
|
|
1479
1485
|
writer_step_name = "RedisNoSqlTarget"
|
|
1480
1486
|
|
|
1481
1487
|
@staticmethod
|
|
1482
|
-
def get_server_endpoint(path):
|
|
1488
|
+
def get_server_endpoint(path, credentials_prefix=None):
|
|
1483
1489
|
endpoint, uri = parse_path(path)
|
|
1484
1490
|
endpoint = endpoint or mlrun.mlconf.redis.url
|
|
1485
1491
|
if endpoint.startswith("ds://"):
|
|
@@ -1497,7 +1503,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
|
|
|
1497
1503
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
1498
1504
|
"Provide Redis username and password only via secrets"
|
|
1499
1505
|
)
|
|
1500
|
-
credentials_prefix = mlrun.get_secret_or_env(
|
|
1506
|
+
credentials_prefix = credentials_prefix or mlrun.get_secret_or_env(
|
|
1507
|
+
key="CREDENTIALS_PREFIX"
|
|
1508
|
+
)
|
|
1501
1509
|
user = mlrun.get_secret_or_env(
|
|
1502
1510
|
"REDIS_USER", default="", prefix=credentials_prefix
|
|
1503
1511
|
)
|
|
@@ -1517,7 +1525,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
|
|
|
1517
1525
|
from storey import Table
|
|
1518
1526
|
from storey.redis_driver import RedisDriver
|
|
1519
1527
|
|
|
1520
|
-
endpoint, uri = self.get_server_endpoint(
|
|
1528
|
+
endpoint, uri = self.get_server_endpoint(
|
|
1529
|
+
self.get_target_path(), self.credentials_prefix
|
|
1530
|
+
)
|
|
1521
1531
|
|
|
1522
1532
|
return Table(
|
|
1523
1533
|
uri,
|
|
@@ -1526,7 +1536,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
|
|
|
1526
1536
|
)
|
|
1527
1537
|
|
|
1528
1538
|
def get_spark_options(self, key_column=None, timestamp_key=None, overwrite=True):
|
|
1529
|
-
endpoint, uri = self.get_server_endpoint(
|
|
1539
|
+
endpoint, uri = self.get_server_endpoint(
|
|
1540
|
+
self.get_target_path(), self.credentials_prefix
|
|
1541
|
+
)
|
|
1530
1542
|
parsed_endpoint = urlparse(endpoint)
|
|
1531
1543
|
store, path_in_store, path = self._get_store_and_path()
|
|
1532
1544
|
return {
|
|
@@ -1577,6 +1589,7 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
|
|
|
1577
1589
|
class_name="mlrun.datastore.storeytargets.RedisNoSqlStoreyTarget",
|
|
1578
1590
|
columns=column_list,
|
|
1579
1591
|
table=table,
|
|
1592
|
+
credentials_prefix=self.credentials_prefix,
|
|
1580
1593
|
**self.attributes,
|
|
1581
1594
|
)
|
|
1582
1595
|
|
mlrun/execution.py
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import logging
|
|
15
16
|
import os
|
|
16
17
|
import uuid
|
|
17
18
|
from copy import deepcopy
|
|
@@ -168,6 +169,8 @@ class MLClientCtx:
|
|
|
168
169
|
@log_level.setter
|
|
169
170
|
def log_level(self, value: str):
|
|
170
171
|
"""Set the logging level, e.g. 'debug', 'info', 'error'"""
|
|
172
|
+
level = logging.getLevelName(value.upper())
|
|
173
|
+
self._logger.set_logger_level(level)
|
|
171
174
|
self._log_level = value
|
|
172
175
|
|
|
173
176
|
@property
|
|
@@ -335,7 +338,7 @@ class MLClientCtx:
|
|
|
335
338
|
"name": self.name,
|
|
336
339
|
"kind": "run",
|
|
337
340
|
"uri": uri,
|
|
338
|
-
"owner": get_in(self._labels,
|
|
341
|
+
"owner": get_in(self._labels, mlrun_constants.MLRunInternalLabels.owner),
|
|
339
342
|
}
|
|
340
343
|
if mlrun_constants.MLRunInternalLabels.workflow in self._labels:
|
|
341
344
|
resp[mlrun_constants.MLRunInternalLabels.workflow] = self._labels[
|
mlrun/k8s_utils.py
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import re
|
|
15
|
+
import warnings
|
|
15
16
|
|
|
16
17
|
import kubernetes.client
|
|
17
18
|
|
|
@@ -133,7 +134,7 @@ def sanitize_label_value(value: str) -> str:
|
|
|
133
134
|
return re.sub(r"([^a-zA-Z0-9_.-]|^[^a-zA-Z0-9]|[^a-zA-Z0-9]$)", "-", value[:63])
|
|
134
135
|
|
|
135
136
|
|
|
136
|
-
def verify_label_key(key: str):
|
|
137
|
+
def verify_label_key(key: str, allow_k8s_prefix: bool = False):
|
|
137
138
|
"""
|
|
138
139
|
Verify that the label key is valid for Kubernetes.
|
|
139
140
|
Refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set
|
|
@@ -146,6 +147,10 @@ def verify_label_key(key: str):
|
|
|
146
147
|
name = parts[0]
|
|
147
148
|
elif len(parts) == 2:
|
|
148
149
|
prefix, name = parts
|
|
150
|
+
if len(name) == 0:
|
|
151
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
152
|
+
"Label key name cannot be empty when a prefix is set"
|
|
153
|
+
)
|
|
149
154
|
if len(prefix) == 0:
|
|
150
155
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
151
156
|
"Label key prefix cannot be empty"
|
|
@@ -173,7 +178,13 @@ def verify_label_key(key: str):
|
|
|
173
178
|
mlrun.utils.regex.qualified_name,
|
|
174
179
|
)
|
|
175
180
|
|
|
176
|
-
|
|
181
|
+
# Allow the use of Kubernetes reserved prefixes ('k8s.io/' or 'kubernetes.io/')
|
|
182
|
+
# only when setting node selectors, not when adding new labels.
|
|
183
|
+
if (
|
|
184
|
+
key.startswith("k8s.io/")
|
|
185
|
+
or key.startswith("kubernetes.io/")
|
|
186
|
+
and not allow_k8s_prefix
|
|
187
|
+
):
|
|
177
188
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
178
189
|
"Labels cannot start with 'k8s.io/' or 'kubernetes.io/'"
|
|
179
190
|
)
|
|
@@ -185,3 +196,38 @@ def verify_label_value(value, label_key):
|
|
|
185
196
|
value,
|
|
186
197
|
mlrun.utils.regex.label_value,
|
|
187
198
|
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def validate_node_selectors(
|
|
202
|
+
node_selectors: dict[str, str], raise_on_error: bool = True
|
|
203
|
+
) -> bool:
|
|
204
|
+
"""
|
|
205
|
+
Ensures that user-defined node selectors adhere to Kubernetes label standards:
|
|
206
|
+
- Validates that each key conforms to Kubernetes naming conventions, with specific rules for name and prefix.
|
|
207
|
+
- Ensures values comply with Kubernetes label value rules.
|
|
208
|
+
- If raise_on_error is True, raises errors for invalid selectors.
|
|
209
|
+
- If raise_on_error is False, logs warnings for invalid selectors.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
# Helper function for handling errors or warnings
|
|
213
|
+
def handle_invalid(message):
|
|
214
|
+
if raise_on_error:
|
|
215
|
+
raise
|
|
216
|
+
else:
|
|
217
|
+
warnings.warn(
|
|
218
|
+
f"{message}\n"
|
|
219
|
+
f"The node selector you’ve set does not meet the validation rules for the current Kubernetes version. "
|
|
220
|
+
f"Please note that invalid node selectors may cause issues with function scheduling."
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
node_selectors = node_selectors or {}
|
|
224
|
+
for key, value in node_selectors.items():
|
|
225
|
+
try:
|
|
226
|
+
verify_label_key(key, allow_k8s_prefix=True)
|
|
227
|
+
verify_label_value(value, label_key=key)
|
|
228
|
+
except mlrun.errors.MLRunInvalidArgumentError as err:
|
|
229
|
+
# An error or warning is raised by handle_invalid due to validation failure.
|
|
230
|
+
# Returning False indicates validation failed, allowing us to exit the function.
|
|
231
|
+
handle_invalid(str(err))
|
|
232
|
+
return False
|
|
233
|
+
return True
|
mlrun/model.py
CHANGED
|
@@ -681,7 +681,8 @@ class ImageBuilder(ModelObj):
|
|
|
681
681
|
class Notification(ModelObj):
|
|
682
682
|
"""Notification object
|
|
683
683
|
|
|
684
|
-
:param kind: notification implementation kind - slack, webhook, etc.
|
|
684
|
+
:param kind: notification implementation kind - slack, webhook, etc. See
|
|
685
|
+
:py:class:`mlrun.common.schemas.notification.NotificationKind`
|
|
685
686
|
:param name: for logging and identification
|
|
686
687
|
:param message: message content in the notification
|
|
687
688
|
:param severity: severity to display in the notification
|
|
@@ -265,13 +265,6 @@ def calculate_inputs_statistics(
|
|
|
265
265
|
counts.tolist(),
|
|
266
266
|
bins.tolist(),
|
|
267
267
|
]
|
|
268
|
-
elif "hist" in inputs_statistics[feature]:
|
|
269
|
-
# Comply with the other common features' histogram length
|
|
270
|
-
mlrun.common.model_monitoring.helpers.pad_hist(
|
|
271
|
-
mlrun.common.model_monitoring.helpers.Histogram(
|
|
272
|
-
inputs_statistics[feature]["hist"]
|
|
273
|
-
)
|
|
274
|
-
)
|
|
275
268
|
else:
|
|
276
269
|
# If the feature is not in the sample set and doesn't have a histogram, remove it from the statistics:
|
|
277
270
|
inputs_statistics.pop(feature)
|
mlrun/model_monitoring/writer.py
CHANGED
|
@@ -258,9 +258,13 @@ class ModelMonitoringWriter(StepToDict):
|
|
|
258
258
|
"data drift app",
|
|
259
259
|
endpoint_id=endpoint_id,
|
|
260
260
|
)
|
|
261
|
+
attributes = json.loads(event[ResultData.RESULT_EXTRA_DATA])
|
|
262
|
+
attributes[EventFieldType.DRIFT_STATUS] = str(
|
|
263
|
+
attributes[EventFieldType.DRIFT_STATUS]
|
|
264
|
+
)
|
|
261
265
|
self._app_result_store.update_model_endpoint(
|
|
262
266
|
endpoint_id=endpoint_id,
|
|
263
|
-
attributes=
|
|
267
|
+
attributes=attributes,
|
|
264
268
|
)
|
|
265
269
|
|
|
266
270
|
logger.info("Model monitoring writer finished handling event")
|
mlrun/projects/project.py
CHANGED
|
@@ -18,6 +18,7 @@ import glob
|
|
|
18
18
|
import http
|
|
19
19
|
import importlib.util as imputil
|
|
20
20
|
import json
|
|
21
|
+
import os
|
|
21
22
|
import pathlib
|
|
22
23
|
import shutil
|
|
23
24
|
import tempfile
|
|
@@ -25,6 +26,7 @@ import typing
|
|
|
25
26
|
import uuid
|
|
26
27
|
import warnings
|
|
27
28
|
import zipfile
|
|
29
|
+
from copy import deepcopy
|
|
28
30
|
from os import environ, makedirs, path
|
|
29
31
|
from typing import Callable, Optional, Union
|
|
30
32
|
|
|
@@ -251,8 +253,7 @@ def new_project(
|
|
|
251
253
|
project.spec.description = description
|
|
252
254
|
|
|
253
255
|
if default_function_node_selector:
|
|
254
|
-
|
|
255
|
-
project.spec.default_function_node_selector[key] = val
|
|
256
|
+
project.spec.default_function_node_selector = default_function_node_selector
|
|
256
257
|
|
|
257
258
|
if parameters:
|
|
258
259
|
# Enable setting project parameters at load time, can be used to customize the project_setup
|
|
@@ -874,7 +875,7 @@ class ProjectSpec(ModelObj):
|
|
|
874
875
|
# in a tuple where the first index is the packager module's path (str) and the second is a flag (bool) for
|
|
875
876
|
# whether it is mandatory for a run (raise exception on collection error) or not.
|
|
876
877
|
self.custom_packagers = custom_packagers or []
|
|
877
|
-
self.
|
|
878
|
+
self._default_function_node_selector = default_function_node_selector or None
|
|
878
879
|
|
|
879
880
|
@property
|
|
880
881
|
def source(self) -> str:
|
|
@@ -1049,6 +1050,14 @@ class ProjectSpec(ModelObj):
|
|
|
1049
1050
|
if key in self._artifacts:
|
|
1050
1051
|
del self._artifacts[key]
|
|
1051
1052
|
|
|
1053
|
+
@property
|
|
1054
|
+
def default_function_node_selector(self):
|
|
1055
|
+
return self._default_function_node_selector
|
|
1056
|
+
|
|
1057
|
+
@default_function_node_selector.setter
|
|
1058
|
+
def default_function_node_selector(self, node_selector: dict[str, str]):
|
|
1059
|
+
self._default_function_node_selector = deepcopy(node_selector)
|
|
1060
|
+
|
|
1052
1061
|
@property
|
|
1053
1062
|
def build(self) -> ImageBuilder:
|
|
1054
1063
|
return self._build
|
|
@@ -2325,31 +2334,51 @@ class MlrunProject(ModelObj):
|
|
|
2325
2334
|
requirements: typing.Union[str, list[str]] = None,
|
|
2326
2335
|
requirements_file: str = "",
|
|
2327
2336
|
) -> mlrun.runtimes.BaseRuntime:
|
|
2328
|
-
"""
|
|
2337
|
+
"""
|
|
2338
|
+
| Update or add a function object to the project.
|
|
2339
|
+
| Function can be provided as an object (func) or a .py/.ipynb/.yaml URL.
|
|
2329
2340
|
|
|
2330
|
-
function
|
|
2331
|
-
|
|
2341
|
+
| Creating a function from a single file is done by specifying ``func`` and disabling ``with_repo``.
|
|
2342
|
+
| Creating a function with project source (specify ``with_repo=True``):
|
|
2343
|
+
| 1. Specify a relative ``func`` path.
|
|
2344
|
+
| 2. Specify a module ``handler`` (e.g. ``handler=package.package.func``) without ``func``.
|
|
2345
|
+
| Creating a function with non project source is done by specifying a module ``handler`` and on the
|
|
2346
|
+
returned function set the source with ``function.with_source_archive(<source>)``.
|
|
2332
2347
|
|
|
2333
|
-
|
|
2334
|
-
MLRun DB e.g. db://project/func:ver
|
|
2335
|
-
functions hub/market: e.g. hub://auto-trainer:master
|
|
2348
|
+
Support URL prefixes:
|
|
2336
2349
|
|
|
2337
|
-
|
|
2350
|
+
| Object (s3://, v3io://, ..)
|
|
2351
|
+
| MLRun DB e.g. db://project/func:ver
|
|
2352
|
+
| Functions hub/market: e.g. hub://auto-trainer:master
|
|
2353
|
+
|
|
2354
|
+
Examples::
|
|
2338
2355
|
|
|
2339
2356
|
proj.set_function(func_object)
|
|
2340
|
-
proj.set_function(
|
|
2341
|
-
"./src/mycode.py", "ingest", image="myrepo/ing:latest", with_repo=True
|
|
2342
|
-
)
|
|
2343
2357
|
proj.set_function("http://.../mynb.ipynb", "train")
|
|
2344
2358
|
proj.set_function("./func.yaml")
|
|
2345
2359
|
proj.set_function("hub://get_toy_data", "getdata")
|
|
2346
2360
|
|
|
2347
|
-
#
|
|
2361
|
+
# Create a function from a single file
|
|
2362
|
+
proj.set_function("./src/mycode.py", "ingest")
|
|
2348
2363
|
|
|
2349
|
-
#
|
|
2364
|
+
# Creating a function with project source
|
|
2365
|
+
proj.set_function(
|
|
2366
|
+
"./src/mycode.py", "ingest", image="myrepo/ing:latest", with_repo=True
|
|
2367
|
+
)
|
|
2368
|
+
proj.set_function("ingest", handler="package.package.func", with_repo=True)
|
|
2369
|
+
|
|
2370
|
+
# Creating a function with non project source
|
|
2371
|
+
func = proj.set_function(
|
|
2372
|
+
"ingest", handler="package.package.func", with_repo=False
|
|
2373
|
+
)
|
|
2374
|
+
func.with_source_archive("git://github.com/mlrun/something.git")
|
|
2375
|
+
|
|
2376
|
+
# Set function requirements
|
|
2377
|
+
|
|
2378
|
+
# By providing a list of packages
|
|
2350
2379
|
proj.set_function("my.py", requirements=["requests", "pandas"])
|
|
2351
2380
|
|
|
2352
|
-
#
|
|
2381
|
+
# By providing a path to a pip requirements file
|
|
2353
2382
|
proj.set_function("my.py", requirements="requirements.txt")
|
|
2354
2383
|
|
|
2355
2384
|
:param func: Function object or spec/code url, None refers to current Notebook
|
|
@@ -2369,7 +2398,7 @@ class MlrunProject(ModelObj):
|
|
|
2369
2398
|
:param requirements: A list of python packages
|
|
2370
2399
|
:param requirements_file: Path to a python requirements file
|
|
2371
2400
|
|
|
2372
|
-
:returns:
|
|
2401
|
+
:returns: :py:class:`~mlrun.runtimes.BaseRuntime`
|
|
2373
2402
|
"""
|
|
2374
2403
|
(
|
|
2375
2404
|
resolved_function_name,
|
|
@@ -2801,47 +2830,92 @@ class MlrunProject(ModelObj):
|
|
|
2801
2830
|
secrets=secrets or {},
|
|
2802
2831
|
)
|
|
2803
2832
|
|
|
2804
|
-
def sync_functions(
|
|
2805
|
-
|
|
2833
|
+
def sync_functions(
|
|
2834
|
+
self,
|
|
2835
|
+
names: list = None,
|
|
2836
|
+
always: bool = True,
|
|
2837
|
+
save: bool = False,
|
|
2838
|
+
silent: bool = False,
|
|
2839
|
+
):
|
|
2840
|
+
"""
|
|
2841
|
+
Reload function objects from specs and files.
|
|
2842
|
+
The function objects are synced against the definitions spec in `self.spec._function_definitions`.
|
|
2843
|
+
Referenced files/URLs in the function spec will be reloaded.
|
|
2844
|
+
Function definitions are parsed by the following precedence:
|
|
2845
|
+
1. Contains runtime spec.
|
|
2846
|
+
2. Contains module in the project's context.
|
|
2847
|
+
3. Contains path to function definition (yaml, DB, Hub).
|
|
2848
|
+
4. Contains path to .ipynb or .py files.
|
|
2849
|
+
5. Contains a Nuclio/Serving function image / an 'Application' kind definition.
|
|
2850
|
+
If function definition is already an object, some project metadata updates will apply however,
|
|
2851
|
+
it will not be reloaded.
|
|
2852
|
+
|
|
2853
|
+
:param names: Names of functions to reload, defaults to `self.spec._function_definitions.keys()`.
|
|
2854
|
+
:param always: Force reloading the functions.
|
|
2855
|
+
:param save: Whether to save the loaded functions or not.
|
|
2856
|
+
:param silent: Whether to raise an exception when a function fails to load.
|
|
2857
|
+
|
|
2858
|
+
:returns: Dictionary of function objects
|
|
2859
|
+
"""
|
|
2806
2860
|
if self._initialized and not always:
|
|
2807
2861
|
return self.spec._function_objects
|
|
2808
2862
|
|
|
2809
|
-
|
|
2863
|
+
functions = self.spec._function_objects
|
|
2810
2864
|
if not names:
|
|
2811
2865
|
names = self.spec._function_definitions.keys()
|
|
2812
|
-
|
|
2866
|
+
functions = {}
|
|
2867
|
+
|
|
2813
2868
|
origin = mlrun.runtimes.utils.add_code_metadata(self.spec.context)
|
|
2814
2869
|
for name in names:
|
|
2815
|
-
|
|
2816
|
-
if not
|
|
2817
|
-
|
|
2870
|
+
function_definition = self.spec._function_definitions.get(name)
|
|
2871
|
+
if not function_definition:
|
|
2872
|
+
if silent:
|
|
2873
|
+
logger.warn(
|
|
2874
|
+
"Function definition was not found, skipping reload", name=name
|
|
2875
|
+
)
|
|
2876
|
+
continue
|
|
2877
|
+
|
|
2878
|
+
raise ValueError(f"Function named {name} not found")
|
|
2879
|
+
|
|
2880
|
+
function_object = self.spec._function_objects.get(name, None)
|
|
2881
|
+
is_base_runtime = isinstance(
|
|
2882
|
+
function_object, mlrun.runtimes.base.BaseRuntime
|
|
2883
|
+
)
|
|
2818
2884
|
# If this function is already available locally, don't recreate it unless always=True
|
|
2819
|
-
if
|
|
2820
|
-
|
|
2821
|
-
self.spec._function_objects.get(name, None),
|
|
2822
|
-
mlrun.runtimes.base.BaseRuntime,
|
|
2823
|
-
)
|
|
2824
|
-
and not always
|
|
2825
|
-
):
|
|
2826
|
-
funcs[name] = self.spec._function_objects[name]
|
|
2885
|
+
if is_base_runtime and not always:
|
|
2886
|
+
functions[name] = function_object
|
|
2827
2887
|
continue
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2888
|
+
|
|
2889
|
+
# Reload the function
|
|
2890
|
+
if hasattr(function_definition, "to_dict"):
|
|
2891
|
+
name, func = _init_function_from_obj(function_definition, self, name)
|
|
2892
|
+
elif isinstance(function_definition, dict):
|
|
2833
2893
|
try:
|
|
2834
|
-
name, func = _init_function_from_dict(
|
|
2894
|
+
name, func = _init_function_from_dict(
|
|
2895
|
+
function_definition, self, name
|
|
2896
|
+
)
|
|
2835
2897
|
except FileNotFoundError as exc:
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2898
|
+
message = f"File {exc.filename} not found while syncing project functions."
|
|
2899
|
+
if silent:
|
|
2900
|
+
message += " Skipping function reload"
|
|
2901
|
+
logger.warn(message, name=name)
|
|
2902
|
+
continue
|
|
2903
|
+
|
|
2904
|
+
raise mlrun.errors.MLRunMissingDependencyError(message) from exc
|
|
2905
|
+
else:
|
|
2906
|
+
message = f"Function {name} must be an object or dict."
|
|
2907
|
+
if silent:
|
|
2908
|
+
message += " Skipping function reload"
|
|
2909
|
+
logger.warn(message, name=name)
|
|
2910
|
+
continue
|
|
2911
|
+
raise ValueError(message)
|
|
2912
|
+
|
|
2839
2913
|
func.spec.build.code_origin = origin
|
|
2840
|
-
|
|
2914
|
+
functions[name] = func
|
|
2841
2915
|
if save:
|
|
2842
2916
|
func.save(versioned=False)
|
|
2843
2917
|
|
|
2844
|
-
self.spec._function_objects =
|
|
2918
|
+
self.spec._function_objects = functions
|
|
2845
2919
|
self._initialized = True
|
|
2846
2920
|
return self.spec._function_objects
|
|
2847
2921
|
|
|
@@ -3041,11 +3115,10 @@ class MlrunProject(ModelObj):
|
|
|
3041
3115
|
)
|
|
3042
3116
|
|
|
3043
3117
|
if engine not in ["remote"] and not schedule:
|
|
3044
|
-
# For remote/scheduled runs
|
|
3045
|
-
|
|
3046
|
-
self.sync_functions(always=sync)
|
|
3118
|
+
# For remote/scheduled runs there is no need to sync functions as they can be loaded dynamically during run
|
|
3119
|
+
self.sync_functions(always=sync, silent=True)
|
|
3047
3120
|
if not self.spec._function_objects:
|
|
3048
|
-
|
|
3121
|
+
logger.warn(
|
|
3049
3122
|
"There are no functions in the project."
|
|
3050
3123
|
" Make sure you've set your functions with project.set_function()."
|
|
3051
3124
|
)
|
|
@@ -4289,6 +4362,7 @@ class MlrunProject(ModelObj):
|
|
|
4289
4362
|
kind=producer_dict.get("kind", ""),
|
|
4290
4363
|
project=producer_project,
|
|
4291
4364
|
tag=producer_tag,
|
|
4365
|
+
owner=producer_dict.get("owner", ""),
|
|
4292
4366
|
), True
|
|
4293
4367
|
|
|
4294
4368
|
# do not retain the artifact's producer, replace it with the project as the producer
|
|
@@ -4298,6 +4372,7 @@ class MlrunProject(ModelObj):
|
|
|
4298
4372
|
name=self.metadata.name,
|
|
4299
4373
|
project=self.metadata.name,
|
|
4300
4374
|
tag=project_producer_tag,
|
|
4375
|
+
owner=self._resolve_artifact_owner(),
|
|
4301
4376
|
), False
|
|
4302
4377
|
|
|
4303
4378
|
def _resolve_existing_artifact(
|
|
@@ -4337,6 +4412,9 @@ class MlrunProject(ModelObj):
|
|
|
4337
4412
|
def _get_project_tag(self):
|
|
4338
4413
|
return self._get_hexsha() or str(uuid.uuid4())
|
|
4339
4414
|
|
|
4415
|
+
def _resolve_artifact_owner(self):
|
|
4416
|
+
return os.getenv("V3IO_USERNAME") or self.spec.owner
|
|
4417
|
+
|
|
4340
4418
|
|
|
4341
4419
|
def _set_as_current_default_project(project: MlrunProject):
|
|
4342
4420
|
mlrun.mlconf.default_project = project.metadata.name
|
mlrun/runtimes/local.py
CHANGED
|
@@ -145,7 +145,10 @@ class ParallelRunner:
|
|
|
145
145
|
if function_name and generator.options.teardown_dask:
|
|
146
146
|
logger.info("Tearing down the dask cluster..")
|
|
147
147
|
mlrun.get_run_db().delete_runtime_resources(
|
|
148
|
-
|
|
148
|
+
project=self.metadata.project,
|
|
149
|
+
kind=mlrun.runtimes.RuntimeKinds.dask,
|
|
150
|
+
object_id=function_name,
|
|
151
|
+
force=True,
|
|
149
152
|
)
|
|
150
153
|
|
|
151
154
|
return results
|
|
@@ -438,8 +438,9 @@ class ApplicationRuntime(RemoteRuntime):
|
|
|
438
438
|
"""
|
|
439
439
|
Create the application API gateway. Once the application is deployed, the API gateway can be created.
|
|
440
440
|
An application without an API gateway is not accessible.
|
|
441
|
-
:param name: The name of the API gateway
|
|
442
|
-
:param path: Optional path of the API gateway, default value is "/"
|
|
441
|
+
:param name: The name of the API gateway
|
|
442
|
+
:param path: Optional path of the API gateway, default value is "/".
|
|
443
|
+
The given path should be supported by the deployed application
|
|
443
444
|
:param direct_port_access: Set True to allow direct port access to the application sidecar
|
|
444
445
|
:param authentication_mode: API Gateway authentication mode
|
|
445
446
|
:param authentication_creds: API Gateway basic authentication credentials as a tuple (username, password)
|
mlrun/runtimes/pod.py
CHANGED
|
@@ -38,6 +38,7 @@ from ..k8s_utils import (
|
|
|
38
38
|
generate_preemptible_nodes_affinity_terms,
|
|
39
39
|
generate_preemptible_nodes_anti_affinity_terms,
|
|
40
40
|
generate_preemptible_tolerations,
|
|
41
|
+
validate_node_selectors,
|
|
41
42
|
)
|
|
42
43
|
from ..utils import logger, update_in
|
|
43
44
|
from .base import BaseRuntime, FunctionSpec, spec_fields
|
|
@@ -1175,6 +1176,7 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
|
|
|
1175
1176
|
if node_name:
|
|
1176
1177
|
self.spec.node_name = node_name
|
|
1177
1178
|
if node_selector is not None:
|
|
1179
|
+
validate_node_selectors(node_selectors=node_selector, raise_on_error=False)
|
|
1178
1180
|
self.spec.node_selector = node_selector
|
|
1179
1181
|
if affinity is not None:
|
|
1180
1182
|
self.spec.affinity = affinity
|
|
@@ -18,6 +18,7 @@ from mlrun_pipelines.mounts import mount_v3io, mount_v3iod
|
|
|
18
18
|
|
|
19
19
|
import mlrun.common.schemas.function
|
|
20
20
|
import mlrun.errors
|
|
21
|
+
import mlrun.k8s_utils
|
|
21
22
|
import mlrun.runtimes.pod
|
|
22
23
|
from mlrun.config import config
|
|
23
24
|
|
|
@@ -505,6 +506,7 @@ class Spark3Runtime(KubejobRuntime):
|
|
|
505
506
|
raise NotImplementedError(
|
|
506
507
|
"Setting node name is not supported for spark runtime"
|
|
507
508
|
)
|
|
509
|
+
mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
|
|
508
510
|
self.with_driver_node_selection(node_name, node_selector, affinity, tolerations)
|
|
509
511
|
self.with_executor_node_selection(
|
|
510
512
|
node_name, node_selector, affinity, tolerations
|
|
@@ -537,6 +539,7 @@ class Spark3Runtime(KubejobRuntime):
|
|
|
537
539
|
if affinity is not None:
|
|
538
540
|
self.spec.driver_affinity = affinity
|
|
539
541
|
if node_selector is not None:
|
|
542
|
+
mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
|
|
540
543
|
self.spec.driver_node_selector = node_selector
|
|
541
544
|
if tolerations is not None:
|
|
542
545
|
self.spec.driver_tolerations = tolerations
|
|
@@ -568,6 +571,7 @@ class Spark3Runtime(KubejobRuntime):
|
|
|
568
571
|
if affinity is not None:
|
|
569
572
|
self.spec.executor_affinity = affinity
|
|
570
573
|
if node_selector is not None:
|
|
574
|
+
mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
|
|
571
575
|
self.spec.executor_node_selector = node_selector
|
|
572
576
|
if tolerations is not None:
|
|
573
577
|
self.spec.executor_tolerations = tolerations
|
mlrun/utils/async_http.py
CHANGED
|
@@ -237,7 +237,7 @@ class _CustomRequestContext(_RequestContext):
|
|
|
237
237
|
retry_wait = self._retry_options.get_timeout(
|
|
238
238
|
attempt=current_attempt, response=None
|
|
239
239
|
)
|
|
240
|
-
self._logger.
|
|
240
|
+
self._logger.warning(
|
|
241
241
|
"Request failed on retryable exception, retrying",
|
|
242
242
|
retry_wait_secs=retry_wait,
|
|
243
243
|
method=params.method,
|
mlrun/utils/helpers.py
CHANGED
|
@@ -1007,6 +1007,23 @@ def get_workflow_url(project, id=None):
|
|
|
1007
1007
|
return url
|
|
1008
1008
|
|
|
1009
1009
|
|
|
1010
|
+
def get_kfp_project_filter(project_name: str) -> str:
|
|
1011
|
+
"""
|
|
1012
|
+
Generates a filter string for KFP runs, using a substring predicate
|
|
1013
|
+
on the run's 'name' field. This is used as a heuristic to retrieve runs that are associated
|
|
1014
|
+
with a specific project. The 'op: 9' operator indicates that the filter checks if the
|
|
1015
|
+
project name appears as a substring in the run's name, ensuring that we can identify
|
|
1016
|
+
runs belonging to the desired project.
|
|
1017
|
+
"""
|
|
1018
|
+
is_substring_op = 9
|
|
1019
|
+
project_name_filter = {
|
|
1020
|
+
"predicates": [
|
|
1021
|
+
{"key": "name", "op": is_substring_op, "string_value": project_name}
|
|
1022
|
+
]
|
|
1023
|
+
}
|
|
1024
|
+
return json.dumps(project_name_filter)
|
|
1025
|
+
|
|
1026
|
+
|
|
1010
1027
|
def are_strings_in_exception_chain_messages(
|
|
1011
1028
|
exception: Exception, strings_list: list[str]
|
|
1012
1029
|
) -> bool:
|
mlrun/utils/version/version.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mlrun
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.0rc43
|
|
4
4
|
Summary: Tracking and config of machine learning runs
|
|
5
5
|
Home-page: https://github.com/mlrun/mlrun
|
|
6
6
|
Author: Yaron Haviv
|
|
@@ -41,7 +41,7 @@ Requires-Dist: mergedeep ~=1.3
|
|
|
41
41
|
Requires-Dist: v3io-frames ~=0.10.14
|
|
42
42
|
Requires-Dist: semver ~=3.0
|
|
43
43
|
Requires-Dist: dependency-injector ~=4.41
|
|
44
|
-
Requires-Dist: fsspec <2024.
|
|
44
|
+
Requires-Dist: fsspec <2024.7,>=2023.9.2
|
|
45
45
|
Requires-Dist: v3iofs ~=0.1.17
|
|
46
46
|
Requires-Dist: storey ~=1.7.24
|
|
47
47
|
Requires-Dist: inflection ~=0.5.0
|
|
@@ -67,7 +67,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'all'
|
|
|
67
67
|
Requires-Dist: dask ~=2023.9.0 ; extra == 'all'
|
|
68
68
|
Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'all'
|
|
69
69
|
Requires-Dist: distributed ~=2023.9.0 ; extra == 'all'
|
|
70
|
-
Requires-Dist: gcsfs <2024.
|
|
70
|
+
Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'all'
|
|
71
71
|
Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'all'
|
|
72
72
|
Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'all'
|
|
73
73
|
Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'all'
|
|
@@ -81,7 +81,7 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'all'
|
|
|
81
81
|
Requires-Dist: plotly ~=5.23 ; extra == 'all'
|
|
82
82
|
Requires-Dist: pyopenssl >=23 ; extra == 'all'
|
|
83
83
|
Requires-Dist: redis ~=4.3 ; extra == 'all'
|
|
84
|
-
Requires-Dist: s3fs <2024.
|
|
84
|
+
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'all'
|
|
85
85
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'all'
|
|
86
86
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
|
|
87
87
|
Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'all'
|
|
@@ -120,7 +120,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'complete'
|
|
|
120
120
|
Requires-Dist: dask ~=2023.9.0 ; extra == 'complete'
|
|
121
121
|
Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete'
|
|
122
122
|
Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete'
|
|
123
|
-
Requires-Dist: gcsfs <2024.
|
|
123
|
+
Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'complete'
|
|
124
124
|
Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'complete'
|
|
125
125
|
Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete'
|
|
126
126
|
Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'complete'
|
|
@@ -134,7 +134,7 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'complete'
|
|
|
134
134
|
Requires-Dist: plotly ~=5.23 ; extra == 'complete'
|
|
135
135
|
Requires-Dist: pyopenssl >=23 ; extra == 'complete'
|
|
136
136
|
Requires-Dist: redis ~=4.3 ; extra == 'complete'
|
|
137
|
-
Requires-Dist: s3fs <2024.
|
|
137
|
+
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete'
|
|
138
138
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete'
|
|
139
139
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
|
|
140
140
|
Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete'
|
|
@@ -153,7 +153,7 @@ Requires-Dist: dask ~=2023.9.0 ; extra == 'complete-api'
|
|
|
153
153
|
Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete-api'
|
|
154
154
|
Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete-api'
|
|
155
155
|
Requires-Dist: fastapi ~=0.110.0 ; extra == 'complete-api'
|
|
156
|
-
Requires-Dist: gcsfs <2024.
|
|
156
|
+
Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'complete-api'
|
|
157
157
|
Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'complete-api'
|
|
158
158
|
Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete-api'
|
|
159
159
|
Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'complete-api'
|
|
@@ -171,7 +171,7 @@ Requires-Dist: plotly ~=5.23 ; extra == 'complete-api'
|
|
|
171
171
|
Requires-Dist: pymysql ~=1.0 ; extra == 'complete-api'
|
|
172
172
|
Requires-Dist: pyopenssl >=23 ; extra == 'complete-api'
|
|
173
173
|
Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
|
|
174
|
-
Requires-Dist: s3fs <2024.
|
|
174
|
+
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete-api'
|
|
175
175
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete-api'
|
|
176
176
|
Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
|
|
177
177
|
Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete-api'
|
|
@@ -188,7 +188,7 @@ Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'google-cloud'
|
|
|
188
188
|
Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'google-cloud'
|
|
189
189
|
Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'google-cloud'
|
|
190
190
|
Requires-Dist: google-cloud ==0.34 ; extra == 'google-cloud'
|
|
191
|
-
Requires-Dist: gcsfs <2024.
|
|
191
|
+
Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'google-cloud'
|
|
192
192
|
Provides-Extra: graphviz
|
|
193
193
|
Requires-Dist: graphviz ~=0.20.0 ; extra == 'graphviz'
|
|
194
194
|
Provides-Extra: kafka
|
|
@@ -203,7 +203,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'redis'
|
|
|
203
203
|
Provides-Extra: s3
|
|
204
204
|
Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 's3'
|
|
205
205
|
Requires-Dist: aiobotocore <2.8,>=2.5.0 ; extra == 's3'
|
|
206
|
-
Requires-Dist: s3fs <2024.
|
|
206
|
+
Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 's3'
|
|
207
207
|
Provides-Extra: snowflake
|
|
208
208
|
Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'snowflake'
|
|
209
209
|
Provides-Extra: sqlalchemy
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
mlrun/__init__.py,sha256=y08M1JcKXy5-9_5WaI9fn5aV5BxIQ5QkbduJK0OxWbA,7470
|
|
2
2
|
mlrun/__main__.py,sha256=iAifncsrQQx6ozXXmz7GH1OiNl8PA7KS3TnwlxnHGeo,45890
|
|
3
|
-
mlrun/config.py,sha256=
|
|
3
|
+
mlrun/config.py,sha256=Qr6ToS9ryv0ivaKrbC3rnWMwL8ptbqXDFVxJzXRRg5s,66971
|
|
4
4
|
mlrun/errors.py,sha256=nY23dns_kTzbOrelJf0FyxLw5mglv7jo4Sx3efKS9Fs,7798
|
|
5
|
-
mlrun/execution.py,sha256=
|
|
5
|
+
mlrun/execution.py,sha256=5MG-B8KVS_7OqkVw-SCuQqNAeULegwo3y0JW36uSb54,42334
|
|
6
6
|
mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
|
|
7
|
-
mlrun/k8s_utils.py,sha256=
|
|
7
|
+
mlrun/k8s_utils.py,sha256=mRQMs6NzPq36vx1n5_2BfFapXysc8wv3NcrZ77_2ANA,8949
|
|
8
8
|
mlrun/lists.py,sha256=3PqBdcajdwhTe1XuFsAaHTuFVM2kjwepf31qqE82apg,8384
|
|
9
|
-
mlrun/model.py,sha256=
|
|
9
|
+
mlrun/model.py,sha256=WcRg13FSww_4YLpL-WDRnfoBnfiEHXRFTMLEMJIeICk,80694
|
|
10
10
|
mlrun/render.py,sha256=n8SeY3ogVrsV02-7-H0lt1RmpkxGpbI-11RQx61Vq9E,13267
|
|
11
11
|
mlrun/run.py,sha256=hNxV-TnixbH8MCos2jqz8jdTDlK7dBSvJMil_QoGKQI,43616
|
|
12
12
|
mlrun/secrets.py,sha256=ibtCK79u7JVBZF6F0SP1-xXXF5MyrLEUs_TCWiJAnlc,7798
|
|
@@ -16,7 +16,7 @@ mlrun/api/schemas/__init__.py,sha256=fEWH4I8hr5AdRJ7yoW44RlFB6NHkYDxyomP5J6ct1z4
|
|
|
16
16
|
mlrun/artifacts/__init__.py,sha256=daGrLqltI1nE3ES30nm-tanUnxReRzfyxyaxNRx2zbc,1168
|
|
17
17
|
mlrun/artifacts/base.py,sha256=EystjLta4XVdZP2x4nz1ZNlDUYKTIcFNfMVfBVseCHw,29168
|
|
18
18
|
mlrun/artifacts/dataset.py,sha256=O_2g2RFHYEAXIBX86mgyc0wBNOhWLT7NlYvxFeLNTuw,16505
|
|
19
|
-
mlrun/artifacts/manager.py,sha256=
|
|
19
|
+
mlrun/artifacts/manager.py,sha256=sHRPJmE60Zot2CNj8Qg-IjVShJ1H6dcFgsWffczgSgA,15403
|
|
20
20
|
mlrun/artifacts/model.py,sha256=ObUkqFMejYOtq0CDFdpYwzwhQ5bsHv0dHTysuVPJnbs,21102
|
|
21
21
|
mlrun/artifacts/plots.py,sha256=dS0mHGt1b20tN2JyEH9H5o5I0oMKZkzn3Uz_3Hf4WjU,4813
|
|
22
22
|
mlrun/common/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
|
|
@@ -36,7 +36,7 @@ mlrun/common/formatters/run.py,sha256=eEBy1NEwGT9b98TWS2OetEbDnDrnHBIBVMrlXsxveo
|
|
|
36
36
|
mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
|
|
37
37
|
mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
|
|
38
38
|
mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
|
|
39
|
-
mlrun/common/schemas/__init__.py,sha256=
|
|
39
|
+
mlrun/common/schemas/__init__.py,sha256=xCRh98GdHfB6Tzb7_lrOhgoO9UnkUfTcsjStLZll8tc,5247
|
|
40
40
|
mlrun/common/schemas/alert.py,sha256=NIotUCJjtw5aYA3CmxiDo2ch-Ba8r1Sj1WkJfYCtluM,6749
|
|
41
41
|
mlrun/common/schemas/api_gateway.py,sha256=9ilorgLOiWxFZbv89-dbPNfVdaChlGOIdC4SLTxQwNI,7118
|
|
42
42
|
mlrun/common/schemas/artifact.py,sha256=V3ngobnzI1v2eoOroWBEedjAZu0ntCSIQ-LzsOK1Z9k,3570
|
|
@@ -49,13 +49,13 @@ mlrun/common/schemas/constants.py,sha256=sTNCimttd7ytSZ3jxbftItw_HDGxPwY96Ub86Ov
|
|
|
49
49
|
mlrun/common/schemas/datastore_profile.py,sha256=hJ8q54A8VZKsnOvSIjcllj4MZ1bBhb_EmBgsqpwSF_Y,750
|
|
50
50
|
mlrun/common/schemas/events.py,sha256=ROHJLo_fqYjc96pek7yhAUPpPRIuAR76lwxvNz8LIr8,1026
|
|
51
51
|
mlrun/common/schemas/feature_store.py,sha256=T0yKYcv6cb3ZwgY5Jh9kWp94zLv2ImxAQUy6x68Imd0,4776
|
|
52
|
-
mlrun/common/schemas/frontend_spec.py,sha256=
|
|
52
|
+
mlrun/common/schemas/frontend_spec.py,sha256=Xos6Jagj0ayqJXw0OrFIFMhSOkuKZcHE3ijB9l6-Kg0,2611
|
|
53
53
|
mlrun/common/schemas/function.py,sha256=fZZBZroj6Ok0giRn2pYSzR40bx037v9pIWvSagPA2fE,4820
|
|
54
54
|
mlrun/common/schemas/http.py,sha256=1PtYFhF6sqLSBRcuPMtYcUGmroBhaleqLmYidSdL9LM,705
|
|
55
55
|
mlrun/common/schemas/hub.py,sha256=cuv_vpkO27XNCZzfytnUyi0k0ZA4wf_QRn5B0ZPoK-Y,4116
|
|
56
56
|
mlrun/common/schemas/k8s.py,sha256=nmMnhgjVMLem5jyumoG2eQKioGK9eUVhQnOSb3hG7yw,1395
|
|
57
57
|
mlrun/common/schemas/memory_reports.py,sha256=tpS3fpvxa6VcBpzCRzcZTt0fCF0h6ReUetYs7j6kdps,892
|
|
58
|
-
mlrun/common/schemas/notification.py,sha256=
|
|
58
|
+
mlrun/common/schemas/notification.py,sha256=BsDjHHH1k8OW2bTi49ww77LIfvjVFde7Btv9vILxcvs,4404
|
|
59
59
|
mlrun/common/schemas/object.py,sha256=VleJSUmDJMl92knLgaDE8SWCi3ky0UaHcwcwOIapPQ8,1980
|
|
60
60
|
mlrun/common/schemas/pagination.py,sha256=q7nk6bipkDiE7HExIVqhy5ANl-zv0x8QC9Kg6AkLtDA,887
|
|
61
61
|
mlrun/common/schemas/pipeline.py,sha256=MhH07_fAQXNAnmf5j6oXZp8qh9cxGcZlReMdt-ZJf40,1429
|
|
@@ -79,7 +79,7 @@ mlrun/data_types/to_pandas.py,sha256=-ZbJBg00x4xxyqqqu3AVbEh-HaO2--DrChyPuedRhHA
|
|
|
79
79
|
mlrun/datastore/__init__.py,sha256=8WvgHF245fvU9u98ctRqosvEmQ9iAKKIIS_dSgj_fmU,4153
|
|
80
80
|
mlrun/datastore/alibaba_oss.py,sha256=-RMA4vCE4rar-D57Niy3tY_6bXKHLFpMp28z5YR7-jI,4888
|
|
81
81
|
mlrun/datastore/azure_blob.py,sha256=9qkgrEMXGiuYYcc6b6HkuHlRHDbl0p7tIzeWxAAcEVs,12724
|
|
82
|
-
mlrun/datastore/base.py,sha256=
|
|
82
|
+
mlrun/datastore/base.py,sha256=4GWgPB7t1wHYxdfc3mdpbL5Lq9W-ahCgy0ckgMUP6DI,26215
|
|
83
83
|
mlrun/datastore/datastore.py,sha256=F2i8XI2hkQwf51OjqdFZ8179oHvDfQtaT5pvfkvMV9U,9389
|
|
84
84
|
mlrun/datastore/datastore_profile.py,sha256=ZCU-brdRNXNE8EnknzFljtWjciEJ9sGZnoahFxbdEt4,18940
|
|
85
85
|
mlrun/datastore/dbfs_store.py,sha256=mylyl-evK3CVe5fx6rwawITxPIc2YVbw5WHGbL24jtM,6516
|
|
@@ -94,8 +94,8 @@ mlrun/datastore/sources.py,sha256=op90ksx95wqaBtoiORpHnqEgw4iGEDPsJ3_lI8ftS-E,48
|
|
|
94
94
|
mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
|
|
95
95
|
mlrun/datastore/spark_utils.py,sha256=_AsVoU5Ix_-W7Gyq8io8V-2GTk0m8THJNDP3WGGaWJY,2865
|
|
96
96
|
mlrun/datastore/store_resources.py,sha256=rcLoG506AMmR8qPJU_gE-G5d34VJVV_vNlZ3VHqho6c,6869
|
|
97
|
-
mlrun/datastore/storeytargets.py,sha256=
|
|
98
|
-
mlrun/datastore/targets.py,sha256=
|
|
97
|
+
mlrun/datastore/storeytargets.py,sha256=a7a_fmp5JiSOO-f0fB9hx0aeaGsLGs4SvlRQ4sA564g,5018
|
|
98
|
+
mlrun/datastore/targets.py,sha256=TkG2HG4h7SaQ3qG2sKAHAuJJyj_gnE-eChaIsyjlq1o,80450
|
|
99
99
|
mlrun/datastore/utils.py,sha256=l9dLZb_VCbHs_htqMFRv4qiestZ8z8K-4eY1MxHS8wE,7720
|
|
100
100
|
mlrun/datastore/v3io.py,sha256=HxP6mygiYM6leDAbQ9KdTxObLCt9yGMro0YhfdU6KUo,8157
|
|
101
101
|
mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev56Te4,1343
|
|
@@ -216,11 +216,11 @@ mlrun/model_monitoring/application.py,sha256=RJ8HeAPfGO3P2A_dEZYNg60c1wKTADh2YSv
|
|
|
216
216
|
mlrun/model_monitoring/controller.py,sha256=HFyVNNikoxEd3X5aL3y88rLktH_gZtbCOqPs7qdUsCg,27969
|
|
217
217
|
mlrun/model_monitoring/evidently_application.py,sha256=iOc42IVjj8m6PDBmVcKIMWm46Bu0EdO9SDcH40Eqhyo,769
|
|
218
218
|
mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
|
|
219
|
-
mlrun/model_monitoring/helpers.py,sha256=
|
|
219
|
+
mlrun/model_monitoring/helpers.py,sha256=GY36xkOSL6opdjBLMvkN3xx24DX7H1JI83C3eSNykKU,12789
|
|
220
220
|
mlrun/model_monitoring/model_endpoint.py,sha256=7VX0cBATqLsA4sSinDzouf41ndxqh2mf5bO9BW0G5Z4,4017
|
|
221
221
|
mlrun/model_monitoring/stream_processing.py,sha256=0eu1Gq1Obq87LFno6eIZ55poXoFaeloqYTLiQgyfd0k,38687
|
|
222
222
|
mlrun/model_monitoring/tracking_policy.py,sha256=sQq956akAQpntkrJwIgFWcEq-JpyVcg0FxgNa4h3V70,5502
|
|
223
|
-
mlrun/model_monitoring/writer.py,sha256=
|
|
223
|
+
mlrun/model_monitoring/writer.py,sha256=cLhxAwVfCWEx16vhhXCwxf1do9SbHjDtVUSOtJuX9Rg,10119
|
|
224
224
|
mlrun/model_monitoring/applications/__init__.py,sha256=i793GqYee01mRh_KD6GShvX7UbPBgdJDO4qf9Z3BXEQ,970
|
|
225
225
|
mlrun/model_monitoring/applications/_application_steps.py,sha256=fvZbtat7eXe5mo927_jyhq4BqWCapKZn7OVjptepIAI,7055
|
|
226
226
|
mlrun/model_monitoring/applications/base.py,sha256=snr3xYdqv6Po19yS0Z1VktyoLrbl88lljSFQyjnKjR0,11616
|
|
@@ -274,7 +274,7 @@ mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13
|
|
|
274
274
|
mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
|
|
275
275
|
mlrun/projects/operations.py,sha256=UEpiW4bDscth4pwWcLWF1xz-IU7bnZfckPR7sXp3O-g,19441
|
|
276
276
|
mlrun/projects/pipelines.py,sha256=iFa0iy4iYk3yUH4Nx-sq7VVJhXW8LlR3Hsbjx_KLL5Y,40019
|
|
277
|
-
mlrun/projects/project.py,sha256=
|
|
277
|
+
mlrun/projects/project.py,sha256=qJXhB78CtIAxyT6SNZByWhL6Q2-nn4_HLLK2hYSJ6bw,189067
|
|
278
278
|
mlrun/runtimes/__init__.py,sha256=egLM94cDMUyQ1GVABdFGXUQcDhU70lP3k7qSnM_UnHY,9008
|
|
279
279
|
mlrun/runtimes/base.py,sha256=JXWmTIcm3b0klGUOHDlyFNa3bUgsNzQIgWhUQpSZoE0,37692
|
|
280
280
|
mlrun/runtimes/daskjob.py,sha256=JfK8rSPY-0SYnLJdtp_ts3oKyad0pA98th-2VntYzK0,19387
|
|
@@ -282,8 +282,8 @@ mlrun/runtimes/funcdoc.py,sha256=zRFHrJsV8rhDLJwoUhcfZ7Cs0j-tQ76DxwUqdXV_Wyc,981
|
|
|
282
282
|
mlrun/runtimes/function_reference.py,sha256=iWKRe4r2GTc5S8FOIASYUNLwwne8NqIui51PFr8Q4mg,4918
|
|
283
283
|
mlrun/runtimes/generators.py,sha256=v28HdNgxdHvj888G1dTnUeQZz-D9iTO0hoGeZbCdiuQ,7241
|
|
284
284
|
mlrun/runtimes/kubejob.py,sha256=ptBnMTIjukbEznkdixmbGvBqzujXrRzqNfP7ze6M76M,8660
|
|
285
|
-
mlrun/runtimes/local.py,sha256=
|
|
286
|
-
mlrun/runtimes/pod.py,sha256=
|
|
285
|
+
mlrun/runtimes/local.py,sha256=yedo3R1c46cB1mX7aOz8zORXswQPvX86U-_fYxXoqTY,22717
|
|
286
|
+
mlrun/runtimes/pod.py,sha256=yNgfluaS5ZcyPGGdFhn9js9E8NXtpuVFzci9uBWZ_3Y,63325
|
|
287
287
|
mlrun/runtimes/remotesparkjob.py,sha256=3ggRVNod67TRnsM2-Ilr9Sw5OWqkRwHWaiBkGvmWU2c,7357
|
|
288
288
|
mlrun/runtimes/utils.py,sha256=9RnfpZxZEuE2bFVLSaUxBxi2IWsnKoaWF-eljP2FpbA,15637
|
|
289
289
|
mlrun/runtimes/databricks_job/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
|
|
@@ -299,10 +299,10 @@ mlrun/runtimes/nuclio/function.py,sha256=tK7INPTtYFOJRCzKLUELd0mE_U9w-wt5nCA0Hae
|
|
|
299
299
|
mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
|
|
300
300
|
mlrun/runtimes/nuclio/serving.py,sha256=X0fYJnidH0S5xrupoTC74OhZz7Tym34iw6hFSzahMCk,29720
|
|
301
301
|
mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
|
|
302
|
-
mlrun/runtimes/nuclio/application/application.py,sha256=
|
|
302
|
+
mlrun/runtimes/nuclio/application/application.py,sha256=PVuzcuC7pWG4KJmC1Gi2E5oVANRZgaBGCcpiTamzhUg,29007
|
|
303
303
|
mlrun/runtimes/nuclio/application/reverse_proxy.go,sha256=JIIYae6bXzCLf3jXuu49KWPQYoXr_FDQ2Rbo1OWKAd0,3150
|
|
304
304
|
mlrun/runtimes/sparkjob/__init__.py,sha256=_KPvk0qefeLtHO6lxQE_AMOGiMTG_OT48eRCE4Z2ldw,709
|
|
305
|
-
mlrun/runtimes/sparkjob/spark3job.py,sha256=
|
|
305
|
+
mlrun/runtimes/sparkjob/spark3job.py,sha256=RuwO9Pk1IFaUCFz8zoYLaK3pYT7w07uAjoucYDVtwL8,41327
|
|
306
306
|
mlrun/serving/__init__.py,sha256=-SMRV3q_5cGVPDxRslXPU0zGYZIygs0cSj7WKlOJJUc,1163
|
|
307
307
|
mlrun/serving/merger.py,sha256=PXLn3A21FiLteJHaDSLm5xKNT-80eTTjfHUJnBX1gKY,6116
|
|
308
308
|
mlrun/serving/remote.py,sha256=MrFByphQWmIsKXqw-MOwl2Q1hbtWReYVRKvlcKj9pfw,17980
|
|
@@ -319,12 +319,12 @@ mlrun/track/tracker_manager.py,sha256=IYBl99I62IC6VCCmG1yt6JoHNOQXa53C4DURJ2sWgi
|
|
|
319
319
|
mlrun/track/trackers/__init__.py,sha256=9xft8YjJnblwqt8f05htmOt_eDzVBVQN07RfY_SYLCs,569
|
|
320
320
|
mlrun/track/trackers/mlflow_tracker.py,sha256=O3ROZh6NZ92Ghga8c2FGaYmWLdgTs33GchNJVa8ypkY,23469
|
|
321
321
|
mlrun/utils/__init__.py,sha256=g2pbT3loDw0GWELOC_rBq1NojSMCFnWrD-TYcDgAZiI,826
|
|
322
|
-
mlrun/utils/async_http.py,sha256=
|
|
322
|
+
mlrun/utils/async_http.py,sha256=EitI8ndS3kKkB1oAfZ5RvlGMtE4ktzyEuCJd5K9QvSs,11726
|
|
323
323
|
mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,3450
|
|
324
324
|
mlrun/utils/clones.py,sha256=mJpx4nyFiY6jlBCvFABsNuyi_mr1mvfPWn81vlafpOU,7361
|
|
325
325
|
mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
|
|
326
326
|
mlrun/utils/db.py,sha256=blQgkWMfFH9lcN4sgJQcPQgEETz2Dl_zwbVA0SslpFg,2186
|
|
327
|
-
mlrun/utils/helpers.py,sha256=
|
|
327
|
+
mlrun/utils/helpers.py,sha256=6Ds8trOm4AEZtD2gUO4rwzAYeS394LIlcPTNqqmuWT0,59662
|
|
328
328
|
mlrun/utils/http.py,sha256=t6FrXQstZm9xVVjxqIGiLzrwZNCR4CSienSOuVgNIcI,8706
|
|
329
329
|
mlrun/utils/logger.py,sha256=cag2J30-jynIHmHZ2J8RYmVMNhYBGgAoimc5sbk-A1U,10016
|
|
330
330
|
mlrun/utils/regex.py,sha256=b0AUa2THS-ELzJj0grl5b8Stq609F2XomTZkD9SB1fQ,4900
|
|
@@ -334,7 +334,7 @@ mlrun/utils/v3io_clients.py,sha256=0aCFiQFBmgdSeLzJr_nEP6SG-zyieSgH8RdtcUq4dc0,1
|
|
|
334
334
|
mlrun/utils/vault.py,sha256=xUiKL17dCXjwQJ33YRzQj0oadUXATlFWPzKKYAESoQk,10447
|
|
335
335
|
mlrun/utils/notifications/__init__.py,sha256=eUzQDBxSQmMZASRY-YAnYS6tL5801P0wEjycp3Dvoe0,990
|
|
336
336
|
mlrun/utils/notifications/notification_pusher.py,sha256=4ecV6JfCtvYpb0kl1-sdg4Cw6XTrAjmmh2olhUenesY,26752
|
|
337
|
-
mlrun/utils/notifications/notification/__init__.py,sha256=
|
|
337
|
+
mlrun/utils/notifications/notification/__init__.py,sha256=o1OgBKFSQoD6g8Lh20Cw-_CLa-FPVaL33Kv6YwKiLGA,2154
|
|
338
338
|
mlrun/utils/notifications/notification/base.py,sha256=hf3BDZ4-bq92MsqofQHt8DZqqlcKbWHscZFvzHdMcw4,4265
|
|
339
339
|
mlrun/utils/notifications/notification/console.py,sha256=MAVk7v5PJ52vdGRv76YcEPixWgV0licBPWGpR01uR40,2643
|
|
340
340
|
mlrun/utils/notifications/notification/git.py,sha256=g_8RksjCboGrKKjyhkePk5nSWrfdT61JkhMeg9EeGcY,6119
|
|
@@ -342,11 +342,11 @@ mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT
|
|
|
342
342
|
mlrun/utils/notifications/notification/slack.py,sha256=wqpFGr5BTvFO5KuUSzFfxsgmyU1Ohq7fbrGeNe9TXOk,7006
|
|
343
343
|
mlrun/utils/notifications/notification/webhook.py,sha256=cb9w1Mc8ENfJBdgan7iiVHK9eVls4-R3tUxmXM-P-8I,4746
|
|
344
344
|
mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
|
|
345
|
-
mlrun/utils/version/version.json,sha256=
|
|
345
|
+
mlrun/utils/version/version.json,sha256=n_L3px_MlIp2dW2njEFmMLcqoSQpwpmC7RlrOEtxtCg,89
|
|
346
346
|
mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
|
|
347
|
-
mlrun-1.7.
|
|
348
|
-
mlrun-1.7.
|
|
349
|
-
mlrun-1.7.
|
|
350
|
-
mlrun-1.7.
|
|
351
|
-
mlrun-1.7.
|
|
352
|
-
mlrun-1.7.
|
|
347
|
+
mlrun-1.7.0rc43.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
348
|
+
mlrun-1.7.0rc43.dist-info/METADATA,sha256=LNIpVyKhu5PFy26lN3HB0fZ_SZzt_i2mnw1ETL7Bvfo,19939
|
|
349
|
+
mlrun-1.7.0rc43.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
|
350
|
+
mlrun-1.7.0rc43.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
|
|
351
|
+
mlrun-1.7.0rc43.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
|
|
352
|
+
mlrun-1.7.0rc43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|