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/runtimes/nuclio.py
CHANGED
mlrun/runtimes/pod.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.
|
|
@@ -24,12 +24,12 @@ from deprecated import deprecated
|
|
|
24
24
|
|
|
25
25
|
import mlrun.errors
|
|
26
26
|
import mlrun.utils.regex
|
|
27
|
-
|
|
28
|
-
from ..api.schemas import (
|
|
27
|
+
from mlrun.common.schemas import (
|
|
29
28
|
NodeSelectorOperator,
|
|
30
29
|
PreemptionModes,
|
|
31
30
|
SecurityContextEnrichmentModes,
|
|
32
31
|
)
|
|
32
|
+
|
|
33
33
|
from ..config import config as mlconf
|
|
34
34
|
from ..k8s_utils import (
|
|
35
35
|
generate_preemptible_node_selector_requirements,
|
|
@@ -44,6 +44,7 @@ from .utils import (
|
|
|
44
44
|
apply_kfp,
|
|
45
45
|
get_gpu_from_resource_requirement,
|
|
46
46
|
get_item_name,
|
|
47
|
+
get_k8s,
|
|
47
48
|
get_resource_labels,
|
|
48
49
|
set_named_item,
|
|
49
50
|
verify_limits,
|
|
@@ -135,6 +136,7 @@ class KubeResourceSpec(FunctionSpec):
|
|
|
135
136
|
tolerations=None,
|
|
136
137
|
preemption_mode=None,
|
|
137
138
|
security_context=None,
|
|
139
|
+
clone_target_dir=None,
|
|
138
140
|
):
|
|
139
141
|
super().__init__(
|
|
140
142
|
command=command,
|
|
@@ -148,6 +150,7 @@ class KubeResourceSpec(FunctionSpec):
|
|
|
148
150
|
default_handler=default_handler,
|
|
149
151
|
pythonpath=pythonpath,
|
|
150
152
|
disable_auto_mount=disable_auto_mount,
|
|
153
|
+
clone_target_dir=clone_target_dir,
|
|
151
154
|
)
|
|
152
155
|
self._volumes = {}
|
|
153
156
|
self._volume_mounts = {}
|
|
@@ -357,15 +360,25 @@ class KubeResourceSpec(FunctionSpec):
|
|
|
357
360
|
patch: bool = False,
|
|
358
361
|
):
|
|
359
362
|
"""
|
|
360
|
-
|
|
361
|
-
|
|
363
|
+
Set pod cpu/memory/gpu limits (max values)
|
|
364
|
+
|
|
365
|
+
:param mem: set limit for memory e.g. '500M', '2G', etc.
|
|
366
|
+
:param cpu: set limit for cpu e.g. '0.5', '2', etc.
|
|
367
|
+
:param gpus: set limit for gpu
|
|
368
|
+
:param gpu_type: set gpu type e.g. "nvidia.com/gpu"
|
|
369
|
+
:param patch: by default it overrides the whole limits section,
|
|
370
|
+
if you wish to patch specific resources use `patch=True`
|
|
362
371
|
"""
|
|
363
372
|
self._verify_and_set_limits("resources", mem, cpu, gpus, gpu_type, patch=patch)
|
|
364
373
|
|
|
365
374
|
def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
|
|
366
375
|
"""
|
|
367
|
-
|
|
368
|
-
|
|
376
|
+
Set requested (desired) pod cpu/memory resources
|
|
377
|
+
|
|
378
|
+
:param mem: set request for memory e.g. '200M', '1G', etc.
|
|
379
|
+
:param cpu: set request for cpu e.g. '0.1', '1', etc.
|
|
380
|
+
:param patch: by default it overrides the whole requests section,
|
|
381
|
+
if you wish to patch specific resources use `patch=True`
|
|
369
382
|
"""
|
|
370
383
|
self._verify_and_set_requests("resources", mem, cpu, patch)
|
|
371
384
|
|
|
@@ -989,12 +1002,14 @@ class KubeResource(BaseRuntime):
|
|
|
989
1002
|
"must specify env_vars OR file_path"
|
|
990
1003
|
)
|
|
991
1004
|
if file_path:
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1005
|
+
if os.path.isfile(file_path):
|
|
1006
|
+
env_vars = dotenv.dotenv_values(file_path)
|
|
1007
|
+
if None in env_vars.values():
|
|
1008
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
1009
|
+
"env file lines must be in the form key=value"
|
|
1010
|
+
)
|
|
1011
|
+
else:
|
|
1012
|
+
raise mlrun.errors.MLRunNotFoundError(f"{file_path} does not exist")
|
|
998
1013
|
for name, value in env_vars.items():
|
|
999
1014
|
self.set_env(name, value)
|
|
1000
1015
|
return self
|
|
@@ -1036,15 +1051,25 @@ class KubeResource(BaseRuntime):
|
|
|
1036
1051
|
patch: bool = False,
|
|
1037
1052
|
):
|
|
1038
1053
|
"""
|
|
1039
|
-
|
|
1040
|
-
|
|
1054
|
+
Set pod cpu/memory/gpu limits (max values)
|
|
1055
|
+
|
|
1056
|
+
:param mem: set limit for memory e.g. '500M', '2G', etc.
|
|
1057
|
+
:param cpu: set limit for cpu e.g. '0.5', '2', etc.
|
|
1058
|
+
:param gpus: set limit for gpu
|
|
1059
|
+
:param gpu_type: set gpu type e.g. "nvidia.com/gpu"
|
|
1060
|
+
:param patch: by default it overrides the whole limits section,
|
|
1061
|
+
if you wish to patch specific resources use `patch=True`
|
|
1041
1062
|
"""
|
|
1042
1063
|
self.spec.with_limits(mem, cpu, gpus, gpu_type, patch=patch)
|
|
1043
1064
|
|
|
1044
1065
|
def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
|
|
1045
1066
|
"""
|
|
1046
|
-
|
|
1047
|
-
|
|
1067
|
+
Set requested (desired) pod cpu/memory resources
|
|
1068
|
+
|
|
1069
|
+
:param mem: set request for memory e.g. '200M', '1G', etc.
|
|
1070
|
+
:param cpu: set request for cpu e.g. '0.1', '1', etc.
|
|
1071
|
+
:param patch: by default it overrides the whole requests section,
|
|
1072
|
+
if you wish to patch specific resources use `patch=True`
|
|
1048
1073
|
"""
|
|
1049
1074
|
self.spec.with_requests(mem, cpu, patch=patch)
|
|
1050
1075
|
|
|
@@ -1113,7 +1138,7 @@ class KubeResource(BaseRuntime):
|
|
|
1113
1138
|
The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
|
|
1114
1139
|
by default it's set to **prevent**
|
|
1115
1140
|
|
|
1116
|
-
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.
|
|
1141
|
+
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
|
|
1117
1142
|
"""
|
|
1118
1143
|
preemptible_mode = PreemptionModes(mode)
|
|
1119
1144
|
self.spec.preemption_mode = preemptible_mode.value
|
|
@@ -1122,7 +1147,7 @@ class KubeResource(BaseRuntime):
|
|
|
1122
1147
|
"""
|
|
1123
1148
|
Set security context for the pod.
|
|
1124
1149
|
For Iguazio we handle security context internally -
|
|
1125
|
-
see mlrun.
|
|
1150
|
+
see mlrun.common.schemas.function.SecurityContextEnrichmentModes
|
|
1126
1151
|
|
|
1127
1152
|
Example:
|
|
1128
1153
|
|
|
@@ -1155,7 +1180,7 @@ class KubeResource(BaseRuntime):
|
|
|
1155
1180
|
return mlconf.default_function_priority_class_name
|
|
1156
1181
|
|
|
1157
1182
|
def _get_meta(self, runobj, unique=False):
|
|
1158
|
-
namespace =
|
|
1183
|
+
namespace = get_k8s().resolve_namespace()
|
|
1159
1184
|
|
|
1160
1185
|
labels = get_resource_labels(self, runobj, runobj.spec.scrape_metrics)
|
|
1161
1186
|
new_meta = k8s_client.V1ObjectMeta(
|
|
@@ -1223,7 +1248,7 @@ class KubeResource(BaseRuntime):
|
|
|
1223
1248
|
mlconf.secret_stores.kubernetes.global_function_env_secret_name
|
|
1224
1249
|
)
|
|
1225
1250
|
if mlrun.config.is_running_as_api() and global_secret_name:
|
|
1226
|
-
global_secrets =
|
|
1251
|
+
global_secrets = get_k8s().get_secret_data(global_secret_name)
|
|
1227
1252
|
for key, value in global_secrets.items():
|
|
1228
1253
|
env_var_name = (
|
|
1229
1254
|
SecretsStore.k8s_env_variable_name_for_secret(key)
|
|
@@ -1245,10 +1270,10 @@ class KubeResource(BaseRuntime):
|
|
|
1245
1270
|
logger.warning("No project provided. Cannot add k8s secrets")
|
|
1246
1271
|
return
|
|
1247
1272
|
|
|
1248
|
-
secret_name =
|
|
1273
|
+
secret_name = get_k8s().get_project_secret_name(project_name)
|
|
1249
1274
|
# Not utilizing the same functionality from the Secrets crud object because this code also runs client-side
|
|
1250
1275
|
# in the nuclio remote-dashboard flow, which causes dependency problems.
|
|
1251
|
-
existing_secret_keys =
|
|
1276
|
+
existing_secret_keys = get_k8s().get_project_secret_keys(
|
|
1252
1277
|
project_name, filter_internal=True
|
|
1253
1278
|
)
|
|
1254
1279
|
|
|
@@ -1282,7 +1307,7 @@ class KubeResource(BaseRuntime):
|
|
|
1282
1307
|
)
|
|
1283
1308
|
)
|
|
1284
1309
|
|
|
1285
|
-
project_vault_secret_name =
|
|
1310
|
+
project_vault_secret_name = get_k8s().get_project_vault_secret_name(
|
|
1286
1311
|
project_name, service_account_name
|
|
1287
1312
|
)
|
|
1288
1313
|
if project_vault_secret_name is None:
|
|
@@ -1453,7 +1478,7 @@ def get_sanitized_attribute(spec, attribute_name: str):
|
|
|
1453
1478
|
if isinstance(attribute, dict):
|
|
1454
1479
|
if attribute_config["not_sanitized_class"] != dict:
|
|
1455
1480
|
raise mlrun.errors.MLRunInvalidArgumentTypeError(
|
|
1456
|
-
f"expected to
|
|
1481
|
+
f"expected to be of type {attribute_config.get('not_sanitized_class')} but got dict"
|
|
1457
1482
|
)
|
|
1458
1483
|
if _resolve_if_type_sanitized(attribute_name, attribute):
|
|
1459
1484
|
return attribute
|
|
@@ -1463,7 +1488,7 @@ def get_sanitized_attribute(spec, attribute_name: str):
|
|
|
1463
1488
|
):
|
|
1464
1489
|
if attribute_config["not_sanitized_class"] != list:
|
|
1465
1490
|
raise mlrun.errors.MLRunInvalidArgumentTypeError(
|
|
1466
|
-
f"expected to
|
|
1491
|
+
f"expected to be of type {attribute_config.get('not_sanitized_class')} but got list"
|
|
1467
1492
|
)
|
|
1468
1493
|
if _resolve_if_type_sanitized(attribute_name, attribute[0]):
|
|
1469
1494
|
return attribute
|
mlrun/runtimes/remotesparkjob.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.
|
|
@@ -58,6 +58,7 @@ class RemoteSparkSpec(KubeResourceSpec):
|
|
|
58
58
|
tolerations=None,
|
|
59
59
|
preemption_mode=None,
|
|
60
60
|
security_context=None,
|
|
61
|
+
clone_target_dir=None,
|
|
61
62
|
):
|
|
62
63
|
super().__init__(
|
|
63
64
|
command=command,
|
|
@@ -86,6 +87,7 @@ class RemoteSparkSpec(KubeResourceSpec):
|
|
|
86
87
|
tolerations=tolerations,
|
|
87
88
|
preemption_mode=preemption_mode,
|
|
88
89
|
security_context=security_context,
|
|
90
|
+
clone_target_dir=clone_target_dir,
|
|
89
91
|
)
|
|
90
92
|
self.provider = provider
|
|
91
93
|
|
mlrun/runtimes/serving.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.
|
|
@@ -21,7 +21,7 @@ import nuclio
|
|
|
21
21
|
from nuclio import KafkaTrigger
|
|
22
22
|
|
|
23
23
|
import mlrun
|
|
24
|
-
import mlrun.
|
|
24
|
+
import mlrun.common.schemas
|
|
25
25
|
|
|
26
26
|
from ..datastore import parse_kafka_url
|
|
27
27
|
from ..model import ObjectList
|
|
@@ -116,6 +116,7 @@ class ServingSpec(NuclioSpec):
|
|
|
116
116
|
function_kind=None,
|
|
117
117
|
service_account=None,
|
|
118
118
|
readiness_timeout=None,
|
|
119
|
+
readiness_timeout_before_failure=None,
|
|
119
120
|
models=None,
|
|
120
121
|
graph=None,
|
|
121
122
|
parameters=None,
|
|
@@ -141,6 +142,9 @@ class ServingSpec(NuclioSpec):
|
|
|
141
142
|
tolerations=None,
|
|
142
143
|
preemption_mode=None,
|
|
143
144
|
security_context=None,
|
|
145
|
+
service_type=None,
|
|
146
|
+
add_templated_ingress_host_mode=None,
|
|
147
|
+
clone_target_dir=None,
|
|
144
148
|
):
|
|
145
149
|
|
|
146
150
|
super().__init__(
|
|
@@ -165,6 +169,7 @@ class ServingSpec(NuclioSpec):
|
|
|
165
169
|
function_kind=serving_subkind,
|
|
166
170
|
service_account=service_account,
|
|
167
171
|
readiness_timeout=readiness_timeout,
|
|
172
|
+
readiness_timeout_before_failure=readiness_timeout_before_failure,
|
|
168
173
|
build=build,
|
|
169
174
|
node_name=node_name,
|
|
170
175
|
node_selector=node_selector,
|
|
@@ -178,6 +183,9 @@ class ServingSpec(NuclioSpec):
|
|
|
178
183
|
tolerations=tolerations,
|
|
179
184
|
preemption_mode=preemption_mode,
|
|
180
185
|
security_context=security_context,
|
|
186
|
+
service_type=service_type,
|
|
187
|
+
add_templated_ingress_host_mode=add_templated_ingress_host_mode,
|
|
188
|
+
clone_target_dir=clone_target_dir,
|
|
181
189
|
)
|
|
182
190
|
|
|
183
191
|
self.models = models or {}
|
|
@@ -313,7 +321,7 @@ class ServingRuntime(RemoteRuntime):
|
|
|
313
321
|
example::
|
|
314
322
|
|
|
315
323
|
# initialize a new serving function
|
|
316
|
-
serving_fn = mlrun.import_function("hub://
|
|
324
|
+
serving_fn = mlrun.import_function("hub://v2-model-server", new_name="serving")
|
|
317
325
|
# apply model monitoring and set monitoring batch job to run every 3 hours
|
|
318
326
|
tracking_policy = {'default_batch_intervals':"0 */3 * * *"}
|
|
319
327
|
serving_fn.set_tracking(tracking_policy=tracking_policy)
|
|
@@ -579,7 +587,7 @@ class ServingRuntime(RemoteRuntime):
|
|
|
579
587
|
project="",
|
|
580
588
|
tag="",
|
|
581
589
|
verbose=False,
|
|
582
|
-
auth_info: mlrun.
|
|
590
|
+
auth_info: mlrun.common.schemas.AuthInfo = None,
|
|
583
591
|
builder_env: dict = None,
|
|
584
592
|
):
|
|
585
593
|
"""deploy model serving function to a local/remote cluster
|
|
@@ -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.
|
|
@@ -15,5 +15,4 @@
|
|
|
15
15
|
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
16
16
|
|
|
17
17
|
from .abstract import SparkRuntimeHandler
|
|
18
|
-
from .spark2job import Spark2Runtime
|
|
19
18
|
from .spark3job import Spark3Runtime
|
|
@@ -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.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
|
|
14
|
+
import os.path
|
|
15
15
|
import typing
|
|
16
16
|
from copy import deepcopy
|
|
17
17
|
from datetime import datetime
|
|
@@ -31,7 +31,6 @@ from mlrun.runtimes.base import BaseRuntimeHandler
|
|
|
31
31
|
from mlrun.runtimes.constants import RunStates, SparkApplicationStates
|
|
32
32
|
|
|
33
33
|
from ...execution import MLClientCtx
|
|
34
|
-
from ...k8s_utils import get_k8s_helper
|
|
35
34
|
from ...model import RunObject
|
|
36
35
|
from ...platforms.iguazio import mount_v3io, mount_v3iod
|
|
37
36
|
from ...utils import (
|
|
@@ -45,7 +44,7 @@ from ...utils import (
|
|
|
45
44
|
from ..base import RunError, RuntimeClassMode
|
|
46
45
|
from ..kubejob import KubejobRuntime
|
|
47
46
|
from ..pod import KubeResourceSpec
|
|
48
|
-
from ..utils import get_item_name
|
|
47
|
+
from ..utils import get_item_name, get_k8s
|
|
49
48
|
|
|
50
49
|
_service_account = "sparkapp"
|
|
51
50
|
_sparkjob_template = {
|
|
@@ -143,6 +142,7 @@ class AbstractSparkJobSpec(KubeResourceSpec):
|
|
|
143
142
|
tolerations=None,
|
|
144
143
|
preemption_mode=None,
|
|
145
144
|
security_context=None,
|
|
145
|
+
clone_target_dir=None,
|
|
146
146
|
):
|
|
147
147
|
|
|
148
148
|
super().__init__(
|
|
@@ -172,6 +172,7 @@ class AbstractSparkJobSpec(KubeResourceSpec):
|
|
|
172
172
|
tolerations=tolerations,
|
|
173
173
|
preemption_mode=preemption_mode,
|
|
174
174
|
security_context=security_context,
|
|
175
|
+
clone_target_dir=clone_target_dir,
|
|
175
176
|
)
|
|
176
177
|
|
|
177
178
|
self._driver_resources = self.enrich_resources_with_default_pod_resources(
|
|
@@ -363,6 +364,15 @@ class AbstractSparkRuntime(KubejobRuntime):
|
|
|
363
364
|
def _get_igz_deps(self):
|
|
364
365
|
raise NotImplementedError()
|
|
365
366
|
|
|
367
|
+
def _pre_run(self, runobj: RunObject, execution: MLClientCtx):
|
|
368
|
+
if self.spec.build.source and self.spec.build.load_source_on_run:
|
|
369
|
+
raise mlrun.errors.MLRunPreconditionFailedError(
|
|
370
|
+
"Sparkjob does not support loading source code on run, "
|
|
371
|
+
"use func.with_source_archive(pull_at_runtime=False)"
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
super()._pre_run(runobj, execution)
|
|
375
|
+
|
|
366
376
|
def _run(self, runobj: RunObject, execution: MLClientCtx):
|
|
367
377
|
self._validate(runobj)
|
|
368
378
|
|
|
@@ -559,7 +569,11 @@ with ctx:
|
|
|
559
569
|
|
|
560
570
|
if self.spec.command:
|
|
561
571
|
if "://" not in self.spec.command:
|
|
562
|
-
|
|
572
|
+
workdir = self._resolve_workdir()
|
|
573
|
+
self.spec.command = "local://" + os.path.join(
|
|
574
|
+
workdir or "",
|
|
575
|
+
self.spec.command,
|
|
576
|
+
)
|
|
563
577
|
update_in(job, "spec.mainApplicationFile", self.spec.command)
|
|
564
578
|
|
|
565
579
|
verify_list_and_update_in(job, "spec.arguments", self.spec.args or [], str)
|
|
@@ -577,7 +591,7 @@ with ctx:
|
|
|
577
591
|
code=None,
|
|
578
592
|
):
|
|
579
593
|
namespace = meta.namespace
|
|
580
|
-
k8s =
|
|
594
|
+
k8s = get_k8s()
|
|
581
595
|
namespace = k8s.resolve_namespace(namespace)
|
|
582
596
|
if code:
|
|
583
597
|
k8s_config_map = client.V1ConfigMap()
|
|
@@ -621,7 +635,7 @@ with ctx:
|
|
|
621
635
|
raise RunError("Exception when creating SparkJob") from exc
|
|
622
636
|
|
|
623
637
|
def get_job(self, name, namespace=None):
|
|
624
|
-
k8s =
|
|
638
|
+
k8s = get_k8s()
|
|
625
639
|
namespace = k8s.resolve_namespace(namespace)
|
|
626
640
|
try:
|
|
627
641
|
resp = k8s.crdapi.get_namespaced_custom_object(
|
|
@@ -789,25 +803,27 @@ with ctx:
|
|
|
789
803
|
submission_retry_interval,
|
|
790
804
|
)
|
|
791
805
|
|
|
792
|
-
def
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
806
|
+
def with_source_archive(
|
|
807
|
+
self, source, workdir=None, handler=None, pull_at_runtime=True, target_dir=None
|
|
808
|
+
):
|
|
809
|
+
"""load the code from git/tar/zip archive at runtime or build
|
|
810
|
+
|
|
811
|
+
:param source: valid path to git, zip, or tar file, e.g.
|
|
812
|
+
git://github.com/mlrun/something.git
|
|
813
|
+
http://some/url/file.zip
|
|
814
|
+
:param handler: default function handler
|
|
815
|
+
:param workdir: working dir relative to the archive root (e.g. './subdir') or absolute to the image root
|
|
816
|
+
:param pull_at_runtime: not supported for spark runtime, must be False
|
|
817
|
+
:param target_dir: target dir on runtime pod for repo clone / archive extraction
|
|
818
|
+
"""
|
|
819
|
+
if pull_at_runtime:
|
|
820
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
821
|
+
"pull_at_runtime is not supported for spark runtime, use pull_at_runtime=False"
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
super().with_source_archive(
|
|
825
|
+
source, workdir, handler, pull_at_runtime, target_dir
|
|
826
|
+
)
|
|
811
827
|
|
|
812
828
|
def is_deployed(self):
|
|
813
829
|
if (
|
|
@@ -926,22 +942,19 @@ class SparkRuntimeHandler(BaseRuntimeHandler):
|
|
|
926
942
|
"""
|
|
927
943
|
Handling config maps deletion
|
|
928
944
|
"""
|
|
929
|
-
if grace_period is None:
|
|
930
|
-
grace_period = config.runtime_resources_deletion_grace_period
|
|
931
945
|
uids = []
|
|
932
946
|
for crd_dict in deleted_resources:
|
|
933
947
|
uid = crd_dict["metadata"].get("labels", {}).get("mlrun/uid", None)
|
|
934
948
|
uids.append(uid)
|
|
935
949
|
|
|
936
|
-
|
|
937
|
-
config_maps = k8s_helper.v1api.list_namespaced_config_map(
|
|
950
|
+
config_maps = get_k8s().v1api.list_namespaced_config_map(
|
|
938
951
|
namespace, label_selector=label_selector
|
|
939
952
|
)
|
|
940
953
|
for config_map in config_maps.items:
|
|
941
954
|
try:
|
|
942
955
|
uid = config_map.metadata.labels.get("mlrun/uid", None)
|
|
943
956
|
if force or uid in uids:
|
|
944
|
-
|
|
957
|
+
get_k8s().v1api.delete_namespaced_config_map(
|
|
945
958
|
config_map.metadata.name, namespace
|
|
946
959
|
)
|
|
947
960
|
logger.info(f"Deleted config map: {config_map.metadata.name}")
|
|
@@ -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.
|
|
@@ -16,7 +16,7 @@ import typing
|
|
|
16
16
|
|
|
17
17
|
import kubernetes.client
|
|
18
18
|
|
|
19
|
-
import mlrun.
|
|
19
|
+
import mlrun.common.schemas.function
|
|
20
20
|
import mlrun.errors
|
|
21
21
|
import mlrun.runtimes.pod
|
|
22
22
|
|
|
@@ -100,6 +100,7 @@ class Spark3JobSpec(AbstractSparkJobSpec):
|
|
|
100
100
|
driver_cores=None,
|
|
101
101
|
executor_cores=None,
|
|
102
102
|
security_context=None,
|
|
103
|
+
clone_target_dir=None,
|
|
103
104
|
):
|
|
104
105
|
|
|
105
106
|
super().__init__(
|
|
@@ -129,6 +130,7 @@ class Spark3JobSpec(AbstractSparkJobSpec):
|
|
|
129
130
|
tolerations=tolerations,
|
|
130
131
|
preemption_mode=preemption_mode,
|
|
131
132
|
security_context=security_context,
|
|
133
|
+
clone_target_dir=clone_target_dir,
|
|
132
134
|
)
|
|
133
135
|
|
|
134
136
|
self.driver_resources = driver_resources or {}
|
|
@@ -518,7 +520,7 @@ class Spark3Runtime(AbstractSparkRuntime):
|
|
|
518
520
|
self.spec.executor_tolerations = tolerations
|
|
519
521
|
|
|
520
522
|
def with_preemption_mode(
|
|
521
|
-
self, mode: typing.Union[mlrun.
|
|
523
|
+
self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
|
|
522
524
|
):
|
|
523
525
|
"""
|
|
524
526
|
Use with_driver_preemption_mode / with_executor_preemption_mode to setup preemption_mode for spark operator
|
|
@@ -529,7 +531,7 @@ class Spark3Runtime(AbstractSparkRuntime):
|
|
|
529
531
|
)
|
|
530
532
|
|
|
531
533
|
def with_driver_preemption_mode(
|
|
532
|
-
self, mode: typing.Union[mlrun.
|
|
534
|
+
self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
|
|
533
535
|
):
|
|
534
536
|
"""
|
|
535
537
|
Preemption mode controls whether the spark driver can be scheduled on preemptible nodes.
|
|
@@ -545,13 +547,13 @@ class Spark3Runtime(AbstractSparkRuntime):
|
|
|
545
547
|
The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
|
|
546
548
|
by default it's set to **prevent**
|
|
547
549
|
|
|
548
|
-
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.
|
|
550
|
+
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
|
|
549
551
|
"""
|
|
550
|
-
preemption_mode = mlrun.
|
|
552
|
+
preemption_mode = mlrun.common.schemas.function.PreemptionModes(mode)
|
|
551
553
|
self.spec.driver_preemption_mode = preemption_mode.value
|
|
552
554
|
|
|
553
555
|
def with_executor_preemption_mode(
|
|
554
|
-
self, mode: typing.Union[mlrun.
|
|
556
|
+
self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
|
|
555
557
|
):
|
|
556
558
|
"""
|
|
557
559
|
Preemption mode controls whether the spark executor can be scheduled on preemptible nodes.
|
|
@@ -567,9 +569,9 @@ class Spark3Runtime(AbstractSparkRuntime):
|
|
|
567
569
|
The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
|
|
568
570
|
by default it's set to **prevent**
|
|
569
571
|
|
|
570
|
-
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.
|
|
572
|
+
:param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
|
|
571
573
|
"""
|
|
572
|
-
preemption_mode = mlrun.
|
|
574
|
+
preemption_mode = mlrun.common.schemas.function.PreemptionModes(mode)
|
|
573
575
|
self.spec.executor_preemption_mode = preemption_mode.value
|
|
574
576
|
|
|
575
577
|
def with_security_context(
|