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/utils.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,17 +24,18 @@ import pandas as pd
|
|
|
24
24
|
from kubernetes import client
|
|
25
25
|
|
|
26
26
|
import mlrun
|
|
27
|
-
import mlrun.builder
|
|
27
|
+
import mlrun.api.utils.builder
|
|
28
|
+
import mlrun.common.constants
|
|
29
|
+
import mlrun.common.schemas
|
|
28
30
|
import mlrun.utils.regex
|
|
29
31
|
from mlrun.api.utils.clients import nuclio
|
|
30
|
-
from mlrun.db import get_run_db
|
|
31
32
|
from mlrun.errors import err_to_str
|
|
32
33
|
from mlrun.frameworks.parallel_coordinates import gen_pcp_plot
|
|
33
|
-
from mlrun.k8s_utils import get_k8s_helper
|
|
34
34
|
from mlrun.runtimes.constants import MPIJobCRDVersions
|
|
35
35
|
|
|
36
36
|
from ..artifacts import TableArtifact
|
|
37
|
-
from ..config import config
|
|
37
|
+
from ..config import config, is_running_as_api
|
|
38
|
+
from ..k8s_utils import is_running_inside_kubernetes_cluster
|
|
38
39
|
from ..utils import get_in, helpers, logger, verify_field_regex
|
|
39
40
|
from .generators import selector
|
|
40
41
|
|
|
@@ -69,19 +70,21 @@ cached_nuclio_version = None
|
|
|
69
70
|
# if not specified, try resolving it according to the mpi-operator, otherwise set to default
|
|
70
71
|
# since this is a heavy operation (sending requests to k8s/API), and it's unlikely that the crd version
|
|
71
72
|
# will change in any context - cache it
|
|
72
|
-
def resolve_mpijob_crd_version(
|
|
73
|
+
def resolve_mpijob_crd_version():
|
|
73
74
|
global cached_mpijob_crd_version
|
|
74
75
|
if not cached_mpijob_crd_version:
|
|
75
76
|
|
|
76
77
|
# config override everything
|
|
78
|
+
# on client side, expecting it to get enriched from the API through the client-spec
|
|
77
79
|
mpijob_crd_version = config.mpijob_crd_version
|
|
78
80
|
|
|
79
81
|
if not mpijob_crd_version:
|
|
80
|
-
in_k8s_cluster =
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
in_k8s_cluster = is_running_inside_kubernetes_cluster()
|
|
83
|
+
|
|
84
|
+
if in_k8s_cluster and is_running_as_api():
|
|
85
|
+
import mlrun.api.utils.singletons.k8s
|
|
86
|
+
|
|
87
|
+
k8s_helper = mlrun.api.utils.singletons.k8s.get_k8s_helper()
|
|
85
88
|
namespace = k8s_helper.resolve_namespace()
|
|
86
89
|
|
|
87
90
|
# try resolving according to mpi-operator that's running
|
|
@@ -93,13 +96,8 @@ def resolve_mpijob_crd_version(api_context=False):
|
|
|
93
96
|
mpijob_crd_version = mpi_operator_pod.metadata.labels.get(
|
|
94
97
|
"crd-version"
|
|
95
98
|
)
|
|
96
|
-
elif not in_k8s_cluster and not api_context:
|
|
97
|
-
# connect will populate the config from the server config
|
|
98
|
-
# TODO: something nicer
|
|
99
|
-
get_run_db()
|
|
100
|
-
mpijob_crd_version = config.mpijob_crd_version
|
|
101
99
|
|
|
102
|
-
#
|
|
100
|
+
# backoff to use default if wasn't resolved in API
|
|
103
101
|
if not mpijob_crd_version:
|
|
104
102
|
mpijob_crd_version = MPIJobCRDVersions.default()
|
|
105
103
|
|
|
@@ -182,22 +180,6 @@ def log_std(db, runobj, out, err="", skip=False, show=True, silent=False):
|
|
|
182
180
|
raise RunError(err)
|
|
183
181
|
|
|
184
182
|
|
|
185
|
-
class AsyncLogWriter:
|
|
186
|
-
def __init__(self, db, runobj):
|
|
187
|
-
self.db = db
|
|
188
|
-
self.uid = runobj.metadata.uid
|
|
189
|
-
self.project = runobj.metadata.project or ""
|
|
190
|
-
self.iter = runobj.metadata.iteration
|
|
191
|
-
|
|
192
|
-
def write(self, data):
|
|
193
|
-
if self.db:
|
|
194
|
-
self.db.store_log(self.uid, self.project, data, append=True)
|
|
195
|
-
|
|
196
|
-
def flush(self):
|
|
197
|
-
# todo: verify writes are large enough, if not cache and use flush
|
|
198
|
-
pass
|
|
199
|
-
|
|
200
|
-
|
|
201
183
|
def add_code_metadata(path=""):
|
|
202
184
|
if path:
|
|
203
185
|
if "://" in path:
|
|
@@ -227,8 +209,31 @@ def add_code_metadata(path=""):
|
|
|
227
209
|
]
|
|
228
210
|
if len(remotes) > 0:
|
|
229
211
|
return f"{remotes[0]}#{repo.head.commit.hexsha}"
|
|
230
|
-
|
|
231
|
-
|
|
212
|
+
|
|
213
|
+
except (
|
|
214
|
+
GitCommandNotFound,
|
|
215
|
+
InvalidGitRepositoryError,
|
|
216
|
+
NoSuchPathError,
|
|
217
|
+
ValueError,
|
|
218
|
+
) as exc:
|
|
219
|
+
logger.warning(
|
|
220
|
+
"Failed to add git metadata, ignore if path is not part of a git repo.",
|
|
221
|
+
path=path,
|
|
222
|
+
error=err_to_str(exc),
|
|
223
|
+
)
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_k8s():
|
|
228
|
+
"""
|
|
229
|
+
Get the k8s helper object
|
|
230
|
+
:return: k8s helper object or None if not running as API
|
|
231
|
+
"""
|
|
232
|
+
if is_running_as_api():
|
|
233
|
+
import mlrun.api.utils.singletons.k8s
|
|
234
|
+
|
|
235
|
+
return mlrun.api.utils.singletons.k8s.get_k8s_helper()
|
|
236
|
+
|
|
232
237
|
return None
|
|
233
238
|
|
|
234
239
|
|
|
@@ -348,7 +353,11 @@ def generate_function_image_name(project: str, name: str, tag: str) -> str:
|
|
|
348
353
|
_, repository = helpers.get_parsed_docker_registry()
|
|
349
354
|
repository = helpers.get_docker_repository_or_default(repository)
|
|
350
355
|
return fill_function_image_name_template(
|
|
351
|
-
mlrun.
|
|
356
|
+
mlrun.common.constants.IMAGE_NAME_ENRICH_REGISTRY_PREFIX,
|
|
357
|
+
repository,
|
|
358
|
+
project,
|
|
359
|
+
name,
|
|
360
|
+
tag,
|
|
352
361
|
)
|
|
353
362
|
|
|
354
363
|
|
|
@@ -373,7 +382,7 @@ def resolve_function_target_image_registries_to_enforce_prefix():
|
|
|
373
382
|
registry, repository = helpers.get_parsed_docker_registry()
|
|
374
383
|
repository = helpers.get_docker_repository_or_default(repository)
|
|
375
384
|
return [
|
|
376
|
-
f"{mlrun.
|
|
385
|
+
f"{mlrun.common.constants.IMAGE_NAME_ENRICH_REGISTRY_PREFIX}{repository}/",
|
|
377
386
|
f"{registry}/{repository}/",
|
|
378
387
|
]
|
|
379
388
|
|
|
@@ -476,20 +485,26 @@ def verify_limits(
|
|
|
476
485
|
verify_field_regex(
|
|
477
486
|
f"function.spec.{resources_field_name}.limits.memory",
|
|
478
487
|
mem,
|
|
479
|
-
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
488
|
+
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
489
|
+
+ mlrun.utils.regex.pipeline_param,
|
|
490
|
+
mode=mlrun.common.schemas.RegexMatchModes.any,
|
|
480
491
|
)
|
|
481
492
|
if cpu:
|
|
482
493
|
verify_field_regex(
|
|
483
494
|
f"function.spec.{resources_field_name}.limits.cpu",
|
|
484
495
|
cpu,
|
|
485
|
-
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
496
|
+
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
497
|
+
+ mlrun.utils.regex.pipeline_param,
|
|
498
|
+
mode=mlrun.common.schemas.RegexMatchModes.any,
|
|
486
499
|
)
|
|
487
500
|
# https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/
|
|
488
501
|
if gpus:
|
|
489
502
|
verify_field_regex(
|
|
490
503
|
f"function.spec.{resources_field_name}.limits.gpus",
|
|
491
504
|
gpus,
|
|
492
|
-
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
505
|
+
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
506
|
+
+ mlrun.utils.regex.pipeline_param,
|
|
507
|
+
mode=mlrun.common.schemas.RegexMatchModes.any,
|
|
493
508
|
)
|
|
494
509
|
return generate_resources(mem=mem, cpu=cpu, gpus=gpus, gpu_type=gpu_type)
|
|
495
510
|
|
|
@@ -503,13 +518,17 @@ def verify_requests(
|
|
|
503
518
|
verify_field_regex(
|
|
504
519
|
f"function.spec.{resources_field_name}.requests.memory",
|
|
505
520
|
mem,
|
|
506
|
-
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
521
|
+
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
522
|
+
+ mlrun.utils.regex.pipeline_param,
|
|
523
|
+
mode=mlrun.common.schemas.RegexMatchModes.any,
|
|
507
524
|
)
|
|
508
525
|
if cpu:
|
|
509
526
|
verify_field_regex(
|
|
510
527
|
f"function.spec.{resources_field_name}.requests.cpu",
|
|
511
528
|
cpu,
|
|
512
|
-
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
529
|
+
mlrun.utils.regex.k8s_resource_quantity_regex
|
|
530
|
+
+ mlrun.utils.regex.pipeline_param,
|
|
531
|
+
mode=mlrun.common.schemas.RegexMatchModes.any,
|
|
513
532
|
)
|
|
514
533
|
return generate_resources(mem=mem, cpu=cpu)
|
|
515
534
|
|
mlrun/secrets.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.
|
|
@@ -16,7 +16,7 @@ from ast import literal_eval
|
|
|
16
16
|
from os import environ, getenv
|
|
17
17
|
from typing import Callable, Dict, Optional, Union
|
|
18
18
|
|
|
19
|
-
from .utils import AzureVaultStore,
|
|
19
|
+
from .utils import AzureVaultStore, list2dict
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class SecretsStore:
|
|
@@ -26,7 +26,6 @@ class SecretsStore:
|
|
|
26
26
|
# for example from Vault, and when adding their source they will be retrieved from the external source.
|
|
27
27
|
self._hidden_sources = []
|
|
28
28
|
self._hidden_secrets = {}
|
|
29
|
-
self.vault = VaultStore()
|
|
30
29
|
|
|
31
30
|
@classmethod
|
|
32
31
|
def from_list(cls, src_list: list):
|
|
@@ -60,21 +59,20 @@ class SecretsStore:
|
|
|
60
59
|
for key in source.split(","):
|
|
61
60
|
k = key.strip()
|
|
62
61
|
self._secrets[prefix + k] = environ.get(k)
|
|
63
|
-
|
|
64
|
-
elif kind == "vault":
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
# TODO: Vault: uncomment when vault returns to be relevant
|
|
63
|
+
# elif kind == "vault":
|
|
64
|
+
# if isinstance(source, str):
|
|
65
|
+
# source = literal_eval(source)
|
|
66
|
+
# if not isinstance(source, dict):
|
|
67
|
+
# raise ValueError("vault secrets must be of type dict")
|
|
68
|
+
#
|
|
69
|
+
# for key, value in self.vault.get_secrets(
|
|
70
|
+
# source["secrets"],
|
|
71
|
+
# user=source.get("user"),
|
|
72
|
+
# project=source.get("project"),
|
|
73
|
+
# ).items():
|
|
74
|
+
# self._hidden_secrets[prefix + key] = value
|
|
75
|
+
# self._hidden_sources.append({"kind": kind, "source": source})
|
|
78
76
|
elif kind == "azure_vault":
|
|
79
77
|
if isinstance(source, str):
|
|
80
78
|
source = literal_eval(source)
|
mlrun/serving/__init__.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,10 +21,11 @@ __all__ = [
|
|
|
21
21
|
"TaskStep",
|
|
22
22
|
"RouterStep",
|
|
23
23
|
"QueueStep",
|
|
24
|
+
"ErrorStep",
|
|
24
25
|
]
|
|
25
26
|
|
|
26
27
|
from .routers import ModelRouter, VotingEnsemble # noqa
|
|
27
28
|
from .server import GraphContext, GraphServer, create_graph_server # noqa
|
|
28
|
-
from .states import QueueStep, RouterStep, TaskStep # noqa
|
|
29
|
+
from .states import ErrorStep, QueueStep, RouterStep, TaskStep # noqa
|
|
29
30
|
from .v1_serving import MLModelServer, new_v1_model_server # noqa
|
|
30
31
|
from .v2_serving import V2ModelServer # noqa
|
mlrun/serving/merger.py
CHANGED
mlrun/serving/remote.py
CHANGED
mlrun/serving/routers.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,18 +24,12 @@ import numpy
|
|
|
24
24
|
import numpy as np
|
|
25
25
|
|
|
26
26
|
import mlrun
|
|
27
|
+
import mlrun.common.model_monitoring
|
|
28
|
+
import mlrun.common.schemas
|
|
27
29
|
import mlrun.utils.model_monitoring
|
|
28
30
|
from mlrun.utils import logger, now_date, parse_versioned_object_uri
|
|
29
31
|
|
|
30
|
-
from ..api.schemas import (
|
|
31
|
-
ModelEndpoint,
|
|
32
|
-
ModelEndpointMetadata,
|
|
33
|
-
ModelEndpointSpec,
|
|
34
|
-
ModelEndpointStatus,
|
|
35
|
-
ModelMonitoringMode,
|
|
36
|
-
)
|
|
37
32
|
from ..config import config
|
|
38
|
-
from ..utils.model_monitoring import EndpointType
|
|
39
33
|
from .server import GraphServer
|
|
40
34
|
from .utils import RouterToDict, _extract_input_data, _update_result_body
|
|
41
35
|
from .v2_serving import _ModelLogPusher
|
|
@@ -402,12 +396,14 @@ class ParallelRun(BaseModelRouter):
|
|
|
402
396
|
step._parent = None
|
|
403
397
|
if step._object:
|
|
404
398
|
step._object.context = None
|
|
399
|
+
if hasattr(step._object, "_kwargs"):
|
|
400
|
+
step._object._kwargs["graph_step"] = None
|
|
405
401
|
routes[key] = step
|
|
406
402
|
executor_class = concurrent.futures.ProcessPoolExecutor
|
|
407
403
|
self._pool = executor_class(
|
|
408
404
|
max_workers=len(self.routes),
|
|
409
405
|
initializer=ParallelRun.init_pool,
|
|
410
|
-
initargs=(server, routes
|
|
406
|
+
initargs=(server, routes),
|
|
411
407
|
)
|
|
412
408
|
elif self.executor_type == ParallelRunnerModes.thread:
|
|
413
409
|
executor_class = concurrent.futures.ThreadPoolExecutor
|
|
@@ -422,7 +418,7 @@ class ParallelRun(BaseModelRouter):
|
|
|
422
418
|
if self._pool is not None:
|
|
423
419
|
if self.executor_type == ParallelRunnerModes.process:
|
|
424
420
|
global local_routes
|
|
425
|
-
local_routes
|
|
421
|
+
del local_routes
|
|
426
422
|
self._pool.shutdown()
|
|
427
423
|
self._pool = None
|
|
428
424
|
|
|
@@ -446,7 +442,7 @@ class ParallelRun(BaseModelRouter):
|
|
|
446
442
|
for route in self.routes.keys():
|
|
447
443
|
if self.executor_type == ParallelRunnerModes.process:
|
|
448
444
|
future = executor.submit(
|
|
449
|
-
ParallelRun._wrap_step, route,
|
|
445
|
+
ParallelRun._wrap_step, route, copy.copy(event)
|
|
450
446
|
)
|
|
451
447
|
elif self.executor_type == ParallelRunnerModes.thread:
|
|
452
448
|
step = self.routes[route]
|
|
@@ -470,25 +466,22 @@ class ParallelRun(BaseModelRouter):
|
|
|
470
466
|
return results
|
|
471
467
|
|
|
472
468
|
@staticmethod
|
|
473
|
-
def init_pool(server_spec, routes
|
|
469
|
+
def init_pool(server_spec, routes):
|
|
474
470
|
server = mlrun.serving.GraphServer.from_dict(server_spec)
|
|
475
471
|
server.init_states(None, None)
|
|
476
472
|
global local_routes
|
|
477
|
-
if object_id in local_routes:
|
|
478
|
-
return
|
|
479
473
|
for route in routes.values():
|
|
480
474
|
route.context = server.context
|
|
481
475
|
if route._object:
|
|
482
476
|
route._object.context = server.context
|
|
483
|
-
local_routes
|
|
477
|
+
local_routes = routes
|
|
484
478
|
|
|
485
479
|
@staticmethod
|
|
486
|
-
def _wrap_step(route,
|
|
480
|
+
def _wrap_step(route, event):
|
|
487
481
|
global local_routes
|
|
488
|
-
|
|
489
|
-
if routes is None:
|
|
482
|
+
if local_routes is None:
|
|
490
483
|
return None, None
|
|
491
|
-
return route,
|
|
484
|
+
return route, local_routes[route].run(event)
|
|
492
485
|
|
|
493
486
|
@staticmethod
|
|
494
487
|
def _wrap_method(route, handler, event):
|
|
@@ -1043,7 +1036,7 @@ def _init_endpoint_record(
|
|
|
1043
1036
|
versioned_model_name = f"{voting_ensemble.name}:latest"
|
|
1044
1037
|
|
|
1045
1038
|
# Generating model endpoint ID based on function uri and model version
|
|
1046
|
-
endpoint_uid = mlrun.
|
|
1039
|
+
endpoint_uid = mlrun.common.model_monitoring.create_model_endpoint_uid(
|
|
1047
1040
|
function_uri=graph_server.function_uri, versioned_model=versioned_model_name
|
|
1048
1041
|
).uid
|
|
1049
1042
|
|
|
@@ -1061,33 +1054,35 @@ def _init_endpoint_record(
|
|
|
1061
1054
|
if hasattr(c, "endpoint_uid"):
|
|
1062
1055
|
children_uids.append(c.endpoint_uid)
|
|
1063
1056
|
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
monitoring_mode=ModelMonitoringMode.enabled
|
|
1075
|
-
if voting_ensemble.context.server.track_models
|
|
1076
|
-
else ModelMonitoringMode.disabled,
|
|
1077
|
-
),
|
|
1078
|
-
status=ModelEndpointStatus(
|
|
1079
|
-
children=list(voting_ensemble.routes.keys()),
|
|
1080
|
-
endpoint_type=EndpointType.ROUTER,
|
|
1081
|
-
children_uids=children_uids,
|
|
1057
|
+
model_endpoint = mlrun.common.schemas.ModelEndpoint(
|
|
1058
|
+
metadata=mlrun.common.schemas.ModelEndpointMetadata(
|
|
1059
|
+
project=project, uid=endpoint_uid
|
|
1060
|
+
),
|
|
1061
|
+
spec=mlrun.common.schemas.ModelEndpointSpec(
|
|
1062
|
+
function_uri=graph_server.function_uri,
|
|
1063
|
+
model=versioned_model_name,
|
|
1064
|
+
model_class=voting_ensemble.__class__.__name__,
|
|
1065
|
+
stream_path=config.model_endpoint_monitoring.store_prefixes.default.format(
|
|
1066
|
+
project=project, kind="stream"
|
|
1082
1067
|
),
|
|
1083
|
-
|
|
1068
|
+
active=True,
|
|
1069
|
+
monitoring_mode=mlrun.common.model_monitoring.ModelMonitoringMode.enabled
|
|
1070
|
+
if voting_ensemble.context.server.track_models
|
|
1071
|
+
else mlrun.common.model_monitoring.ModelMonitoringMode.disabled,
|
|
1072
|
+
),
|
|
1073
|
+
status=mlrun.common.schemas.ModelEndpointStatus(
|
|
1074
|
+
children=list(voting_ensemble.routes.keys()),
|
|
1075
|
+
endpoint_type=mlrun.common.model_monitoring.EndpointType.ROUTER,
|
|
1076
|
+
children_uids=children_uids,
|
|
1077
|
+
),
|
|
1078
|
+
)
|
|
1084
1079
|
|
|
1085
1080
|
db = mlrun.get_run_db()
|
|
1086
1081
|
|
|
1087
1082
|
db.create_model_endpoint(
|
|
1088
1083
|
project=project,
|
|
1089
1084
|
endpoint_id=model_endpoint.metadata.uid,
|
|
1090
|
-
model_endpoint=model_endpoint,
|
|
1085
|
+
model_endpoint=model_endpoint.dict(),
|
|
1091
1086
|
)
|
|
1092
1087
|
|
|
1093
1088
|
# Update model endpoint children type
|
|
@@ -1095,7 +1090,9 @@ def _init_endpoint_record(
|
|
|
1095
1090
|
current_endpoint = db.get_model_endpoint(
|
|
1096
1091
|
project=project, endpoint_id=model_endpoint
|
|
1097
1092
|
)
|
|
1098
|
-
current_endpoint.status.endpoint_type =
|
|
1093
|
+
current_endpoint.status.endpoint_type = (
|
|
1094
|
+
mlrun.common.model_monitoring.EndpointType.LEAF_EP
|
|
1095
|
+
)
|
|
1099
1096
|
db.create_model_endpoint(
|
|
1100
1097
|
project=project,
|
|
1101
1098
|
endpoint_id=model_endpoint,
|
mlrun/serving/server.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.
|
|
@@ -18,12 +18,13 @@ import asyncio
|
|
|
18
18
|
import json
|
|
19
19
|
import os
|
|
20
20
|
import socket
|
|
21
|
-
import sys
|
|
22
21
|
import traceback
|
|
23
22
|
import uuid
|
|
24
23
|
from typing import Optional, Union
|
|
25
24
|
|
|
26
25
|
import mlrun
|
|
26
|
+
import mlrun.utils.model_monitoring
|
|
27
|
+
from mlrun.common.model_monitoring import FileTargetKind
|
|
27
28
|
from mlrun.config import config
|
|
28
29
|
from mlrun.errors import err_to_str
|
|
29
30
|
from mlrun.secrets import SecretsStore
|
|
@@ -32,7 +33,7 @@ from ..datastore import get_stream_pusher
|
|
|
32
33
|
from ..datastore.store_resources import ResourceCache
|
|
33
34
|
from ..errors import MLRunInvalidArgumentError
|
|
34
35
|
from ..model import ModelObj
|
|
35
|
-
from ..utils import
|
|
36
|
+
from ..utils import get_caller_globals, parse_versioned_object_uri
|
|
36
37
|
from .states import RootFlowStep, RouterStep, get_function, graph_root_setter
|
|
37
38
|
from .utils import (
|
|
38
39
|
event_id_key,
|
|
@@ -43,32 +44,41 @@ from .utils import (
|
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
class _StreamContext:
|
|
46
|
-
|
|
47
|
+
"""Handles the stream context for the events stream process. Includes the configuration for the output stream
|
|
48
|
+
that will be used for pushing the events from the nuclio model serving function"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, enabled: bool, parameters: dict, function_uri: str):
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
Initialize _StreamContext object.
|
|
54
|
+
:param enabled: A boolean indication for applying the stream context
|
|
55
|
+
:param parameters: Dictionary of optional parameters, such as `log_stream` and `stream_args`. Note that these
|
|
56
|
+
parameters might be relevant to the output source such as `kafka_bootstrap_servers` if
|
|
57
|
+
the output source is from type Kafka.
|
|
58
|
+
:param function_uri: Full value of the function uri, usually it's <project-name>/<function-name>
|
|
59
|
+
"""
|
|
60
|
+
|
|
47
61
|
self.enabled = False
|
|
48
62
|
self.hostname = socket.gethostname()
|
|
49
63
|
self.function_uri = function_uri
|
|
50
64
|
self.output_stream = None
|
|
51
65
|
self.stream_uri = None
|
|
66
|
+
log_stream = parameters.get(FileTargetKind.LOG_STREAM, "")
|
|
52
67
|
|
|
53
|
-
|
|
54
|
-
stream_uri = config.model_endpoint_monitoring.store_prefixes.default
|
|
55
|
-
|
|
56
|
-
if ((enabled and stream_uri) or log_stream) and function_uri:
|
|
68
|
+
if (enabled or log_stream) and function_uri:
|
|
57
69
|
self.enabled = True
|
|
58
|
-
|
|
59
70
|
project, _, _, _ = parse_versioned_object_uri(
|
|
60
71
|
function_uri, config.default_project
|
|
61
72
|
)
|
|
62
73
|
|
|
63
|
-
stream_uri =
|
|
74
|
+
stream_uri = mlrun.utils.model_monitoring.get_stream_path(project=project)
|
|
64
75
|
|
|
65
76
|
if log_stream:
|
|
77
|
+
# Update the stream path to the log stream value
|
|
66
78
|
stream_uri = log_stream.format(project=project)
|
|
67
79
|
|
|
68
80
|
stream_args = parameters.get("stream_args", {})
|
|
69
81
|
|
|
70
|
-
self.stream_uri = stream_uri
|
|
71
|
-
|
|
72
82
|
self.output_stream = get_stream_pusher(stream_uri, **stream_args)
|
|
73
83
|
|
|
74
84
|
|
|
@@ -458,7 +468,7 @@ class GraphContext:
|
|
|
458
468
|
self.Response = nuclio_context.Response
|
|
459
469
|
self.worker_id = nuclio_context.worker_id
|
|
460
470
|
elif not logger:
|
|
461
|
-
self.logger =
|
|
471
|
+
self.logger = mlrun.utils.helpers.logger
|
|
462
472
|
|
|
463
473
|
self._server = server
|
|
464
474
|
self.current_function = None
|
mlrun/serving/serving_wrapper.py
CHANGED