mlrun 1.3.3rc1__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.3rc1.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.3rc1.dist-info/RECORD +0 -381
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
|
@@ -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.
|
|
@@ -19,7 +19,7 @@ import pandas as pd
|
|
|
19
19
|
from storey import EmitEveryEvent, EmitPolicy
|
|
20
20
|
|
|
21
21
|
import mlrun
|
|
22
|
-
import mlrun.
|
|
22
|
+
import mlrun.common.schemas
|
|
23
23
|
|
|
24
24
|
from ..config import config as mlconf
|
|
25
25
|
from ..datastore import get_store_uri
|
|
@@ -118,7 +118,7 @@ class FeatureSetSpec(ModelObj):
|
|
|
118
118
|
self.owner = owner
|
|
119
119
|
self.description = description
|
|
120
120
|
self.entities: List[Union[Entity, str]] = entities or []
|
|
121
|
-
self.relations: Dict[str, Entity] = relations or {}
|
|
121
|
+
self.relations: Dict[str, Union[Entity, str]] = relations or {}
|
|
122
122
|
self.features: List[Feature] = features or []
|
|
123
123
|
self.partition_keys = partition_keys or []
|
|
124
124
|
self.timestamp_key = timestamp_key
|
|
@@ -131,6 +131,7 @@ class FeatureSetSpec(ModelObj):
|
|
|
131
131
|
self.engine = engine
|
|
132
132
|
self.output_path = output_path or mlconf.artifact_path
|
|
133
133
|
self.passthrough = passthrough
|
|
134
|
+
self.with_default_targets = True
|
|
134
135
|
|
|
135
136
|
@property
|
|
136
137
|
def entities(self) -> List[Entity]:
|
|
@@ -185,7 +186,8 @@ class FeatureSetSpec(ModelObj):
|
|
|
185
186
|
@engine.setter
|
|
186
187
|
def engine(self, engine: str):
|
|
187
188
|
engine_list = ["pandas", "spark", "storey"]
|
|
188
|
-
|
|
189
|
+
engine = engine if engine else "storey"
|
|
190
|
+
if engine not in engine_list:
|
|
189
191
|
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
190
192
|
f"engine must be one of {','.join(engine_list)}"
|
|
191
193
|
)
|
|
@@ -232,6 +234,9 @@ class FeatureSetSpec(ModelObj):
|
|
|
232
234
|
|
|
233
235
|
@relations.setter
|
|
234
236
|
def relations(self, relations: Dict[str, Entity]):
|
|
237
|
+
for col, ent in relations.items():
|
|
238
|
+
if isinstance(ent, str):
|
|
239
|
+
relations[col] = Entity(ent)
|
|
235
240
|
self._relations = ObjectDict.from_dict({"entity": Entity}, relations, "entity")
|
|
236
241
|
|
|
237
242
|
def require_processing(self):
|
|
@@ -313,7 +318,7 @@ def emit_policy_to_dict(policy: EmitPolicy):
|
|
|
313
318
|
class FeatureSet(ModelObj):
|
|
314
319
|
"""Feature set object, defines a set of features and their data pipeline"""
|
|
315
320
|
|
|
316
|
-
kind = mlrun.
|
|
321
|
+
kind = mlrun.common.schemas.ObjectKind.feature_set.value
|
|
317
322
|
_dict_fields = ["kind", "metadata", "spec", "status"]
|
|
318
323
|
|
|
319
324
|
def __init__(
|
|
@@ -324,7 +329,7 @@ class FeatureSet(ModelObj):
|
|
|
324
329
|
timestamp_key: str = None,
|
|
325
330
|
engine: str = None,
|
|
326
331
|
label_column: str = None,
|
|
327
|
-
relations: Dict[str, Entity] = None,
|
|
332
|
+
relations: Dict[str, Union[Entity, str]] = None,
|
|
328
333
|
passthrough: bool = None,
|
|
329
334
|
):
|
|
330
335
|
"""Feature set object, defines a set of features and their data pipeline
|
|
@@ -372,6 +377,7 @@ class FeatureSet(ModelObj):
|
|
|
372
377
|
self.status = None
|
|
373
378
|
self._last_state = ""
|
|
374
379
|
self._aggregations = {}
|
|
380
|
+
self.set_targets()
|
|
375
381
|
|
|
376
382
|
@property
|
|
377
383
|
def spec(self) -> FeatureSetSpec:
|
|
@@ -470,10 +476,25 @@ class FeatureSet(ModelObj):
|
|
|
470
476
|
)
|
|
471
477
|
targets = targets or []
|
|
472
478
|
if with_defaults:
|
|
473
|
-
|
|
479
|
+
self.spec.with_default_targets = True
|
|
480
|
+
targets.extend(get_default_targets(offline_only=self.spec.passthrough))
|
|
481
|
+
else:
|
|
482
|
+
self.spec.with_default_targets = False
|
|
474
483
|
|
|
475
|
-
|
|
484
|
+
self.spec.targets = []
|
|
485
|
+
self.__set_targets_add_targets_helper(targets)
|
|
486
|
+
|
|
487
|
+
if default_final_step:
|
|
488
|
+
self.spec.graph.final_step = default_final_step
|
|
489
|
+
|
|
490
|
+
def __set_targets_add_targets_helper(self, targets):
|
|
491
|
+
"""
|
|
492
|
+
Add the desired target list
|
|
476
493
|
|
|
494
|
+
:param targets: list of target type names ('csv', 'nosql', ..) or target objects
|
|
495
|
+
CSVTarget(), ParquetTarget(), NoSqlTarget(), StreamTarget(), ..
|
|
496
|
+
"""
|
|
497
|
+
validate_target_list(targets=targets)
|
|
477
498
|
for target in targets:
|
|
478
499
|
kind = target.kind if hasattr(target, "kind") else target
|
|
479
500
|
if kind not in TargetTypes.all():
|
|
@@ -485,8 +506,6 @@ class FeatureSet(ModelObj):
|
|
|
485
506
|
target, name=str(target), partitioned=(target == "parquet")
|
|
486
507
|
)
|
|
487
508
|
self.spec.targets.update(target)
|
|
488
|
-
if default_final_step:
|
|
489
|
-
self.spec.graph.final_step = default_final_step
|
|
490
509
|
|
|
491
510
|
def validate_steps(self, namespace):
|
|
492
511
|
if not self.spec:
|
|
@@ -522,7 +541,7 @@ class FeatureSet(ModelObj):
|
|
|
522
541
|
:param silent: Fail silently if target doesn't exist in featureset status"""
|
|
523
542
|
|
|
524
543
|
verify_feature_set_permissions(
|
|
525
|
-
self, mlrun.
|
|
544
|
+
self, mlrun.common.schemas.AuthorizationAction.delete
|
|
526
545
|
)
|
|
527
546
|
|
|
528
547
|
purge_targets = self._reload_and_get_status_targets(
|
|
@@ -923,7 +942,18 @@ class FeatureSet(ModelObj):
|
|
|
923
942
|
raise mlrun.errors.MLRunNotFoundError(
|
|
924
943
|
"passthrough feature set {self.metadata.name} with no source"
|
|
925
944
|
)
|
|
926
|
-
|
|
945
|
+
df = self.spec.source.to_dataframe(
|
|
946
|
+
columns=columns,
|
|
947
|
+
start_time=start_time
|
|
948
|
+
or pd.Timestamp.min, # overwrite `source.start_time` when the source is schedule.
|
|
949
|
+
end_time=end_time or pd.Timestamp.max,
|
|
950
|
+
time_field=time_column,
|
|
951
|
+
**kwargs,
|
|
952
|
+
)
|
|
953
|
+
# to_dataframe() can sometimes return an iterator of dataframes instead of one dataframe
|
|
954
|
+
if not isinstance(df, pd.DataFrame):
|
|
955
|
+
df = pd.concat(df)
|
|
956
|
+
return df
|
|
927
957
|
|
|
928
958
|
target = get_offline_target(self, name=target_name)
|
|
929
959
|
if not target:
|
|
@@ -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.
|
|
@@ -154,7 +154,7 @@ class FeatureVectorStatus(ModelObj):
|
|
|
154
154
|
class FeatureVector(ModelObj):
|
|
155
155
|
"""Feature vector, specify selected features, their metadata and material views"""
|
|
156
156
|
|
|
157
|
-
kind = mlrun.
|
|
157
|
+
kind = mlrun.common.schemas.ObjectKind.feature_vector.value
|
|
158
158
|
_dict_fields = ["kind", "metadata", "spec", "status"]
|
|
159
159
|
|
|
160
160
|
def __init__(
|
|
@@ -384,13 +384,23 @@ class FeatureVector(ModelObj):
|
|
|
384
384
|
class OnlineVectorService:
|
|
385
385
|
"""get_online_feature_service response object"""
|
|
386
386
|
|
|
387
|
-
def __init__(
|
|
387
|
+
def __init__(
|
|
388
|
+
self,
|
|
389
|
+
vector,
|
|
390
|
+
graph,
|
|
391
|
+
index_columns,
|
|
392
|
+
all_fs_entities: List[str] = None,
|
|
393
|
+
impute_policy: dict = None,
|
|
394
|
+
requested_columns: List[str] = None,
|
|
395
|
+
):
|
|
388
396
|
self.vector = vector
|
|
389
397
|
self.impute_policy = impute_policy or {}
|
|
390
398
|
|
|
391
399
|
self._controller = graph.controller
|
|
392
400
|
self._index_columns = index_columns
|
|
401
|
+
self._all_fs_entities = all_fs_entities
|
|
393
402
|
self._impute_values = {}
|
|
403
|
+
self._requested_columns = requested_columns
|
|
394
404
|
|
|
395
405
|
def __enter__(self):
|
|
396
406
|
return self
|
|
@@ -493,38 +503,39 @@ class OnlineVectorService:
|
|
|
493
503
|
for row in entity_rows:
|
|
494
504
|
futures.append(self._controller.emit(row, return_awaitable_result=True))
|
|
495
505
|
|
|
496
|
-
requested_columns = list(self.vector.status.features.keys())
|
|
497
|
-
aliases = self.vector.get_feature_aliases()
|
|
498
|
-
for i, column in enumerate(requested_columns):
|
|
499
|
-
requested_columns[i] = aliases.get(column, column)
|
|
500
|
-
|
|
501
506
|
for future in futures:
|
|
502
507
|
result = future.await_result()
|
|
503
508
|
data = result.body
|
|
504
|
-
|
|
505
|
-
if data and key in data:
|
|
506
|
-
del data[key]
|
|
507
|
-
if not data:
|
|
508
|
-
data = None
|
|
509
|
-
else:
|
|
509
|
+
if data:
|
|
510
510
|
actual_columns = data.keys()
|
|
511
|
-
for
|
|
511
|
+
if all([col in self._index_columns for col in actual_columns]):
|
|
512
|
+
# didn't get any data from the graph
|
|
513
|
+
results.append(None)
|
|
514
|
+
continue
|
|
515
|
+
for column in self._requested_columns:
|
|
512
516
|
if (
|
|
513
517
|
column not in actual_columns
|
|
514
518
|
and column != self.vector.status.label_column
|
|
515
519
|
):
|
|
516
520
|
data[column] = None
|
|
517
521
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
522
|
+
if self._impute_values:
|
|
523
|
+
for name in data.keys():
|
|
524
|
+
v = data[name]
|
|
525
|
+
if v is None or (
|
|
526
|
+
type(v) == float and (np.isinf(v) or np.isnan(v))
|
|
527
|
+
):
|
|
528
|
+
data[name] = self._impute_values.get(name, v)
|
|
529
|
+
if not self.vector.spec.with_indexes:
|
|
530
|
+
for name in self._all_fs_entities:
|
|
531
|
+
data.pop(name, None)
|
|
532
|
+
if not any(data.values()):
|
|
533
|
+
data = None
|
|
523
534
|
|
|
524
535
|
if as_list and data:
|
|
525
536
|
data = [
|
|
526
537
|
data.get(key, None)
|
|
527
|
-
for key in
|
|
538
|
+
for key in self._requested_columns
|
|
528
539
|
if key != self.vector.status.label_column
|
|
529
540
|
]
|
|
530
541
|
results.append(data)
|
mlrun/feature_store/ingestion.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.
|
|
@@ -89,7 +89,7 @@ def init_featureset_graph(
|
|
|
89
89
|
key_fields = entity_columns if entity_columns else None
|
|
90
90
|
|
|
91
91
|
sizes = [0] * len(targets)
|
|
92
|
-
|
|
92
|
+
result_dfs = []
|
|
93
93
|
total_rows = 0
|
|
94
94
|
targets = [get_target_driver(target, featureset) for target in targets]
|
|
95
95
|
if featureset.spec.passthrough:
|
|
@@ -100,11 +100,11 @@ def init_featureset_graph(
|
|
|
100
100
|
# set the entities to be the indexes of the df
|
|
101
101
|
event.body = entities_to_index(featureset, event.body)
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
if
|
|
103
|
+
df = server.run(event, get_body=True)
|
|
104
|
+
if df is not None:
|
|
105
105
|
for i, target in enumerate(targets):
|
|
106
106
|
size = target.write_dataframe(
|
|
107
|
-
|
|
107
|
+
df,
|
|
108
108
|
key_column=key_fields,
|
|
109
109
|
timestamp_key=featureset.spec.timestamp_key,
|
|
110
110
|
chunk_id=chunk_id,
|
|
@@ -112,21 +112,18 @@ def init_featureset_graph(
|
|
|
112
112
|
if size:
|
|
113
113
|
sizes[i] += size
|
|
114
114
|
chunk_id += 1
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
data_result = data
|
|
118
|
-
total_rows += data.shape[0]
|
|
115
|
+
result_dfs.append(df)
|
|
116
|
+
total_rows += df.shape[0]
|
|
119
117
|
if rows_limit and total_rows >= rows_limit:
|
|
120
118
|
break
|
|
121
119
|
|
|
122
|
-
# todo: fire termination event if iterator
|
|
123
|
-
|
|
124
120
|
for i, target in enumerate(targets):
|
|
125
121
|
target_status = target.update_resource_status("ready", size=sizes[i])
|
|
126
122
|
if verbose:
|
|
127
123
|
logger.info(f"wrote target: {target_status}")
|
|
128
124
|
|
|
129
|
-
|
|
125
|
+
result_df = pd.concat(result_dfs)
|
|
126
|
+
return result_df.head(rows_limit)
|
|
130
127
|
|
|
131
128
|
|
|
132
129
|
def featureset_initializer(server):
|
|
@@ -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,13 +16,14 @@ import mlrun.errors
|
|
|
16
16
|
from .dask_merger import DaskFeatureMerger
|
|
17
17
|
from .job import run_merge_job # noqa
|
|
18
18
|
from .local_merger import LocalFeatureMerger
|
|
19
|
-
from .online import init_feature_vector_graph # noqa
|
|
20
19
|
from .spark_merger import SparkFeatureMerger
|
|
20
|
+
from .storey_merger import StoreyFeatureMerger
|
|
21
21
|
|
|
22
22
|
mergers = {
|
|
23
23
|
"local": LocalFeatureMerger,
|
|
24
24
|
"dask": DaskFeatureMerger,
|
|
25
25
|
"spark": SparkFeatureMerger,
|
|
26
|
+
"storey": StoreyFeatureMerger,
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
|