mlrun 1.10.0rc34__py3-none-any.whl → 1.10.0rc36__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/common/schemas/__init__.py +1 -0
- mlrun/common/schemas/hub.py +1 -1
- mlrun/common/schemas/model_monitoring/__init__.py +1 -0
- mlrun/hub/module.py +19 -4
- mlrun/model.py +2 -2
- mlrun/model_monitoring/api.py +17 -2
- mlrun/model_monitoring/applications/base.py +88 -54
- mlrun/projects/project.py +10 -3
- mlrun/run.py +27 -19
- mlrun/runtimes/nuclio/application/application.py +6 -0
- mlrun/serving/server.py +2 -13
- mlrun/utils/helpers.py +72 -4
- mlrun/utils/version/version.json +2 -2
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/METADATA +2 -2
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/RECORD +19 -19
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/WHEEL +0 -0
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/entry_points.txt +0 -0
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/licenses/LICENSE +0 -0
- {mlrun-1.10.0rc34.dist-info → mlrun-1.10.0rc36.dist-info}/top_level.txt +0 -0
mlrun/common/schemas/__init__.py
CHANGED
mlrun/common/schemas/hub.py
CHANGED
mlrun/hub/module.py
CHANGED
|
@@ -26,6 +26,7 @@ from mlrun.common.schemas.hub import HubModuleType, HubSourceType
|
|
|
26
26
|
from mlrun.run import function_to_module, get_object
|
|
27
27
|
from mlrun.utils import logger
|
|
28
28
|
|
|
29
|
+
from ..errors import MLRunBadRequestError
|
|
29
30
|
from ..model import ModelObj
|
|
30
31
|
from ..utils import extend_hub_uri_if_needed
|
|
31
32
|
|
|
@@ -109,19 +110,33 @@ class HubModule(ModelObj):
|
|
|
109
110
|
f.write(data)
|
|
110
111
|
|
|
111
112
|
@staticmethod
|
|
112
|
-
def verify_directory(path: str) -> Path:
|
|
113
|
-
"""
|
|
113
|
+
def verify_directory(path: Optional[str] = None) -> Path:
|
|
114
|
+
"""
|
|
115
|
+
Validate that the given path is an existing directory.
|
|
116
|
+
If no path has been provided, returns current working directory.
|
|
117
|
+
"""
|
|
114
118
|
if path:
|
|
115
119
|
path = Path(path)
|
|
116
120
|
if not path.exists():
|
|
117
121
|
raise ValueError(f"Path does not exist: {path}")
|
|
118
122
|
if not path.is_dir():
|
|
119
123
|
raise ValueError(f"Path is not a directory: {path}")
|
|
120
|
-
|
|
124
|
+
return path
|
|
125
|
+
return Path(os.getcwd())
|
|
126
|
+
|
|
127
|
+
def get_module_file_path(self):
|
|
128
|
+
if not self.local_path:
|
|
129
|
+
raise MLRunBadRequestError(
|
|
130
|
+
"module files haven't been downloaded yet, try calling download_module_files() first"
|
|
131
|
+
)
|
|
132
|
+
return str(Path(self.local_path) / self.filename)
|
|
121
133
|
|
|
122
134
|
|
|
123
135
|
def get_hub_module(
|
|
124
|
-
url="",
|
|
136
|
+
url: str = "",
|
|
137
|
+
download_files: Optional[bool] = True,
|
|
138
|
+
secrets: Optional[dict] = None,
|
|
139
|
+
local_path: Optional[str] = None,
|
|
125
140
|
) -> HubModule:
|
|
126
141
|
"""
|
|
127
142
|
Get a hub-module object containing metadata of the requested module.
|
mlrun/model.py
CHANGED
|
@@ -667,7 +667,7 @@ class ImageBuilder(ModelObj):
|
|
|
667
667
|
"""
|
|
668
668
|
requirements = requirements or []
|
|
669
669
|
self._verify_list(requirements, "requirements")
|
|
670
|
-
resolved_requirements = self.
|
|
670
|
+
resolved_requirements = self.resolve_requirements(
|
|
671
671
|
requirements, requirements_file
|
|
672
672
|
)
|
|
673
673
|
requirements = self.requirements or [] if not overwrite else []
|
|
@@ -680,7 +680,7 @@ class ImageBuilder(ModelObj):
|
|
|
680
680
|
self.requirements = requirements
|
|
681
681
|
|
|
682
682
|
@staticmethod
|
|
683
|
-
def
|
|
683
|
+
def resolve_requirements(requirements: list, requirements_file: str = "") -> list:
|
|
684
684
|
requirements = requirements or []
|
|
685
685
|
requirements_to_resolve = []
|
|
686
686
|
|
mlrun/model_monitoring/api.py
CHANGED
|
@@ -30,8 +30,9 @@ from mlrun.common.schemas.model_monitoring import (
|
|
|
30
30
|
FunctionURI,
|
|
31
31
|
)
|
|
32
32
|
from mlrun.data_types.infer import InferOptions, get_df_stats
|
|
33
|
-
from mlrun.utils import datetime_now, logger
|
|
33
|
+
from mlrun.utils import check_if_hub_uri, datetime_now, logger, merge_requirements
|
|
34
34
|
|
|
35
|
+
from ..common.schemas.hub import HubModuleType
|
|
35
36
|
from .helpers import update_model_endpoint_last_request
|
|
36
37
|
|
|
37
38
|
# A union of all supported dataset types:
|
|
@@ -548,8 +549,9 @@ def _create_model_monitoring_function_base(
|
|
|
548
549
|
name: typing.Optional[str] = None,
|
|
549
550
|
image: typing.Optional[str] = None,
|
|
550
551
|
tag: typing.Optional[str] = None,
|
|
551
|
-
requirements: typing.Union[
|
|
552
|
+
requirements: typing.Union[list[str], None] = None,
|
|
552
553
|
requirements_file: str = "",
|
|
554
|
+
local_path: typing.Optional[str] = None,
|
|
553
555
|
**application_kwargs,
|
|
554
556
|
) -> mlrun.runtimes.ServingRuntime:
|
|
555
557
|
"""
|
|
@@ -567,6 +569,19 @@ def _create_model_monitoring_function_base(
|
|
|
567
569
|
)
|
|
568
570
|
if func is None:
|
|
569
571
|
func = ""
|
|
572
|
+
if check_if_hub_uri(func):
|
|
573
|
+
hub_module = mlrun.get_hub_module(url=func, local_path=local_path)
|
|
574
|
+
if hub_module.kind != HubModuleType.monitoring_app:
|
|
575
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
576
|
+
"The provided module is not a monitoring application"
|
|
577
|
+
)
|
|
578
|
+
requirements = mlrun.model.ImageBuilder.resolve_requirements(
|
|
579
|
+
requirements, requirements_file
|
|
580
|
+
)
|
|
581
|
+
requirements = merge_requirements(
|
|
582
|
+
reqs_priority=requirements, reqs_secondary=hub_module.requirements
|
|
583
|
+
)
|
|
584
|
+
func = hub_module.get_module_file_path()
|
|
570
585
|
func_obj = typing.cast(
|
|
571
586
|
mlrun.runtimes.ServingRuntime,
|
|
572
587
|
mlrun.code_to_function(
|
|
@@ -332,36 +332,11 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
332
332
|
project=project,
|
|
333
333
|
) as (endpoints_output, application_schedules):
|
|
334
334
|
|
|
335
|
-
def call_do_tracking(
|
|
335
|
+
def call_do_tracking(
|
|
336
|
+
monitoring_context: mm_context.MonitoringApplicationContext,
|
|
337
|
+
):
|
|
336
338
|
nonlocal endpoints_output
|
|
337
339
|
|
|
338
|
-
if event is None:
|
|
339
|
-
event = {}
|
|
340
|
-
monitoring_context = (
|
|
341
|
-
mm_context.MonitoringApplicationContext._from_ml_ctx(
|
|
342
|
-
event=event,
|
|
343
|
-
application_name=application_name,
|
|
344
|
-
context=context,
|
|
345
|
-
project=project,
|
|
346
|
-
sample_df=sample_data,
|
|
347
|
-
feature_stats=feature_stats,
|
|
348
|
-
)
|
|
349
|
-
)
|
|
350
|
-
|
|
351
|
-
if (
|
|
352
|
-
monitoring_context.endpoint_id
|
|
353
|
-
and monitoring_context.sample_df.empty
|
|
354
|
-
):
|
|
355
|
-
# The current sample is empty
|
|
356
|
-
context.logger.warning(
|
|
357
|
-
"No sample data available for tracking",
|
|
358
|
-
application_name=application_name,
|
|
359
|
-
endpoint_id=monitoring_context.endpoint_id,
|
|
360
|
-
start_time=monitoring_context.start_infer_time,
|
|
361
|
-
end_time=monitoring_context.end_infer_time,
|
|
362
|
-
)
|
|
363
|
-
return
|
|
364
|
-
|
|
365
340
|
result = self.do_tracking(monitoring_context)
|
|
366
341
|
endpoints_output[monitoring_context.endpoint_id].append(
|
|
367
342
|
(monitoring_context, result)
|
|
@@ -369,7 +344,7 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
369
344
|
return result
|
|
370
345
|
|
|
371
346
|
if endpoints is not None:
|
|
372
|
-
resolved_endpoints = self.
|
|
347
|
+
resolved_endpoints = self._validate_endpoints(
|
|
373
348
|
project=project, endpoints=endpoints
|
|
374
349
|
)
|
|
375
350
|
if (
|
|
@@ -391,26 +366,24 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
391
366
|
application_schedules=application_schedules,
|
|
392
367
|
)
|
|
393
368
|
for endpoint_name, endpoint_id in resolved_endpoints:
|
|
394
|
-
for
|
|
369
|
+
for monitoring_ctx in self._window_generator(
|
|
395
370
|
start=start,
|
|
396
371
|
end=end,
|
|
397
372
|
base_period=base_period,
|
|
398
373
|
application_schedules=application_schedules,
|
|
399
374
|
endpoint_id=endpoint_id,
|
|
375
|
+
endpoint_name=endpoint_name,
|
|
400
376
|
application_name=application_name,
|
|
401
377
|
existing_data_handling=existing_data_handling,
|
|
378
|
+
sample_data=sample_data,
|
|
379
|
+
context=context,
|
|
380
|
+
project=project,
|
|
402
381
|
):
|
|
403
|
-
result = call_do_tracking(
|
|
404
|
-
event={
|
|
405
|
-
mm_constants.ApplicationEvent.ENDPOINT_NAME: endpoint_name,
|
|
406
|
-
mm_constants.ApplicationEvent.ENDPOINT_ID: endpoint_id,
|
|
407
|
-
mm_constants.ApplicationEvent.START_INFER_TIME: window_start,
|
|
408
|
-
mm_constants.ApplicationEvent.END_INFER_TIME: window_end,
|
|
409
|
-
}
|
|
410
|
-
)
|
|
382
|
+
result = call_do_tracking(monitoring_ctx)
|
|
411
383
|
result_key = (
|
|
412
|
-
f"{endpoint_name}-{endpoint_id}_{
|
|
413
|
-
if
|
|
384
|
+
f"{endpoint_name}-{endpoint_id}_{monitoring_ctx.start_infer_time.isoformat()}_{monitoring_ctx.end_infer_time.isoformat()}"
|
|
385
|
+
if monitoring_ctx.start_infer_time
|
|
386
|
+
and monitoring_ctx.end_infer_time
|
|
414
387
|
else f"{endpoint_name}-{endpoint_id}"
|
|
415
388
|
)
|
|
416
389
|
|
|
@@ -418,10 +391,38 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
418
391
|
result_key, self._flatten_data_result(result)
|
|
419
392
|
)
|
|
420
393
|
else:
|
|
421
|
-
|
|
394
|
+
result = call_do_tracking(
|
|
395
|
+
mm_context.MonitoringApplicationContext._from_ml_ctx(
|
|
396
|
+
context=context,
|
|
397
|
+
project=project,
|
|
398
|
+
application_name=application_name,
|
|
399
|
+
event={},
|
|
400
|
+
sample_df=sample_data,
|
|
401
|
+
feature_stats=feature_stats,
|
|
402
|
+
)
|
|
403
|
+
)
|
|
404
|
+
return self._flatten_data_result(result)
|
|
422
405
|
|
|
423
406
|
@staticmethod
|
|
424
|
-
def
|
|
407
|
+
def _check_endpoints_first_request(
|
|
408
|
+
endpoints: list[mlrun.common.schemas.ModelEndpoint],
|
|
409
|
+
) -> None:
|
|
410
|
+
"""Make sure that all the endpoints have had at least one request"""
|
|
411
|
+
endpoints_no_requests = [
|
|
412
|
+
(endpoint.metadata.name, endpoint.metadata.uid)
|
|
413
|
+
for endpoint in endpoints
|
|
414
|
+
if not endpoint.status.first_request
|
|
415
|
+
]
|
|
416
|
+
if endpoints_no_requests:
|
|
417
|
+
raise mlrun.errors.MLRunValueError(
|
|
418
|
+
"The following model endpoints have not had any requests yet and "
|
|
419
|
+
"have no data, cannot run the model monitoring application on them: "
|
|
420
|
+
f"{endpoints_no_requests}"
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
@classmethod
|
|
424
|
+
def _validate_endpoints(
|
|
425
|
+
cls,
|
|
425
426
|
project: "mlrun.MlrunProject",
|
|
426
427
|
endpoints: Union[
|
|
427
428
|
list[tuple[str, str]], list[list[str]], list[str], Literal["all"]
|
|
@@ -457,6 +458,9 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
457
458
|
endpoints_list = project.list_model_endpoints(
|
|
458
459
|
names=endpoint_names, latest_only=True
|
|
459
460
|
).endpoints
|
|
461
|
+
|
|
462
|
+
cls._check_endpoints_first_request(endpoints_list)
|
|
463
|
+
|
|
460
464
|
if endpoints_list:
|
|
461
465
|
list_endpoints_result = [
|
|
462
466
|
(endpoint.metadata.name, endpoint.metadata.uid)
|
|
@@ -596,13 +600,51 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
596
600
|
application_schedules: Optional[
|
|
597
601
|
mm_schedules.ModelMonitoringSchedulesFileApplication
|
|
598
602
|
],
|
|
603
|
+
endpoint_name: str,
|
|
599
604
|
endpoint_id: str,
|
|
600
605
|
application_name: str,
|
|
601
606
|
existing_data_handling: ExistingDataHandling,
|
|
602
|
-
|
|
607
|
+
context: "mlrun.MLClientCtx",
|
|
608
|
+
project: "mlrun.MlrunProject",
|
|
609
|
+
sample_data: Optional[pd.DataFrame],
|
|
610
|
+
) -> Iterator[mm_context.MonitoringApplicationContext]:
|
|
611
|
+
def yield_monitoring_ctx(
|
|
612
|
+
window_start: Optional[datetime], window_end: Optional[datetime]
|
|
613
|
+
) -> Iterator[mm_context.MonitoringApplicationContext]:
|
|
614
|
+
ctx = mm_context.MonitoringApplicationContext._from_ml_ctx(
|
|
615
|
+
event={
|
|
616
|
+
mm_constants.ApplicationEvent.ENDPOINT_NAME: endpoint_name,
|
|
617
|
+
mm_constants.ApplicationEvent.ENDPOINT_ID: endpoint_id,
|
|
618
|
+
mm_constants.ApplicationEvent.START_INFER_TIME: window_start,
|
|
619
|
+
mm_constants.ApplicationEvent.END_INFER_TIME: window_end,
|
|
620
|
+
},
|
|
621
|
+
application_name=application_name,
|
|
622
|
+
context=context,
|
|
623
|
+
project=project,
|
|
624
|
+
sample_df=sample_data,
|
|
625
|
+
)
|
|
626
|
+
|
|
627
|
+
if ctx.sample_df.empty:
|
|
628
|
+
# The current sample is empty
|
|
629
|
+
context.logger.debug(
|
|
630
|
+
"No sample data available for tracking",
|
|
631
|
+
application_name=application_name,
|
|
632
|
+
endpoint_id=ctx.endpoint_id,
|
|
633
|
+
start_time=ctx.start_infer_time,
|
|
634
|
+
end_time=ctx.end_infer_time,
|
|
635
|
+
)
|
|
636
|
+
return
|
|
637
|
+
|
|
638
|
+
yield ctx
|
|
639
|
+
|
|
640
|
+
if application_schedules and window_end:
|
|
641
|
+
application_schedules.update_endpoint_last_analyzed(
|
|
642
|
+
endpoint_uid=endpoint_id, last_analyzed=window_end
|
|
643
|
+
)
|
|
644
|
+
|
|
603
645
|
if start is None or end is None:
|
|
604
646
|
# A single window based on the `sample_data` input - see `_handler`.
|
|
605
|
-
yield None, None
|
|
647
|
+
yield from yield_monitoring_ctx(None, None)
|
|
606
648
|
return
|
|
607
649
|
|
|
608
650
|
start_dt = datetime.fromisoformat(start)
|
|
@@ -630,11 +672,7 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
630
672
|
)
|
|
631
673
|
|
|
632
674
|
if base_period is None:
|
|
633
|
-
yield start_dt, end_dt
|
|
634
|
-
if application_schedules:
|
|
635
|
-
application_schedules.update_endpoint_last_analyzed(
|
|
636
|
-
endpoint_uid=endpoint_id, last_analyzed=end_dt
|
|
637
|
-
)
|
|
675
|
+
yield from yield_monitoring_ctx(start_dt, end_dt)
|
|
638
676
|
return
|
|
639
677
|
|
|
640
678
|
window_length = cls._validate_and_get_window_length(
|
|
@@ -644,11 +682,7 @@ class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC):
|
|
|
644
682
|
current_start_time = start_dt
|
|
645
683
|
while current_start_time < end_dt:
|
|
646
684
|
current_end_time = min(current_start_time + window_length, end_dt)
|
|
647
|
-
yield current_start_time, current_end_time
|
|
648
|
-
if application_schedules:
|
|
649
|
-
application_schedules.update_endpoint_last_analyzed(
|
|
650
|
-
endpoint_uid=endpoint_id, last_analyzed=current_end_time
|
|
651
|
-
)
|
|
685
|
+
yield from yield_monitoring_ctx(current_start_time, current_end_time)
|
|
652
686
|
current_start_time = current_end_time
|
|
653
687
|
|
|
654
688
|
@classmethod
|
mlrun/projects/project.py
CHANGED
|
@@ -2386,8 +2386,9 @@ class MlrunProject(ModelObj):
|
|
|
2386
2386
|
handler: Optional[str] = None,
|
|
2387
2387
|
with_repo: Optional[bool] = None,
|
|
2388
2388
|
tag: Optional[str] = None,
|
|
2389
|
-
requirements: Optional[
|
|
2389
|
+
requirements: Optional[list[str]] = None,
|
|
2390
2390
|
requirements_file: str = "",
|
|
2391
|
+
local_path: Optional[str] = None,
|
|
2391
2392
|
**application_kwargs,
|
|
2392
2393
|
) -> mlrun.runtimes.RemoteRuntime:
|
|
2393
2394
|
"""
|
|
@@ -2402,7 +2403,8 @@ class MlrunProject(ModelObj):
|
|
|
2402
2403
|
)
|
|
2403
2404
|
|
|
2404
2405
|
:param func: Remote function object or spec/code URL. :code:`None` refers to the current
|
|
2405
|
-
notebook.
|
|
2406
|
+
notebook. May also be a hub URL of a module of kind model-monitoring-app in the
|
|
2407
|
+
format: hub://[{source}/]{name}[:{tag}].
|
|
2406
2408
|
:param name: Name of the function (under the project), can be specified with a tag to support
|
|
2407
2409
|
versions (e.g. myfunc:v1).
|
|
2408
2410
|
:param image: Docker image to be used, can also be specified in
|
|
@@ -2417,6 +2419,8 @@ class MlrunProject(ModelObj):
|
|
|
2417
2419
|
:param application_class: Name or an Instance of a class that implements the monitoring application.
|
|
2418
2420
|
:param application_kwargs: Additional keyword arguments to be passed to the
|
|
2419
2421
|
monitoring application's constructor.
|
|
2422
|
+
:param local_path: Path to a local directory to save the downloaded monitoring-app code files in,
|
|
2423
|
+
in case 'func' is a hub URL (defaults to current working directory).
|
|
2420
2424
|
:returns: The model monitoring remote function object.
|
|
2421
2425
|
"""
|
|
2422
2426
|
(
|
|
@@ -2433,6 +2437,7 @@ class MlrunProject(ModelObj):
|
|
|
2433
2437
|
tag,
|
|
2434
2438
|
requirements,
|
|
2435
2439
|
requirements_file,
|
|
2440
|
+
local_path,
|
|
2436
2441
|
**application_kwargs,
|
|
2437
2442
|
)
|
|
2438
2443
|
# save to project spec
|
|
@@ -2511,8 +2516,9 @@ class MlrunProject(ModelObj):
|
|
|
2511
2516
|
handler: typing.Optional[str] = None,
|
|
2512
2517
|
with_repo: typing.Optional[bool] = None,
|
|
2513
2518
|
tag: typing.Optional[str] = None,
|
|
2514
|
-
requirements: typing.Union[
|
|
2519
|
+
requirements: typing.Union[list[str], None] = None,
|
|
2515
2520
|
requirements_file: str = "",
|
|
2521
|
+
local_path: typing.Optional[str] = None,
|
|
2516
2522
|
**application_kwargs,
|
|
2517
2523
|
) -> tuple[str, mlrun.runtimes.RemoteRuntime, dict]:
|
|
2518
2524
|
import mlrun.model_monitoring.api
|
|
@@ -2529,6 +2535,7 @@ class MlrunProject(ModelObj):
|
|
|
2529
2535
|
tag=tag,
|
|
2530
2536
|
requirements=requirements,
|
|
2531
2537
|
requirements_file=requirements_file,
|
|
2538
|
+
local_path=local_path,
|
|
2532
2539
|
**application_kwargs,
|
|
2533
2540
|
)
|
|
2534
2541
|
elif isinstance(func, str) and isinstance(handler, str):
|
mlrun/run.py
CHANGED
|
@@ -17,6 +17,7 @@ import json
|
|
|
17
17
|
import os
|
|
18
18
|
import pathlib
|
|
19
19
|
import socket
|
|
20
|
+
import sys
|
|
20
21
|
import tempfile
|
|
21
22
|
import time
|
|
22
23
|
import typing
|
|
@@ -117,14 +118,13 @@ def function_to_module(code="", workdir=None, secrets=None, silent=False):
|
|
|
117
118
|
raise ValueError("nothing to run, specify command or function")
|
|
118
119
|
|
|
119
120
|
command = os.path.join(workdir or "", command)
|
|
120
|
-
|
|
121
|
-
mod_name = path.name
|
|
122
|
-
if path.suffix:
|
|
123
|
-
mod_name = mod_name[: -len(path.suffix)]
|
|
121
|
+
mod_name = mlrun.utils.helpers.get_module_name_from_path(command)
|
|
124
122
|
spec = imputil.spec_from_file_location(mod_name, command)
|
|
125
123
|
if spec is None:
|
|
126
124
|
raise OSError(f"cannot import from {command!r}")
|
|
127
125
|
mod = imputil.module_from_spec(spec)
|
|
126
|
+
# add to system modules, which can be necessary when running in a MockServer (ML-10937)
|
|
127
|
+
sys.modules[mod_name] = mod
|
|
128
128
|
spec.loader.exec_module(mod)
|
|
129
129
|
|
|
130
130
|
return mod
|
|
@@ -413,21 +413,29 @@ def import_function_to_dict(
|
|
|
413
413
|
with open(code_file, "wb") as fp:
|
|
414
414
|
fp.write(code)
|
|
415
415
|
elif cmd:
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
if slash_index < 0:
|
|
419
|
-
raise ValueError(f"no file in exec path (spec.command={code_file})")
|
|
420
|
-
base_dir = os.path.normpath(url[: slash_index + 1])
|
|
421
|
-
candidate_path = _ensure_path_confined_to_base_dir(
|
|
422
|
-
base_directory=base_dir,
|
|
423
|
-
relative_path=code_file,
|
|
424
|
-
error_message_on_escape=f"exec file spec.command={code_file} is outside of allowed directory",
|
|
425
|
-
)
|
|
426
|
-
if path.isfile(candidate_path):
|
|
427
|
-
raise ValueError(
|
|
428
|
-
f"exec file spec.command={code_file} is relative, change working dir"
|
|
429
|
-
)
|
|
416
|
+
slash_index = url.rfind("/")
|
|
417
|
+
if slash_index < 0:
|
|
430
418
|
raise ValueError(f"no file in exec path (spec.command={code_file})")
|
|
419
|
+
base_dir = os.path.normpath(url[: slash_index + 1])
|
|
420
|
+
|
|
421
|
+
# Validate and resolve the candidate path before checking existence
|
|
422
|
+
candidate_path = _ensure_path_confined_to_base_dir(
|
|
423
|
+
base_directory=base_dir,
|
|
424
|
+
relative_path=code_file,
|
|
425
|
+
error_message_on_escape=(
|
|
426
|
+
f"exec file spec.command={code_file} is outside of allowed directory"
|
|
427
|
+
),
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
# Only now it's safe to check file existence
|
|
431
|
+
if not path.isfile(candidate_path):
|
|
432
|
+
raise ValueError(f"no file in exec path (spec.command={code_file})")
|
|
433
|
+
|
|
434
|
+
# Check that the path is absolute
|
|
435
|
+
if not os.path.isabs(code_file):
|
|
436
|
+
raise ValueError(
|
|
437
|
+
f"exec file spec.command={code_file} is relative, it must be absolute. Change working dir"
|
|
438
|
+
)
|
|
431
439
|
else:
|
|
432
440
|
raise ValueError("command or code not specified in function spec")
|
|
433
441
|
|
|
@@ -601,7 +609,7 @@ def code_to_function(
|
|
|
601
609
|
code_output: Optional[str] = "",
|
|
602
610
|
embed_code: bool = True,
|
|
603
611
|
description: Optional[str] = "",
|
|
604
|
-
requirements: Optional[
|
|
612
|
+
requirements: Optional[list[str]] = None,
|
|
605
613
|
categories: Optional[list[str]] = None,
|
|
606
614
|
labels: Optional[dict[str, str]] = None,
|
|
607
615
|
with_doc: Optional[bool] = True,
|
|
@@ -568,6 +568,12 @@ class ApplicationRuntime(RemoteRuntime):
|
|
|
568
568
|
"Authentication credentials not provided"
|
|
569
569
|
)
|
|
570
570
|
|
|
571
|
+
if direct_port_access and port:
|
|
572
|
+
logger.warning(
|
|
573
|
+
"Ignoring 'port' because 'direct_port_access' is enabled. "
|
|
574
|
+
"The 'port' setting is only applicable when 'direct_port_access' is disabled."
|
|
575
|
+
)
|
|
576
|
+
|
|
571
577
|
ports = (
|
|
572
578
|
port or self.spec.internal_application_port if direct_port_access else []
|
|
573
579
|
)
|
mlrun/serving/server.py
CHANGED
|
@@ -20,7 +20,6 @@ import copy
|
|
|
20
20
|
import importlib
|
|
21
21
|
import json
|
|
22
22
|
import os
|
|
23
|
-
import pathlib
|
|
24
23
|
import socket
|
|
25
24
|
import traceback
|
|
26
25
|
import uuid
|
|
@@ -51,7 +50,7 @@ from ..datastore.store_resources import ResourceCache
|
|
|
51
50
|
from ..errors import MLRunInvalidArgumentError
|
|
52
51
|
from ..execution import MLClientCtx
|
|
53
52
|
from ..model import ModelObj
|
|
54
|
-
from ..utils import get_caller_globals
|
|
53
|
+
from ..utils import get_caller_globals, get_module_name_from_path
|
|
55
54
|
from .states import (
|
|
56
55
|
FlowStep,
|
|
57
56
|
MonitoredStep,
|
|
@@ -598,17 +597,7 @@ async def async_execute_graph(
|
|
|
598
597
|
# gets set in local flow and not just in the remote pod
|
|
599
598
|
source_file_path = spec.get("filename", None)
|
|
600
599
|
if source_file_path:
|
|
601
|
-
|
|
602
|
-
current_dir_path_object = pathlib.Path(".").resolve()
|
|
603
|
-
if not source_file_path_object.is_relative_to(current_dir_path_object):
|
|
604
|
-
raise mlrun.errors.MLRunRuntimeError(
|
|
605
|
-
f"Source file path '{source_file_path}' is not under the current working directory "
|
|
606
|
-
f"(which is required when running with local=True)"
|
|
607
|
-
)
|
|
608
|
-
relative_path_to_source_file = source_file_path_object.relative_to(
|
|
609
|
-
current_dir_path_object
|
|
610
|
-
)
|
|
611
|
-
modname = ".".join(relative_path_to_source_file.with_suffix("").parts)
|
|
600
|
+
modname = get_module_name_from_path(source_file_path)
|
|
612
601
|
|
|
613
602
|
namespace = {}
|
|
614
603
|
if modname:
|
mlrun/utils/helpers.py
CHANGED
|
@@ -21,6 +21,7 @@ import inspect
|
|
|
21
21
|
import itertools
|
|
22
22
|
import json
|
|
23
23
|
import os
|
|
24
|
+
import pathlib
|
|
24
25
|
import re
|
|
25
26
|
import string
|
|
26
27
|
import sys
|
|
@@ -45,6 +46,8 @@ import pytz
|
|
|
45
46
|
import semver
|
|
46
47
|
import yaml
|
|
47
48
|
from dateutil import parser
|
|
49
|
+
from packaging.requirements import Requirement
|
|
50
|
+
from packaging.utils import canonicalize_name
|
|
48
51
|
from pandas import Timedelta, Timestamp
|
|
49
52
|
from yaml.representer import RepresenterError
|
|
50
53
|
|
|
@@ -807,6 +810,10 @@ def remove_tag_from_artifact_uri(uri: str) -> Optional[str]:
|
|
|
807
810
|
return uri if not add_store else DB_SCHEMA + "://" + uri
|
|
808
811
|
|
|
809
812
|
|
|
813
|
+
def check_if_hub_uri(uri: str) -> bool:
|
|
814
|
+
return uri.startswith(hub_prefix)
|
|
815
|
+
|
|
816
|
+
|
|
810
817
|
def extend_hub_uri_if_needed(
|
|
811
818
|
uri: str,
|
|
812
819
|
asset_type: HubSourceType = HubSourceType.functions,
|
|
@@ -823,7 +830,7 @@ def extend_hub_uri_if_needed(
|
|
|
823
830
|
[0] = Extended URI of item
|
|
824
831
|
[1] = Is hub item (bool)
|
|
825
832
|
"""
|
|
826
|
-
is_hub_uri = uri
|
|
833
|
+
is_hub_uri = check_if_hub_uri(uri)
|
|
827
834
|
if not is_hub_uri:
|
|
828
835
|
return uri, is_hub_uri
|
|
829
836
|
|
|
@@ -923,11 +930,23 @@ def enrich_image_url(
|
|
|
923
930
|
)
|
|
924
931
|
mlrun_version = config.images_tag or client_version or server_version
|
|
925
932
|
tag = mlrun_version or ""
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
933
|
+
|
|
934
|
+
# starting mlrun 1.10.0-rc0 we want to enrich the kfp image with the python version
|
|
935
|
+
# e.g for 1.9 we have a single mlrun-kfp image that supports only python 3.9
|
|
936
|
+
enrich_kfp_python_version = (
|
|
937
|
+
"mlrun-kfp" in image_url
|
|
938
|
+
and mlrun_version
|
|
939
|
+
and semver.VersionInfo.is_valid(mlrun_version)
|
|
940
|
+
and semver.VersionInfo.parse(mlrun_version)
|
|
941
|
+
>= semver.VersionInfo.parse("1.10.0-rc0")
|
|
929
942
|
)
|
|
930
943
|
|
|
944
|
+
if "mlrun-kfp" not in image_url or enrich_kfp_python_version:
|
|
945
|
+
tag += resolve_image_tag_suffix(
|
|
946
|
+
mlrun_version=mlrun_version,
|
|
947
|
+
python_version=client_python_version,
|
|
948
|
+
)
|
|
949
|
+
|
|
931
950
|
# it's an mlrun image if the repository is mlrun
|
|
932
951
|
is_mlrun_image = image_url.startswith("mlrun/") or "/mlrun/" in image_url
|
|
933
952
|
if ":" in image_url:
|
|
@@ -2408,3 +2427,52 @@ def set_data_by_path(
|
|
|
2408
2427
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
2409
2428
|
"Expected path to be of type str or list of str"
|
|
2410
2429
|
)
|
|
2430
|
+
|
|
2431
|
+
|
|
2432
|
+
def _normalize_requirements(reqs: typing.Union[str, list[str], None]) -> list[str]:
|
|
2433
|
+
if reqs is None:
|
|
2434
|
+
return []
|
|
2435
|
+
if isinstance(reqs, str):
|
|
2436
|
+
s = reqs.strip()
|
|
2437
|
+
return [s] if s else []
|
|
2438
|
+
return [s.strip() for s in reqs if s and s.strip()]
|
|
2439
|
+
|
|
2440
|
+
|
|
2441
|
+
def merge_requirements(
|
|
2442
|
+
reqs_priority: typing.Union[str, list[str], None],
|
|
2443
|
+
reqs_secondary: typing.Union[str, list[str], None],
|
|
2444
|
+
) -> list[str]:
|
|
2445
|
+
"""
|
|
2446
|
+
Merge two requirement collections into a union. If the same package
|
|
2447
|
+
appears in both, the specifier from reqs_priority wins.
|
|
2448
|
+
|
|
2449
|
+
Args:
|
|
2450
|
+
reqs_priority: str | list[str] | None (priority input)
|
|
2451
|
+
reqs_secondary: str | list[str] | None
|
|
2452
|
+
|
|
2453
|
+
Returns:
|
|
2454
|
+
list[str]: pip-style requirements.
|
|
2455
|
+
"""
|
|
2456
|
+
merged: dict[str, Requirement] = {}
|
|
2457
|
+
|
|
2458
|
+
for r in _normalize_requirements(reqs_secondary) + _normalize_requirements(
|
|
2459
|
+
reqs_priority
|
|
2460
|
+
):
|
|
2461
|
+
req = Requirement(r)
|
|
2462
|
+
merged[canonicalize_name(req.name)] = req
|
|
2463
|
+
|
|
2464
|
+
return [str(req) for req in merged.values()]
|
|
2465
|
+
|
|
2466
|
+
|
|
2467
|
+
def get_module_name_from_path(source_file_path: str) -> str:
|
|
2468
|
+
source_file_path_object = pathlib.Path(source_file_path).resolve()
|
|
2469
|
+
current_dir_path_object = pathlib.Path(".").resolve()
|
|
2470
|
+
if not source_file_path_object.is_relative_to(current_dir_path_object):
|
|
2471
|
+
raise mlrun.errors.MLRunRuntimeError(
|
|
2472
|
+
f"Source file path '{source_file_path}' is not under the current working directory "
|
|
2473
|
+
f"(which is required when running with local=True)"
|
|
2474
|
+
)
|
|
2475
|
+
relative_path_to_source_file = source_file_path_object.relative_to(
|
|
2476
|
+
current_dir_path_object
|
|
2477
|
+
)
|
|
2478
|
+
return ".".join(relative_path_to_source_file.with_suffix("").parts)
|
mlrun/utils/version/version.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mlrun
|
|
3
|
-
Version: 1.10.
|
|
3
|
+
Version: 1.10.0rc36
|
|
4
4
|
Summary: Tracking and config of machine learning runs
|
|
5
5
|
Home-page: https://github.com/mlrun/mlrun
|
|
6
6
|
Author: Yaron Haviv
|
|
@@ -105,7 +105,7 @@ Requires-Dist: snowflake-connector-python~=3.7; extra == "snowflake"
|
|
|
105
105
|
Provides-Extra: dev-postgres
|
|
106
106
|
Requires-Dist: pytest-mock-resources[postgres]~=2.12; extra == "dev-postgres"
|
|
107
107
|
Provides-Extra: kfp18
|
|
108
|
-
Requires-Dist: mlrun_pipelines_kfp_v1_8[kfp]
|
|
108
|
+
Requires-Dist: mlrun_pipelines_kfp_v1_8[kfp]~=0.5.8; extra == "kfp18"
|
|
109
109
|
Provides-Extra: api
|
|
110
110
|
Requires-Dist: uvicorn~=0.32.1; extra == "api"
|
|
111
111
|
Requires-Dist: dask-kubernetes~=0.11.0; extra == "api"
|
|
@@ -6,9 +6,9 @@ mlrun/execution.py,sha256=Ozu8SjO-nQ6l5vHwqrTQjmP6koMpUqNQpp6qn6jvhVE,58802
|
|
|
6
6
|
mlrun/features.py,sha256=jMEXo6NB36A6iaxNEJWzdtYwUmglYD90OIKTIEeWhE8,15841
|
|
7
7
|
mlrun/k8s_utils.py,sha256=zIacVyvsXrXVO-DdxAoGQOGEDWOGJEFJzYPhPVnn3z8,24548
|
|
8
8
|
mlrun/lists.py,sha256=OlaV2QIFUzmenad9kxNJ3k4whlDyxI3zFbGwr6vpC5Y,8561
|
|
9
|
-
mlrun/model.py,sha256=
|
|
9
|
+
mlrun/model.py,sha256=JxYWYfMvRMloVEsxfghjH8gq5vsVCVk-OJmHGhbPJuU,88954
|
|
10
10
|
mlrun/render.py,sha256=5DlhD6JtzHgmj5RVlpaYiHGhX84Q7qdi4RCEUj2UMgw,13195
|
|
11
|
-
mlrun/run.py,sha256=
|
|
11
|
+
mlrun/run.py,sha256=eXmu2C2Z-iWWRkyraYjOoM22lRfnyavOnskylHwPeV8,48948
|
|
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=QQFZGydQbx9RvAaSiaH-ALQZVcDKQX5lgizqj_rXW2k,15948
|
|
@@ -40,7 +40,7 @@ mlrun/common/formatters/run.py,sha256=LlqhhVY4dAp5y17k_sWBtHaJogdNdtJWF0iO9sX-bU
|
|
|
40
40
|
mlrun/common/model_monitoring/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
|
|
41
41
|
mlrun/common/model_monitoring/helpers.py,sha256=DZ1xAtqHNswKY5rrZo2cVTmQLsfS-M7fSF4XsV-FIYE,6237
|
|
42
42
|
mlrun/common/runtimes/constants.py,sha256=CGMHE2gdsNHXNsa-u3eL0o8sQmDs6PN5FLpMlCDClns,12218
|
|
43
|
-
mlrun/common/schemas/__init__.py,sha256=
|
|
43
|
+
mlrun/common/schemas/__init__.py,sha256=oEG9cIcDxzrTVrjDRuYBTSsEOK0ifFVdQp-D1EUkIDY,5517
|
|
44
44
|
mlrun/common/schemas/alert.py,sha256=u6INAHBhQIfm-mMsGqDJo1_JDN6gOuWZa-8fOU-aOUE,10182
|
|
45
45
|
mlrun/common/schemas/api_gateway.py,sha256=bgC3vXbyb1SVwsSZkLXtEoQLCe_QDKpIhAVX3X_HWW4,7126
|
|
46
46
|
mlrun/common/schemas/artifact.py,sha256=JojMRRa4n0Rge2olGOpUyp348hkTGsMEnvUBRSoo4oE,4310
|
|
@@ -56,7 +56,7 @@ mlrun/common/schemas/feature_store.py,sha256=Kz7AWQ1RCPA8sTL9cGRZnfUBhWf4MX_5yyY
|
|
|
56
56
|
mlrun/common/schemas/frontend_spec.py,sha256=tR8k78cppYK-X8kCWe0mz1gk8yqpsn2IxM3QmBdTJs8,2622
|
|
57
57
|
mlrun/common/schemas/function.py,sha256=BUHenAK6r_mWtDrBWE42xPJU8zh8ng5Usj7GmB_SAcU,5108
|
|
58
58
|
mlrun/common/schemas/http.py,sha256=KozLgGV1vpNXQ8Qptr_Zm6BEbc2VcU42hSphe_ffe_A,704
|
|
59
|
-
mlrun/common/schemas/hub.py,sha256=
|
|
59
|
+
mlrun/common/schemas/hub.py,sha256=K6Z9RHeCFXRWDyhtmc2UF4SNl2uwmJk0Pe4BqrZgLVw,4275
|
|
60
60
|
mlrun/common/schemas/k8s.py,sha256=YgyDK7KNt29GHCOxd1vw-jnl_757cIPLzViCTNT1Zcc,1403
|
|
61
61
|
mlrun/common/schemas/memory_reports.py,sha256=Q6w7xofQlMD-iqjE8uK9yU5ijLPkht_EsXJCMad_TQo,899
|
|
62
62
|
mlrun/common/schemas/notification.py,sha256=Q-tBaU_V7YZiuj3ankuACf3_-hb874_osxq0eaW90Ww,5549
|
|
@@ -73,7 +73,7 @@ mlrun/common/schemas/secret.py,sha256=Td2UAeWHSAdA4nIP3rQv_PIVKVqcBnCnK6xjr528tS
|
|
|
73
73
|
mlrun/common/schemas/serving.py,sha256=4ek9JZDagkdeXyfkX6P6xp4deUNSf_kqXUaXcKSuv-g,1391
|
|
74
74
|
mlrun/common/schemas/tag.py,sha256=1wqEiAujsElojWb3qmuyfcaLFjXSNAAQdafkDx7fkn0,891
|
|
75
75
|
mlrun/common/schemas/workflow.py,sha256=Y-FHJnxs5c86yetuOAPdEJPkne__tLPCxjSXSb4lrjo,2541
|
|
76
|
-
mlrun/common/schemas/model_monitoring/__init__.py,sha256=
|
|
76
|
+
mlrun/common/schemas/model_monitoring/__init__.py,sha256=ndeGXCJTE_GvMSb1FfQ5fXvhs0I8nO_yWy1UBSZIifY,1956
|
|
77
77
|
mlrun/common/schemas/model_monitoring/constants.py,sha256=uQ3ataL-tAcwGY1GQLEvu05gGgMb2kBr6YRzjJS6yYs,13953
|
|
78
78
|
mlrun/common/schemas/model_monitoring/functions.py,sha256=Ej8ChjmMZq1HP32THNABoktQHN1mdlkSqKbofxu10i4,2536
|
|
79
79
|
mlrun/common/schemas/model_monitoring/grafana.py,sha256=THQlLfPBevBksta8p5OaIsBaJtsNSXexLvHrDxOaVns,2095
|
|
@@ -220,7 +220,7 @@ mlrun/frameworks/xgboost/mlrun_interface.py,sha256=KINOf0udbY75raTewjEFGNlIRyE0e
|
|
|
220
220
|
mlrun/frameworks/xgboost/model_handler.py,sha256=bJq4D1VK3rzhALovqIV5mS0LvGiTlsgAkHanD25pU2c,11663
|
|
221
221
|
mlrun/frameworks/xgboost/utils.py,sha256=4rShiFChzDbWJ4HoTo4qV_lj-Z89pHBAp6Z1yHmU8wA,1068
|
|
222
222
|
mlrun/hub/__init__.py,sha256=50cXcEk8i5G8KQ-nzF6iZDkMbXd-zMNd8nQZ7y7KTVI,620
|
|
223
|
-
mlrun/hub/module.py,sha256=
|
|
223
|
+
mlrun/hub/module.py,sha256=ZVZB8hsd5tEaRLM-mMsnw1yZx6acNrpTyGBl8EJ4nhU,7269
|
|
224
224
|
mlrun/launcher/__init__.py,sha256=JL8qkT1lLr1YvW6iP0hmwDTaSR2RfrMDx0-1gWRhTOE,571
|
|
225
225
|
mlrun/launcher/base.py,sha256=IgBE-ZS1ZiGzucg5SElGtO4qOB0cqYQfGtZTcRc2S3Y,17378
|
|
226
226
|
mlrun/launcher/client.py,sha256=cl40ZdF2fU1QbUKdl4Xnucb1u2h-8_dn095qIUyxbuM,6402
|
|
@@ -228,7 +228,7 @@ mlrun/launcher/factory.py,sha256=RW7mfzEFi8fR0M-4W1JQg1iq3_muUU6OTqT_3l4Ubrk,233
|
|
|
228
228
|
mlrun/launcher/local.py,sha256=3gv-IQYoIChSmRaZ0vLUh0Tu26oLMCx9GbBYh4fWygQ,12161
|
|
229
229
|
mlrun/launcher/remote.py,sha256=zFXE52Cq_7EkC8lfNKT0ceIbye0CfFiundF7O1YU4Xw,7810
|
|
230
230
|
mlrun/model_monitoring/__init__.py,sha256=qDQnncjya9XPTlfvGyfWsZWiXc-glGZrrNja-5QmCZk,782
|
|
231
|
-
mlrun/model_monitoring/api.py,sha256=
|
|
231
|
+
mlrun/model_monitoring/api.py,sha256=g9st30YgcApT42ZU-aSlnLiLdDwATkujXg_5UrAFt1M,27738
|
|
232
232
|
mlrun/model_monitoring/controller.py,sha256=2XOkOZRB03K9ph6TH-ICspHga-GQOURL0C8-0GTHaTY,43961
|
|
233
233
|
mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
|
|
234
234
|
mlrun/model_monitoring/helpers.py,sha256=50oFqgIc5xFHYPIVgq3M-Gbr7epqAI5NgHmvOeMy52U,24667
|
|
@@ -236,7 +236,7 @@ mlrun/model_monitoring/stream_processing.py,sha256=bryYO3D0cC10MAQ-liHxUZ79MrL-V
|
|
|
236
236
|
mlrun/model_monitoring/writer.py,sha256=l2D_5Ms5Wq5jfyQRVJbGBBRTMLjMmIAxwPeHWmrc9Kg,16382
|
|
237
237
|
mlrun/model_monitoring/applications/__init__.py,sha256=BwlmRELlFJf2b2YMyv5kUSHNe8--OyqWhDgRlT8a_8g,779
|
|
238
238
|
mlrun/model_monitoring/applications/_application_steps.py,sha256=t9LDIqQUGE10cyjyhlg0QqN1yVx0apD1HpERYLJfm8U,7409
|
|
239
|
-
mlrun/model_monitoring/applications/base.py,sha256=
|
|
239
|
+
mlrun/model_monitoring/applications/base.py,sha256=kvfYiFUsStjZwPIqeibUW6auCXRFcovyh-pih_pZ6Rs,49139
|
|
240
240
|
mlrun/model_monitoring/applications/context.py,sha256=3W3AW4oyJgx_nW_5mDsV59Iy5D3frkfYMQSc6DgBc4c,17004
|
|
241
241
|
mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=2qgfFmrpHf-x0_EaHD-0T28piwSQzw-HH71aV1GwbZs,15389
|
|
242
242
|
mlrun/model_monitoring/applications/results.py,sha256=LfBQOmkpKGvVGNrcj5QiXsRIG2IRgcv_Xqe4QJBmauk,5699
|
|
@@ -281,7 +281,7 @@ mlrun/platforms/iguazio.py,sha256=32_o95Ntx9z3ciowt2NcnX7tAiLBwX3VB0mbTQ-KrIQ,13
|
|
|
281
281
|
mlrun/projects/__init__.py,sha256=hdCOA6_fp8X4qGGGT7Bj7sPbkM1PayWuaVZL0DkpuZw,1240
|
|
282
282
|
mlrun/projects/operations.py,sha256=Oo7h0TMztI_RVmj0rQxNS1igS_c94HpQZwMIFjiWt0E,21038
|
|
283
283
|
mlrun/projects/pipelines.py,sha256=ZOfuIEHOXfuc4qAkuWvbWhCjP6kqpLkv-yBBaY9RXhg,52219
|
|
284
|
-
mlrun/projects/project.py,sha256=
|
|
284
|
+
mlrun/projects/project.py,sha256=jSJ65upJ6zYRHly6aOQxBR6414Ypueg2iXE6XBjc-uQ,257695
|
|
285
285
|
mlrun/runtimes/__init__.py,sha256=8cqrYKy1a0_87XG7V_p96untQ4t8RocadM4LVEEN1JM,9029
|
|
286
286
|
mlrun/runtimes/base.py,sha256=txynS-hiNLR97PBd49mc5q9ZX3gMf3VdJ2rJ-fz5bZU,38913
|
|
287
287
|
mlrun/runtimes/daskjob.py,sha256=IN6gKKrmCIjWooj5FgFm-pAb2i7ra1ERRzClfu_rYGI,20102
|
|
@@ -307,7 +307,7 @@ mlrun/runtimes/nuclio/function.py,sha256=VjJtfteEX2I8gYCwbBdqWwIK6ZOCVOu8lQGlX4i
|
|
|
307
307
|
mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
|
|
308
308
|
mlrun/runtimes/nuclio/serving.py,sha256=NF0f7a6KV8GIb4QBUKiJa_L_5oqCsG7UHPs8Uo3K_Eo,36330
|
|
309
309
|
mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
|
|
310
|
-
mlrun/runtimes/nuclio/application/application.py,sha256=
|
|
310
|
+
mlrun/runtimes/nuclio/application/application.py,sha256=q5vBuHnWTGciokEODlSM3nfopuPwJ9RqKZNZe6C86l4,33464
|
|
311
311
|
mlrun/runtimes/nuclio/application/reverse_proxy.go,sha256=lEHH74vr2PridIHp1Jkc_NjkrWb5b6zawRrNxHQhwGU,2913
|
|
312
312
|
mlrun/runtimes/sparkjob/__init__.py,sha256=GPP_ekItxiU9Ydn3mJa4Obph02Bg6DO-JYs791_MV58,607
|
|
313
313
|
mlrun/runtimes/sparkjob/spark3job.py,sha256=3dW7RG2T58F2dsUw0TsRvE3SIFcekx3CerLdcaG1f50,41458
|
|
@@ -315,7 +315,7 @@ mlrun/serving/__init__.py,sha256=nriJAcVn5aatwU03T7SsE6ngJEGTxr3wIGt4WuvCCzY,139
|
|
|
315
315
|
mlrun/serving/merger.py,sha256=pfOQoozUyObCTpqXAMk94PmhZefn4bBrKufO3MKnkAc,6193
|
|
316
316
|
mlrun/serving/remote.py,sha256=p29CBtKwbW_l8BzmNg3Uy__0eMf7_OubTMzga_S3EOA,22089
|
|
317
317
|
mlrun/serving/routers.py,sha256=pu5jlSLI4Ml68YP_FMFDhhwPfLcT6lRu5yL5QDgXPHQ,52889
|
|
318
|
-
mlrun/serving/server.py,sha256=
|
|
318
|
+
mlrun/serving/server.py,sha256=voN7s7WT3S-7gt14F1lXd5OMxz6tMNZX8ORP-blq2Hg,40342
|
|
319
319
|
mlrun/serving/serving_wrapper.py,sha256=UL9hhWCfMPcTJO_XrkvNaFvck1U1E7oS8trTZyak0cA,835
|
|
320
320
|
mlrun/serving/states.py,sha256=Q2Q7o0eJCvnonXd2-sfiv7zhCiyC6xthfW25nzf61KM,138976
|
|
321
321
|
mlrun/serving/steps.py,sha256=zbMgJnu-m4n7vhFRgZkCMMifIsCya-TzAj3Gjc-Fgnc,2193
|
|
@@ -333,7 +333,7 @@ mlrun/utils/async_http.py,sha256=8Olx8TNNeXB07nEGwlqhEgFgnFAD71vBU_bqaA9JW-w,122
|
|
|
333
333
|
mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,3450
|
|
334
334
|
mlrun/utils/clones.py,sha256=qbAGyEbSvlewn3Tw_DpQZP9z6MGzFhSaZfI1CblX8Fg,7515
|
|
335
335
|
mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
|
|
336
|
-
mlrun/utils/helpers.py,sha256=
|
|
336
|
+
mlrun/utils/helpers.py,sha256=Cz3VR5aq3N6DinKd16HI9HGZSLqSmN9h4-EmnNyYGqQ,84369
|
|
337
337
|
mlrun/utils/http.py,sha256=5ZU2VpokaUM_DT3HBSqTm8xjUqTPjZN5fKkSIvKlTl0,8704
|
|
338
338
|
mlrun/utils/logger.py,sha256=uaCgI_ezzaXf7nJDCy-1Nrjds8vSXqDbzmjmb3IyCQo,14864
|
|
339
339
|
mlrun/utils/regex.py,sha256=FcRwWD8x9X3HLhCCU2F0AVKTFah784Pr7ZAe3a02jw8,5199
|
|
@@ -352,11 +352,11 @@ mlrun/utils/notifications/notification/mail.py,sha256=ZyJ3eqd8simxffQmXzqd3bgbAq
|
|
|
352
352
|
mlrun/utils/notifications/notification/slack.py,sha256=wSu_7W0EnGLBNwIgWCYEeTP8j9SPAMPDBnfUcPnVZYA,7299
|
|
353
353
|
mlrun/utils/notifications/notification/webhook.py,sha256=FM5-LQAKAVJKp37MRzR3SsejalcnpM6r_9Oe7znxZEA,5313
|
|
354
354
|
mlrun/utils/version/__init__.py,sha256=YnzE6tlf24uOQ8y7Z7l96QLAI6-QEii7-77g8ynmzy0,613
|
|
355
|
-
mlrun/utils/version/version.json,sha256=
|
|
355
|
+
mlrun/utils/version/version.json,sha256=876_bBJq-oJumu3IBWxsasuwBXN_LUtdTW7Jr0LznPU,90
|
|
356
356
|
mlrun/utils/version/version.py,sha256=M2hVhRrgkN3SxacZHs3ZqaOsqAA7B6a22ne324IQ1HE,1877
|
|
357
|
-
mlrun-1.10.
|
|
358
|
-
mlrun-1.10.
|
|
359
|
-
mlrun-1.10.
|
|
360
|
-
mlrun-1.10.
|
|
361
|
-
mlrun-1.10.
|
|
362
|
-
mlrun-1.10.
|
|
357
|
+
mlrun-1.10.0rc36.dist-info/licenses/LICENSE,sha256=zTiv1CxWNkOk1q8eJS1G_8oD4gWpWLwWxj_Agcsi8Os,11337
|
|
358
|
+
mlrun-1.10.0rc36.dist-info/METADATA,sha256=VKzv921s1CzMkxdNcIj5xmKzuHq-Voq9Bijsncs9ZN8,26104
|
|
359
|
+
mlrun-1.10.0rc36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
360
|
+
mlrun-1.10.0rc36.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
|
|
361
|
+
mlrun-1.10.0rc36.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
|
|
362
|
+
mlrun-1.10.0rc36.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|