mlrun 1.6.0rc35__py3-none-any.whl → 1.7.0rc2__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/__main__.py +3 -3
- mlrun/api/schemas/__init__.py +1 -1
- mlrun/artifacts/base.py +11 -6
- mlrun/artifacts/dataset.py +2 -2
- mlrun/artifacts/model.py +30 -24
- mlrun/artifacts/plots.py +2 -2
- mlrun/common/db/sql_session.py +5 -3
- mlrun/common/helpers.py +1 -2
- mlrun/common/schemas/artifact.py +3 -3
- mlrun/common/schemas/auth.py +3 -3
- mlrun/common/schemas/background_task.py +1 -1
- mlrun/common/schemas/client_spec.py +1 -1
- mlrun/common/schemas/feature_store.py +16 -16
- mlrun/common/schemas/frontend_spec.py +7 -7
- mlrun/common/schemas/function.py +1 -1
- mlrun/common/schemas/hub.py +4 -9
- mlrun/common/schemas/memory_reports.py +2 -2
- mlrun/common/schemas/model_monitoring/grafana.py +4 -4
- mlrun/common/schemas/model_monitoring/model_endpoints.py +14 -15
- mlrun/common/schemas/notification.py +4 -4
- mlrun/common/schemas/object.py +2 -2
- mlrun/common/schemas/pipeline.py +1 -1
- mlrun/common/schemas/project.py +3 -3
- mlrun/common/schemas/runtime_resource.py +8 -12
- mlrun/common/schemas/schedule.py +3 -3
- mlrun/common/schemas/tag.py +1 -2
- mlrun/common/schemas/workflow.py +2 -2
- mlrun/config.py +8 -4
- mlrun/data_types/to_pandas.py +1 -3
- mlrun/datastore/base.py +0 -28
- mlrun/datastore/datastore_profile.py +9 -9
- mlrun/datastore/filestore.py +0 -1
- mlrun/datastore/google_cloud_storage.py +1 -1
- mlrun/datastore/sources.py +7 -11
- mlrun/datastore/spark_utils.py +1 -2
- mlrun/datastore/targets.py +31 -31
- mlrun/datastore/utils.py +4 -6
- mlrun/datastore/v3io.py +70 -46
- mlrun/db/base.py +22 -23
- mlrun/db/httpdb.py +34 -34
- mlrun/db/nopdb.py +19 -19
- mlrun/errors.py +1 -1
- mlrun/execution.py +4 -4
- mlrun/feature_store/api.py +20 -21
- mlrun/feature_store/common.py +1 -1
- mlrun/feature_store/feature_set.py +28 -32
- mlrun/feature_store/feature_vector.py +24 -27
- mlrun/feature_store/retrieval/base.py +7 -7
- mlrun/feature_store/retrieval/conversion.py +2 -4
- mlrun/feature_store/steps.py +7 -15
- mlrun/features.py +5 -7
- mlrun/frameworks/_common/artifacts_library.py +9 -9
- mlrun/frameworks/_common/mlrun_interface.py +5 -5
- mlrun/frameworks/_common/model_handler.py +48 -48
- mlrun/frameworks/_common/plan.py +2 -3
- mlrun/frameworks/_common/producer.py +3 -4
- mlrun/frameworks/_common/utils.py +5 -5
- mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +16 -35
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
- mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
- mlrun/frameworks/_ml_common/model_handler.py +24 -24
- mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
- mlrun/frameworks/_ml_common/plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
- mlrun/frameworks/_ml_common/utils.py +4 -4
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +7 -7
- mlrun/frameworks/huggingface/model_server.py +4 -4
- mlrun/frameworks/lgbm/__init__.py +32 -32
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
- mlrun/frameworks/lgbm/model_handler.py +9 -9
- mlrun/frameworks/lgbm/model_server.py +6 -6
- mlrun/frameworks/lgbm/utils.py +5 -5
- mlrun/frameworks/onnx/dataset.py +8 -8
- mlrun/frameworks/onnx/mlrun_interface.py +3 -3
- mlrun/frameworks/onnx/model_handler.py +6 -6
- mlrun/frameworks/onnx/model_server.py +7 -7
- mlrun/frameworks/parallel_coordinates.py +2 -2
- mlrun/frameworks/pytorch/__init__.py +16 -16
- mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
- mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
- mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
- mlrun/frameworks/pytorch/model_handler.py +17 -17
- mlrun/frameworks/pytorch/model_server.py +7 -7
- mlrun/frameworks/sklearn/__init__.py +12 -12
- mlrun/frameworks/sklearn/estimator.py +4 -4
- mlrun/frameworks/sklearn/metrics_library.py +14 -14
- mlrun/frameworks/sklearn/mlrun_interface.py +3 -6
- mlrun/frameworks/sklearn/model_handler.py +2 -2
- mlrun/frameworks/tf_keras/__init__.py +5 -5
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +14 -14
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
- mlrun/frameworks/tf_keras/mlrun_interface.py +7 -9
- mlrun/frameworks/tf_keras/model_handler.py +14 -14
- mlrun/frameworks/tf_keras/model_server.py +6 -6
- mlrun/frameworks/xgboost/__init__.py +12 -12
- mlrun/frameworks/xgboost/model_handler.py +6 -6
- mlrun/k8s_utils.py +4 -5
- mlrun/kfpops.py +2 -2
- mlrun/launcher/base.py +10 -10
- mlrun/launcher/local.py +8 -8
- mlrun/launcher/remote.py +7 -7
- mlrun/lists.py +3 -4
- mlrun/model.py +205 -55
- mlrun/model_monitoring/api.py +21 -24
- mlrun/model_monitoring/application.py +4 -4
- mlrun/model_monitoring/batch.py +17 -17
- mlrun/model_monitoring/controller.py +2 -1
- mlrun/model_monitoring/features_drift_table.py +44 -31
- mlrun/model_monitoring/prometheus.py +1 -4
- mlrun/model_monitoring/stores/kv_model_endpoint_store.py +11 -13
- mlrun/model_monitoring/stores/model_endpoint_store.py +9 -11
- mlrun/model_monitoring/stores/models/__init__.py +2 -2
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +11 -13
- mlrun/model_monitoring/stream_processing.py +16 -34
- mlrun/model_monitoring/tracking_policy.py +2 -1
- mlrun/package/__init__.py +6 -6
- mlrun/package/context_handler.py +5 -5
- mlrun/package/packager.py +7 -7
- mlrun/package/packagers/default_packager.py +6 -6
- mlrun/package/packagers/numpy_packagers.py +15 -15
- mlrun/package/packagers/pandas_packagers.py +5 -5
- mlrun/package/packagers/python_standard_library_packagers.py +10 -10
- mlrun/package/packagers_manager.py +18 -23
- mlrun/package/utils/_formatter.py +4 -4
- mlrun/package/utils/_pickler.py +2 -2
- mlrun/package/utils/_supported_format.py +4 -4
- mlrun/package/utils/log_hint_utils.py +2 -2
- mlrun/package/utils/type_hint_utils.py +4 -9
- mlrun/platforms/other.py +1 -2
- mlrun/projects/operations.py +5 -5
- mlrun/projects/pipelines.py +9 -9
- mlrun/projects/project.py +58 -46
- mlrun/render.py +1 -1
- mlrun/run.py +9 -9
- mlrun/runtimes/__init__.py +7 -4
- mlrun/runtimes/base.py +20 -23
- mlrun/runtimes/constants.py +5 -5
- mlrun/runtimes/daskjob.py +8 -8
- mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
- mlrun/runtimes/databricks_job/databricks_runtime.py +7 -7
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/local.py +1 -1
- mlrun/runtimes/mpijob/abstract.py +1 -2
- mlrun/runtimes/nuclio/__init__.py +20 -0
- mlrun/runtimes/{function.py → nuclio/function.py} +15 -16
- mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
- mlrun/runtimes/{serving.py → nuclio/serving.py} +13 -12
- mlrun/runtimes/pod.py +95 -48
- mlrun/runtimes/remotesparkjob.py +1 -1
- mlrun/runtimes/sparkjob/spark3job.py +50 -33
- mlrun/runtimes/utils.py +1 -2
- mlrun/secrets.py +3 -3
- mlrun/serving/remote.py +0 -4
- mlrun/serving/routers.py +6 -6
- mlrun/serving/server.py +4 -4
- mlrun/serving/states.py +29 -0
- mlrun/serving/utils.py +3 -3
- mlrun/serving/v1_serving.py +6 -7
- mlrun/serving/v2_serving.py +50 -8
- mlrun/track/tracker_manager.py +3 -3
- mlrun/track/trackers/mlflow_tracker.py +1 -2
- mlrun/utils/async_http.py +5 -7
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +1 -2
- mlrun/utils/condition_evaluator.py +3 -3
- mlrun/utils/db.py +3 -3
- mlrun/utils/helpers.py +37 -119
- mlrun/utils/http.py +1 -4
- mlrun/utils/logger.py +49 -14
- mlrun/utils/notifications/notification/__init__.py +3 -3
- mlrun/utils/notifications/notification/base.py +2 -2
- mlrun/utils/notifications/notification/ipython.py +1 -1
- mlrun/utils/notifications/notification_pusher.py +8 -14
- mlrun/utils/retryer.py +207 -0
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +2 -3
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +2 -6
- {mlrun-1.6.0rc35.dist-info → mlrun-1.7.0rc2.dist-info}/METADATA +9 -9
- mlrun-1.7.0rc2.dist-info/RECORD +315 -0
- mlrun-1.6.0rc35.dist-info/RECORD +0 -313
- {mlrun-1.6.0rc35.dist-info → mlrun-1.7.0rc2.dist-info}/LICENSE +0 -0
- {mlrun-1.6.0rc35.dist-info → mlrun-1.7.0rc2.dist-info}/WHEEL +0 -0
- {mlrun-1.6.0rc35.dist-info → mlrun-1.7.0rc2.dist-info}/entry_points.txt +0 -0
- {mlrun-1.6.0rc35.dist-info → mlrun-1.7.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
import importlib
|
|
16
16
|
import sys
|
|
17
|
-
from typing import Any,
|
|
17
|
+
from typing import Any, Union
|
|
18
18
|
|
|
19
19
|
import torch
|
|
20
20
|
import torch.multiprocessing as mp
|
|
@@ -109,13 +109,13 @@ class PyTorchMLRunInterface:
|
|
|
109
109
|
loss_function: Module,
|
|
110
110
|
optimizer: Optimizer,
|
|
111
111
|
validation_set: DataLoader = None,
|
|
112
|
-
metric_functions:
|
|
112
|
+
metric_functions: list[PyTorchTypes.MetricFunctionType] = None,
|
|
113
113
|
scheduler=None,
|
|
114
114
|
scheduler_step_frequency: Union[int, float, str] = "epoch",
|
|
115
115
|
epochs: int = 1,
|
|
116
116
|
training_iterations: int = None,
|
|
117
117
|
validation_iterations: int = None,
|
|
118
|
-
callbacks:
|
|
118
|
+
callbacks: list[Callback] = None,
|
|
119
119
|
use_cuda: bool = True,
|
|
120
120
|
use_horovod: bool = None,
|
|
121
121
|
):
|
|
@@ -221,12 +221,12 @@ class PyTorchMLRunInterface:
|
|
|
221
221
|
self,
|
|
222
222
|
dataset: DataLoader,
|
|
223
223
|
loss_function: Module = None,
|
|
224
|
-
metric_functions:
|
|
224
|
+
metric_functions: list[PyTorchTypes.MetricFunctionType] = None,
|
|
225
225
|
iterations: int = None,
|
|
226
|
-
callbacks:
|
|
226
|
+
callbacks: list[Callback] = None,
|
|
227
227
|
use_cuda: bool = True,
|
|
228
228
|
use_horovod: bool = None,
|
|
229
|
-
) ->
|
|
229
|
+
) -> list[PyTorchTypes.MetricValueType]:
|
|
230
230
|
"""
|
|
231
231
|
Initiate an evaluation process on this interface configuration.
|
|
232
232
|
|
|
@@ -303,9 +303,9 @@ class PyTorchMLRunInterface:
|
|
|
303
303
|
def add_auto_logging_callbacks(
|
|
304
304
|
self,
|
|
305
305
|
add_mlrun_logger: bool = True,
|
|
306
|
-
mlrun_callback_kwargs:
|
|
306
|
+
mlrun_callback_kwargs: dict[str, Any] = None,
|
|
307
307
|
add_tensorboard_logger: bool = True,
|
|
308
|
-
tensorboard_callback_kwargs:
|
|
308
|
+
tensorboard_callback_kwargs: dict[str, Any] = None,
|
|
309
309
|
):
|
|
310
310
|
"""
|
|
311
311
|
Get automatic logging callbacks to both MLRun's context and Tensorboard. For further features of logging to both
|
|
@@ -347,7 +347,7 @@ class PyTorchMLRunInterface:
|
|
|
347
347
|
|
|
348
348
|
def predict(
|
|
349
349
|
self,
|
|
350
|
-
inputs: Union[Tensor,
|
|
350
|
+
inputs: Union[Tensor, list[Tensor]],
|
|
351
351
|
use_cuda: bool = True,
|
|
352
352
|
batch_size: int = -1,
|
|
353
353
|
) -> Tensor:
|
|
@@ -402,13 +402,13 @@ class PyTorchMLRunInterface:
|
|
|
402
402
|
loss_function: Module = None,
|
|
403
403
|
optimizer: Optimizer = None,
|
|
404
404
|
validation_set: DataLoader = None,
|
|
405
|
-
metric_functions:
|
|
405
|
+
metric_functions: list[PyTorchTypes.MetricFunctionType] = None,
|
|
406
406
|
scheduler=None,
|
|
407
407
|
scheduler_step_frequency: Union[int, float, str] = "epoch",
|
|
408
408
|
epochs: int = 1,
|
|
409
409
|
training_iterations: int = None,
|
|
410
410
|
validation_iterations: int = None,
|
|
411
|
-
callbacks:
|
|
411
|
+
callbacks: list[Callback] = None,
|
|
412
412
|
use_cuda: bool = True,
|
|
413
413
|
use_horovod: bool = None,
|
|
414
414
|
):
|
|
@@ -734,7 +734,7 @@ class PyTorchMLRunInterface:
|
|
|
734
734
|
|
|
735
735
|
def _validate(
|
|
736
736
|
self, is_evaluation: bool = False
|
|
737
|
-
) ->
|
|
737
|
+
) -> tuple[PyTorchTypes.MetricValueType, list[PyTorchTypes.MetricValueType]]:
|
|
738
738
|
"""
|
|
739
739
|
Initiate a single epoch validation.
|
|
740
740
|
|
|
@@ -817,7 +817,7 @@ class PyTorchMLRunInterface:
|
|
|
817
817
|
)
|
|
818
818
|
return loss_value, metric_values
|
|
819
819
|
|
|
820
|
-
def _print_results(self, loss_value: Tensor, metric_values:
|
|
820
|
+
def _print_results(self, loss_value: Tensor, metric_values: list[float]):
|
|
821
821
|
"""
|
|
822
822
|
Print the given result between each epoch.
|
|
823
823
|
|
|
@@ -832,7 +832,7 @@ class PyTorchMLRunInterface:
|
|
|
832
832
|
+ tabulate(table, headers=["Metrics", "Values"], tablefmt="pretty")
|
|
833
833
|
)
|
|
834
834
|
|
|
835
|
-
def _metrics(self, y_pred: Tensor, y_true: Tensor) ->
|
|
835
|
+
def _metrics(self, y_pred: Tensor, y_true: Tensor) -> list[float]:
|
|
836
836
|
"""
|
|
837
837
|
Call all the metrics on the given batch's truth and prediction output.
|
|
838
838
|
|
|
@@ -860,7 +860,7 @@ class PyTorchMLRunInterface:
|
|
|
860
860
|
average_tensor = self._hvd.allreduce(rank_value, name=name)
|
|
861
861
|
return average_tensor.item()
|
|
862
862
|
|
|
863
|
-
def _get_learning_rate(self) -> Union[
|
|
863
|
+
def _get_learning_rate(self) -> Union[tuple[str, list[Union[str, int]]], None]:
|
|
864
864
|
"""
|
|
865
865
|
Try and get the learning rate value form the stored optimizer.
|
|
866
866
|
|
|
@@ -949,8 +949,8 @@ class PyTorchMLRunInterface:
|
|
|
949
949
|
|
|
950
950
|
@staticmethod
|
|
951
951
|
def _tensor_to_cuda(
|
|
952
|
-
tensor: Union[Tensor,
|
|
953
|
-
) -> Union[Tensor,
|
|
952
|
+
tensor: Union[Tensor, dict, list, tuple],
|
|
953
|
+
) -> Union[Tensor, dict, list, tuple]:
|
|
954
954
|
"""
|
|
955
955
|
Send to given tensor to cuda if it is a tensor. If the given object is a dictionary, the dictionary values will
|
|
956
956
|
be sent to the function again recursively. If the given object is a list or a tuple, all the values in it will
|
|
@@ -997,7 +997,7 @@ class PyTorchMLRunInterface:
|
|
|
997
997
|
dataset: DataLoader,
|
|
998
998
|
iterations: int,
|
|
999
999
|
description: str,
|
|
1000
|
-
metrics:
|
|
1000
|
+
metrics: list[PyTorchTypes.MetricFunctionType],
|
|
1001
1001
|
) -> tqdm:
|
|
1002
1002
|
"""
|
|
1003
1003
|
Create a progress bar for training and validating / evaluating.
|
|
@@ -1028,8 +1028,8 @@ class PyTorchMLRunInterface:
|
|
|
1028
1028
|
@staticmethod
|
|
1029
1029
|
def _update_progress_bar(
|
|
1030
1030
|
progress_bar: tqdm,
|
|
1031
|
-
metrics:
|
|
1032
|
-
values:
|
|
1031
|
+
metrics: list[PyTorchTypes.MetricFunctionType],
|
|
1032
|
+
values: list[PyTorchTypes.MetricValueType],
|
|
1033
1033
|
):
|
|
1034
1034
|
"""
|
|
1035
1035
|
Update the progress bar metrics results.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
import os
|
|
16
|
-
from typing import
|
|
16
|
+
from typing import Union
|
|
17
17
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
import torch
|
|
@@ -50,9 +50,9 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
50
50
|
model: Module = None,
|
|
51
51
|
model_path: str = None,
|
|
52
52
|
model_name: str = None,
|
|
53
|
-
model_class: Union[
|
|
54
|
-
modules_map: Union[
|
|
55
|
-
custom_objects_map: Union[
|
|
53
|
+
model_class: Union[type[Module], str] = None,
|
|
54
|
+
modules_map: Union[dict[str, Union[None, str, list[str]]], str] = None,
|
|
55
|
+
custom_objects_map: Union[dict[str, Union[str, list[str]]], str] = None,
|
|
56
56
|
custom_objects_directory: str = None,
|
|
57
57
|
context: mlrun.MLClientCtx = None,
|
|
58
58
|
**kwargs,
|
|
@@ -136,7 +136,7 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
136
136
|
)
|
|
137
137
|
|
|
138
138
|
# Set up the base handler class:
|
|
139
|
-
super(
|
|
139
|
+
super().__init__(
|
|
140
140
|
model=model,
|
|
141
141
|
model_path=model_path,
|
|
142
142
|
model_name=model_name,
|
|
@@ -152,8 +152,8 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
152
152
|
|
|
153
153
|
def set_labels(
|
|
154
154
|
self,
|
|
155
|
-
to_add:
|
|
156
|
-
to_remove:
|
|
155
|
+
to_add: dict[str, Union[str, int, float]] = None,
|
|
156
|
+
to_remove: list[str] = None,
|
|
157
157
|
):
|
|
158
158
|
"""
|
|
159
159
|
Update the labels dictionary of this model artifact. There are required labels that cannot be edited or removed.
|
|
@@ -162,14 +162,14 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
162
162
|
:param to_remove: A list of labels keys to remove.
|
|
163
163
|
"""
|
|
164
164
|
# Update the user's labels:
|
|
165
|
-
super(
|
|
165
|
+
super().set_labels(to_add=to_add, to_remove=to_remove)
|
|
166
166
|
|
|
167
167
|
# Set the required labels:
|
|
168
168
|
self._labels[self._LabelKeys.MODEL_CLASS_NAME] = self._model_class_name
|
|
169
169
|
|
|
170
170
|
def save(
|
|
171
171
|
self, output_path: str = None, **kwargs
|
|
172
|
-
) -> Union[
|
|
172
|
+
) -> Union[dict[str, Artifact], None]:
|
|
173
173
|
"""
|
|
174
174
|
Save the handled model at the given output path.
|
|
175
175
|
|
|
@@ -182,7 +182,7 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
182
182
|
:raise MLRunInvalidArgumentError: If an output path was not given, yet a context was not provided in
|
|
183
183
|
initialization.
|
|
184
184
|
"""
|
|
185
|
-
super(
|
|
185
|
+
super().save(output_path=output_path)
|
|
186
186
|
|
|
187
187
|
# Set the output path:
|
|
188
188
|
if output_path is None:
|
|
@@ -207,7 +207,7 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
207
207
|
|
|
208
208
|
:raise MLRunInvalidArgumentError: If the model's class is not in the custom objects map.
|
|
209
209
|
"""
|
|
210
|
-
super(
|
|
210
|
+
super().load()
|
|
211
211
|
|
|
212
212
|
# Validate the model's class is in the custom objects map:
|
|
213
213
|
if (
|
|
@@ -233,10 +233,10 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
233
233
|
def to_onnx(
|
|
234
234
|
self,
|
|
235
235
|
model_name: str = None,
|
|
236
|
-
input_sample: Union[torch.Tensor,
|
|
237
|
-
input_layers_names:
|
|
238
|
-
output_layers_names:
|
|
239
|
-
dynamic_axes:
|
|
236
|
+
input_sample: Union[torch.Tensor, tuple[torch.Tensor, ...]] = None,
|
|
237
|
+
input_layers_names: list[str] = None,
|
|
238
|
+
output_layers_names: list[str] = None,
|
|
239
|
+
dynamic_axes: dict[str, dict[int, str]] = None,
|
|
240
240
|
is_batched: bool = True,
|
|
241
241
|
optimize: bool = True,
|
|
242
242
|
output_path: str = None,
|
|
@@ -406,7 +406,7 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
406
406
|
]
|
|
407
407
|
|
|
408
408
|
# Continue collecting from abstract class:
|
|
409
|
-
super(
|
|
409
|
+
super()._collect_files_from_store_object()
|
|
410
410
|
|
|
411
411
|
def _collect_files_from_local_path(self):
|
|
412
412
|
"""
|
|
@@ -443,7 +443,7 @@ class PyTorchModelHandler(DLModelHandler):
|
|
|
443
443
|
"""
|
|
444
444
|
# Supported types:
|
|
445
445
|
if isinstance(sample, np.ndarray):
|
|
446
|
-
return super(
|
|
446
|
+
return super()._read_sample(sample=sample)
|
|
447
447
|
elif isinstance(sample, torch.Tensor):
|
|
448
448
|
return Feature(
|
|
449
449
|
value_type=PyTorchUtils.convert_torch_dtype_to_value_type(
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
from typing import Any,
|
|
15
|
+
from typing import Any, Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import torch
|
|
@@ -39,9 +39,9 @@ class PyTorchModelServer(V2ModelServer):
|
|
|
39
39
|
model: Module = None,
|
|
40
40
|
model_path: str = None,
|
|
41
41
|
model_name: str = None,
|
|
42
|
-
model_class: Union[
|
|
43
|
-
modules_map: Union[
|
|
44
|
-
custom_objects_map: Union[
|
|
42
|
+
model_class: Union[type[Module], str] = None,
|
|
43
|
+
modules_map: Union[dict[str, Union[None, str, list[str]]], str] = None,
|
|
44
|
+
custom_objects_map: Union[dict[str, Union[str, list[str]]], str] = None,
|
|
45
45
|
custom_objects_directory: str = None,
|
|
46
46
|
use_cuda: bool = True,
|
|
47
47
|
to_list: bool = False,
|
|
@@ -106,7 +106,7 @@ class PyTorchModelServer(V2ModelServer):
|
|
|
106
106
|
:param protocol: -
|
|
107
107
|
:param class_args: -
|
|
108
108
|
"""
|
|
109
|
-
super(
|
|
109
|
+
super().__init__(
|
|
110
110
|
context=context,
|
|
111
111
|
name=name,
|
|
112
112
|
model_path=model_path,
|
|
@@ -158,7 +158,7 @@ class PyTorchModelServer(V2ModelServer):
|
|
|
158
158
|
model=self._model_handler.model, context=self.context
|
|
159
159
|
)
|
|
160
160
|
|
|
161
|
-
def predict(self, request:
|
|
161
|
+
def predict(self, request: dict[str, Any]) -> Union[Tensor, list]:
|
|
162
162
|
"""
|
|
163
163
|
Infer the inputs through the model using MLRun's PyTorch interface and return its output. The inferred data will
|
|
164
164
|
be read from the "inputs" key of the request.
|
|
@@ -183,7 +183,7 @@ class PyTorchModelServer(V2ModelServer):
|
|
|
183
183
|
# Return as list if required:
|
|
184
184
|
return predictions if not self.to_list else predictions.tolist()
|
|
185
185
|
|
|
186
|
-
def explain(self, request:
|
|
186
|
+
def explain(self, request: dict[str, Any]) -> str:
|
|
187
187
|
"""
|
|
188
188
|
Return a string explaining what model is being serve in this serving function and the function name.
|
|
189
189
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
16
16
|
import warnings
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import Union
|
|
18
18
|
|
|
19
19
|
import mlrun
|
|
20
20
|
from mlrun.frameworks.sklearn.metric import Metric
|
|
@@ -37,25 +37,25 @@ def apply_mlrun(
|
|
|
37
37
|
model_name: str = "model",
|
|
38
38
|
tag: str = "",
|
|
39
39
|
model_path: str = None,
|
|
40
|
-
modules_map: Union[
|
|
41
|
-
custom_objects_map: Union[
|
|
40
|
+
modules_map: Union[dict[str, Union[None, str, list[str]]], str] = None,
|
|
41
|
+
custom_objects_map: Union[dict[str, Union[str, list[str]]], str] = None,
|
|
42
42
|
custom_objects_directory: str = None,
|
|
43
43
|
context: mlrun.MLClientCtx = None,
|
|
44
|
-
artifacts: Union[
|
|
44
|
+
artifacts: Union[list[MLPlan], list[str], dict[str, dict]] = None,
|
|
45
45
|
metrics: Union[
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
list[Metric],
|
|
47
|
+
list[SKLearnTypes.MetricEntryType],
|
|
48
|
+
dict[str, SKLearnTypes.MetricEntryType],
|
|
49
49
|
] = None,
|
|
50
50
|
x_test: SKLearnTypes.DatasetType = None,
|
|
51
51
|
y_test: SKLearnTypes.DatasetType = None,
|
|
52
52
|
sample_set: Union[SKLearnTypes.DatasetType, mlrun.DataItem, str] = None,
|
|
53
|
-
y_columns: Union[
|
|
53
|
+
y_columns: Union[list[str], list[int]] = None,
|
|
54
54
|
feature_vector: str = None,
|
|
55
|
-
feature_weights:
|
|
56
|
-
labels:
|
|
57
|
-
parameters:
|
|
58
|
-
extra_data:
|
|
55
|
+
feature_weights: list[float] = None,
|
|
56
|
+
labels: dict[str, Union[str, int, float]] = None,
|
|
57
|
+
parameters: dict[str, Union[str, int, float]] = None,
|
|
58
|
+
extra_data: dict[str, SKLearnTypes.ExtraDataType] = None,
|
|
59
59
|
auto_log: bool = True,
|
|
60
60
|
**kwargs,
|
|
61
61
|
) -> SKLearnModelHandler:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
from typing import
|
|
15
|
+
from typing import Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pandas as pd
|
|
@@ -32,7 +32,7 @@ class Estimator:
|
|
|
32
32
|
def __init__(
|
|
33
33
|
self,
|
|
34
34
|
context: mlrun.MLClientCtx = None,
|
|
35
|
-
metrics:
|
|
35
|
+
metrics: list[Metric] = None,
|
|
36
36
|
):
|
|
37
37
|
"""
|
|
38
38
|
Initialize an estimator with the given metrics. The estimator will log the calculated results using the given
|
|
@@ -62,7 +62,7 @@ class Estimator:
|
|
|
62
62
|
return self._context
|
|
63
63
|
|
|
64
64
|
@property
|
|
65
|
-
def results(self) ->
|
|
65
|
+
def results(self) -> dict[str, float]:
|
|
66
66
|
"""
|
|
67
67
|
Get the logged results.
|
|
68
68
|
|
|
@@ -86,7 +86,7 @@ class Estimator:
|
|
|
86
86
|
"""
|
|
87
87
|
self._context = context
|
|
88
88
|
|
|
89
|
-
def set_metrics(self, metrics:
|
|
89
|
+
def set_metrics(self, metrics: list[Metric]):
|
|
90
90
|
"""
|
|
91
91
|
Update the metrics of this logger to the given list of metrics here.
|
|
92
92
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
from abc import ABC
|
|
16
|
-
from typing import
|
|
16
|
+
from typing import Union
|
|
17
17
|
|
|
18
18
|
import sklearn
|
|
19
19
|
from sklearn.preprocessing import LabelBinarizer
|
|
@@ -40,14 +40,14 @@ class MetricsLibrary(ABC):
|
|
|
40
40
|
def get_metrics(
|
|
41
41
|
cls,
|
|
42
42
|
metrics: Union[
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
list[Metric],
|
|
44
|
+
list[SKLearnTypes.MetricEntryType],
|
|
45
|
+
dict[str, SKLearnTypes.MetricEntryType],
|
|
46
46
|
] = None,
|
|
47
47
|
context: mlrun.MLClientCtx = None,
|
|
48
48
|
include_default: bool = True,
|
|
49
49
|
**default_kwargs,
|
|
50
|
-
) ->
|
|
50
|
+
) -> list[Metric]:
|
|
51
51
|
"""
|
|
52
52
|
Get metrics for a run. The metrics will be taken from the provided metrics / configuration via code, from
|
|
53
53
|
provided configuration via MLRun context and if the 'include_default' is True, from the metric library's
|
|
@@ -87,11 +87,11 @@ class MetricsLibrary(ABC):
|
|
|
87
87
|
def _parse(
|
|
88
88
|
cls,
|
|
89
89
|
metrics: Union[
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
list[Metric],
|
|
91
|
+
list[SKLearnTypes.MetricEntryType],
|
|
92
|
+
dict[str, SKLearnTypes.MetricEntryType],
|
|
93
93
|
],
|
|
94
|
-
) ->
|
|
94
|
+
) -> list[Metric]:
|
|
95
95
|
"""
|
|
96
96
|
Parse the given metrics by the possible rules of the framework implementing.
|
|
97
97
|
|
|
@@ -116,8 +116,8 @@ class MetricsLibrary(ABC):
|
|
|
116
116
|
|
|
117
117
|
@classmethod
|
|
118
118
|
def _from_list(
|
|
119
|
-
cls, metrics_list:
|
|
120
|
-
) ->
|
|
119
|
+
cls, metrics_list: list[Union[Metric, SKLearnTypes.MetricEntryType]]
|
|
120
|
+
) -> list[Metric]:
|
|
121
121
|
"""
|
|
122
122
|
Collect the given metrics configurations from a list. The metrics names will be chosen by the following rules:
|
|
123
123
|
|
|
@@ -143,8 +143,8 @@ class MetricsLibrary(ABC):
|
|
|
143
143
|
|
|
144
144
|
@classmethod
|
|
145
145
|
def _from_dict(
|
|
146
|
-
cls, metrics_dictionary:
|
|
147
|
-
) ->
|
|
146
|
+
cls, metrics_dictionary: dict[str, SKLearnTypes.MetricEntryType]
|
|
147
|
+
) -> list[Metric]:
|
|
148
148
|
"""
|
|
149
149
|
Collect the given metrics configurations from a dictionary.
|
|
150
150
|
|
|
@@ -165,7 +165,7 @@ class MetricsLibrary(ABC):
|
|
|
165
165
|
@classmethod
|
|
166
166
|
def _default(
|
|
167
167
|
cls, model: SKLearnTypes.ModelType, y: SKLearnTypes.DatasetType = None
|
|
168
|
-
) ->
|
|
168
|
+
) -> list[Metric]:
|
|
169
169
|
"""
|
|
170
170
|
Get the default metrics list according to the algorithm functionality.
|
|
171
171
|
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
from abc import ABC
|
|
16
|
-
from typing import List
|
|
17
16
|
|
|
18
17
|
import mlrun
|
|
19
18
|
|
|
@@ -75,9 +74,7 @@ class SKLearnMLRunInterface(MLRunInterface, ABC):
|
|
|
75
74
|
cls._REPLACED_METHODS.remove("predict_proba")
|
|
76
75
|
|
|
77
76
|
# Add the interface to the model:
|
|
78
|
-
super(
|
|
79
|
-
obj=obj, restoration=restoration
|
|
80
|
-
)
|
|
77
|
+
super().add_interface(obj=obj, restoration=restoration)
|
|
81
78
|
|
|
82
79
|
# Restore the '_REPLACED_METHODS' list for next models:
|
|
83
80
|
if "predict_proba" not in cls._REPLACED_METHODS:
|
|
@@ -154,8 +151,8 @@ class SKLearnMLRunInterface(MLRunInterface, ABC):
|
|
|
154
151
|
def configure_logging(
|
|
155
152
|
self,
|
|
156
153
|
context: mlrun.MLClientCtx = None,
|
|
157
|
-
plans:
|
|
158
|
-
metrics:
|
|
154
|
+
plans: list[MLPlan] = None,
|
|
155
|
+
metrics: list[Metric] = None,
|
|
159
156
|
x_test: SKLearnTypes.DatasetType = None,
|
|
160
157
|
y_test: SKLearnTypes.DatasetType = None,
|
|
161
158
|
model_handler: MLModelHandler = None,
|
|
@@ -59,7 +59,7 @@ class SKLearnModelHandler(MLModelHandler):
|
|
|
59
59
|
|
|
60
60
|
:return The saved model additional artifacts (if needed) dictionary if context is available and None otherwise.
|
|
61
61
|
"""
|
|
62
|
-
super(
|
|
62
|
+
super().save(output_path=output_path)
|
|
63
63
|
|
|
64
64
|
# Save the model pkl file:
|
|
65
65
|
self._model_file = f"{self._model_name}.pkl"
|
|
@@ -73,7 +73,7 @@ class SKLearnModelHandler(MLModelHandler):
|
|
|
73
73
|
Load the specified model in this handler. Additional parameters for the class initializer can be passed via the
|
|
74
74
|
kwargs dictionary.
|
|
75
75
|
"""
|
|
76
|
-
super(
|
|
76
|
+
super().load()
|
|
77
77
|
|
|
78
78
|
# Load from a pkl file:
|
|
79
79
|
with open(self._model_file, "rb") as pickle_file:
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
16
|
-
from typing import Any,
|
|
16
|
+
from typing import Any, Union
|
|
17
17
|
|
|
18
18
|
from tensorflow import keras
|
|
19
19
|
|
|
@@ -33,14 +33,14 @@ def apply_mlrun(
|
|
|
33
33
|
model_path: str = None,
|
|
34
34
|
model_format: str = TFKerasModelHandler.ModelFormats.SAVED_MODEL,
|
|
35
35
|
save_traces: bool = False,
|
|
36
|
-
modules_map: Union[
|
|
37
|
-
custom_objects_map: Union[
|
|
36
|
+
modules_map: Union[dict[str, Union[None, str, list[str]]], str] = None,
|
|
37
|
+
custom_objects_map: Union[dict[str, Union[str, list[str]]], str] = None,
|
|
38
38
|
custom_objects_directory: str = None,
|
|
39
39
|
context: mlrun.MLClientCtx = None,
|
|
40
40
|
auto_log: bool = True,
|
|
41
41
|
tensorboard_directory: str = None,
|
|
42
|
-
mlrun_callback_kwargs:
|
|
43
|
-
tensorboard_callback_kwargs:
|
|
42
|
+
mlrun_callback_kwargs: dict[str, Any] = None,
|
|
43
|
+
tensorboard_callback_kwargs: dict[str, Any] = None,
|
|
44
44
|
use_horovod: bool = None,
|
|
45
45
|
**kwargs,
|
|
46
46
|
) -> TFKerasModelHandler:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
-
from typing import Callable,
|
|
15
|
+
from typing import Callable, Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import tensorflow as tf
|
|
@@ -36,11 +36,11 @@ class LoggingCallback(Callback):
|
|
|
36
36
|
def __init__(
|
|
37
37
|
self,
|
|
38
38
|
context: mlrun.MLClientCtx = None,
|
|
39
|
-
dynamic_hyperparameters:
|
|
40
|
-
str, Union[
|
|
39
|
+
dynamic_hyperparameters: dict[
|
|
40
|
+
str, Union[list[Union[str, int]], Callable[[], TFKerasTypes.TrackableType]]
|
|
41
41
|
] = None,
|
|
42
|
-
static_hyperparameters:
|
|
43
|
-
str, Union[TFKerasTypes.TrackableType,
|
|
42
|
+
static_hyperparameters: dict[
|
|
43
|
+
str, Union[TFKerasTypes.TrackableType, list[Union[str, int]]]
|
|
44
44
|
] = None,
|
|
45
45
|
auto_log: bool = False,
|
|
46
46
|
):
|
|
@@ -70,7 +70,7 @@ class LoggingCallback(Callback):
|
|
|
70
70
|
:param auto_log: Whether or not to enable auto logging, trying to track common static and dynamic
|
|
71
71
|
hyperparameters.
|
|
72
72
|
"""
|
|
73
|
-
super(
|
|
73
|
+
super().__init__()
|
|
74
74
|
self._supports_tf_logs = True
|
|
75
75
|
|
|
76
76
|
# Store the configurations:
|
|
@@ -93,7 +93,7 @@ class LoggingCallback(Callback):
|
|
|
93
93
|
self._is_training = None # type: bool
|
|
94
94
|
self._auto_log = auto_log
|
|
95
95
|
|
|
96
|
-
def get_training_results(self) ->
|
|
96
|
+
def get_training_results(self) -> dict[str, list[list[float]]]:
|
|
97
97
|
"""
|
|
98
98
|
Get the training results logged. The results will be stored in a dictionary where each key is the metric name
|
|
99
99
|
and the value is a list of lists of values. The first list is by epoch and the second list is by iteration
|
|
@@ -103,7 +103,7 @@ class LoggingCallback(Callback):
|
|
|
103
103
|
"""
|
|
104
104
|
return self._logger.training_results
|
|
105
105
|
|
|
106
|
-
def get_validation_results(self) ->
|
|
106
|
+
def get_validation_results(self) -> dict[str, list[list[float]]]:
|
|
107
107
|
"""
|
|
108
108
|
Get the validation results logged. The results will be stored in a dictionary where each key is the metric name
|
|
109
109
|
and the value is a list of lists of values. The first list is by epoch and the second list is by iteration
|
|
@@ -113,7 +113,7 @@ class LoggingCallback(Callback):
|
|
|
113
113
|
"""
|
|
114
114
|
return self._logger.validation_results
|
|
115
115
|
|
|
116
|
-
def get_training_summaries(self) ->
|
|
116
|
+
def get_training_summaries(self) -> dict[str, list[float]]:
|
|
117
117
|
"""
|
|
118
118
|
Get the training summaries of the metrics results. The summaries will be stored in a dictionary where each key
|
|
119
119
|
is the metric names and the value is a list of all the summary values per epoch.
|
|
@@ -122,7 +122,7 @@ class LoggingCallback(Callback):
|
|
|
122
122
|
"""
|
|
123
123
|
return self._logger.training_summaries
|
|
124
124
|
|
|
125
|
-
def get_validation_summaries(self) ->
|
|
125
|
+
def get_validation_summaries(self) -> dict[str, list[float]]:
|
|
126
126
|
"""
|
|
127
127
|
Get the validation summaries of the metrics results. The summaries will be stored in a dictionary where each key
|
|
128
128
|
is the metric names and the value is a list of all the summary values per epoch.
|
|
@@ -131,7 +131,7 @@ class LoggingCallback(Callback):
|
|
|
131
131
|
"""
|
|
132
132
|
return self._logger.validation_summaries
|
|
133
133
|
|
|
134
|
-
def get_static_hyperparameters(self) ->
|
|
134
|
+
def get_static_hyperparameters(self) -> dict[str, TFKerasTypes.TrackableType]:
|
|
135
135
|
"""
|
|
136
136
|
Get the static hyperparameters logged. The hyperparameters will be stored in a dictionary where each key is the
|
|
137
137
|
hyperparameter name and the value is his logged value.
|
|
@@ -142,7 +142,7 @@ class LoggingCallback(Callback):
|
|
|
142
142
|
|
|
143
143
|
def get_dynamic_hyperparameters(
|
|
144
144
|
self,
|
|
145
|
-
) ->
|
|
145
|
+
) -> dict[str, list[TFKerasTypes.TrackableType]]:
|
|
146
146
|
"""
|
|
147
147
|
Get the dynamic hyperparameters logged. The hyperparameters will be stored in a dictionary where each key is the
|
|
148
148
|
hyperparameter name and the value is a list of his logged values per epoch.
|
|
@@ -329,7 +329,7 @@ class LoggingCallback(Callback):
|
|
|
329
329
|
|
|
330
330
|
# Static hyperparameters:
|
|
331
331
|
for name, value in self._static_hyperparameters_keys.items():
|
|
332
|
-
if isinstance(value,
|
|
332
|
+
if isinstance(value, list):
|
|
333
333
|
# Its a parameter that needed to be extracted via key chain.
|
|
334
334
|
self._logger.log_static_hyperparameter(
|
|
335
335
|
parameter_name=name,
|
|
@@ -398,7 +398,7 @@ class LoggingCallback(Callback):
|
|
|
398
398
|
def _get_hyperparameter(
|
|
399
399
|
self,
|
|
400
400
|
key_chain: Union[
|
|
401
|
-
Callable[[], TFKerasTypes.TrackableType],
|
|
401
|
+
Callable[[], TFKerasTypes.TrackableType], list[Union[str, int]]
|
|
402
402
|
],
|
|
403
403
|
) -> TFKerasTypes.TrackableType:
|
|
404
404
|
"""
|