genesis-flow 1.0.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.
- genesis_flow-1.0.0.dist-info/METADATA +822 -0
- genesis_flow-1.0.0.dist-info/RECORD +645 -0
- genesis_flow-1.0.0.dist-info/WHEEL +5 -0
- genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
- genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
- genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
- mlflow/__init__.py +367 -0
- mlflow/__main__.py +3 -0
- mlflow/ag2/__init__.py +56 -0
- mlflow/ag2/ag2_logger.py +294 -0
- mlflow/anthropic/__init__.py +40 -0
- mlflow/anthropic/autolog.py +129 -0
- mlflow/anthropic/chat.py +144 -0
- mlflow/artifacts/__init__.py +268 -0
- mlflow/autogen/__init__.py +144 -0
- mlflow/autogen/chat.py +142 -0
- mlflow/azure/__init__.py +26 -0
- mlflow/azure/auth_handler.py +257 -0
- mlflow/azure/client.py +319 -0
- mlflow/azure/config.py +120 -0
- mlflow/azure/connection_factory.py +340 -0
- mlflow/azure/exceptions.py +27 -0
- mlflow/azure/stores.py +327 -0
- mlflow/azure/utils.py +183 -0
- mlflow/bedrock/__init__.py +45 -0
- mlflow/bedrock/_autolog.py +202 -0
- mlflow/bedrock/chat.py +122 -0
- mlflow/bedrock/stream.py +160 -0
- mlflow/bedrock/utils.py +43 -0
- mlflow/cli.py +707 -0
- mlflow/client.py +12 -0
- mlflow/config/__init__.py +56 -0
- mlflow/crewai/__init__.py +79 -0
- mlflow/crewai/autolog.py +253 -0
- mlflow/crewai/chat.py +29 -0
- mlflow/data/__init__.py +75 -0
- mlflow/data/artifact_dataset_sources.py +170 -0
- mlflow/data/code_dataset_source.py +40 -0
- mlflow/data/dataset.py +123 -0
- mlflow/data/dataset_registry.py +168 -0
- mlflow/data/dataset_source.py +110 -0
- mlflow/data/dataset_source_registry.py +219 -0
- mlflow/data/delta_dataset_source.py +167 -0
- mlflow/data/digest_utils.py +108 -0
- mlflow/data/evaluation_dataset.py +562 -0
- mlflow/data/filesystem_dataset_source.py +81 -0
- mlflow/data/http_dataset_source.py +145 -0
- mlflow/data/huggingface_dataset.py +258 -0
- mlflow/data/huggingface_dataset_source.py +118 -0
- mlflow/data/meta_dataset.py +104 -0
- mlflow/data/numpy_dataset.py +223 -0
- mlflow/data/pandas_dataset.py +231 -0
- mlflow/data/polars_dataset.py +352 -0
- mlflow/data/pyfunc_dataset_mixin.py +31 -0
- mlflow/data/schema.py +76 -0
- mlflow/data/sources.py +1 -0
- mlflow/data/spark_dataset.py +406 -0
- mlflow/data/spark_dataset_source.py +74 -0
- mlflow/data/spark_delta_utils.py +118 -0
- mlflow/data/tensorflow_dataset.py +350 -0
- mlflow/data/uc_volume_dataset_source.py +81 -0
- mlflow/db.py +27 -0
- mlflow/dspy/__init__.py +17 -0
- mlflow/dspy/autolog.py +197 -0
- mlflow/dspy/callback.py +398 -0
- mlflow/dspy/constant.py +1 -0
- mlflow/dspy/load.py +93 -0
- mlflow/dspy/save.py +393 -0
- mlflow/dspy/util.py +109 -0
- mlflow/dspy/wrapper.py +226 -0
- mlflow/entities/__init__.py +104 -0
- mlflow/entities/_mlflow_object.py +52 -0
- mlflow/entities/assessment.py +545 -0
- mlflow/entities/assessment_error.py +80 -0
- mlflow/entities/assessment_source.py +141 -0
- mlflow/entities/dataset.py +92 -0
- mlflow/entities/dataset_input.py +51 -0
- mlflow/entities/dataset_summary.py +62 -0
- mlflow/entities/document.py +48 -0
- mlflow/entities/experiment.py +109 -0
- mlflow/entities/experiment_tag.py +35 -0
- mlflow/entities/file_info.py +45 -0
- mlflow/entities/input_tag.py +35 -0
- mlflow/entities/lifecycle_stage.py +35 -0
- mlflow/entities/logged_model.py +228 -0
- mlflow/entities/logged_model_input.py +26 -0
- mlflow/entities/logged_model_output.py +32 -0
- mlflow/entities/logged_model_parameter.py +46 -0
- mlflow/entities/logged_model_status.py +74 -0
- mlflow/entities/logged_model_tag.py +33 -0
- mlflow/entities/metric.py +200 -0
- mlflow/entities/model_registry/__init__.py +29 -0
- mlflow/entities/model_registry/_model_registry_entity.py +13 -0
- mlflow/entities/model_registry/model_version.py +243 -0
- mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
- mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
- mlflow/entities/model_registry/model_version_search.py +25 -0
- mlflow/entities/model_registry/model_version_stages.py +25 -0
- mlflow/entities/model_registry/model_version_status.py +35 -0
- mlflow/entities/model_registry/model_version_tag.py +35 -0
- mlflow/entities/model_registry/prompt.py +73 -0
- mlflow/entities/model_registry/prompt_version.py +244 -0
- mlflow/entities/model_registry/registered_model.py +175 -0
- mlflow/entities/model_registry/registered_model_alias.py +35 -0
- mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
- mlflow/entities/model_registry/registered_model_search.py +25 -0
- mlflow/entities/model_registry/registered_model_tag.py +35 -0
- mlflow/entities/multipart_upload.py +74 -0
- mlflow/entities/param.py +49 -0
- mlflow/entities/run.py +97 -0
- mlflow/entities/run_data.py +84 -0
- mlflow/entities/run_info.py +188 -0
- mlflow/entities/run_inputs.py +59 -0
- mlflow/entities/run_outputs.py +43 -0
- mlflow/entities/run_status.py +41 -0
- mlflow/entities/run_tag.py +36 -0
- mlflow/entities/source_type.py +31 -0
- mlflow/entities/span.py +774 -0
- mlflow/entities/span_event.py +96 -0
- mlflow/entities/span_status.py +102 -0
- mlflow/entities/trace.py +317 -0
- mlflow/entities/trace_data.py +71 -0
- mlflow/entities/trace_info.py +220 -0
- mlflow/entities/trace_info_v2.py +162 -0
- mlflow/entities/trace_location.py +173 -0
- mlflow/entities/trace_state.py +39 -0
- mlflow/entities/trace_status.py +68 -0
- mlflow/entities/view_type.py +51 -0
- mlflow/environment_variables.py +866 -0
- mlflow/evaluation/__init__.py +16 -0
- mlflow/evaluation/assessment.py +369 -0
- mlflow/evaluation/evaluation.py +411 -0
- mlflow/evaluation/evaluation_tag.py +61 -0
- mlflow/evaluation/fluent.py +48 -0
- mlflow/evaluation/utils.py +201 -0
- mlflow/exceptions.py +213 -0
- mlflow/experiments.py +140 -0
- mlflow/gemini/__init__.py +81 -0
- mlflow/gemini/autolog.py +186 -0
- mlflow/gemini/chat.py +261 -0
- mlflow/genai/__init__.py +71 -0
- mlflow/genai/datasets/__init__.py +67 -0
- mlflow/genai/datasets/evaluation_dataset.py +131 -0
- mlflow/genai/evaluation/__init__.py +3 -0
- mlflow/genai/evaluation/base.py +411 -0
- mlflow/genai/evaluation/constant.py +23 -0
- mlflow/genai/evaluation/utils.py +244 -0
- mlflow/genai/judges/__init__.py +21 -0
- mlflow/genai/judges/databricks.py +404 -0
- mlflow/genai/label_schemas/__init__.py +153 -0
- mlflow/genai/label_schemas/label_schemas.py +209 -0
- mlflow/genai/labeling/__init__.py +159 -0
- mlflow/genai/labeling/labeling.py +250 -0
- mlflow/genai/optimize/__init__.py +13 -0
- mlflow/genai/optimize/base.py +198 -0
- mlflow/genai/optimize/optimizers/__init__.py +4 -0
- mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
- mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
- mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
- mlflow/genai/optimize/types.py +75 -0
- mlflow/genai/optimize/util.py +30 -0
- mlflow/genai/prompts/__init__.py +206 -0
- mlflow/genai/scheduled_scorers.py +431 -0
- mlflow/genai/scorers/__init__.py +26 -0
- mlflow/genai/scorers/base.py +492 -0
- mlflow/genai/scorers/builtin_scorers.py +765 -0
- mlflow/genai/scorers/scorer_utils.py +138 -0
- mlflow/genai/scorers/validation.py +165 -0
- mlflow/genai/utils/data_validation.py +146 -0
- mlflow/genai/utils/enum_utils.py +23 -0
- mlflow/genai/utils/trace_utils.py +211 -0
- mlflow/groq/__init__.py +42 -0
- mlflow/groq/_groq_autolog.py +74 -0
- mlflow/johnsnowlabs/__init__.py +888 -0
- mlflow/langchain/__init__.py +24 -0
- mlflow/langchain/api_request_parallel_processor.py +330 -0
- mlflow/langchain/autolog.py +147 -0
- mlflow/langchain/chat_agent_langgraph.py +340 -0
- mlflow/langchain/constant.py +1 -0
- mlflow/langchain/constants.py +1 -0
- mlflow/langchain/databricks_dependencies.py +444 -0
- mlflow/langchain/langchain_tracer.py +597 -0
- mlflow/langchain/model.py +919 -0
- mlflow/langchain/output_parsers.py +142 -0
- mlflow/langchain/retriever_chain.py +153 -0
- mlflow/langchain/runnables.py +527 -0
- mlflow/langchain/utils/chat.py +402 -0
- mlflow/langchain/utils/logging.py +671 -0
- mlflow/langchain/utils/serialization.py +36 -0
- mlflow/legacy_databricks_cli/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/provider.py +482 -0
- mlflow/litellm/__init__.py +175 -0
- mlflow/llama_index/__init__.py +22 -0
- mlflow/llama_index/autolog.py +55 -0
- mlflow/llama_index/chat.py +43 -0
- mlflow/llama_index/constant.py +1 -0
- mlflow/llama_index/model.py +577 -0
- mlflow/llama_index/pyfunc_wrapper.py +332 -0
- mlflow/llama_index/serialize_objects.py +188 -0
- mlflow/llama_index/tracer.py +561 -0
- mlflow/metrics/__init__.py +479 -0
- mlflow/metrics/base.py +39 -0
- mlflow/metrics/genai/__init__.py +25 -0
- mlflow/metrics/genai/base.py +101 -0
- mlflow/metrics/genai/genai_metric.py +771 -0
- mlflow/metrics/genai/metric_definitions.py +450 -0
- mlflow/metrics/genai/model_utils.py +371 -0
- mlflow/metrics/genai/prompt_template.py +68 -0
- mlflow/metrics/genai/prompts/__init__.py +0 -0
- mlflow/metrics/genai/prompts/v1.py +422 -0
- mlflow/metrics/genai/utils.py +6 -0
- mlflow/metrics/metric_definitions.py +619 -0
- mlflow/mismatch.py +34 -0
- mlflow/mistral/__init__.py +34 -0
- mlflow/mistral/autolog.py +71 -0
- mlflow/mistral/chat.py +135 -0
- mlflow/ml_package_versions.py +452 -0
- mlflow/models/__init__.py +97 -0
- mlflow/models/auth_policy.py +83 -0
- mlflow/models/cli.py +354 -0
- mlflow/models/container/__init__.py +294 -0
- mlflow/models/container/scoring_server/__init__.py +0 -0
- mlflow/models/container/scoring_server/nginx.conf +39 -0
- mlflow/models/dependencies_schemas.py +287 -0
- mlflow/models/display_utils.py +158 -0
- mlflow/models/docker_utils.py +211 -0
- mlflow/models/evaluation/__init__.py +23 -0
- mlflow/models/evaluation/_shap_patch.py +64 -0
- mlflow/models/evaluation/artifacts.py +194 -0
- mlflow/models/evaluation/base.py +1811 -0
- mlflow/models/evaluation/calibration_curve.py +109 -0
- mlflow/models/evaluation/default_evaluator.py +996 -0
- mlflow/models/evaluation/deprecated.py +23 -0
- mlflow/models/evaluation/evaluator_registry.py +80 -0
- mlflow/models/evaluation/evaluators/classifier.py +704 -0
- mlflow/models/evaluation/evaluators/default.py +233 -0
- mlflow/models/evaluation/evaluators/regressor.py +96 -0
- mlflow/models/evaluation/evaluators/shap.py +296 -0
- mlflow/models/evaluation/lift_curve.py +178 -0
- mlflow/models/evaluation/utils/metric.py +123 -0
- mlflow/models/evaluation/utils/trace.py +179 -0
- mlflow/models/evaluation/validation.py +434 -0
- mlflow/models/flavor_backend.py +93 -0
- mlflow/models/flavor_backend_registry.py +53 -0
- mlflow/models/model.py +1639 -0
- mlflow/models/model_config.py +150 -0
- mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
- mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
- mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
- mlflow/models/python_api.py +369 -0
- mlflow/models/rag_signatures.py +128 -0
- mlflow/models/resources.py +321 -0
- mlflow/models/signature.py +662 -0
- mlflow/models/utils.py +2054 -0
- mlflow/models/wheeled_model.py +280 -0
- mlflow/openai/__init__.py +57 -0
- mlflow/openai/_agent_tracer.py +364 -0
- mlflow/openai/api_request_parallel_processor.py +131 -0
- mlflow/openai/autolog.py +509 -0
- mlflow/openai/constant.py +1 -0
- mlflow/openai/model.py +824 -0
- mlflow/openai/utils/chat_schema.py +367 -0
- mlflow/optuna/__init__.py +3 -0
- mlflow/optuna/storage.py +646 -0
- mlflow/plugins/__init__.py +72 -0
- mlflow/plugins/base.py +358 -0
- mlflow/plugins/builtin/__init__.py +24 -0
- mlflow/plugins/builtin/pytorch_plugin.py +150 -0
- mlflow/plugins/builtin/sklearn_plugin.py +158 -0
- mlflow/plugins/builtin/transformers_plugin.py +187 -0
- mlflow/plugins/cli.py +321 -0
- mlflow/plugins/discovery.py +340 -0
- mlflow/plugins/manager.py +465 -0
- mlflow/plugins/registry.py +316 -0
- mlflow/plugins/templates/framework_plugin_template.py +329 -0
- mlflow/prompt/constants.py +20 -0
- mlflow/prompt/promptlab_model.py +197 -0
- mlflow/prompt/registry_utils.py +248 -0
- mlflow/promptflow/__init__.py +495 -0
- mlflow/protos/__init__.py +0 -0
- mlflow/protos/assessments_pb2.py +174 -0
- mlflow/protos/databricks_artifacts_pb2.py +489 -0
- mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
- mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
- mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
- mlflow/protos/databricks_pb2.py +267 -0
- mlflow/protos/databricks_trace_server_pb2.py +374 -0
- mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
- mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
- mlflow/protos/facet_feature_statistics_pb2.py +296 -0
- mlflow/protos/internal_pb2.py +77 -0
- mlflow/protos/mlflow_artifacts_pb2.py +336 -0
- mlflow/protos/model_registry_pb2.py +1073 -0
- mlflow/protos/scalapb/__init__.py +0 -0
- mlflow/protos/scalapb/scalapb_pb2.py +104 -0
- mlflow/protos/service_pb2.py +2600 -0
- mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
- mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
- mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
- mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
- mlflow/py.typed +0 -0
- mlflow/pydantic_ai/__init__.py +57 -0
- mlflow/pydantic_ai/autolog.py +173 -0
- mlflow/pyfunc/__init__.py +3844 -0
- mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
- mlflow/pyfunc/backend.py +523 -0
- mlflow/pyfunc/context.py +78 -0
- mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
- mlflow/pyfunc/loaders/__init__.py +7 -0
- mlflow/pyfunc/loaders/chat_agent.py +117 -0
- mlflow/pyfunc/loaders/chat_model.py +125 -0
- mlflow/pyfunc/loaders/code_model.py +31 -0
- mlflow/pyfunc/loaders/responses_agent.py +112 -0
- mlflow/pyfunc/mlserver.py +46 -0
- mlflow/pyfunc/model.py +1473 -0
- mlflow/pyfunc/scoring_server/__init__.py +604 -0
- mlflow/pyfunc/scoring_server/app.py +7 -0
- mlflow/pyfunc/scoring_server/client.py +146 -0
- mlflow/pyfunc/spark_model_cache.py +48 -0
- mlflow/pyfunc/stdin_server.py +44 -0
- mlflow/pyfunc/utils/__init__.py +3 -0
- mlflow/pyfunc/utils/data_validation.py +224 -0
- mlflow/pyfunc/utils/environment.py +22 -0
- mlflow/pyfunc/utils/input_converter.py +47 -0
- mlflow/pyfunc/utils/serving_data_parser.py +11 -0
- mlflow/pytorch/__init__.py +1171 -0
- mlflow/pytorch/_lightning_autolog.py +580 -0
- mlflow/pytorch/_pytorch_autolog.py +50 -0
- mlflow/pytorch/pickle_module.py +35 -0
- mlflow/rfunc/__init__.py +42 -0
- mlflow/rfunc/backend.py +134 -0
- mlflow/runs.py +89 -0
- mlflow/server/__init__.py +302 -0
- mlflow/server/auth/__init__.py +1224 -0
- mlflow/server/auth/__main__.py +4 -0
- mlflow/server/auth/basic_auth.ini +6 -0
- mlflow/server/auth/cli.py +11 -0
- mlflow/server/auth/client.py +537 -0
- mlflow/server/auth/config.py +34 -0
- mlflow/server/auth/db/__init__.py +0 -0
- mlflow/server/auth/db/cli.py +18 -0
- mlflow/server/auth/db/migrations/__init__.py +0 -0
- mlflow/server/auth/db/migrations/alembic.ini +110 -0
- mlflow/server/auth/db/migrations/env.py +76 -0
- mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
- mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
- mlflow/server/auth/db/models.py +67 -0
- mlflow/server/auth/db/utils.py +37 -0
- mlflow/server/auth/entities.py +165 -0
- mlflow/server/auth/logo.py +14 -0
- mlflow/server/auth/permissions.py +65 -0
- mlflow/server/auth/routes.py +18 -0
- mlflow/server/auth/sqlalchemy_store.py +263 -0
- mlflow/server/graphql/__init__.py +0 -0
- mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
- mlflow/server/graphql/graphql_custom_scalars.py +24 -0
- mlflow/server/graphql/graphql_errors.py +15 -0
- mlflow/server/graphql/graphql_no_batching.py +89 -0
- mlflow/server/graphql/graphql_schema_extensions.py +74 -0
- mlflow/server/handlers.py +3217 -0
- mlflow/server/prometheus_exporter.py +17 -0
- mlflow/server/validation.py +30 -0
- mlflow/shap/__init__.py +691 -0
- mlflow/sklearn/__init__.py +1994 -0
- mlflow/sklearn/utils.py +1041 -0
- mlflow/smolagents/__init__.py +66 -0
- mlflow/smolagents/autolog.py +139 -0
- mlflow/smolagents/chat.py +29 -0
- mlflow/store/__init__.py +10 -0
- mlflow/store/_unity_catalog/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/constants.py +2 -0
- mlflow/store/_unity_catalog/registry/__init__.py +6 -0
- mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
- mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
- mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
- mlflow/store/_unity_catalog/registry/utils.py +121 -0
- mlflow/store/artifact/__init__.py +0 -0
- mlflow/store/artifact/artifact_repo.py +472 -0
- mlflow/store/artifact/artifact_repository_registry.py +154 -0
- mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
- mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
- mlflow/store/artifact/cli.py +141 -0
- mlflow/store/artifact/cloud_artifact_repo.py +332 -0
- mlflow/store/artifact/databricks_artifact_repo.py +729 -0
- mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
- mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
- mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
- mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
- mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
- mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
- mlflow/store/artifact/ftp_artifact_repo.py +132 -0
- mlflow/store/artifact/gcs_artifact_repo.py +296 -0
- mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
- mlflow/store/artifact/http_artifact_repo.py +218 -0
- mlflow/store/artifact/local_artifact_repo.py +142 -0
- mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
- mlflow/store/artifact/models_artifact_repo.py +259 -0
- mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
- mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
- mlflow/store/artifact/r2_artifact_repo.py +70 -0
- mlflow/store/artifact/runs_artifact_repo.py +265 -0
- mlflow/store/artifact/s3_artifact_repo.py +330 -0
- mlflow/store/artifact/sftp_artifact_repo.py +141 -0
- mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
- mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
- mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
- mlflow/store/artifact/utils/__init__.py +0 -0
- mlflow/store/artifact/utils/models.py +148 -0
- mlflow/store/db/__init__.py +0 -0
- mlflow/store/db/base_sql_model.py +3 -0
- mlflow/store/db/db_types.py +10 -0
- mlflow/store/db/utils.py +314 -0
- mlflow/store/db_migrations/__init__.py +0 -0
- mlflow/store/db_migrations/alembic.ini +74 -0
- mlflow/store/db_migrations/env.py +84 -0
- mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
- mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
- mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
- mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
- mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
- mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
- mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
- mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
- mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
- mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
- mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
- mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
- mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
- mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
- mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
- mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
- mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
- mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
- mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
- mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
- mlflow/store/db_migrations/versions/__init__.py +0 -0
- mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
- mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
- mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
- mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
- mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
- mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
- mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
- mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
- mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
- mlflow/store/entities/__init__.py +3 -0
- mlflow/store/entities/paged_list.py +18 -0
- mlflow/store/model_registry/__init__.py +10 -0
- mlflow/store/model_registry/abstract_store.py +1081 -0
- mlflow/store/model_registry/base_rest_store.py +44 -0
- mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
- mlflow/store/model_registry/dbmodels/__init__.py +0 -0
- mlflow/store/model_registry/dbmodels/models.py +206 -0
- mlflow/store/model_registry/file_store.py +1091 -0
- mlflow/store/model_registry/rest_store.py +481 -0
- mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
- mlflow/store/tracking/__init__.py +23 -0
- mlflow/store/tracking/abstract_store.py +816 -0
- mlflow/store/tracking/dbmodels/__init__.py +0 -0
- mlflow/store/tracking/dbmodels/initial_models.py +243 -0
- mlflow/store/tracking/dbmodels/models.py +1073 -0
- mlflow/store/tracking/file_store.py +2438 -0
- mlflow/store/tracking/postgres_managed_identity.py +146 -0
- mlflow/store/tracking/rest_store.py +1131 -0
- mlflow/store/tracking/sqlalchemy_store.py +2785 -0
- mlflow/system_metrics/__init__.py +61 -0
- mlflow/system_metrics/metrics/__init__.py +0 -0
- mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
- mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
- mlflow/system_metrics/metrics/disk_monitor.py +21 -0
- mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
- mlflow/system_metrics/metrics/network_monitor.py +34 -0
- mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
- mlflow/system_metrics/system_metrics_monitor.py +198 -0
- mlflow/tracing/__init__.py +16 -0
- mlflow/tracing/assessment.py +356 -0
- mlflow/tracing/client.py +531 -0
- mlflow/tracing/config.py +125 -0
- mlflow/tracing/constant.py +105 -0
- mlflow/tracing/destination.py +81 -0
- mlflow/tracing/display/__init__.py +40 -0
- mlflow/tracing/display/display_handler.py +196 -0
- mlflow/tracing/export/async_export_queue.py +186 -0
- mlflow/tracing/export/inference_table.py +138 -0
- mlflow/tracing/export/mlflow_v3.py +137 -0
- mlflow/tracing/export/utils.py +70 -0
- mlflow/tracing/fluent.py +1417 -0
- mlflow/tracing/processor/base_mlflow.py +199 -0
- mlflow/tracing/processor/inference_table.py +175 -0
- mlflow/tracing/processor/mlflow_v3.py +47 -0
- mlflow/tracing/processor/otel.py +73 -0
- mlflow/tracing/provider.py +487 -0
- mlflow/tracing/trace_manager.py +200 -0
- mlflow/tracing/utils/__init__.py +616 -0
- mlflow/tracing/utils/artifact_utils.py +28 -0
- mlflow/tracing/utils/copy.py +55 -0
- mlflow/tracing/utils/environment.py +55 -0
- mlflow/tracing/utils/exception.py +21 -0
- mlflow/tracing/utils/once.py +35 -0
- mlflow/tracing/utils/otlp.py +63 -0
- mlflow/tracing/utils/processor.py +54 -0
- mlflow/tracing/utils/search.py +292 -0
- mlflow/tracing/utils/timeout.py +250 -0
- mlflow/tracing/utils/token.py +19 -0
- mlflow/tracing/utils/truncation.py +124 -0
- mlflow/tracing/utils/warning.py +76 -0
- mlflow/tracking/__init__.py +39 -0
- mlflow/tracking/_model_registry/__init__.py +1 -0
- mlflow/tracking/_model_registry/client.py +764 -0
- mlflow/tracking/_model_registry/fluent.py +853 -0
- mlflow/tracking/_model_registry/registry.py +67 -0
- mlflow/tracking/_model_registry/utils.py +251 -0
- mlflow/tracking/_tracking_service/__init__.py +0 -0
- mlflow/tracking/_tracking_service/client.py +883 -0
- mlflow/tracking/_tracking_service/registry.py +56 -0
- mlflow/tracking/_tracking_service/utils.py +275 -0
- mlflow/tracking/artifact_utils.py +179 -0
- mlflow/tracking/client.py +5900 -0
- mlflow/tracking/context/__init__.py +0 -0
- mlflow/tracking/context/abstract_context.py +35 -0
- mlflow/tracking/context/databricks_cluster_context.py +15 -0
- mlflow/tracking/context/databricks_command_context.py +15 -0
- mlflow/tracking/context/databricks_job_context.py +49 -0
- mlflow/tracking/context/databricks_notebook_context.py +41 -0
- mlflow/tracking/context/databricks_repo_context.py +43 -0
- mlflow/tracking/context/default_context.py +51 -0
- mlflow/tracking/context/git_context.py +32 -0
- mlflow/tracking/context/registry.py +98 -0
- mlflow/tracking/context/system_environment_context.py +15 -0
- mlflow/tracking/default_experiment/__init__.py +1 -0
- mlflow/tracking/default_experiment/abstract_context.py +43 -0
- mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
- mlflow/tracking/default_experiment/registry.py +75 -0
- mlflow/tracking/fluent.py +3595 -0
- mlflow/tracking/metric_value_conversion_utils.py +93 -0
- mlflow/tracking/multimedia.py +206 -0
- mlflow/tracking/registry.py +86 -0
- mlflow/tracking/request_auth/__init__.py +0 -0
- mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
- mlflow/tracking/request_auth/registry.py +60 -0
- mlflow/tracking/request_header/__init__.py +0 -0
- mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
- mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
- mlflow/tracking/request_header/default_request_header_provider.py +17 -0
- mlflow/tracking/request_header/registry.py +79 -0
- mlflow/transformers/__init__.py +2982 -0
- mlflow/transformers/flavor_config.py +258 -0
- mlflow/transformers/hub_utils.py +83 -0
- mlflow/transformers/llm_inference_utils.py +468 -0
- mlflow/transformers/model_io.py +301 -0
- mlflow/transformers/peft.py +51 -0
- mlflow/transformers/signature.py +183 -0
- mlflow/transformers/torch_utils.py +55 -0
- mlflow/types/__init__.py +21 -0
- mlflow/types/agent.py +270 -0
- mlflow/types/chat.py +240 -0
- mlflow/types/llm.py +935 -0
- mlflow/types/responses.py +139 -0
- mlflow/types/responses_helpers.py +416 -0
- mlflow/types/schema.py +1505 -0
- mlflow/types/type_hints.py +647 -0
- mlflow/types/utils.py +753 -0
- mlflow/utils/__init__.py +283 -0
- mlflow/utils/_capture_modules.py +256 -0
- mlflow/utils/_capture_transformers_modules.py +75 -0
- mlflow/utils/_spark_utils.py +201 -0
- mlflow/utils/_unity_catalog_oss_utils.py +97 -0
- mlflow/utils/_unity_catalog_utils.py +479 -0
- mlflow/utils/annotations.py +218 -0
- mlflow/utils/arguments_utils.py +16 -0
- mlflow/utils/async_logging/__init__.py +1 -0
- mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
- mlflow/utils/async_logging/async_logging_queue.py +366 -0
- mlflow/utils/async_logging/run_artifact.py +38 -0
- mlflow/utils/async_logging/run_batch.py +58 -0
- mlflow/utils/async_logging/run_operations.py +49 -0
- mlflow/utils/autologging_utils/__init__.py +737 -0
- mlflow/utils/autologging_utils/client.py +432 -0
- mlflow/utils/autologging_utils/config.py +33 -0
- mlflow/utils/autologging_utils/events.py +294 -0
- mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
- mlflow/utils/autologging_utils/metrics_queue.py +71 -0
- mlflow/utils/autologging_utils/safety.py +1104 -0
- mlflow/utils/autologging_utils/versioning.py +95 -0
- mlflow/utils/checkpoint_utils.py +206 -0
- mlflow/utils/class_utils.py +6 -0
- mlflow/utils/cli_args.py +257 -0
- mlflow/utils/conda.py +354 -0
- mlflow/utils/credentials.py +231 -0
- mlflow/utils/data_utils.py +17 -0
- mlflow/utils/databricks_utils.py +1436 -0
- mlflow/utils/docstring_utils.py +477 -0
- mlflow/utils/doctor.py +133 -0
- mlflow/utils/download_cloud_file_chunk.py +43 -0
- mlflow/utils/env_manager.py +16 -0
- mlflow/utils/env_pack.py +131 -0
- mlflow/utils/environment.py +1009 -0
- mlflow/utils/exception_utils.py +14 -0
- mlflow/utils/file_utils.py +978 -0
- mlflow/utils/git_utils.py +77 -0
- mlflow/utils/gorilla.py +797 -0
- mlflow/utils/import_hooks/__init__.py +363 -0
- mlflow/utils/lazy_load.py +51 -0
- mlflow/utils/logging_utils.py +168 -0
- mlflow/utils/mime_type_utils.py +58 -0
- mlflow/utils/mlflow_tags.py +103 -0
- mlflow/utils/model_utils.py +486 -0
- mlflow/utils/name_utils.py +346 -0
- mlflow/utils/nfs_on_spark.py +62 -0
- mlflow/utils/openai_utils.py +164 -0
- mlflow/utils/os.py +12 -0
- mlflow/utils/oss_registry_utils.py +29 -0
- mlflow/utils/plugins.py +17 -0
- mlflow/utils/process.py +182 -0
- mlflow/utils/promptlab_utils.py +146 -0
- mlflow/utils/proto_json_utils.py +743 -0
- mlflow/utils/pydantic_utils.py +54 -0
- mlflow/utils/request_utils.py +279 -0
- mlflow/utils/requirements_utils.py +704 -0
- mlflow/utils/rest_utils.py +673 -0
- mlflow/utils/search_logged_model_utils.py +127 -0
- mlflow/utils/search_utils.py +2111 -0
- mlflow/utils/secure_loading.py +221 -0
- mlflow/utils/security_validation.py +384 -0
- mlflow/utils/server_cli_utils.py +61 -0
- mlflow/utils/spark_utils.py +15 -0
- mlflow/utils/string_utils.py +138 -0
- mlflow/utils/thread_utils.py +63 -0
- mlflow/utils/time.py +54 -0
- mlflow/utils/timeout.py +42 -0
- mlflow/utils/uri.py +572 -0
- mlflow/utils/validation.py +662 -0
- mlflow/utils/virtualenv.py +458 -0
- mlflow/utils/warnings_utils.py +25 -0
- mlflow/utils/yaml_utils.py +179 -0
- mlflow/version.py +24 -0
@@ -0,0 +1,472 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
import posixpath
|
5
|
+
import tempfile
|
6
|
+
import traceback
|
7
|
+
from abc import ABC, ABCMeta, abstractmethod
|
8
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
9
|
+
from contextlib import contextmanager
|
10
|
+
from pathlib import Path
|
11
|
+
from typing import Any, Optional
|
12
|
+
|
13
|
+
from mlflow.entities.file_info import FileInfo
|
14
|
+
from mlflow.entities.multipart_upload import (
|
15
|
+
CreateMultipartUploadResponse,
|
16
|
+
MultipartUploadPart,
|
17
|
+
)
|
18
|
+
from mlflow.exceptions import (
|
19
|
+
MlflowException,
|
20
|
+
MlflowTraceDataCorrupted,
|
21
|
+
MlflowTraceDataNotFound,
|
22
|
+
)
|
23
|
+
from mlflow.protos.databricks_pb2 import (
|
24
|
+
INVALID_PARAMETER_VALUE,
|
25
|
+
RESOURCE_DOES_NOT_EXIST,
|
26
|
+
)
|
27
|
+
from mlflow.tracing.utils.artifact_utils import TRACE_DATA_FILE_NAME
|
28
|
+
from mlflow.utils.annotations import developer_stable
|
29
|
+
from mlflow.utils.async_logging.async_artifacts_logging_queue import (
|
30
|
+
AsyncArtifactsLoggingQueue,
|
31
|
+
)
|
32
|
+
from mlflow.utils.file_utils import ArtifactProgressBar, create_tmp_dir
|
33
|
+
from mlflow.utils.validation import bad_path_message, path_not_unique
|
34
|
+
|
35
|
+
# Constants used to determine max level of parallelism to use while uploading/downloading artifacts.
|
36
|
+
# Max threads to use for parallelism.
|
37
|
+
_NUM_MAX_THREADS = 20
|
38
|
+
# Max threads per CPU
|
39
|
+
_NUM_MAX_THREADS_PER_CPU = 2
|
40
|
+
assert _NUM_MAX_THREADS >= _NUM_MAX_THREADS_PER_CPU
|
41
|
+
assert _NUM_MAX_THREADS_PER_CPU > 0
|
42
|
+
# Default number of CPUs to assume on the machine if unavailable to fetch it using os.cpu_count()
|
43
|
+
_NUM_DEFAULT_CPUS = _NUM_MAX_THREADS // _NUM_MAX_THREADS_PER_CPU
|
44
|
+
_logger = logging.getLogger(__name__)
|
45
|
+
|
46
|
+
|
47
|
+
def _truncate_error(err: str, max_length: int = 10_000) -> str:
|
48
|
+
if len(err) <= max_length:
|
49
|
+
return err
|
50
|
+
half = max_length // 2
|
51
|
+
return err[:half] + "\n\n*** Error message is too long, truncated ***\n\n" + err[-half:]
|
52
|
+
|
53
|
+
|
54
|
+
def _retry_with_new_creds(try_func, creds_func, orig_creds=None):
|
55
|
+
"""
|
56
|
+
Attempt the try_func with the original credentials (og_creds) if provided, or by generating the
|
57
|
+
credentials using creds_func. If the try_func throws, then try again with new credentials
|
58
|
+
provided by creds_func.
|
59
|
+
"""
|
60
|
+
try:
|
61
|
+
first_creds = creds_func() if orig_creds is None else orig_creds
|
62
|
+
return try_func(first_creds)
|
63
|
+
except Exception as e:
|
64
|
+
_logger.info(
|
65
|
+
f"Failed to complete request, possibly due to credential expiration (Error: {e})."
|
66
|
+
" Refreshing credentials and trying again..."
|
67
|
+
)
|
68
|
+
new_creds = creds_func()
|
69
|
+
return try_func(new_creds)
|
70
|
+
|
71
|
+
|
72
|
+
@developer_stable
|
73
|
+
class ArtifactRepository:
|
74
|
+
"""
|
75
|
+
Abstract artifact repo that defines how to upload (log) and download potentially large
|
76
|
+
artifacts from different storage backends.
|
77
|
+
"""
|
78
|
+
|
79
|
+
__metaclass__ = ABCMeta
|
80
|
+
|
81
|
+
def __init__(self, artifact_uri: str, tracking_uri: Optional[str] = None) -> None:
|
82
|
+
self.artifact_uri = artifact_uri
|
83
|
+
self.tracking_uri = tracking_uri
|
84
|
+
# Limit the number of threads used for artifact uploads/downloads. Use at most
|
85
|
+
# constants._NUM_MAX_THREADS threads or 2 * the number of CPU cores available on the
|
86
|
+
# system (whichever is smaller)
|
87
|
+
self.thread_pool = self._create_thread_pool()
|
88
|
+
|
89
|
+
def log_artifact_handler(filename, artifact_path=None, artifact=None):
|
90
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
91
|
+
tmp_path = os.path.join(tmp_dir, filename)
|
92
|
+
if artifact is not None:
|
93
|
+
# User should already have installed PIL to log a PIL image
|
94
|
+
from PIL import Image
|
95
|
+
|
96
|
+
if isinstance(artifact, Image.Image):
|
97
|
+
artifact.save(tmp_path)
|
98
|
+
self.log_artifact(tmp_path, artifact_path)
|
99
|
+
|
100
|
+
self._async_logging_queue = AsyncArtifactsLoggingQueue(log_artifact_handler)
|
101
|
+
|
102
|
+
def __repr__(self) -> str:
|
103
|
+
return (
|
104
|
+
f"{self.__class__.__name__}("
|
105
|
+
f"artifact_uri={self.artifact_uri!r}, "
|
106
|
+
f"tracking_uri={self.tracking_uri!r}"
|
107
|
+
f")"
|
108
|
+
)
|
109
|
+
|
110
|
+
def _create_thread_pool(self):
|
111
|
+
return ThreadPoolExecutor(
|
112
|
+
max_workers=self.max_workers, thread_name_prefix=f"Mlflow{self.__class__.__name__}"
|
113
|
+
)
|
114
|
+
|
115
|
+
def flush_async_logging(self):
|
116
|
+
"""
|
117
|
+
Flushes the async logging queue, ensuring that all pending logging operations have
|
118
|
+
completed.
|
119
|
+
"""
|
120
|
+
if self._async_logging_queue._is_activated:
|
121
|
+
self._async_logging_queue.flush()
|
122
|
+
|
123
|
+
@abstractmethod
|
124
|
+
def log_artifact(self, local_file, artifact_path=None):
|
125
|
+
"""
|
126
|
+
Log a local file as an artifact, optionally taking an ``artifact_path`` to place it in
|
127
|
+
within the run's artifacts. Run artifacts can be organized into directories, so you can
|
128
|
+
place the artifact in a directory this way.
|
129
|
+
|
130
|
+
Args:
|
131
|
+
local_file: Path to artifact to log.
|
132
|
+
artifact_path: Directory within the run's artifact directory in which to log the
|
133
|
+
artifact.
|
134
|
+
"""
|
135
|
+
|
136
|
+
def _log_artifact_async(self, filename, artifact_path=None, artifact=None):
|
137
|
+
"""
|
138
|
+
Asynchronously log a local file as an artifact, optionally taking an ``artifact_path`` to
|
139
|
+
place it within the run's artifacts. Run artifacts can be organized into directory, so you
|
140
|
+
can place the artifact in the directory this way. Cleanup tells the function whether to
|
141
|
+
cleanup the local_file after running log_artifact, since it could be a Temporary
|
142
|
+
Directory.
|
143
|
+
|
144
|
+
Args:
|
145
|
+
filename: Filename of the artifact to be logged.
|
146
|
+
artifact_path: Directory within the run's artifact directory in which to log the
|
147
|
+
artifact.
|
148
|
+
artifact: The artifact to be logged.
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
An :py:class:`mlflow.utils.async_logging.run_operations.RunOperations` instance
|
152
|
+
that represents future for logging operation.
|
153
|
+
"""
|
154
|
+
|
155
|
+
if not self._async_logging_queue.is_active():
|
156
|
+
self._async_logging_queue.activate()
|
157
|
+
|
158
|
+
return self._async_logging_queue.log_artifacts_async(
|
159
|
+
filename=filename, artifact_path=artifact_path, artifact=artifact
|
160
|
+
)
|
161
|
+
|
162
|
+
@abstractmethod
|
163
|
+
def log_artifacts(self, local_dir, artifact_path=None):
|
164
|
+
"""
|
165
|
+
Log the files in the specified local directory as artifacts, optionally taking
|
166
|
+
an ``artifact_path`` to place them in within the run's artifacts.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
local_dir: Directory of local artifacts to log.
|
170
|
+
artifact_path: Directory within the run's artifact directory in which to log the
|
171
|
+
artifacts.
|
172
|
+
"""
|
173
|
+
|
174
|
+
@abstractmethod
|
175
|
+
def list_artifacts(self, path: Optional[str] = None) -> list[FileInfo]:
|
176
|
+
"""
|
177
|
+
Return all the artifacts for this run_id directly under path. If path is a file, returns
|
178
|
+
an empty list. Will error if path is neither a file nor directory.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
path: Relative source path that contains desired artifacts.
|
182
|
+
|
183
|
+
Returns:
|
184
|
+
List of artifacts as FileInfo listed directly under path.
|
185
|
+
"""
|
186
|
+
|
187
|
+
def _is_directory(self, artifact_path):
|
188
|
+
listing = self.list_artifacts(artifact_path)
|
189
|
+
return len(listing) > 0
|
190
|
+
|
191
|
+
def _create_download_destination(self, src_artifact_path, dst_local_dir_path=None):
|
192
|
+
"""
|
193
|
+
Creates a local filesystem location to be used as a destination for downloading the artifact
|
194
|
+
specified by `src_artifact_path`. The destination location is a subdirectory of the
|
195
|
+
specified `dst_local_dir_path`, which is determined according to the structure of
|
196
|
+
`src_artifact_path`. For example, if `src_artifact_path` is `dir1/file1.txt`, then the
|
197
|
+
resulting destination path is `<dst_local_dir_path>/dir1/file1.txt`. Local directories are
|
198
|
+
created for the resulting destination location if they do not exist.
|
199
|
+
|
200
|
+
Args:
|
201
|
+
src_artifact_path: A relative, POSIX-style path referring to an artifact stored
|
202
|
+
within the repository's artifact root location. `src_artifact_path` should be
|
203
|
+
specified relative to the repository's artifact root location.
|
204
|
+
dst_local_dir_path: The absolute path to a local filesystem directory in which the
|
205
|
+
local destination path will be contained. The local destination path may be
|
206
|
+
contained in a subdirectory of `dst_root_dir` if `src_artifact_path` contains
|
207
|
+
subdirectories.
|
208
|
+
|
209
|
+
Returns:
|
210
|
+
The absolute path to a local filesystem location to be used as a destination
|
211
|
+
for downloading the artifact specified by `src_artifact_path`.
|
212
|
+
"""
|
213
|
+
src_artifact_path = src_artifact_path.rstrip("/") # Ensure correct dirname for trailing '/'
|
214
|
+
dirpath = posixpath.dirname(src_artifact_path)
|
215
|
+
local_dir_path = os.path.join(dst_local_dir_path, dirpath)
|
216
|
+
local_file_path = os.path.join(dst_local_dir_path, src_artifact_path)
|
217
|
+
if not os.path.exists(local_dir_path):
|
218
|
+
os.makedirs(local_dir_path, exist_ok=True)
|
219
|
+
return local_file_path
|
220
|
+
|
221
|
+
def _iter_artifacts_recursive(self, path):
|
222
|
+
dir_content = [
|
223
|
+
file_info
|
224
|
+
for file_info in self.list_artifacts(path)
|
225
|
+
# prevent infinite loop, sometimes the dir is recursively included
|
226
|
+
if file_info.path not in [".", path]
|
227
|
+
]
|
228
|
+
# Empty directory
|
229
|
+
if not dir_content:
|
230
|
+
yield FileInfo(path=path, is_dir=True, file_size=None)
|
231
|
+
return
|
232
|
+
|
233
|
+
for file_info in dir_content:
|
234
|
+
if file_info.is_dir:
|
235
|
+
yield from self._iter_artifacts_recursive(file_info.path)
|
236
|
+
else:
|
237
|
+
yield file_info
|
238
|
+
|
239
|
+
def download_artifacts(self, artifact_path, dst_path=None):
|
240
|
+
"""
|
241
|
+
Download an artifact file or directory to a local directory if applicable, and return a
|
242
|
+
local path for it.
|
243
|
+
The caller is responsible for managing the lifecycle of the downloaded artifacts.
|
244
|
+
|
245
|
+
Args:
|
246
|
+
artifact_path: Relative source path to the desired artifacts.
|
247
|
+
dst_path: Absolute path of the local filesystem destination directory to which to
|
248
|
+
download the specified artifacts. This directory must already exist.
|
249
|
+
If unspecified, the artifacts will either be downloaded to a new
|
250
|
+
uniquely-named directory on the local filesystem or will be returned
|
251
|
+
directly in the case of the LocalArtifactRepository.
|
252
|
+
|
253
|
+
Returns:
|
254
|
+
Absolute path of the local filesystem location containing the desired artifacts.
|
255
|
+
"""
|
256
|
+
if dst_path:
|
257
|
+
dst_path = os.path.abspath(dst_path)
|
258
|
+
if not os.path.exists(dst_path):
|
259
|
+
raise MlflowException(
|
260
|
+
message=(
|
261
|
+
"The destination path for downloaded artifacts does not"
|
262
|
+
f" exist! Destination path: {dst_path}"
|
263
|
+
),
|
264
|
+
error_code=RESOURCE_DOES_NOT_EXIST,
|
265
|
+
)
|
266
|
+
elif not os.path.isdir(dst_path):
|
267
|
+
raise MlflowException(
|
268
|
+
message=(
|
269
|
+
"The destination path for downloaded artifacts must be a directory!"
|
270
|
+
f" Destination path: {dst_path}"
|
271
|
+
),
|
272
|
+
error_code=INVALID_PARAMETER_VALUE,
|
273
|
+
)
|
274
|
+
else:
|
275
|
+
dst_path = create_tmp_dir()
|
276
|
+
|
277
|
+
def _download_file(src_artifact_path, dst_local_dir_path):
|
278
|
+
dst_local_file_path = self._create_download_destination(
|
279
|
+
src_artifact_path=src_artifact_path, dst_local_dir_path=dst_local_dir_path
|
280
|
+
)
|
281
|
+
return self.thread_pool.submit(
|
282
|
+
self._download_file,
|
283
|
+
remote_file_path=src_artifact_path,
|
284
|
+
local_path=dst_local_file_path,
|
285
|
+
)
|
286
|
+
|
287
|
+
# Submit download tasks
|
288
|
+
futures = {}
|
289
|
+
if self._is_directory(artifact_path):
|
290
|
+
for file_info in self._iter_artifacts_recursive(artifact_path):
|
291
|
+
if file_info.is_dir: # Empty directory
|
292
|
+
os.makedirs(os.path.join(dst_path, file_info.path), exist_ok=True)
|
293
|
+
else:
|
294
|
+
fut = _download_file(file_info.path, dst_path)
|
295
|
+
futures[fut] = file_info.path
|
296
|
+
else:
|
297
|
+
fut = _download_file(artifact_path, dst_path)
|
298
|
+
futures[fut] = artifact_path
|
299
|
+
|
300
|
+
# Wait for downloads to complete and collect failures
|
301
|
+
failed_downloads = {}
|
302
|
+
tracebacks = {}
|
303
|
+
with ArtifactProgressBar.files(desc="Downloading artifacts", total=len(futures)) as pbar:
|
304
|
+
for f in as_completed(futures):
|
305
|
+
try:
|
306
|
+
f.result()
|
307
|
+
pbar.update()
|
308
|
+
except Exception as e:
|
309
|
+
path = futures[f]
|
310
|
+
failed_downloads[path] = e
|
311
|
+
tracebacks[path] = traceback.format_exc()
|
312
|
+
|
313
|
+
if failed_downloads:
|
314
|
+
if _logger.isEnabledFor(logging.DEBUG):
|
315
|
+
template = "##### File {path} #####\n{error}\nTraceback:\n{traceback}\n"
|
316
|
+
else:
|
317
|
+
template = "##### File {path} #####\n{error}"
|
318
|
+
|
319
|
+
failures = "\n".join(
|
320
|
+
template.format(path=path, error=error, traceback=tracebacks[path])
|
321
|
+
for path, error in failed_downloads.items()
|
322
|
+
)
|
323
|
+
raise MlflowException(
|
324
|
+
message=(
|
325
|
+
"The following failures occurred while downloading one or more"
|
326
|
+
f" artifacts from {self.artifact_uri}:\n{_truncate_error(failures)}"
|
327
|
+
)
|
328
|
+
)
|
329
|
+
|
330
|
+
return os.path.join(dst_path, artifact_path)
|
331
|
+
|
332
|
+
@abstractmethod
|
333
|
+
def _download_file(self, remote_file_path, local_path):
|
334
|
+
"""
|
335
|
+
Download the file at the specified relative remote path and saves
|
336
|
+
it at the specified local path.
|
337
|
+
|
338
|
+
Args:
|
339
|
+
remote_file_path: Source path to the remote file, relative to the root
|
340
|
+
directory of the artifact repository.
|
341
|
+
local_path: The path to which to save the downloaded file.
|
342
|
+
"""
|
343
|
+
|
344
|
+
def delete_artifacts(self, artifact_path=None):
|
345
|
+
"""
|
346
|
+
Delete the artifacts at the specified location.
|
347
|
+
Supports the deletion of a single file or of a directory. Deletion of a directory
|
348
|
+
is recursive.
|
349
|
+
|
350
|
+
Args:
|
351
|
+
artifact_path: Path of the artifact to delete.
|
352
|
+
"""
|
353
|
+
|
354
|
+
@property
|
355
|
+
def max_workers(self) -> int:
|
356
|
+
"""Compute the number of workers to use for multi-threading."""
|
357
|
+
num_cpus = os.cpu_count() or _NUM_DEFAULT_CPUS
|
358
|
+
return min(num_cpus * _NUM_MAX_THREADS_PER_CPU, _NUM_MAX_THREADS)
|
359
|
+
|
360
|
+
def download_trace_data(self) -> dict[str, Any]:
|
361
|
+
"""
|
362
|
+
Download the trace data.
|
363
|
+
|
364
|
+
Returns:
|
365
|
+
The trace data as a dictionary.
|
366
|
+
|
367
|
+
Raises:
|
368
|
+
- `MlflowTraceDataNotFound`: The trace data is not found.
|
369
|
+
- `MlflowTraceDataCorrupted`: The trace data is corrupted.
|
370
|
+
"""
|
371
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
372
|
+
temp_file = Path(temp_dir, TRACE_DATA_FILE_NAME)
|
373
|
+
try:
|
374
|
+
self._download_file(TRACE_DATA_FILE_NAME, temp_file)
|
375
|
+
except Exception as e:
|
376
|
+
# `MlflowTraceDataNotFound` is caught in `TrackingServiceClient.search_traces` and
|
377
|
+
# is used to filter out traces with failed trace data download.
|
378
|
+
raise MlflowTraceDataNotFound(artifact_path=TRACE_DATA_FILE_NAME) from e
|
379
|
+
return try_read_trace_data(temp_file)
|
380
|
+
|
381
|
+
def upload_trace_data(self, trace_data: str) -> None:
|
382
|
+
"""
|
383
|
+
Upload the trace data.
|
384
|
+
|
385
|
+
Args:
|
386
|
+
trace_data: The json-serialized trace data to upload.
|
387
|
+
"""
|
388
|
+
with write_local_temp_trace_data_file(trace_data) as temp_file:
|
389
|
+
self.log_artifact(temp_file)
|
390
|
+
|
391
|
+
|
392
|
+
@contextmanager
|
393
|
+
def write_local_temp_trace_data_file(trace_data: str):
|
394
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
395
|
+
temp_file = Path(temp_dir, TRACE_DATA_FILE_NAME)
|
396
|
+
temp_file.write_text(trace_data, encoding="utf-8")
|
397
|
+
yield temp_file
|
398
|
+
|
399
|
+
|
400
|
+
def try_read_trace_data(trace_data_path):
|
401
|
+
if not os.path.exists(trace_data_path):
|
402
|
+
raise MlflowTraceDataNotFound(artifact_path=trace_data_path)
|
403
|
+
with open(trace_data_path, encoding="utf-8") as f:
|
404
|
+
data = f.read()
|
405
|
+
if not data:
|
406
|
+
raise MlflowTraceDataNotFound(artifact_path=trace_data_path)
|
407
|
+
try:
|
408
|
+
return json.loads(data)
|
409
|
+
except json.decoder.JSONDecodeError as e:
|
410
|
+
raise MlflowTraceDataCorrupted(artifact_path=trace_data_path) from e
|
411
|
+
|
412
|
+
|
413
|
+
class MultipartUploadMixin(ABC):
|
414
|
+
@abstractmethod
|
415
|
+
def create_multipart_upload(
|
416
|
+
self, local_file: str, num_parts: int, artifact_path: Optional[str] = None
|
417
|
+
) -> CreateMultipartUploadResponse:
|
418
|
+
"""
|
419
|
+
Initiate a multipart upload and retrieve the pre-signed upload URLS and upload id.
|
420
|
+
|
421
|
+
Args:
|
422
|
+
local_file: Path of artifact to upload.
|
423
|
+
num_parts: Number of parts to upload. Only required by S3 and GCS.
|
424
|
+
artifact_path: Directory within the run's artifact directory in which to upload the
|
425
|
+
artifact.
|
426
|
+
|
427
|
+
"""
|
428
|
+
|
429
|
+
@abstractmethod
|
430
|
+
def complete_multipart_upload(
|
431
|
+
self,
|
432
|
+
local_file: str,
|
433
|
+
upload_id: str,
|
434
|
+
parts: list[MultipartUploadPart],
|
435
|
+
artifact_path: Optional[str] = None,
|
436
|
+
) -> None:
|
437
|
+
"""
|
438
|
+
Complete a multipart upload.
|
439
|
+
|
440
|
+
Args:
|
441
|
+
local_file: Path of artifact to upload.
|
442
|
+
upload_id: The upload ID. Only required by S3 and GCS.
|
443
|
+
parts: A list containing the metadata of each part that has been uploaded.
|
444
|
+
artifact_path: Directory within the run's artifact directory in which to upload the
|
445
|
+
artifact.
|
446
|
+
|
447
|
+
"""
|
448
|
+
|
449
|
+
@abstractmethod
|
450
|
+
def abort_multipart_upload(
|
451
|
+
self,
|
452
|
+
local_file: str,
|
453
|
+
upload_id: str,
|
454
|
+
artifact_path: Optional[str] = None,
|
455
|
+
) -> None:
|
456
|
+
"""
|
457
|
+
Abort a multipart upload.
|
458
|
+
|
459
|
+
Args:
|
460
|
+
local_file: Path of artifact to upload.
|
461
|
+
upload_id: The upload ID. Only required by S3 and GCS.
|
462
|
+
artifact_path: Directory within the run's artifact directory in which to upload the
|
463
|
+
artifact.
|
464
|
+
|
465
|
+
"""
|
466
|
+
|
467
|
+
|
468
|
+
def verify_artifact_path(artifact_path):
|
469
|
+
if artifact_path and path_not_unique(artifact_path):
|
470
|
+
raise MlflowException(
|
471
|
+
f"Invalid artifact path: '{artifact_path}'. {bad_path_message(artifact_path)}"
|
472
|
+
)
|
@@ -0,0 +1,154 @@
|
|
1
|
+
import warnings
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from mlflow.exceptions import MlflowException
|
5
|
+
from mlflow.store.artifact.artifact_repo import ArtifactRepository
|
6
|
+
from mlflow.store.artifact.azure_blob_artifact_repo import AzureBlobArtifactRepository
|
7
|
+
from mlflow.store.artifact.azure_data_lake_artifact_repo import AzureDataLakeArtifactRepository
|
8
|
+
from mlflow.store.artifact.dbfs_artifact_repo import dbfs_artifact_repo_factory
|
9
|
+
from mlflow.store.artifact.ftp_artifact_repo import FTPArtifactRepository
|
10
|
+
from mlflow.store.artifact.gcs_artifact_repo import GCSArtifactRepository
|
11
|
+
from mlflow.store.artifact.hdfs_artifact_repo import HdfsArtifactRepository
|
12
|
+
from mlflow.store.artifact.http_artifact_repo import HttpArtifactRepository
|
13
|
+
from mlflow.store.artifact.local_artifact_repo import LocalArtifactRepository
|
14
|
+
from mlflow.store.artifact.mlflow_artifacts_repo import MlflowArtifactsRepository
|
15
|
+
from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
|
16
|
+
from mlflow.store.artifact.r2_artifact_repo import R2ArtifactRepository
|
17
|
+
from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
|
18
|
+
from mlflow.store.artifact.s3_artifact_repo import S3ArtifactRepository
|
19
|
+
from mlflow.store.artifact.sftp_artifact_repo import SFTPArtifactRepository
|
20
|
+
from mlflow.store.artifact.uc_volume_artifact_repo import uc_volume_artifact_repo_factory
|
21
|
+
from mlflow.utils.plugins import get_entry_points
|
22
|
+
from mlflow.utils.uri import get_uri_scheme, is_uc_volumes_uri
|
23
|
+
|
24
|
+
|
25
|
+
class ArtifactRepositoryRegistry:
|
26
|
+
"""Scheme-based registry for artifact repository implementations
|
27
|
+
|
28
|
+
This class allows the registration of a function or class to provide an implementation for a
|
29
|
+
given scheme of `artifact_uri` through the `register` method. Implementations declared though
|
30
|
+
the entrypoints `mlflow.artifact_repository` group can be automatically registered through the
|
31
|
+
`register_entrypoints` method.
|
32
|
+
|
33
|
+
When instantiating an artifact repository through the `get_artifact_repository` method, the
|
34
|
+
scheme of the artifact URI provided will be used to select which implementation to instantiate,
|
35
|
+
which will be called with same arguments passed to the `get_artifact_repository` method.
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self):
|
39
|
+
self._registry = {}
|
40
|
+
|
41
|
+
def register(self, scheme, repository):
|
42
|
+
"""Register artifact repositories provided by other packages"""
|
43
|
+
self._registry[scheme] = repository
|
44
|
+
|
45
|
+
def register_entrypoints(self):
|
46
|
+
# Register artifact repositories provided by other packages
|
47
|
+
for entrypoint in get_entry_points("mlflow.artifact_repository"):
|
48
|
+
try:
|
49
|
+
self.register(entrypoint.name, entrypoint.load())
|
50
|
+
except (AttributeError, ImportError) as exc:
|
51
|
+
warnings.warn(
|
52
|
+
'Failure attempting to register artifact repository for scheme "{}": {}'.format(
|
53
|
+
entrypoint.name, str(exc)
|
54
|
+
),
|
55
|
+
stacklevel=2,
|
56
|
+
)
|
57
|
+
|
58
|
+
def get_artifact_repository(
|
59
|
+
self, artifact_uri: str, tracking_uri: Optional[str] = None
|
60
|
+
) -> ArtifactRepository:
|
61
|
+
"""
|
62
|
+
Get an artifact repository from the registry based on the scheme of artifact_uri
|
63
|
+
|
64
|
+
Args:
|
65
|
+
artifact_uri: The artifact store URI. This URI is used to select which artifact
|
66
|
+
repository implementation to instantiate and is passed to the constructor of the
|
67
|
+
implementation.
|
68
|
+
tracking_uri: The tracking URI. This URI is passed to the constructor of the
|
69
|
+
implementation.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
An instance of `mlflow.store.ArtifactRepository` that fulfills the artifact URI
|
73
|
+
requirements.
|
74
|
+
"""
|
75
|
+
scheme = get_uri_scheme(artifact_uri)
|
76
|
+
repository = self._registry.get(scheme)
|
77
|
+
if repository is None:
|
78
|
+
raise MlflowException(
|
79
|
+
f"Could not find a registered artifact repository for: {artifact_uri}. "
|
80
|
+
f"Currently registered schemes are: {list(self._registry.keys())}"
|
81
|
+
)
|
82
|
+
return repository(artifact_uri, tracking_uri)
|
83
|
+
|
84
|
+
def get_registered_artifact_repositories(self):
|
85
|
+
"""
|
86
|
+
Get all registered artifact repositories.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
A dictionary mapping string artifact URI schemes to artifact repositories.
|
90
|
+
"""
|
91
|
+
return self._registry
|
92
|
+
|
93
|
+
|
94
|
+
def _dbfs_artifact_repo_factory(
|
95
|
+
artifact_uri: str, tracking_uri: Optional[str] = None
|
96
|
+
) -> ArtifactRepository:
|
97
|
+
return (
|
98
|
+
uc_volume_artifact_repo_factory(artifact_uri, tracking_uri)
|
99
|
+
if is_uc_volumes_uri(artifact_uri)
|
100
|
+
else dbfs_artifact_repo_factory(artifact_uri, tracking_uri)
|
101
|
+
)
|
102
|
+
|
103
|
+
|
104
|
+
_artifact_repository_registry = ArtifactRepositoryRegistry()
|
105
|
+
|
106
|
+
_artifact_repository_registry.register("", LocalArtifactRepository)
|
107
|
+
_artifact_repository_registry.register("file", LocalArtifactRepository)
|
108
|
+
_artifact_repository_registry.register("s3", S3ArtifactRepository)
|
109
|
+
_artifact_repository_registry.register("r2", R2ArtifactRepository)
|
110
|
+
_artifact_repository_registry.register("gs", GCSArtifactRepository)
|
111
|
+
_artifact_repository_registry.register("wasbs", AzureBlobArtifactRepository)
|
112
|
+
_artifact_repository_registry.register("ftp", FTPArtifactRepository)
|
113
|
+
_artifact_repository_registry.register("sftp", SFTPArtifactRepository)
|
114
|
+
_artifact_repository_registry.register("dbfs", _dbfs_artifact_repo_factory)
|
115
|
+
_artifact_repository_registry.register("hdfs", HdfsArtifactRepository)
|
116
|
+
_artifact_repository_registry.register("viewfs", HdfsArtifactRepository)
|
117
|
+
_artifact_repository_registry.register("runs", RunsArtifactRepository)
|
118
|
+
_artifact_repository_registry.register("models", ModelsArtifactRepository)
|
119
|
+
for scheme in ["http", "https"]:
|
120
|
+
_artifact_repository_registry.register(scheme, HttpArtifactRepository)
|
121
|
+
_artifact_repository_registry.register("mlflow-artifacts", MlflowArtifactsRepository)
|
122
|
+
_artifact_repository_registry.register("abfss", AzureDataLakeArtifactRepository)
|
123
|
+
|
124
|
+
_artifact_repository_registry.register_entrypoints()
|
125
|
+
|
126
|
+
|
127
|
+
def get_artifact_repository(
|
128
|
+
artifact_uri: str, tracking_uri: Optional[str] = None
|
129
|
+
) -> ArtifactRepository:
|
130
|
+
"""
|
131
|
+
Get an artifact repository from the registry based on the scheme of artifact_uri
|
132
|
+
|
133
|
+
Args:
|
134
|
+
artifact_uri: The artifact store URI. This URI is used to select which artifact
|
135
|
+
repository implementation to instantiate and is passed to the constructor of the
|
136
|
+
implementation.
|
137
|
+
tracking_uri: The tracking URI. This URI is passed to the constructor of the
|
138
|
+
implementation.
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
An instance of `mlflow.store.ArtifactRepository` that fulfills the artifact URI
|
142
|
+
requirements.
|
143
|
+
"""
|
144
|
+
return _artifact_repository_registry.get_artifact_repository(artifact_uri, tracking_uri)
|
145
|
+
|
146
|
+
|
147
|
+
def get_registered_artifact_repositories() -> dict[str, ArtifactRepository]:
|
148
|
+
"""
|
149
|
+
Get all registered artifact repositories.
|
150
|
+
|
151
|
+
Returns:
|
152
|
+
A dictionary mapping string artifact URI schemes to artifact repositories.
|
153
|
+
"""
|
154
|
+
return _artifact_repository_registry.get_registered_artifact_repositories()
|