mlrun 1.3.3__py3-none-any.whl → 1.4.0__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 +3 -3
- mlrun/__main__.py +79 -37
- mlrun/api/__init__.py +1 -1
- mlrun/api/api/__init__.py +1 -1
- mlrun/api/api/api.py +4 -4
- mlrun/api/api/deps.py +10 -21
- mlrun/api/api/endpoints/__init__.py +1 -1
- mlrun/api/api/endpoints/artifacts.py +64 -36
- mlrun/api/api/endpoints/auth.py +4 -4
- mlrun/api/api/endpoints/background_tasks.py +11 -11
- mlrun/api/api/endpoints/client_spec.py +5 -5
- mlrun/api/api/endpoints/clusterization_spec.py +6 -4
- mlrun/api/api/endpoints/feature_store.py +124 -115
- mlrun/api/api/endpoints/files.py +22 -14
- mlrun/api/api/endpoints/frontend_spec.py +28 -21
- mlrun/api/api/endpoints/functions.py +142 -87
- mlrun/api/api/endpoints/grafana_proxy.py +89 -442
- mlrun/api/api/endpoints/healthz.py +20 -7
- mlrun/api/api/endpoints/hub.py +320 -0
- mlrun/api/api/endpoints/internal/__init__.py +1 -1
- mlrun/api/api/endpoints/internal/config.py +1 -1
- mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
- mlrun/api/api/endpoints/logs.py +11 -11
- mlrun/api/api/endpoints/model_endpoints.py +74 -70
- mlrun/api/api/endpoints/operations.py +13 -9
- mlrun/api/api/endpoints/pipelines.py +93 -88
- mlrun/api/api/endpoints/projects.py +35 -35
- mlrun/api/api/endpoints/runs.py +69 -27
- mlrun/api/api/endpoints/runtime_resources.py +28 -28
- mlrun/api/api/endpoints/schedules.py +98 -41
- mlrun/api/api/endpoints/secrets.py +37 -32
- mlrun/api/api/endpoints/submit.py +12 -12
- mlrun/api/api/endpoints/tags.py +20 -22
- mlrun/api/api/utils.py +251 -42
- mlrun/api/constants.py +1 -1
- mlrun/api/crud/__init__.py +18 -15
- mlrun/api/crud/artifacts.py +10 -10
- mlrun/api/crud/client_spec.py +4 -4
- mlrun/api/crud/clusterization_spec.py +3 -3
- mlrun/api/crud/feature_store.py +54 -46
- mlrun/api/crud/functions.py +3 -3
- mlrun/api/crud/hub.py +312 -0
- mlrun/api/crud/logs.py +11 -9
- mlrun/api/crud/model_monitoring/__init__.py +3 -3
- mlrun/api/crud/model_monitoring/grafana.py +435 -0
- mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
- mlrun/api/crud/notifications.py +149 -0
- mlrun/api/crud/pipelines.py +67 -52
- mlrun/api/crud/projects.py +51 -23
- mlrun/api/crud/runs.py +7 -5
- mlrun/api/crud/runtime_resources.py +13 -13
- mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
- mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
- mlrun/api/crud/runtimes/nuclio/function.py +505 -0
- mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
- mlrun/api/crud/secrets.py +88 -46
- mlrun/api/crud/tags.py +5 -5
- mlrun/api/db/__init__.py +1 -1
- mlrun/api/db/base.py +102 -54
- mlrun/api/db/init_db.py +2 -3
- mlrun/api/db/session.py +4 -12
- mlrun/api/db/sqldb/__init__.py +1 -1
- mlrun/api/db/sqldb/db.py +439 -196
- mlrun/api/db/sqldb/helpers.py +1 -1
- mlrun/api/db/sqldb/models/__init__.py +3 -3
- mlrun/api/db/sqldb/models/models_mysql.py +82 -64
- mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
- mlrun/api/db/sqldb/session.py +27 -20
- mlrun/api/initial_data.py +82 -24
- mlrun/api/launcher.py +196 -0
- mlrun/api/main.py +91 -22
- mlrun/api/middlewares.py +6 -5
- mlrun/api/migrations_mysql/env.py +1 -1
- mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
- mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
- mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
- mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
- mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
- mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
- mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/env.py +1 -1
- mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
- mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
- mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
- mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
- mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
- mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
- mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
- mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
- mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
- mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
- mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
- mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
- mlrun/api/schemas/__init__.py +216 -138
- mlrun/api/utils/__init__.py +1 -1
- mlrun/api/utils/asyncio.py +1 -1
- mlrun/api/utils/auth/__init__.py +1 -1
- mlrun/api/utils/auth/providers/__init__.py +1 -1
- mlrun/api/utils/auth/providers/base.py +7 -7
- mlrun/api/utils/auth/providers/nop.py +6 -7
- mlrun/api/utils/auth/providers/opa.py +17 -17
- mlrun/api/utils/auth/verifier.py +36 -34
- mlrun/api/utils/background_tasks.py +24 -24
- mlrun/{builder.py → api/utils/builder.py} +216 -123
- mlrun/api/utils/clients/__init__.py +1 -1
- mlrun/api/utils/clients/chief.py +19 -4
- mlrun/api/utils/clients/iguazio.py +106 -60
- mlrun/api/utils/clients/log_collector.py +1 -1
- mlrun/api/utils/clients/nuclio.py +23 -23
- mlrun/api/utils/clients/protocols/grpc.py +2 -2
- mlrun/api/utils/db/__init__.py +1 -1
- mlrun/api/utils/db/alembic.py +1 -1
- mlrun/api/utils/db/backup.py +1 -1
- mlrun/api/utils/db/mysql.py +24 -25
- mlrun/api/utils/db/sql_collation.py +1 -1
- mlrun/api/utils/db/sqlite_migration.py +2 -2
- mlrun/api/utils/events/__init__.py +14 -0
- mlrun/api/utils/events/base.py +57 -0
- mlrun/api/utils/events/events_factory.py +41 -0
- mlrun/api/utils/events/iguazio.py +217 -0
- mlrun/api/utils/events/nop.py +55 -0
- mlrun/api/utils/helpers.py +16 -13
- mlrun/api/utils/memory_reports.py +1 -1
- mlrun/api/utils/periodic.py +6 -3
- mlrun/api/utils/projects/__init__.py +1 -1
- mlrun/api/utils/projects/follower.py +33 -33
- mlrun/api/utils/projects/leader.py +36 -34
- mlrun/api/utils/projects/member.py +27 -27
- mlrun/api/utils/projects/remotes/__init__.py +1 -1
- mlrun/api/utils/projects/remotes/follower.py +13 -13
- mlrun/api/utils/projects/remotes/leader.py +10 -10
- mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
- mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
- mlrun/api/utils/scheduler.py +140 -51
- mlrun/api/utils/singletons/__init__.py +1 -1
- mlrun/api/utils/singletons/db.py +9 -15
- mlrun/api/utils/singletons/k8s.py +677 -5
- mlrun/api/utils/singletons/logs_dir.py +1 -1
- mlrun/api/utils/singletons/project_member.py +1 -1
- mlrun/api/utils/singletons/scheduler.py +1 -1
- mlrun/artifacts/__init__.py +2 -2
- mlrun/artifacts/base.py +8 -2
- mlrun/artifacts/dataset.py +5 -3
- mlrun/artifacts/manager.py +7 -1
- mlrun/artifacts/model.py +15 -4
- mlrun/artifacts/plots.py +1 -1
- mlrun/common/__init__.py +1 -1
- mlrun/common/constants.py +15 -0
- mlrun/common/model_monitoring.py +209 -0
- mlrun/common/schemas/__init__.py +167 -0
- mlrun/{api → common}/schemas/artifact.py +13 -14
- mlrun/{api → common}/schemas/auth.py +10 -8
- mlrun/{api → common}/schemas/background_task.py +3 -3
- mlrun/{api → common}/schemas/client_spec.py +1 -1
- mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
- mlrun/{api → common}/schemas/constants.py +21 -8
- mlrun/common/schemas/events.py +36 -0
- mlrun/{api → common}/schemas/feature_store.py +2 -1
- mlrun/{api → common}/schemas/frontend_spec.py +7 -6
- mlrun/{api → common}/schemas/function.py +5 -5
- mlrun/{api → common}/schemas/http.py +3 -3
- mlrun/common/schemas/hub.py +134 -0
- mlrun/{api → common}/schemas/k8s.py +3 -3
- mlrun/{api → common}/schemas/memory_reports.py +1 -1
- mlrun/common/schemas/model_endpoints.py +342 -0
- mlrun/common/schemas/notification.py +57 -0
- mlrun/{api → common}/schemas/object.py +6 -6
- mlrun/{api → common}/schemas/pipeline.py +3 -3
- mlrun/{api → common}/schemas/project.py +6 -5
- mlrun/common/schemas/regex.py +24 -0
- mlrun/common/schemas/runs.py +30 -0
- mlrun/{api → common}/schemas/runtime_resource.py +3 -3
- mlrun/{api → common}/schemas/schedule.py +19 -7
- mlrun/{api → common}/schemas/secret.py +3 -3
- mlrun/{api → common}/schemas/tag.py +2 -2
- mlrun/common/types.py +25 -0
- mlrun/config.py +152 -20
- mlrun/data_types/__init__.py +7 -2
- mlrun/data_types/data_types.py +4 -2
- mlrun/data_types/infer.py +1 -1
- mlrun/data_types/spark.py +10 -3
- mlrun/datastore/__init__.py +10 -3
- mlrun/datastore/azure_blob.py +1 -1
- mlrun/datastore/base.py +185 -53
- mlrun/datastore/datastore.py +1 -1
- mlrun/datastore/filestore.py +1 -1
- mlrun/datastore/google_cloud_storage.py +1 -1
- mlrun/datastore/inmem.py +4 -1
- mlrun/datastore/redis.py +1 -1
- mlrun/datastore/s3.py +1 -1
- mlrun/datastore/sources.py +192 -70
- mlrun/datastore/spark_udf.py +44 -0
- mlrun/datastore/store_resources.py +4 -4
- mlrun/datastore/targets.py +115 -45
- mlrun/datastore/utils.py +127 -5
- mlrun/datastore/v3io.py +1 -1
- mlrun/datastore/wasbfs/__init__.py +1 -1
- mlrun/datastore/wasbfs/fs.py +1 -1
- mlrun/db/__init__.py +7 -5
- mlrun/db/base.py +112 -68
- mlrun/db/httpdb.py +445 -277
- mlrun/db/nopdb.py +491 -0
- mlrun/db/sqldb.py +112 -65
- mlrun/errors.py +6 -1
- mlrun/execution.py +44 -22
- mlrun/feature_store/__init__.py +1 -1
- mlrun/feature_store/api.py +143 -95
- mlrun/feature_store/common.py +16 -20
- mlrun/feature_store/feature_set.py +42 -12
- mlrun/feature_store/feature_vector.py +32 -21
- mlrun/feature_store/ingestion.py +9 -12
- mlrun/feature_store/retrieval/__init__.py +3 -2
- mlrun/feature_store/retrieval/base.py +388 -66
- mlrun/feature_store/retrieval/dask_merger.py +63 -151
- mlrun/feature_store/retrieval/job.py +30 -12
- mlrun/feature_store/retrieval/local_merger.py +40 -133
- mlrun/feature_store/retrieval/spark_merger.py +129 -127
- mlrun/feature_store/retrieval/storey_merger.py +173 -0
- mlrun/feature_store/steps.py +132 -15
- mlrun/features.py +8 -3
- mlrun/frameworks/__init__.py +1 -1
- mlrun/frameworks/_common/__init__.py +1 -1
- mlrun/frameworks/_common/artifacts_library.py +1 -1
- mlrun/frameworks/_common/mlrun_interface.py +1 -1
- mlrun/frameworks/_common/model_handler.py +1 -1
- mlrun/frameworks/_common/plan.py +1 -1
- mlrun/frameworks/_common/producer.py +1 -1
- mlrun/frameworks/_common/utils.py +1 -1
- mlrun/frameworks/_dl_common/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
- mlrun/frameworks/_dl_common/model_handler.py +1 -1
- mlrun/frameworks/_dl_common/utils.py +1 -1
- mlrun/frameworks/_ml_common/__init__.py +1 -1
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
- mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_ml_common/model_handler.py +1 -1
- mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
- mlrun/frameworks/_ml_common/plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
- mlrun/frameworks/_ml_common/producer.py +1 -1
- mlrun/frameworks/_ml_common/utils.py +1 -1
- mlrun/frameworks/auto_mlrun/__init__.py +1 -1
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
- mlrun/frameworks/huggingface/__init__.py +1 -1
- mlrun/frameworks/huggingface/model_server.py +1 -1
- mlrun/frameworks/lgbm/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/model_handler.py +1 -1
- mlrun/frameworks/lgbm/model_server.py +1 -1
- mlrun/frameworks/lgbm/utils.py +1 -1
- mlrun/frameworks/onnx/__init__.py +1 -1
- mlrun/frameworks/onnx/dataset.py +1 -1
- mlrun/frameworks/onnx/mlrun_interface.py +1 -1
- mlrun/frameworks/onnx/model_handler.py +1 -1
- mlrun/frameworks/onnx/model_server.py +1 -1
- mlrun/frameworks/parallel_coordinates.py +1 -1
- mlrun/frameworks/pytorch/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
- mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
- mlrun/frameworks/pytorch/model_handler.py +1 -1
- mlrun/frameworks/pytorch/model_server.py +1 -1
- mlrun/frameworks/pytorch/utils.py +1 -1
- mlrun/frameworks/sklearn/__init__.py +1 -1
- mlrun/frameworks/sklearn/estimator.py +1 -1
- mlrun/frameworks/sklearn/metric.py +1 -1
- mlrun/frameworks/sklearn/metrics_library.py +1 -1
- mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
- mlrun/frameworks/sklearn/model_handler.py +1 -1
- mlrun/frameworks/sklearn/utils.py +1 -1
- mlrun/frameworks/tf_keras/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
- mlrun/frameworks/tf_keras/model_handler.py +1 -1
- mlrun/frameworks/tf_keras/model_server.py +1 -1
- mlrun/frameworks/tf_keras/utils.py +1 -1
- mlrun/frameworks/xgboost/__init__.py +1 -1
- mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
- mlrun/frameworks/xgboost/model_handler.py +1 -1
- mlrun/frameworks/xgboost/utils.py +1 -1
- mlrun/k8s_utils.py +14 -765
- mlrun/kfpops.py +14 -17
- mlrun/launcher/__init__.py +13 -0
- mlrun/launcher/base.py +406 -0
- mlrun/launcher/client.py +159 -0
- mlrun/launcher/factory.py +50 -0
- mlrun/launcher/local.py +276 -0
- mlrun/launcher/remote.py +178 -0
- mlrun/lists.py +10 -2
- mlrun/mlutils/__init__.py +1 -1
- mlrun/mlutils/data.py +1 -1
- mlrun/mlutils/models.py +1 -1
- mlrun/mlutils/plots.py +1 -1
- mlrun/model.py +252 -14
- mlrun/model_monitoring/__init__.py +41 -0
- mlrun/model_monitoring/features_drift_table.py +1 -1
- mlrun/model_monitoring/helpers.py +123 -38
- mlrun/model_monitoring/model_endpoint.py +144 -0
- mlrun/model_monitoring/model_monitoring_batch.py +310 -259
- mlrun/model_monitoring/stores/__init__.py +106 -0
- mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
- mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
- mlrun/model_monitoring/stores/models/__init__.py +23 -0
- mlrun/model_monitoring/stores/models/base.py +18 -0
- mlrun/model_monitoring/stores/models/mysql.py +100 -0
- mlrun/model_monitoring/stores/models/sqlite.py +98 -0
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
- mlrun/model_monitoring/stream_processing_fs.py +239 -271
- mlrun/package/__init__.py +163 -0
- mlrun/package/context_handler.py +325 -0
- mlrun/package/errors.py +47 -0
- mlrun/package/packager.py +298 -0
- mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
- mlrun/package/packagers/default_packager.py +422 -0
- mlrun/package/packagers/numpy_packagers.py +612 -0
- mlrun/package/packagers/pandas_packagers.py +968 -0
- mlrun/package/packagers/python_standard_library_packagers.py +616 -0
- mlrun/package/packagers_manager.py +786 -0
- mlrun/package/utils/__init__.py +53 -0
- mlrun/package/utils/_archiver.py +226 -0
- mlrun/package/utils/_formatter.py +211 -0
- mlrun/package/utils/_pickler.py +234 -0
- mlrun/package/utils/_supported_format.py +71 -0
- mlrun/package/utils/log_hint_utils.py +93 -0
- mlrun/package/utils/type_hint_utils.py +298 -0
- mlrun/platforms/__init__.py +1 -1
- mlrun/platforms/iguazio.py +34 -2
- mlrun/platforms/other.py +1 -1
- mlrun/projects/__init__.py +1 -1
- mlrun/projects/operations.py +14 -9
- mlrun/projects/pipelines.py +31 -13
- mlrun/projects/project.py +762 -238
- mlrun/render.py +49 -19
- mlrun/run.py +57 -326
- mlrun/runtimes/__init__.py +3 -9
- mlrun/runtimes/base.py +247 -784
- mlrun/runtimes/constants.py +1 -1
- mlrun/runtimes/daskjob.py +45 -41
- mlrun/runtimes/funcdoc.py +43 -7
- mlrun/runtimes/function.py +66 -656
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/generators.py +1 -1
- mlrun/runtimes/kubejob.py +99 -116
- mlrun/runtimes/local.py +59 -66
- mlrun/runtimes/mpijob/__init__.py +1 -1
- mlrun/runtimes/mpijob/abstract.py +13 -15
- mlrun/runtimes/mpijob/v1.py +3 -1
- mlrun/runtimes/mpijob/v1alpha1.py +1 -1
- mlrun/runtimes/nuclio.py +1 -1
- mlrun/runtimes/pod.py +51 -26
- mlrun/runtimes/remotesparkjob.py +3 -1
- mlrun/runtimes/serving.py +12 -4
- mlrun/runtimes/sparkjob/__init__.py +1 -2
- mlrun/runtimes/sparkjob/abstract.py +44 -31
- mlrun/runtimes/sparkjob/spark3job.py +11 -9
- mlrun/runtimes/utils.py +61 -42
- mlrun/secrets.py +16 -18
- mlrun/serving/__init__.py +3 -2
- mlrun/serving/merger.py +1 -1
- mlrun/serving/remote.py +1 -1
- mlrun/serving/routers.py +39 -42
- mlrun/serving/server.py +23 -13
- mlrun/serving/serving_wrapper.py +1 -1
- mlrun/serving/states.py +172 -39
- mlrun/serving/utils.py +1 -1
- mlrun/serving/v1_serving.py +1 -1
- mlrun/serving/v2_serving.py +29 -21
- mlrun/utils/__init__.py +1 -2
- mlrun/utils/async_http.py +8 -1
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +2 -2
- mlrun/utils/condition_evaluator.py +65 -0
- mlrun/utils/db.py +52 -0
- mlrun/utils/helpers.py +188 -13
- mlrun/utils/http.py +89 -54
- mlrun/utils/logger.py +48 -8
- mlrun/utils/model_monitoring.py +132 -100
- mlrun/utils/notifications/__init__.py +1 -1
- mlrun/utils/notifications/notification/__init__.py +8 -6
- mlrun/utils/notifications/notification/base.py +20 -14
- mlrun/utils/notifications/notification/console.py +7 -4
- mlrun/utils/notifications/notification/git.py +36 -19
- mlrun/utils/notifications/notification/ipython.py +10 -8
- mlrun/utils/notifications/notification/slack.py +18 -13
- mlrun/utils/notifications/notification_pusher.py +377 -56
- mlrun/utils/regex.py +6 -1
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +1 -1
- mlrun/utils/vault.py +270 -269
- mlrun/utils/version/__init__.py +1 -1
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +1 -1
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
- mlrun-1.4.0.dist-info/RECORD +434 -0
- mlrun/api/api/endpoints/marketplace.py +0 -257
- mlrun/api/crud/marketplace.py +0 -221
- mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
- mlrun/api/db/filedb/db.py +0 -518
- mlrun/api/schemas/marketplace.py +0 -128
- mlrun/api/schemas/model_endpoints.py +0 -185
- mlrun/db/filedb.py +0 -891
- mlrun/feature_store/retrieval/online.py +0 -92
- mlrun/model_monitoring/constants.py +0 -67
- mlrun/runtimes/package/context_handler.py +0 -711
- mlrun/runtimes/sparkjob/spark2job.py +0 -59
- mlrun-1.3.3.dist-info/RECORD +0 -381
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
mlrun/launcher/local.py
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# Copyright 2023 MLRun Authors
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
import os
|
|
15
|
+
import pathlib
|
|
16
|
+
from typing import Callable, Dict, List, Optional, Union
|
|
17
|
+
|
|
18
|
+
import mlrun.common.schemas.schedule
|
|
19
|
+
import mlrun.errors
|
|
20
|
+
import mlrun.launcher.client
|
|
21
|
+
import mlrun.run
|
|
22
|
+
import mlrun.runtimes.generators
|
|
23
|
+
import mlrun.utils.clones
|
|
24
|
+
import mlrun.utils.notifications
|
|
25
|
+
from mlrun.utils import logger
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ClientLocalLauncher(mlrun.launcher.client.ClientBaseLauncher):
|
|
29
|
+
"""
|
|
30
|
+
ClientLocalLauncher is a launcher that runs the job locally.
|
|
31
|
+
Either on the user's machine (_is_run_local is True) or on a remote machine (_is_run_local is False).
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, local: bool):
|
|
35
|
+
"""
|
|
36
|
+
Initialize a ClientLocalLauncher.
|
|
37
|
+
:param local: True if the job runs on the user's local machine,
|
|
38
|
+
False if it runs on a remote machine (e.g. a dedicated k8s pod).
|
|
39
|
+
"""
|
|
40
|
+
super().__init__()
|
|
41
|
+
self._is_run_local = local
|
|
42
|
+
|
|
43
|
+
def launch(
|
|
44
|
+
self,
|
|
45
|
+
runtime: "mlrun.runtimes.BaseRuntime",
|
|
46
|
+
task: Optional[
|
|
47
|
+
Union["mlrun.run.RunTemplate", "mlrun.run.RunObject", dict]
|
|
48
|
+
] = None,
|
|
49
|
+
handler: Optional[Union[str, Callable]] = None,
|
|
50
|
+
name: Optional[str] = "",
|
|
51
|
+
project: Optional[str] = "",
|
|
52
|
+
params: Optional[dict] = None,
|
|
53
|
+
inputs: Optional[Dict[str, str]] = None,
|
|
54
|
+
out_path: Optional[str] = "",
|
|
55
|
+
workdir: Optional[str] = "",
|
|
56
|
+
artifact_path: Optional[str] = "",
|
|
57
|
+
watch: Optional[bool] = True,
|
|
58
|
+
schedule: Optional[
|
|
59
|
+
Union[str, mlrun.common.schemas.schedule.ScheduleCronTrigger]
|
|
60
|
+
] = None,
|
|
61
|
+
hyperparams: Dict[str, list] = None,
|
|
62
|
+
hyper_param_options: Optional[mlrun.model.HyperParamOptions] = None,
|
|
63
|
+
verbose: Optional[bool] = None,
|
|
64
|
+
scrape_metrics: Optional[bool] = None,
|
|
65
|
+
local_code_path: Optional[str] = None,
|
|
66
|
+
auto_build: Optional[bool] = None,
|
|
67
|
+
param_file_secrets: Optional[Dict[str, str]] = None,
|
|
68
|
+
notifications: Optional[List[mlrun.model.Notification]] = None,
|
|
69
|
+
returns: Optional[List[Union[str, Dict[str, str]]]] = None,
|
|
70
|
+
) -> "mlrun.run.RunObject":
|
|
71
|
+
|
|
72
|
+
# do not allow local function to be scheduled
|
|
73
|
+
if self._is_run_local and schedule is not None:
|
|
74
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
75
|
+
"local and schedule cannot be used together"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
self.enrich_runtime(runtime)
|
|
79
|
+
run = self._create_run_object(task)
|
|
80
|
+
|
|
81
|
+
if self._is_run_local:
|
|
82
|
+
runtime = self._create_local_function_for_execution(
|
|
83
|
+
runtime=runtime,
|
|
84
|
+
run=run,
|
|
85
|
+
local_code_path=local_code_path,
|
|
86
|
+
project=project,
|
|
87
|
+
name=name,
|
|
88
|
+
workdir=workdir,
|
|
89
|
+
handler=handler,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# sanity check
|
|
93
|
+
elif runtime._is_remote:
|
|
94
|
+
message = "Remote function cannot be executed locally"
|
|
95
|
+
logger.error(
|
|
96
|
+
message,
|
|
97
|
+
is_remote=runtime._is_remote,
|
|
98
|
+
local=self._is_run_local,
|
|
99
|
+
runtime=runtime.to_dict(),
|
|
100
|
+
)
|
|
101
|
+
raise mlrun.errors.MLRunRuntimeError(message)
|
|
102
|
+
|
|
103
|
+
run = self._enrich_run(
|
|
104
|
+
runtime=runtime,
|
|
105
|
+
run=run,
|
|
106
|
+
handler=handler,
|
|
107
|
+
project_name=project,
|
|
108
|
+
name=name,
|
|
109
|
+
params=params,
|
|
110
|
+
inputs=inputs,
|
|
111
|
+
returns=returns,
|
|
112
|
+
hyperparams=hyperparams,
|
|
113
|
+
hyper_param_options=hyper_param_options,
|
|
114
|
+
verbose=verbose,
|
|
115
|
+
scrape_metrics=scrape_metrics,
|
|
116
|
+
out_path=out_path,
|
|
117
|
+
artifact_path=artifact_path,
|
|
118
|
+
workdir=workdir,
|
|
119
|
+
notifications=notifications,
|
|
120
|
+
)
|
|
121
|
+
self._validate_runtime(runtime, run)
|
|
122
|
+
result = self.execute(
|
|
123
|
+
runtime=runtime,
|
|
124
|
+
run=run,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return result
|
|
128
|
+
|
|
129
|
+
def execute(
|
|
130
|
+
self,
|
|
131
|
+
runtime: "mlrun.runtimes.BaseRuntime",
|
|
132
|
+
run: Optional[Union["mlrun.run.RunTemplate", "mlrun.run.RunObject"]] = None,
|
|
133
|
+
):
|
|
134
|
+
|
|
135
|
+
if "V3IO_USERNAME" in os.environ and "v3io_user" not in run.metadata.labels:
|
|
136
|
+
run.metadata.labels["v3io_user"] = os.environ.get("V3IO_USERNAME")
|
|
137
|
+
|
|
138
|
+
# store function object in db unless running from within a run pod
|
|
139
|
+
if not runtime.is_child:
|
|
140
|
+
logger.info(
|
|
141
|
+
"Storing function",
|
|
142
|
+
name=run.metadata.name,
|
|
143
|
+
uid=run.metadata.uid,
|
|
144
|
+
db=runtime.spec.rundb,
|
|
145
|
+
)
|
|
146
|
+
self._store_function(runtime, run)
|
|
147
|
+
|
|
148
|
+
execution = mlrun.run.MLClientCtx.from_dict(
|
|
149
|
+
run.to_dict(),
|
|
150
|
+
runtime._get_db(),
|
|
151
|
+
autocommit=False,
|
|
152
|
+
is_api=False,
|
|
153
|
+
store_run=False,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# create task generator (for child runs) from spec
|
|
157
|
+
task_generator = mlrun.runtimes.generators.get_generator(run.spec, execution)
|
|
158
|
+
if task_generator:
|
|
159
|
+
# verify valid task parameters
|
|
160
|
+
tasks = task_generator.generate(run)
|
|
161
|
+
for task in tasks:
|
|
162
|
+
self._validate_run_params(task.spec.parameters)
|
|
163
|
+
|
|
164
|
+
# post verifications, store execution in db and run pre run hooks
|
|
165
|
+
execution.store_run()
|
|
166
|
+
runtime._pre_run(run, execution) # hook for runtime specific prep
|
|
167
|
+
|
|
168
|
+
last_err = None
|
|
169
|
+
# If the runtime is nested, it means the hyper-run will run within a single instance of the run.
|
|
170
|
+
# So while in the API, we consider the hyper-run as a single run, and then in the runtime itself when the
|
|
171
|
+
# runtime is now a local runtime and therefore `self._is_nested == False`, we run each task as a separate run by
|
|
172
|
+
# using the task generator
|
|
173
|
+
# TODO client-server separation might not need the not runtime._is_nested anymore as this executed local func
|
|
174
|
+
if task_generator and not runtime._is_nested:
|
|
175
|
+
# multiple runs (based on hyper params or params file)
|
|
176
|
+
runner = runtime._run_many
|
|
177
|
+
if hasattr(runtime, "_parallel_run_many") and task_generator.use_parallel():
|
|
178
|
+
runner = runtime._parallel_run_many
|
|
179
|
+
results = runner(task_generator, execution, run)
|
|
180
|
+
mlrun.runtimes.utils.results_to_iter(results, run, execution)
|
|
181
|
+
result = execution.to_dict()
|
|
182
|
+
result = runtime._update_run_state(result, task=run)
|
|
183
|
+
|
|
184
|
+
else:
|
|
185
|
+
# single run
|
|
186
|
+
try:
|
|
187
|
+
resp = runtime._run(run, execution)
|
|
188
|
+
result = runtime._update_run_state(resp, task=run)
|
|
189
|
+
except mlrun.runtimes.base.RunError as err:
|
|
190
|
+
last_err = err
|
|
191
|
+
result = runtime._update_run_state(task=run, err=err)
|
|
192
|
+
|
|
193
|
+
self._push_notifications(run, runtime)
|
|
194
|
+
|
|
195
|
+
# run post run hooks
|
|
196
|
+
runtime._post_run(result, execution) # hook for runtime specific cleanup
|
|
197
|
+
|
|
198
|
+
return self._wrap_run_result(runtime, result, run, err=last_err)
|
|
199
|
+
|
|
200
|
+
def _create_local_function_for_execution(
|
|
201
|
+
self,
|
|
202
|
+
runtime: "mlrun.runtimes.BaseRuntime",
|
|
203
|
+
run: "mlrun.run.RunObject",
|
|
204
|
+
local_code_path: Optional[str] = None,
|
|
205
|
+
project: Optional[str] = "",
|
|
206
|
+
name: Optional[str] = "",
|
|
207
|
+
workdir: Optional[str] = "",
|
|
208
|
+
handler: Optional[str] = None,
|
|
209
|
+
):
|
|
210
|
+
|
|
211
|
+
project = project or runtime.metadata.project
|
|
212
|
+
function_name = name or runtime.metadata.name
|
|
213
|
+
command, args = self._resolve_local_code_path(local_code_path)
|
|
214
|
+
if command:
|
|
215
|
+
function_name = name or pathlib.Path(command).stem
|
|
216
|
+
|
|
217
|
+
meta = mlrun.model.BaseMetadata(function_name, project=project)
|
|
218
|
+
|
|
219
|
+
command, loaded_runtime = mlrun.run.load_func_code(
|
|
220
|
+
command or runtime, workdir, name=name
|
|
221
|
+
)
|
|
222
|
+
# loaded_runtime is loaded from runtime or yaml file, if passed a command it should be None,
|
|
223
|
+
# so we keep the current runtime for enrichment
|
|
224
|
+
runtime = loaded_runtime or runtime
|
|
225
|
+
if loaded_runtime:
|
|
226
|
+
if run:
|
|
227
|
+
handler = handler or run.spec.handler
|
|
228
|
+
handler = handler or runtime.spec.default_handler or ""
|
|
229
|
+
meta = runtime.metadata.copy()
|
|
230
|
+
meta.name = function_name or meta.name
|
|
231
|
+
meta.project = project or meta.project
|
|
232
|
+
|
|
233
|
+
# if the handler has module prefix force "local" (vs "handler") runtime
|
|
234
|
+
kind = "local" if isinstance(handler, str) and "." in handler else ""
|
|
235
|
+
fn = mlrun.new_function(meta.name, command=command, args=args, kind=kind)
|
|
236
|
+
fn.metadata = meta
|
|
237
|
+
setattr(fn, "_is_run_local", True)
|
|
238
|
+
if workdir:
|
|
239
|
+
fn.spec.workdir = str(workdir)
|
|
240
|
+
|
|
241
|
+
fn.spec.allow_empty_resources = runtime.spec.allow_empty_resources
|
|
242
|
+
if runtime:
|
|
243
|
+
# copy the code/base-spec to the local function (for the UI and code logging)
|
|
244
|
+
fn.spec.description = runtime.spec.description
|
|
245
|
+
fn.spec.build = runtime.spec.build
|
|
246
|
+
|
|
247
|
+
run.spec.handler = handler
|
|
248
|
+
return fn
|
|
249
|
+
|
|
250
|
+
@staticmethod
|
|
251
|
+
def _resolve_local_code_path(local_code_path: str) -> (str, List[str]):
|
|
252
|
+
command = None
|
|
253
|
+
args = []
|
|
254
|
+
if local_code_path:
|
|
255
|
+
command = local_code_path
|
|
256
|
+
if command:
|
|
257
|
+
sp = command.split()
|
|
258
|
+
# split command and args
|
|
259
|
+
command = sp[0]
|
|
260
|
+
if len(sp) > 1:
|
|
261
|
+
args = sp[1:]
|
|
262
|
+
return command, args
|
|
263
|
+
|
|
264
|
+
def _push_notifications(
|
|
265
|
+
self, runobj: "mlrun.run.RunObject", runtime: "mlrun.runtimes.BaseRuntime"
|
|
266
|
+
):
|
|
267
|
+
if not self._run_has_valid_notifications(runobj):
|
|
268
|
+
return
|
|
269
|
+
# TODO: add store_notifications API endpoint so we can store notifications pushed from the
|
|
270
|
+
# SDK for documentation purposes.
|
|
271
|
+
# The run is local, so we can assume that watch=True, therefore this code runs
|
|
272
|
+
# once the run is completed, and we can just push the notifications.
|
|
273
|
+
# Only push from jupyter, not from the CLI.
|
|
274
|
+
# "handler" and "dask" kinds are special cases of local runs which don't set local=True
|
|
275
|
+
if self._is_run_local or runtime.kind in ["handler", "dask"]:
|
|
276
|
+
mlrun.utils.notifications.NotificationPusher([runobj]).push()
|
mlrun/launcher/remote.py
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Copyright 2023 MLRun Authors
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
import os
|
|
15
|
+
from typing import Dict, List, Optional, Union
|
|
16
|
+
|
|
17
|
+
import requests
|
|
18
|
+
|
|
19
|
+
import mlrun.common.schemas.schedule
|
|
20
|
+
import mlrun.db
|
|
21
|
+
import mlrun.errors
|
|
22
|
+
import mlrun.launcher.client
|
|
23
|
+
import mlrun.run
|
|
24
|
+
import mlrun.runtimes
|
|
25
|
+
import mlrun.runtimes.generators
|
|
26
|
+
import mlrun.utils.clones
|
|
27
|
+
import mlrun.utils.notifications
|
|
28
|
+
from mlrun.utils import logger
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ClientRemoteLauncher(mlrun.launcher.client.ClientBaseLauncher):
|
|
32
|
+
def launch(
|
|
33
|
+
self,
|
|
34
|
+
runtime: "mlrun.runtimes.KubejobRuntime",
|
|
35
|
+
task: Optional[
|
|
36
|
+
Union["mlrun.run.RunTemplate", "mlrun.run.RunObject", dict]
|
|
37
|
+
] = None,
|
|
38
|
+
handler: Optional[str] = None,
|
|
39
|
+
name: Optional[str] = "",
|
|
40
|
+
project: Optional[str] = "",
|
|
41
|
+
params: Optional[dict] = None,
|
|
42
|
+
inputs: Optional[Dict[str, str]] = None,
|
|
43
|
+
out_path: Optional[str] = "",
|
|
44
|
+
workdir: Optional[str] = "",
|
|
45
|
+
artifact_path: Optional[str] = "",
|
|
46
|
+
watch: Optional[bool] = True,
|
|
47
|
+
schedule: Optional[
|
|
48
|
+
Union[str, mlrun.common.schemas.schedule.ScheduleCronTrigger]
|
|
49
|
+
] = None,
|
|
50
|
+
hyperparams: Dict[str, list] = None,
|
|
51
|
+
hyper_param_options: Optional[mlrun.model.HyperParamOptions] = None,
|
|
52
|
+
verbose: Optional[bool] = None,
|
|
53
|
+
scrape_metrics: Optional[bool] = None,
|
|
54
|
+
local_code_path: Optional[str] = None,
|
|
55
|
+
auto_build: Optional[bool] = None,
|
|
56
|
+
param_file_secrets: Optional[Dict[str, str]] = None,
|
|
57
|
+
notifications: Optional[List[mlrun.model.Notification]] = None,
|
|
58
|
+
returns: Optional[List[Union[str, Dict[str, str]]]] = None,
|
|
59
|
+
) -> "mlrun.run.RunObject":
|
|
60
|
+
self.enrich_runtime(runtime)
|
|
61
|
+
run = self._create_run_object(task)
|
|
62
|
+
|
|
63
|
+
run = self._enrich_run(
|
|
64
|
+
runtime=runtime,
|
|
65
|
+
run=run,
|
|
66
|
+
handler=handler,
|
|
67
|
+
project_name=project,
|
|
68
|
+
name=name,
|
|
69
|
+
params=params,
|
|
70
|
+
inputs=inputs,
|
|
71
|
+
returns=returns,
|
|
72
|
+
hyperparams=hyperparams,
|
|
73
|
+
hyper_param_options=hyper_param_options,
|
|
74
|
+
verbose=verbose,
|
|
75
|
+
scrape_metrics=scrape_metrics,
|
|
76
|
+
out_path=out_path,
|
|
77
|
+
artifact_path=artifact_path,
|
|
78
|
+
workdir=workdir,
|
|
79
|
+
notifications=notifications,
|
|
80
|
+
)
|
|
81
|
+
self._validate_runtime(runtime, run)
|
|
82
|
+
|
|
83
|
+
if not runtime.is_deployed():
|
|
84
|
+
if runtime.spec.build.auto_build or auto_build:
|
|
85
|
+
logger.info(
|
|
86
|
+
"Function is not deployed and auto_build flag is set, starting deploy..."
|
|
87
|
+
)
|
|
88
|
+
runtime.deploy(skip_deployed=True, show_on_failure=True)
|
|
89
|
+
|
|
90
|
+
else:
|
|
91
|
+
raise mlrun.errors.MLRunRuntimeError(
|
|
92
|
+
"function image is not built/ready, set auto_build=True or use .deploy() method first"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if runtime.verbose:
|
|
96
|
+
logger.info(f"runspec:\n{run.to_yaml()}")
|
|
97
|
+
|
|
98
|
+
if "V3IO_USERNAME" in os.environ and "v3io_user" not in run.metadata.labels:
|
|
99
|
+
run.metadata.labels["v3io_user"] = os.environ.get("V3IO_USERNAME")
|
|
100
|
+
|
|
101
|
+
logger.info(
|
|
102
|
+
"Storing function",
|
|
103
|
+
name=run.metadata.name,
|
|
104
|
+
uid=run.metadata.uid,
|
|
105
|
+
db=runtime.spec.rundb,
|
|
106
|
+
)
|
|
107
|
+
self._store_function(runtime, run)
|
|
108
|
+
|
|
109
|
+
return self.submit_job(runtime, run, schedule, watch)
|
|
110
|
+
|
|
111
|
+
def submit_job(
|
|
112
|
+
self,
|
|
113
|
+
runtime: "mlrun.runtimes.KubejobRuntime",
|
|
114
|
+
run: "mlrun.run.RunObject",
|
|
115
|
+
schedule: Optional[mlrun.common.schemas.ScheduleCronTrigger] = None,
|
|
116
|
+
watch: Optional[bool] = None,
|
|
117
|
+
):
|
|
118
|
+
if runtime._secrets:
|
|
119
|
+
run.spec.secret_sources = runtime._secrets.to_serial()
|
|
120
|
+
try:
|
|
121
|
+
db = runtime._get_db()
|
|
122
|
+
resp = db.submit_job(run, schedule=schedule)
|
|
123
|
+
if schedule:
|
|
124
|
+
action = resp.pop("action", "created")
|
|
125
|
+
logger.info(f"task schedule {action}", **resp)
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
except (requests.HTTPError, Exception) as err:
|
|
129
|
+
logger.error(f"got remote run err, {mlrun.errors.err_to_str(err)}")
|
|
130
|
+
|
|
131
|
+
if isinstance(err, requests.HTTPError):
|
|
132
|
+
runtime._handle_submit_job_http_error(err)
|
|
133
|
+
|
|
134
|
+
result = None
|
|
135
|
+
# if we got a schedule no reason to do post_run stuff (it purposed to update the run status with error,
|
|
136
|
+
# but there's no run in case of schedule)
|
|
137
|
+
if not schedule:
|
|
138
|
+
result = runtime._update_run_state(
|
|
139
|
+
task=run, err=mlrun.errors.err_to_str(err)
|
|
140
|
+
)
|
|
141
|
+
return self._wrap_run_result(
|
|
142
|
+
runtime, result, run, schedule=schedule, err=err
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
if resp:
|
|
146
|
+
txt = mlrun.runtimes.utils.helpers.get_in(resp, "status.status_text")
|
|
147
|
+
if txt:
|
|
148
|
+
logger.info(txt)
|
|
149
|
+
|
|
150
|
+
# watch is None only in scenario where we run from pipeline step, in this case we don't want to watch the run
|
|
151
|
+
# logs too frequently but rather just pull the state of the run from the DB and pull the logs every x seconds
|
|
152
|
+
# which ideally greater than the pull state interval, this reduces unnecessary load on the API server, as
|
|
153
|
+
# running a pipeline is mostly not an interactive process which means the logs pulling doesn't need to be pulled
|
|
154
|
+
# in real time
|
|
155
|
+
if (
|
|
156
|
+
watch is None
|
|
157
|
+
and runtime.kfp
|
|
158
|
+
and mlrun.mlconf.httpdb.logs.pipelines.pull_state.mode == "enabled"
|
|
159
|
+
):
|
|
160
|
+
state_interval = int(
|
|
161
|
+
mlrun.mlconf.httpdb.logs.pipelines.pull_state.pull_state_interval
|
|
162
|
+
)
|
|
163
|
+
logs_interval = int(
|
|
164
|
+
mlrun.mlconf.httpdb.logs.pipelines.pull_state.pull_logs_interval
|
|
165
|
+
)
|
|
166
|
+
run.wait_for_completion(
|
|
167
|
+
show_logs=True,
|
|
168
|
+
sleep=state_interval,
|
|
169
|
+
logs_interval=logs_interval,
|
|
170
|
+
raise_on_failure=False,
|
|
171
|
+
)
|
|
172
|
+
resp = runtime._get_db_run(run)
|
|
173
|
+
|
|
174
|
+
elif watch or runtime.kfp:
|
|
175
|
+
run.logs(True, runtime._get_db())
|
|
176
|
+
resp = runtime._get_db_run(run)
|
|
177
|
+
|
|
178
|
+
return self._wrap_run_result(runtime, resp, run, schedule=schedule)
|
mlrun/lists.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -92,7 +92,9 @@ class RunList(list):
|
|
|
92
92
|
|
|
93
93
|
return [list_header] + rows
|
|
94
94
|
|
|
95
|
-
def to_df(
|
|
95
|
+
def to_df(
|
|
96
|
+
self, flat: bool = False, extend_iterations: bool = False, cache: bool = True
|
|
97
|
+
) -> pd.DataFrame:
|
|
96
98
|
"""convert the run list to a dataframe"""
|
|
97
99
|
if hasattr(self, "_df") and cache:
|
|
98
100
|
return self._df
|
|
@@ -179,10 +181,16 @@ class ArtifactList(list):
|
|
|
179
181
|
"producer": ["producer", "spec.producer"],
|
|
180
182
|
"sources": ["sources", "spec.sources"],
|
|
181
183
|
"labels": ["labels", "metadata.labels"],
|
|
184
|
+
# important: the uri item must be the last one in this dict since there is no artifact.uri, and we fill it
|
|
185
|
+
# in the following for loop as the "last_index" in the dict
|
|
186
|
+
"uri": ["uri", "uri"],
|
|
182
187
|
}
|
|
183
188
|
for artifact in self:
|
|
184
189
|
fields_index = 0 if is_legacy_artifact(artifact) else 1
|
|
185
190
|
row = [get_in(artifact, v[fields_index], "") for k, v in head.items()]
|
|
191
|
+
artifact_uri = dict_to_artifact(artifact).uri
|
|
192
|
+
last_index = len(row) - 1
|
|
193
|
+
row[last_index] = artifact_uri
|
|
186
194
|
rows.append(row)
|
|
187
195
|
|
|
188
196
|
return [head.keys()] + rows
|
mlrun/mlutils/__init__.py
CHANGED
mlrun/mlutils/data.py
CHANGED
mlrun/mlutils/models.py
CHANGED
mlrun/mlutils/plots.py
CHANGED