mlrun 1.6.4rc2__py3-none-any.whl → 1.7.0rc20__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/__init__.py +11 -1
- mlrun/__main__.py +26 -112
- mlrun/alerts/__init__.py +15 -0
- mlrun/alerts/alert.py +144 -0
- mlrun/api/schemas/__init__.py +5 -4
- mlrun/artifacts/__init__.py +8 -3
- mlrun/artifacts/base.py +46 -257
- mlrun/artifacts/dataset.py +11 -192
- mlrun/artifacts/manager.py +47 -48
- mlrun/artifacts/model.py +31 -159
- mlrun/artifacts/plots.py +23 -380
- mlrun/common/constants.py +69 -0
- mlrun/common/db/sql_session.py +2 -3
- mlrun/common/formatters/__init__.py +19 -0
- mlrun/common/formatters/artifact.py +21 -0
- mlrun/common/formatters/base.py +78 -0
- mlrun/common/formatters/function.py +41 -0
- mlrun/common/formatters/pipeline.py +53 -0
- mlrun/common/formatters/project.py +51 -0
- mlrun/common/helpers.py +1 -2
- mlrun/common/model_monitoring/helpers.py +9 -5
- mlrun/{runtimes → common/runtimes}/constants.py +37 -9
- mlrun/common/schemas/__init__.py +24 -4
- mlrun/common/schemas/alert.py +203 -0
- mlrun/common/schemas/api_gateway.py +148 -0
- mlrun/common/schemas/artifact.py +18 -8
- mlrun/common/schemas/auth.py +11 -5
- mlrun/common/schemas/background_task.py +1 -1
- mlrun/common/schemas/client_spec.py +4 -1
- mlrun/common/schemas/feature_store.py +16 -16
- mlrun/common/schemas/frontend_spec.py +8 -7
- mlrun/common/schemas/function.py +5 -1
- mlrun/common/schemas/hub.py +11 -18
- mlrun/common/schemas/memory_reports.py +2 -2
- mlrun/common/schemas/model_monitoring/__init__.py +18 -3
- mlrun/common/schemas/model_monitoring/constants.py +83 -26
- mlrun/common/schemas/model_monitoring/grafana.py +13 -9
- mlrun/common/schemas/model_monitoring/model_endpoints.py +99 -16
- mlrun/common/schemas/notification.py +4 -4
- mlrun/common/schemas/object.py +2 -2
- mlrun/{runtimes/mpijob/v1alpha1.py → common/schemas/pagination.py} +10 -13
- mlrun/common/schemas/pipeline.py +1 -10
- mlrun/common/schemas/project.py +24 -23
- 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/common/types.py +7 -1
- mlrun/config.py +54 -17
- mlrun/data_types/to_pandas.py +10 -12
- mlrun/datastore/__init__.py +5 -8
- mlrun/datastore/alibaba_oss.py +130 -0
- mlrun/datastore/azure_blob.py +17 -5
- mlrun/datastore/base.py +62 -39
- mlrun/datastore/datastore.py +28 -9
- mlrun/datastore/datastore_profile.py +146 -20
- mlrun/datastore/filestore.py +0 -1
- mlrun/datastore/google_cloud_storage.py +6 -2
- mlrun/datastore/hdfs.py +56 -0
- mlrun/datastore/inmem.py +2 -2
- mlrun/datastore/redis.py +6 -2
- mlrun/datastore/s3.py +9 -0
- mlrun/datastore/snowflake_utils.py +43 -0
- mlrun/datastore/sources.py +201 -96
- mlrun/datastore/spark_utils.py +1 -2
- mlrun/datastore/store_resources.py +7 -7
- mlrun/datastore/targets.py +358 -104
- mlrun/datastore/utils.py +72 -58
- mlrun/datastore/v3io.py +5 -1
- mlrun/db/base.py +185 -35
- mlrun/db/factory.py +1 -1
- mlrun/db/httpdb.py +614 -179
- mlrun/db/nopdb.py +210 -26
- mlrun/errors.py +12 -1
- mlrun/execution.py +41 -24
- mlrun/feature_store/__init__.py +0 -2
- mlrun/feature_store/api.py +40 -72
- mlrun/feature_store/common.py +1 -1
- mlrun/feature_store/feature_set.py +76 -55
- mlrun/feature_store/feature_vector.py +28 -30
- mlrun/feature_store/ingestion.py +7 -6
- mlrun/feature_store/retrieval/base.py +16 -11
- mlrun/feature_store/retrieval/conversion.py +11 -13
- mlrun/feature_store/retrieval/dask_merger.py +2 -0
- mlrun/feature_store/retrieval/job.py +9 -3
- mlrun/feature_store/retrieval/local_merger.py +2 -0
- mlrun/feature_store/retrieval/spark_merger.py +34 -24
- mlrun/feature_store/steps.py +37 -34
- mlrun/features.py +9 -20
- 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 +23 -47
- 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 +9 -9
- mlrun/frameworks/huggingface/model_server.py +4 -4
- mlrun/frameworks/lgbm/__init__.py +33 -33
- mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
- 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 +10 -10
- 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 +4 -3
- mlrun/frameworks/pytorch/__init__.py +18 -18
- 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 +13 -13
- 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 +10 -7
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
- 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 +9 -11
- mlrun/frameworks/tf_keras/model_handler.py +14 -14
- mlrun/frameworks/tf_keras/model_server.py +6 -6
- mlrun/frameworks/xgboost/__init__.py +13 -13
- mlrun/frameworks/xgboost/model_handler.py +6 -6
- mlrun/k8s_utils.py +14 -16
- mlrun/launcher/__init__.py +1 -1
- mlrun/launcher/base.py +16 -15
- mlrun/launcher/client.py +8 -6
- mlrun/launcher/factory.py +1 -1
- mlrun/launcher/local.py +17 -11
- mlrun/launcher/remote.py +16 -10
- mlrun/lists.py +7 -6
- mlrun/model.py +238 -73
- mlrun/model_monitoring/__init__.py +1 -1
- mlrun/model_monitoring/api.py +138 -315
- mlrun/model_monitoring/application.py +5 -296
- mlrun/model_monitoring/applications/__init__.py +24 -0
- mlrun/model_monitoring/applications/_application_steps.py +157 -0
- mlrun/model_monitoring/applications/base.py +282 -0
- mlrun/model_monitoring/applications/context.py +214 -0
- mlrun/model_monitoring/applications/evidently_base.py +211 -0
- mlrun/model_monitoring/applications/histogram_data_drift.py +349 -0
- mlrun/model_monitoring/applications/results.py +99 -0
- mlrun/model_monitoring/controller.py +104 -84
- mlrun/model_monitoring/controller_handler.py +13 -5
- mlrun/model_monitoring/db/__init__.py +18 -0
- mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -36
- mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
- mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +64 -40
- mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
- mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
- mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +109 -5
- mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +88 -0
- mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
- mlrun/model_monitoring/db/stores/sqldb/sql_store.py +684 -0
- mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
- mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +310 -165
- mlrun/model_monitoring/db/tsdb/__init__.py +100 -0
- mlrun/model_monitoring/db/tsdb/base.py +329 -0
- mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
- mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +240 -0
- mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +45 -0
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +397 -0
- mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
- mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +117 -0
- mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +630 -0
- mlrun/model_monitoring/evidently_application.py +6 -118
- mlrun/model_monitoring/features_drift_table.py +134 -106
- mlrun/model_monitoring/helpers.py +127 -28
- mlrun/model_monitoring/metrics/__init__.py +13 -0
- mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
- mlrun/model_monitoring/model_endpoint.py +3 -2
- mlrun/model_monitoring/prometheus.py +1 -4
- mlrun/model_monitoring/stream_processing.py +62 -231
- mlrun/model_monitoring/tracking_policy.py +9 -2
- mlrun/model_monitoring/writer.py +152 -124
- 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 +19 -23
- mlrun/package/utils/_formatter.py +6 -6
- 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/__init__.py +11 -10
- mlrun/platforms/iguazio.py +24 -203
- mlrun/projects/operations.py +35 -21
- mlrun/projects/pipelines.py +68 -99
- mlrun/projects/project.py +830 -266
- mlrun/render.py +3 -11
- mlrun/run.py +162 -166
- mlrun/runtimes/__init__.py +62 -7
- mlrun/runtimes/base.py +39 -32
- 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/databricks_job/databricks_wrapper.py +1 -1
- mlrun/runtimes/funcdoc.py +0 -28
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/kubejob.py +28 -122
- mlrun/runtimes/local.py +6 -3
- mlrun/runtimes/mpijob/__init__.py +0 -20
- mlrun/runtimes/mpijob/abstract.py +9 -10
- mlrun/runtimes/mpijob/v1.py +1 -1
- mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
- mlrun/runtimes/nuclio/api_gateway.py +709 -0
- mlrun/runtimes/nuclio/application/__init__.py +15 -0
- mlrun/runtimes/nuclio/application/application.py +523 -0
- mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
- mlrun/runtimes/{function.py → nuclio/function.py} +112 -73
- mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
- mlrun/runtimes/{serving.py → nuclio/serving.py} +45 -51
- mlrun/runtimes/pod.py +286 -88
- mlrun/runtimes/remotesparkjob.py +2 -2
- mlrun/runtimes/sparkjob/spark3job.py +51 -34
- mlrun/runtimes/utils.py +7 -75
- mlrun/secrets.py +9 -5
- mlrun/serving/remote.py +2 -7
- mlrun/serving/routers.py +13 -10
- mlrun/serving/server.py +22 -26
- mlrun/serving/states.py +99 -25
- mlrun/serving/utils.py +3 -3
- mlrun/serving/v1_serving.py +6 -7
- mlrun/serving/v2_serving.py +59 -20
- mlrun/track/tracker.py +2 -1
- 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 +183 -197
- mlrun/utils/http.py +2 -5
- mlrun/utils/logger.py +76 -14
- mlrun/utils/notifications/notification/__init__.py +17 -12
- mlrun/utils/notifications/notification/base.py +14 -2
- mlrun/utils/notifications/notification/console.py +2 -0
- mlrun/utils/notifications/notification/git.py +3 -1
- mlrun/utils/notifications/notification/ipython.py +3 -1
- mlrun/utils/notifications/notification/slack.py +101 -21
- mlrun/utils/notifications/notification/webhook.py +11 -1
- mlrun/utils/notifications/notification_pusher.py +155 -30
- mlrun/utils/retryer.py +208 -0
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +2 -4
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +2 -6
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/METADATA +31 -19
- mlrun-1.7.0rc20.dist-info/RECORD +353 -0
- mlrun/kfpops.py +0 -868
- mlrun/model_monitoring/batch.py +0 -1095
- mlrun/model_monitoring/stores/models/__init__.py +0 -27
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
- mlrun/platforms/other.py +0 -306
- mlrun-1.6.4rc2.dist-info/RECORD +0 -314
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/LICENSE +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/WHEEL +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/entry_points.txt +0 -0
- {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/top_level.txt +0 -0
mlrun/projects/pipelines.py
CHANGED
|
@@ -20,18 +20,19 @@ import tempfile
|
|
|
20
20
|
import typing
|
|
21
21
|
import uuid
|
|
22
22
|
|
|
23
|
-
import
|
|
24
|
-
|
|
23
|
+
import mlrun_pipelines.common.models
|
|
24
|
+
import mlrun_pipelines.patcher
|
|
25
25
|
from kfp.compiler import compiler
|
|
26
|
+
from mlrun_pipelines.helpers import new_pipe_metadata
|
|
26
27
|
|
|
27
28
|
import mlrun
|
|
29
|
+
import mlrun.common.runtimes.constants
|
|
28
30
|
import mlrun.common.schemas
|
|
29
31
|
import mlrun.utils.notifications
|
|
30
32
|
from mlrun.errors import err_to_str
|
|
31
33
|
from mlrun.utils import (
|
|
32
34
|
get_ui_url,
|
|
33
35
|
logger,
|
|
34
|
-
new_pipe_metadata,
|
|
35
36
|
normalize_workflow_name,
|
|
36
37
|
retry_until_successful,
|
|
37
38
|
)
|
|
@@ -301,72 +302,6 @@ def _enrich_kfp_pod_security_context(kfp_pod_template, function):
|
|
|
301
302
|
}
|
|
302
303
|
|
|
303
304
|
|
|
304
|
-
# When we run pipelines, the kfp.compile.Compile.compile() method takes the decorated function with @dsl.pipeline and
|
|
305
|
-
# converts it to a k8s object. As part of the flow in the Compile.compile() method,
|
|
306
|
-
# we call _create_and_write_workflow, which builds a dictionary from the workflow and then writes it to a file.
|
|
307
|
-
# Unfortunately, the kfp sdk does not provide an API for configuring priority_class_name and other attributes.
|
|
308
|
-
# I ran across the following problem when seeking for a method to set the priority_class_name:
|
|
309
|
-
# https://github.com/kubeflow/pipelines/issues/3594
|
|
310
|
-
# When we patch the _create_and_write_workflow, we can eventually obtain the dictionary right before we write it
|
|
311
|
-
# to a file and enrich it with argo compatible fields, make sure you looking for the same argo version we use
|
|
312
|
-
# https://github.com/argoproj/argo-workflows/blob/release-2.7/pkg/apis/workflow/v1alpha1/workflow_types.go
|
|
313
|
-
def _create_enriched_mlrun_workflow(
|
|
314
|
-
self,
|
|
315
|
-
pipeline_func: typing.Callable,
|
|
316
|
-
pipeline_name: typing.Optional[typing.Text] = None,
|
|
317
|
-
pipeline_description: typing.Optional[typing.Text] = None,
|
|
318
|
-
params_list: typing.Optional[typing.List[dsl.PipelineParam]] = None,
|
|
319
|
-
pipeline_conf: typing.Optional[dsl.PipelineConf] = None,
|
|
320
|
-
):
|
|
321
|
-
"""Call internal implementation of create_workflow and enrich with mlrun functions attributes"""
|
|
322
|
-
workflow = self._original_create_workflow(
|
|
323
|
-
pipeline_func, pipeline_name, pipeline_description, params_list, pipeline_conf
|
|
324
|
-
)
|
|
325
|
-
# We don't want to interrupt the original flow and don't know all the scenarios the function could be called.
|
|
326
|
-
# that's why we have try/except on all the code of the enrichment and also specific try/except for errors that
|
|
327
|
-
# we know can be raised.
|
|
328
|
-
try:
|
|
329
|
-
functions = []
|
|
330
|
-
if pipeline_context.functions:
|
|
331
|
-
try:
|
|
332
|
-
functions = pipeline_context.functions.values()
|
|
333
|
-
except Exception as err:
|
|
334
|
-
logger.debug(
|
|
335
|
-
"Unable to retrieve project functions, not enriching workflow with mlrun",
|
|
336
|
-
error=err_to_str(err),
|
|
337
|
-
)
|
|
338
|
-
return workflow
|
|
339
|
-
|
|
340
|
-
# enrich each pipeline step with your desire k8s attribute
|
|
341
|
-
for kfp_step_template in workflow["spec"]["templates"]:
|
|
342
|
-
if kfp_step_template.get("container"):
|
|
343
|
-
for function_obj in functions:
|
|
344
|
-
# we condition within each function since the comparison between the function and
|
|
345
|
-
# the kfp pod may change depending on the attribute type.
|
|
346
|
-
_set_function_attribute_on_kfp_pod(
|
|
347
|
-
kfp_step_template,
|
|
348
|
-
function_obj,
|
|
349
|
-
"PriorityClassName",
|
|
350
|
-
"priority_class_name",
|
|
351
|
-
)
|
|
352
|
-
_enrich_kfp_pod_security_context(
|
|
353
|
-
kfp_step_template,
|
|
354
|
-
function_obj,
|
|
355
|
-
)
|
|
356
|
-
except mlrun.errors.MLRunInvalidArgumentError:
|
|
357
|
-
raise
|
|
358
|
-
except Exception as err:
|
|
359
|
-
logger.debug(
|
|
360
|
-
"Something in the enrichment of kfp pods failed", error=err_to_str(err)
|
|
361
|
-
)
|
|
362
|
-
return workflow
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
# patching function as class method
|
|
366
|
-
kfp.compiler.Compiler._original_create_workflow = kfp.compiler.Compiler._create_workflow
|
|
367
|
-
kfp.compiler.Compiler._create_workflow = _create_enriched_mlrun_workflow
|
|
368
|
-
|
|
369
|
-
|
|
370
305
|
def get_db_function(project, key) -> mlrun.runtimes.BaseRuntime:
|
|
371
306
|
project_instance, name, tag, hash_key = parse_versioned_object_uri(
|
|
372
307
|
key, project.metadata.name
|
|
@@ -413,6 +348,11 @@ def enrich_function_object(
|
|
|
413
348
|
if decorator:
|
|
414
349
|
decorator(f)
|
|
415
350
|
|
|
351
|
+
if project.spec.default_function_node_selector:
|
|
352
|
+
f.enrich_runtime_spec(
|
|
353
|
+
project.spec.default_function_node_selector,
|
|
354
|
+
)
|
|
355
|
+
|
|
416
356
|
if try_auto_mount:
|
|
417
357
|
if (
|
|
418
358
|
decorator and AutoMountType.is_auto_modifier(decorator)
|
|
@@ -429,10 +369,10 @@ class _PipelineRunStatus:
|
|
|
429
369
|
def __init__(
|
|
430
370
|
self,
|
|
431
371
|
run_id: str,
|
|
432
|
-
engine:
|
|
372
|
+
engine: type["_PipelineRunner"],
|
|
433
373
|
project: "mlrun.projects.MlrunProject",
|
|
434
374
|
workflow: WorkflowSpec = None,
|
|
435
|
-
state:
|
|
375
|
+
state: mlrun_pipelines.common.models.RunStatuses = "",
|
|
436
376
|
exc: Exception = None,
|
|
437
377
|
):
|
|
438
378
|
"""
|
|
@@ -452,7 +392,10 @@ class _PipelineRunStatus:
|
|
|
452
392
|
|
|
453
393
|
@property
|
|
454
394
|
def state(self):
|
|
455
|
-
if
|
|
395
|
+
if (
|
|
396
|
+
self._state
|
|
397
|
+
not in mlrun_pipelines.common.models.RunStatuses.stable_statuses()
|
|
398
|
+
):
|
|
456
399
|
self._state = self._engine.get_state(self.run_id, self.project)
|
|
457
400
|
return self._state
|
|
458
401
|
|
|
@@ -500,7 +443,7 @@ class _PipelineRunner(abc.ABC):
|
|
|
500
443
|
artifact_path=None,
|
|
501
444
|
namespace=None,
|
|
502
445
|
source=None,
|
|
503
|
-
notifications:
|
|
446
|
+
notifications: list[mlrun.model.Notification] = None,
|
|
504
447
|
) -> _PipelineRunStatus:
|
|
505
448
|
pass
|
|
506
449
|
|
|
@@ -517,7 +460,7 @@ class _PipelineRunner(abc.ABC):
|
|
|
517
460
|
@staticmethod
|
|
518
461
|
def _get_handler(workflow_handler, workflow_spec, project, secrets):
|
|
519
462
|
if not (workflow_handler and callable(workflow_handler)):
|
|
520
|
-
workflow_file = workflow_spec.get_source_file(project.spec.
|
|
463
|
+
workflow_file = workflow_spec.get_source_file(project.spec.get_code_path())
|
|
521
464
|
workflow_handler = create_pipeline(
|
|
522
465
|
project,
|
|
523
466
|
workflow_file,
|
|
@@ -537,6 +480,7 @@ class _PipelineRunner(abc.ABC):
|
|
|
537
480
|
timeout=None,
|
|
538
481
|
expected_statuses=None,
|
|
539
482
|
notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
|
|
483
|
+
**kwargs,
|
|
540
484
|
):
|
|
541
485
|
pass
|
|
542
486
|
|
|
@@ -549,7 +493,7 @@ class _KFPRunner(_PipelineRunner):
|
|
|
549
493
|
@classmethod
|
|
550
494
|
def save(cls, project, workflow_spec: WorkflowSpec, target, artifact_path=None):
|
|
551
495
|
pipeline_context.set(project, workflow_spec)
|
|
552
|
-
workflow_file = workflow_spec.get_source_file(project.spec.
|
|
496
|
+
workflow_file = workflow_spec.get_source_file(project.spec.get_code_path())
|
|
553
497
|
functions = FunctionsDict(project)
|
|
554
498
|
pipeline = create_pipeline(
|
|
555
499
|
project,
|
|
@@ -578,7 +522,7 @@ class _KFPRunner(_PipelineRunner):
|
|
|
578
522
|
artifact_path=None,
|
|
579
523
|
namespace=None,
|
|
580
524
|
source=None,
|
|
581
|
-
notifications:
|
|
525
|
+
notifications: list[mlrun.model.Notification] = None,
|
|
582
526
|
) -> _PipelineRunStatus:
|
|
583
527
|
pipeline_context.set(project, workflow_spec)
|
|
584
528
|
workflow_handler = _PipelineRunner._get_handler(
|
|
@@ -668,6 +612,7 @@ class _KFPRunner(_PipelineRunner):
|
|
|
668
612
|
timeout=None,
|
|
669
613
|
expected_statuses=None,
|
|
670
614
|
notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
|
|
615
|
+
**kwargs,
|
|
671
616
|
):
|
|
672
617
|
if timeout is None:
|
|
673
618
|
timeout = 60 * 60
|
|
@@ -722,7 +667,7 @@ class _LocalRunner(_PipelineRunner):
|
|
|
722
667
|
artifact_path=None,
|
|
723
668
|
namespace=None,
|
|
724
669
|
source=None,
|
|
725
|
-
notifications:
|
|
670
|
+
notifications: list[mlrun.model.Notification] = None,
|
|
726
671
|
) -> _PipelineRunStatus:
|
|
727
672
|
pipeline_context.set(project, workflow_spec)
|
|
728
673
|
workflow_handler = _PipelineRunner._get_handler(
|
|
@@ -749,7 +694,7 @@ class _LocalRunner(_PipelineRunner):
|
|
|
749
694
|
err = None
|
|
750
695
|
try:
|
|
751
696
|
workflow_handler(**workflow_spec.args)
|
|
752
|
-
state =
|
|
697
|
+
state = mlrun_pipelines.common.models.RunStatuses.succeeded
|
|
753
698
|
except Exception as exc:
|
|
754
699
|
err = exc
|
|
755
700
|
logger.exception("Workflow run failed")
|
|
@@ -757,7 +702,7 @@ class _LocalRunner(_PipelineRunner):
|
|
|
757
702
|
f":x: Workflow {workflow_id} run failed!, error: {err_to_str(exc)}",
|
|
758
703
|
mlrun.common.schemas.NotificationSeverity.ERROR,
|
|
759
704
|
)
|
|
760
|
-
state =
|
|
705
|
+
state = mlrun_pipelines.common.models.RunStatuses.failed
|
|
761
706
|
mlrun.run.wait_for_runs_completion(pipeline_context.runs_map.values())
|
|
762
707
|
project.notifiers.push_pipeline_run_results(
|
|
763
708
|
pipeline_context.runs_map.values(), state=state
|
|
@@ -791,6 +736,7 @@ class _LocalRunner(_PipelineRunner):
|
|
|
791
736
|
timeout=None,
|
|
792
737
|
expected_statuses=None,
|
|
793
738
|
notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
|
|
739
|
+
**kwargs,
|
|
794
740
|
):
|
|
795
741
|
pass
|
|
796
742
|
|
|
@@ -811,7 +757,7 @@ class _RemoteRunner(_PipelineRunner):
|
|
|
811
757
|
artifact_path: str = None,
|
|
812
758
|
namespace: str = None,
|
|
813
759
|
source: str = None,
|
|
814
|
-
notifications:
|
|
760
|
+
notifications: list[mlrun.model.Notification] = None,
|
|
815
761
|
) -> typing.Optional[_PipelineRunStatus]:
|
|
816
762
|
workflow_name = normalize_workflow_name(name=name, project_name=project.name)
|
|
817
763
|
workflow_id = None
|
|
@@ -916,9 +862,9 @@ class _RemoteRunner(_PipelineRunner):
|
|
|
916
862
|
f":x: Workflow {workflow_name} run failed!, error: {err_to_str(exc)}",
|
|
917
863
|
mlrun.common.schemas.NotificationSeverity.ERROR,
|
|
918
864
|
)
|
|
919
|
-
state =
|
|
865
|
+
state = mlrun_pipelines.common.models.RunStatuses.failed
|
|
920
866
|
else:
|
|
921
|
-
state =
|
|
867
|
+
state = mlrun_pipelines.common.models.RunStatuses.running
|
|
922
868
|
project.notifiers.push_pipeline_start_message(
|
|
923
869
|
project.metadata.name,
|
|
924
870
|
)
|
|
@@ -935,24 +881,47 @@ class _RemoteRunner(_PipelineRunner):
|
|
|
935
881
|
@staticmethod
|
|
936
882
|
def get_run_status(
|
|
937
883
|
project,
|
|
938
|
-
run,
|
|
884
|
+
run: _PipelineRunStatus,
|
|
939
885
|
timeout=None,
|
|
940
886
|
expected_statuses=None,
|
|
941
887
|
notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
|
|
888
|
+
inner_engine: type[_PipelineRunner] = None,
|
|
942
889
|
):
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
890
|
+
inner_engine = inner_engine or _KFPRunner
|
|
891
|
+
if inner_engine.engine == _KFPRunner.engine:
|
|
892
|
+
# ignore notifiers for remote notifications, as they are handled by the remote pipeline notifications,
|
|
893
|
+
# so overriding with CustomNotificationPusher with empty list of notifiers or only local notifiers
|
|
894
|
+
local_project_notifiers = list(
|
|
895
|
+
set(mlrun.utils.notifications.NotificationTypes.local()).intersection(
|
|
896
|
+
set(project.notifiers.notifications.keys())
|
|
897
|
+
)
|
|
898
|
+
)
|
|
899
|
+
notifiers = mlrun.utils.notifications.CustomNotificationPusher(
|
|
900
|
+
local_project_notifiers
|
|
901
|
+
)
|
|
902
|
+
return _KFPRunner.get_run_status(
|
|
903
|
+
project,
|
|
904
|
+
run,
|
|
905
|
+
timeout,
|
|
906
|
+
expected_statuses,
|
|
907
|
+
notifiers=notifiers,
|
|
908
|
+
)
|
|
952
909
|
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
910
|
+
elif inner_engine.engine == _LocalRunner.engine:
|
|
911
|
+
mldb = mlrun.db.get_run_db(secrets=project._secrets)
|
|
912
|
+
pipeline_runner_run = mldb.read_run(run.run_id, project=project.name)
|
|
913
|
+
pipeline_runner_run = mlrun.run.RunObject.from_dict(pipeline_runner_run)
|
|
914
|
+
pipeline_runner_run.logs(db=mldb)
|
|
915
|
+
pipeline_runner_run.refresh()
|
|
916
|
+
run._state = mlrun.common.runtimes.constants.RunStates.run_state_to_pipeline_run_status(
|
|
917
|
+
pipeline_runner_run.status.state
|
|
918
|
+
)
|
|
919
|
+
run._exc = pipeline_runner_run.status.error
|
|
920
|
+
|
|
921
|
+
else:
|
|
922
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
923
|
+
f"Unsupported inner runner engine: {inner_engine.engine}"
|
|
924
|
+
)
|
|
956
925
|
|
|
957
926
|
|
|
958
927
|
def create_pipeline(project, pipeline, functions, secrets=None, handler=None):
|
|
@@ -1008,7 +977,7 @@ def load_and_run(
|
|
|
1008
977
|
save: bool = True,
|
|
1009
978
|
workflow_name: str = None,
|
|
1010
979
|
workflow_path: str = None,
|
|
1011
|
-
workflow_arguments:
|
|
980
|
+
workflow_arguments: dict[str, typing.Any] = None,
|
|
1012
981
|
artifact_path: str = None,
|
|
1013
982
|
workflow_handler: typing.Union[str, typing.Callable] = None,
|
|
1014
983
|
namespace: str = None,
|
|
@@ -1083,7 +1052,7 @@ def load_and_run(
|
|
|
1083
1052
|
)
|
|
1084
1053
|
|
|
1085
1054
|
except Exception as exc:
|
|
1086
|
-
logger.error("Failed to send slack notification", exc=exc)
|
|
1055
|
+
logger.error("Failed to send slack notification", exc=err_to_str(exc))
|
|
1087
1056
|
|
|
1088
1057
|
raise error
|
|
1089
1058
|
|
|
@@ -1111,7 +1080,7 @@ def load_and_run(
|
|
|
1111
1080
|
context.log_result(key="workflow_id", value=run.run_id)
|
|
1112
1081
|
context.log_result(key="engine", value=run._engine.engine, commit=True)
|
|
1113
1082
|
|
|
1114
|
-
if run.state ==
|
|
1083
|
+
if run.state == mlrun_pipelines.common.models.RunStatuses.failed:
|
|
1115
1084
|
raise RuntimeError(f"Workflow {workflow_log_message} failed") from run.exc
|
|
1116
1085
|
|
|
1117
1086
|
if wait_for_completion:
|
|
@@ -1126,7 +1095,7 @@ def load_and_run(
|
|
|
1126
1095
|
|
|
1127
1096
|
pipeline_state, _, _ = project.get_run_status(run)
|
|
1128
1097
|
context.log_result(key="workflow_state", value=pipeline_state, commit=True)
|
|
1129
|
-
if pipeline_state !=
|
|
1098
|
+
if pipeline_state != mlrun_pipelines.common.models.RunStatuses.succeeded:
|
|
1130
1099
|
raise RuntimeError(
|
|
1131
1100
|
f"Workflow {workflow_log_message} failed, state={pipeline_state}"
|
|
1132
1101
|
)
|