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
mlrun/feature_store/steps.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.
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
+
import math
|
|
15
16
|
import re
|
|
16
17
|
import uuid
|
|
17
18
|
import warnings
|
|
@@ -40,7 +41,9 @@ def get_engine(first_event):
|
|
|
40
41
|
class MLRunStep(MapClass):
|
|
41
42
|
def __init__(self, **kwargs):
|
|
42
43
|
"""Abstract class for mlrun step.
|
|
43
|
-
Can be used in pandas/storey/spark feature set ingestion
|
|
44
|
+
Can be used in pandas/storey/spark feature set ingestion. Extend this class and implement the relevant
|
|
45
|
+
`_do_XXX` methods to support the required execution engines.
|
|
46
|
+
"""
|
|
44
47
|
super().__init__(**kwargs)
|
|
45
48
|
self._engine_to_do_method = {
|
|
46
49
|
"pandas": self._do_pandas,
|
|
@@ -51,23 +54,41 @@ class MLRunStep(MapClass):
|
|
|
51
54
|
def do(self, event):
|
|
52
55
|
"""
|
|
53
56
|
This method defines the do method of this class according to the first event type.
|
|
57
|
+
|
|
58
|
+
.. warning::
|
|
59
|
+
When extending this class, do not override this method; only override the `_do_XXX` methods.
|
|
54
60
|
"""
|
|
55
61
|
engine = get_engine(event)
|
|
56
62
|
self.do = self._engine_to_do_method.get(engine, None)
|
|
57
63
|
if self.do is None:
|
|
58
|
-
raise mlrun.errors.
|
|
64
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
59
65
|
f"Unrecognized engine: {engine}. Available engines are: pandas, spark and storey"
|
|
60
66
|
)
|
|
61
67
|
|
|
62
68
|
return self.do(event)
|
|
63
69
|
|
|
64
70
|
def _do_pandas(self, event):
|
|
71
|
+
"""
|
|
72
|
+
The execution method for pandas engine.
|
|
73
|
+
|
|
74
|
+
:param event: Incoming event, a `pandas.DataFrame` object.
|
|
75
|
+
"""
|
|
65
76
|
raise NotImplementedError
|
|
66
77
|
|
|
67
78
|
def _do_storey(self, event):
|
|
79
|
+
"""
|
|
80
|
+
The execution method for storey engine.
|
|
81
|
+
|
|
82
|
+
:param event: Incoming event, a dictionary or `storey.Event` object, depending on the `full_event` value.
|
|
83
|
+
"""
|
|
68
84
|
raise NotImplementedError
|
|
69
85
|
|
|
70
86
|
def _do_spark(self, event):
|
|
87
|
+
"""
|
|
88
|
+
The execution method for spark engine.
|
|
89
|
+
|
|
90
|
+
:param event: Incoming event, a `pyspark.sql.DataFrame` object.
|
|
91
|
+
"""
|
|
71
92
|
raise NotImplementedError
|
|
72
93
|
|
|
73
94
|
|
|
@@ -136,7 +157,7 @@ class MapValues(StepToDict, MLRunStep):
|
|
|
136
157
|
|
|
137
158
|
def __init__(
|
|
138
159
|
self,
|
|
139
|
-
mapping: Dict[str, Dict[str, Any]],
|
|
160
|
+
mapping: Dict[str, Dict[Union[str, int, bool], Any]],
|
|
140
161
|
with_original_features: bool = False,
|
|
141
162
|
suffix: str = "mapped",
|
|
142
163
|
**kwargs,
|
|
@@ -226,34 +247,130 @@ class MapValues(StepToDict, MLRunStep):
|
|
|
226
247
|
def _do_spark(self, event):
|
|
227
248
|
from itertools import chain
|
|
228
249
|
|
|
229
|
-
from pyspark.sql.functions import col, create_map, lit, when
|
|
250
|
+
from pyspark.sql.functions import col, create_map, isnan, isnull, lit, when
|
|
251
|
+
from pyspark.sql.types import DecimalType, DoubleType, FloatType
|
|
252
|
+
from pyspark.sql.utils import AnalysisException
|
|
230
253
|
|
|
254
|
+
df = event
|
|
255
|
+
source_column_names = df.columns
|
|
231
256
|
for column, column_map in self.mapping.items():
|
|
232
257
|
new_column_name = self._get_feature_name(column)
|
|
233
|
-
if
|
|
258
|
+
if not self.get_ranges_key() in column_map:
|
|
259
|
+
if column not in source_column_names:
|
|
260
|
+
continue
|
|
234
261
|
mapping_expr = create_map([lit(x) for x in chain(*column_map.items())])
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
262
|
+
try:
|
|
263
|
+
df = df.withColumn(
|
|
264
|
+
new_column_name,
|
|
265
|
+
when(
|
|
266
|
+
col(column).isin(list(column_map.keys())),
|
|
267
|
+
mapping_expr.getItem(col(column)),
|
|
268
|
+
).otherwise(col(column)),
|
|
269
|
+
)
|
|
270
|
+
# if failed to use otherwise it is probably because the new column has different type
|
|
271
|
+
# then the original column.
|
|
272
|
+
# we will try to replace the values without using 'otherwise'.
|
|
273
|
+
except AnalysisException:
|
|
274
|
+
df = df.withColumn(
|
|
275
|
+
new_column_name, mapping_expr.getItem(col(column))
|
|
276
|
+
)
|
|
277
|
+
col_type = df.schema[column].dataType
|
|
278
|
+
new_col_type = df.schema[new_column_name].dataType
|
|
279
|
+
# in order to avoid exception at isna on non-decimal/float columns -
|
|
280
|
+
# we need to check their types before filtering.
|
|
281
|
+
if isinstance(col_type, (FloatType, DoubleType, DecimalType)):
|
|
282
|
+
column_filter = (~isnull(col(column))) & (~isnan(col(column)))
|
|
283
|
+
else:
|
|
284
|
+
column_filter = ~isnull(col(column))
|
|
285
|
+
if isinstance(new_col_type, (FloatType, DoubleType, DecimalType)):
|
|
286
|
+
new_column_filter = isnull(col(new_column_name)) | isnan(
|
|
287
|
+
col(new_column_name)
|
|
288
|
+
)
|
|
289
|
+
else:
|
|
290
|
+
# we need to check that every value replaced if we changed column type - except None or NaN.
|
|
291
|
+
new_column_filter = isnull(col(new_column_name))
|
|
292
|
+
mapping_to_null = [
|
|
293
|
+
k
|
|
294
|
+
for k, v in column_map.items()
|
|
295
|
+
if v is None
|
|
296
|
+
or (
|
|
297
|
+
isinstance(v, (float, np.float64, np.float32, np.float16))
|
|
298
|
+
and math.isnan(v)
|
|
299
|
+
)
|
|
300
|
+
]
|
|
301
|
+
turned_to_none_values = df.filter(
|
|
302
|
+
column_filter & new_column_filter
|
|
303
|
+
).filter(~col(column).isin(mapping_to_null))
|
|
304
|
+
|
|
305
|
+
if len(turned_to_none_values.head(1)) > 0:
|
|
306
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
307
|
+
f"MapValues - mapping that changes column type must change all values accordingly,"
|
|
308
|
+
f" which is not the case for column '{column}'"
|
|
309
|
+
)
|
|
238
310
|
else:
|
|
239
311
|
for val, val_range in column_map["ranges"].items():
|
|
240
312
|
min_val = val_range[0] if val_range[0] != "-inf" else -np.inf
|
|
241
313
|
max_val = val_range[1] if val_range[1] != "inf" else np.inf
|
|
242
314
|
otherwise = ""
|
|
243
|
-
if new_column_name in
|
|
244
|
-
otherwise =
|
|
245
|
-
|
|
315
|
+
if new_column_name in df.columns:
|
|
316
|
+
otherwise = df[new_column_name]
|
|
317
|
+
df = df.withColumn(
|
|
246
318
|
new_column_name,
|
|
247
319
|
when(
|
|
248
|
-
(
|
|
320
|
+
(df[column] < max_val) & (df[column] >= min_val),
|
|
249
321
|
lit(val),
|
|
250
322
|
).otherwise(otherwise),
|
|
251
323
|
)
|
|
252
324
|
|
|
253
325
|
if not self.with_original_features:
|
|
254
|
-
|
|
326
|
+
df = df.select(*self.mapping.keys())
|
|
255
327
|
|
|
256
|
-
return
|
|
328
|
+
return df
|
|
329
|
+
|
|
330
|
+
@classmethod
|
|
331
|
+
def validate_args(cls, feature_set, **kwargs):
|
|
332
|
+
mapping = kwargs.get("mapping", [])
|
|
333
|
+
for column, column_map in mapping.items():
|
|
334
|
+
if not cls.get_ranges_key() in column_map:
|
|
335
|
+
types = set(
|
|
336
|
+
type(val)
|
|
337
|
+
for val in column_map.values()
|
|
338
|
+
if type(val) is not None
|
|
339
|
+
and not (
|
|
340
|
+
isinstance(val, (float, np.float64, np.float32, np.float16))
|
|
341
|
+
and math.isnan(val)
|
|
342
|
+
)
|
|
343
|
+
)
|
|
344
|
+
else:
|
|
345
|
+
if len(column_map) > 1:
|
|
346
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
347
|
+
f"MapValues - mapping values of the same column can not combine ranges and "
|
|
348
|
+
f"single replacement, which is the case for column '{column}'"
|
|
349
|
+
)
|
|
350
|
+
ranges_dict = column_map[cls.get_ranges_key()]
|
|
351
|
+
types = set()
|
|
352
|
+
for ranges_mapping_values in ranges_dict.values():
|
|
353
|
+
range_types = set(
|
|
354
|
+
type(val)
|
|
355
|
+
for val in ranges_mapping_values
|
|
356
|
+
if type(val) is not None
|
|
357
|
+
and val != "-inf"
|
|
358
|
+
and val != "inf"
|
|
359
|
+
and not (
|
|
360
|
+
isinstance(val, (float, np.float64, np.float32, np.float16))
|
|
361
|
+
and math.isnan(val)
|
|
362
|
+
)
|
|
363
|
+
)
|
|
364
|
+
types = types.union(range_types)
|
|
365
|
+
if len(types) > 1:
|
|
366
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
367
|
+
f"MapValues - mapping values of the same column must be in the"
|
|
368
|
+
f" same type, which was not the case for Column '{column}'"
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
@staticmethod
|
|
372
|
+
def get_ranges_key():
|
|
373
|
+
return "ranges"
|
|
257
374
|
|
|
258
375
|
|
|
259
376
|
class Imputer(StepToDict, MLRunStep):
|
mlrun/features.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 @@ import math
|
|
|
16
16
|
import re
|
|
17
17
|
from typing import Dict, List, Optional, Union
|
|
18
18
|
|
|
19
|
-
from .data_types import ValueType
|
|
19
|
+
from .data_types import ValueType, python_type_to_value_type
|
|
20
20
|
from .errors import MLRunRuntimeError, err_to_str
|
|
21
21
|
from .model import ModelObj
|
|
22
22
|
|
|
@@ -105,7 +105,12 @@ class Feature(ModelObj):
|
|
|
105
105
|
:param labels: a set of key/value labels (tags)
|
|
106
106
|
"""
|
|
107
107
|
self.name = name or ""
|
|
108
|
-
|
|
108
|
+
if isinstance(value_type, ValueType):
|
|
109
|
+
self.value_type = value_type
|
|
110
|
+
elif value_type is not None:
|
|
111
|
+
self.value_type = python_type_to_value_type(value_type)
|
|
112
|
+
else:
|
|
113
|
+
self.value_type = ValueType.STRING
|
|
109
114
|
self.dims = dims
|
|
110
115
|
self.description = description
|
|
111
116
|
self.default = default
|
mlrun/frameworks/__init__.py
CHANGED
mlrun/frameworks/_common/plan.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.
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
|
+
from typing import Any, Dict
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
import pandas as pd
|
|
17
19
|
from cloudpickle import load
|
|
@@ -56,3 +58,13 @@ class PickleModelServer(V2ModelServer):
|
|
|
56
58
|
y_pred: np.ndarray = self.model.predict(x)
|
|
57
59
|
|
|
58
60
|
return y_pred.tolist()
|
|
61
|
+
|
|
62
|
+
def explain(self, request: Dict[str, Any]) -> str:
|
|
63
|
+
"""
|
|
64
|
+
Returns a string listing the model that is being served in this serving function and the function name.
|
|
65
|
+
|
|
66
|
+
:param request: A given request.
|
|
67
|
+
|
|
68
|
+
:return: Explanation string.
|
|
69
|
+
"""
|
|
70
|
+
return f"A model server named '{self.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.
|
|
@@ -33,7 +33,6 @@ class CalibrationCurvePlan(MLPlotPlan):
|
|
|
33
33
|
|
|
34
34
|
def __init__(
|
|
35
35
|
self,
|
|
36
|
-
normalize: bool = False,
|
|
37
36
|
n_bins: int = 5,
|
|
38
37
|
strategy: str = "uniform",
|
|
39
38
|
):
|
|
@@ -43,14 +42,11 @@ class CalibrationCurvePlan(MLPlotPlan):
|
|
|
43
42
|
To read more about the parameters, head to the SciKit-Learn docs at:
|
|
44
43
|
https://scikit-learn.org/stable/modules/generated/sklearn.calibration.calibration_curve.html
|
|
45
44
|
|
|
46
|
-
:param normalize: Whether the probabilities needs to be normalized into the [0, 1] interval, i.e. is not a
|
|
47
|
-
proper probability.
|
|
48
45
|
:param n_bins: Number of bins to discretize the [0, 1] interval.
|
|
49
46
|
:param strategy: Strategy used to define the widths of the bins. Can be on of {‘uniform’, ‘quantile’}.
|
|
50
47
|
Default: "uniform".
|
|
51
48
|
"""
|
|
52
49
|
# Store the parameters:
|
|
53
|
-
self._normalize = normalize
|
|
54
50
|
self._n_bins = n_bins
|
|
55
51
|
self._strategy = strategy
|
|
56
52
|
|
|
@@ -94,7 +90,6 @@ class CalibrationCurvePlan(MLPlotPlan):
|
|
|
94
90
|
y,
|
|
95
91
|
y_pred[:, -1], # Take only the second class probabilities (1, not 0).
|
|
96
92
|
n_bins=self._n_bins,
|
|
97
|
-
normalize=self._normalize,
|
|
98
93
|
strategy=self._strategy,
|
|
99
94
|
)
|
|
100
95
|
|
mlrun/frameworks/lgbm/utils.py
CHANGED