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,56 @@
|
|
1
|
+
import threading
|
2
|
+
from functools import lru_cache
|
3
|
+
|
4
|
+
from mlflow.tracking.registry import StoreRegistry
|
5
|
+
|
6
|
+
_building_store_lock = threading.Lock()
|
7
|
+
|
8
|
+
|
9
|
+
class TrackingStoreRegistry(StoreRegistry):
|
10
|
+
"""Scheme-based registry for tracking store implementations
|
11
|
+
|
12
|
+
This class allows the registration of a function or class to provide an
|
13
|
+
implementation for a given scheme of `store_uri` through the `register`
|
14
|
+
methods. Implementations declared though the entrypoints
|
15
|
+
`mlflow.tracking_store` group can be automatically registered through the
|
16
|
+
`register_entrypoints` method.
|
17
|
+
|
18
|
+
When instantiating a store through the `get_store` method, the scheme of
|
19
|
+
the store URI provided (or inferred from environment) will be used to
|
20
|
+
select which implementation to instantiate, which will be called with same
|
21
|
+
arguments passed to the `get_store` method.
|
22
|
+
"""
|
23
|
+
|
24
|
+
def __init__(self):
|
25
|
+
super().__init__("mlflow.tracking_store")
|
26
|
+
|
27
|
+
def get_store(self, store_uri=None, artifact_uri=None):
|
28
|
+
"""Get a store from the registry based on the scheme of store_uri
|
29
|
+
|
30
|
+
Args:
|
31
|
+
store_uri: The store URI. If None, it will be inferred from the environment. This URI
|
32
|
+
is used to select which tracking store implementation to instantiate and
|
33
|
+
is passed to the constructor of the implementation.
|
34
|
+
artifact_uri: Artifact repository URI. Passed through to the tracking store
|
35
|
+
implementation.
|
36
|
+
|
37
|
+
Returns:
|
38
|
+
An instance of `mlflow.store.tracking.AbstractStore` that fulfills the store URI
|
39
|
+
requirements.
|
40
|
+
|
41
|
+
"""
|
42
|
+
from mlflow.tracking._tracking_service import utils
|
43
|
+
|
44
|
+
resolved_store_uri = utils._resolve_tracking_uri(store_uri)
|
45
|
+
return self._get_store_with_resolved_uri(resolved_store_uri, artifact_uri)
|
46
|
+
|
47
|
+
@lru_cache(maxsize=100)
|
48
|
+
def _get_store_with_resolved_uri(self, resolved_store_uri, artifact_uri=None):
|
49
|
+
"""
|
50
|
+
Retrieve the store associated with a resolved (non-None) store URI and an artifact URI.
|
51
|
+
Caching is done on resolved URIs because the meaning of an unresolved (None) URI may change
|
52
|
+
depending on external configuration, such as environment variables
|
53
|
+
"""
|
54
|
+
with _building_store_lock:
|
55
|
+
builder = self.get_store_builder(resolved_store_uri)
|
56
|
+
return builder(store_uri=resolved_store_uri, artifact_uri=artifact_uri)
|
@@ -0,0 +1,275 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
from collections import OrderedDict
|
4
|
+
from contextlib import contextmanager
|
5
|
+
from functools import partial
|
6
|
+
from pathlib import Path
|
7
|
+
from typing import Generator, Union
|
8
|
+
|
9
|
+
from mlflow.environment_variables import MLFLOW_TRACKING_URI
|
10
|
+
from mlflow.store.db.db_types import DATABASE_ENGINES
|
11
|
+
from mlflow.store.tracking import DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
|
12
|
+
from mlflow.store.tracking.rest_store import RestStore
|
13
|
+
from mlflow.tracing.provider import reset
|
14
|
+
from mlflow.tracking._tracking_service.registry import TrackingStoreRegistry
|
15
|
+
from mlflow.utils.credentials import get_default_host_creds
|
16
|
+
from mlflow.utils.databricks_utils import get_databricks_host_creds
|
17
|
+
from mlflow.utils.file_utils import path_to_local_file_uri
|
18
|
+
from mlflow.utils.uri import _DATABRICKS_UNITY_CATALOG_SCHEME, _OSS_UNITY_CATALOG_SCHEME
|
19
|
+
|
20
|
+
_logger = logging.getLogger(__name__)
|
21
|
+
_tracking_uri = None
|
22
|
+
|
23
|
+
|
24
|
+
def is_tracking_uri_set():
|
25
|
+
"""Returns True if the tracking URI has been set, False otherwise."""
|
26
|
+
if _tracking_uri or MLFLOW_TRACKING_URI.get():
|
27
|
+
return True
|
28
|
+
return False
|
29
|
+
|
30
|
+
|
31
|
+
def set_tracking_uri(uri: Union[str, Path]) -> None:
|
32
|
+
"""
|
33
|
+
Set the tracking server URI. This does not affect the
|
34
|
+
currently active run (if one exists), but takes effect for successive runs.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
uri:
|
38
|
+
|
39
|
+
- An empty string, or a local file path, prefixed with ``file:/``. Data is stored
|
40
|
+
locally at the provided file (or ``./mlruns`` if empty).
|
41
|
+
- An HTTP URI like ``https://my-tracking-server:5000``.
|
42
|
+
- A Databricks workspace, provided as the string "databricks" or, to use a Databricks
|
43
|
+
CLI `profile <https://github.com/databricks/databricks-cli#installation>`_,
|
44
|
+
"databricks://<profileName>".
|
45
|
+
- A :py:class:`pathlib.Path` instance
|
46
|
+
|
47
|
+
.. code-block:: python
|
48
|
+
:test:
|
49
|
+
:caption: Example
|
50
|
+
|
51
|
+
import mlflow
|
52
|
+
|
53
|
+
mlflow.set_tracking_uri("file:///tmp/my_tracking")
|
54
|
+
tracking_uri = mlflow.get_tracking_uri()
|
55
|
+
print(f"Current tracking uri: {tracking_uri}")
|
56
|
+
|
57
|
+
.. code-block:: text
|
58
|
+
:caption: Output
|
59
|
+
|
60
|
+
Current tracking uri: file:///tmp/my_tracking
|
61
|
+
"""
|
62
|
+
if isinstance(uri, Path):
|
63
|
+
# On Windows with Python3.8 (https://bugs.python.org/issue38671)
|
64
|
+
# .resolve() doesn't return the absolute path if the directory doesn't exist
|
65
|
+
# so we're calling .absolute() first to get the absolute path on Windows,
|
66
|
+
# then .resolve() to clean the path
|
67
|
+
uri = uri.absolute().resolve().as_uri()
|
68
|
+
global _tracking_uri
|
69
|
+
|
70
|
+
if _tracking_uri != uri:
|
71
|
+
_tracking_uri = uri
|
72
|
+
if _tracking_uri is not None:
|
73
|
+
# Set 'MLFLOW_TRACKING_URI' environment variable
|
74
|
+
# so that subprocess can inherit it.
|
75
|
+
MLFLOW_TRACKING_URI.set(_tracking_uri)
|
76
|
+
else:
|
77
|
+
MLFLOW_TRACKING_URI.unset()
|
78
|
+
|
79
|
+
# Tracer provider uses tracking URI to determine where to export traces.
|
80
|
+
# Tracer provider stores the URI as its state so we need to reset
|
81
|
+
# it explicitly when the global tracking URI changes.
|
82
|
+
reset()
|
83
|
+
|
84
|
+
|
85
|
+
@contextmanager
|
86
|
+
def _use_tracking_uri(uri: str) -> Generator[None, None, None]:
|
87
|
+
"""Temporarily use the specified tracking URI.
|
88
|
+
|
89
|
+
Args:
|
90
|
+
uri: The tracking URI to use.
|
91
|
+
|
92
|
+
"""
|
93
|
+
old_tracking_uri = _tracking_uri
|
94
|
+
try:
|
95
|
+
set_tracking_uri(uri)
|
96
|
+
yield
|
97
|
+
finally:
|
98
|
+
set_tracking_uri(old_tracking_uri)
|
99
|
+
|
100
|
+
|
101
|
+
def _resolve_tracking_uri(tracking_uri=None):
|
102
|
+
return tracking_uri or get_tracking_uri()
|
103
|
+
|
104
|
+
|
105
|
+
def get_tracking_uri() -> str:
|
106
|
+
"""Get the current tracking URI. This may not correspond to the tracking URI of
|
107
|
+
the currently active run, since the tracking URI can be updated via ``set_tracking_uri``.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
The tracking URI.
|
111
|
+
|
112
|
+
.. code-block:: python
|
113
|
+
|
114
|
+
import mlflow
|
115
|
+
|
116
|
+
# Get the current tracking uri
|
117
|
+
tracking_uri = mlflow.get_tracking_uri()
|
118
|
+
print(f"Current tracking uri: {tracking_uri}")
|
119
|
+
|
120
|
+
.. code-block:: text
|
121
|
+
|
122
|
+
Current tracking uri: file:///.../mlruns
|
123
|
+
"""
|
124
|
+
if _tracking_uri is not None:
|
125
|
+
return _tracking_uri
|
126
|
+
elif uri := MLFLOW_TRACKING_URI.get():
|
127
|
+
return uri
|
128
|
+
else:
|
129
|
+
return path_to_local_file_uri(os.path.abspath(DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH))
|
130
|
+
|
131
|
+
|
132
|
+
def _get_file_store(store_uri, **_):
|
133
|
+
from mlflow.store.tracking.file_store import FileStore
|
134
|
+
|
135
|
+
return FileStore(store_uri, store_uri)
|
136
|
+
|
137
|
+
|
138
|
+
def _get_sqlalchemy_store(store_uri, artifact_uri):
|
139
|
+
from mlflow.store.tracking.sqlalchemy_store import SqlAlchemyStore
|
140
|
+
|
141
|
+
# Check if this is a PostgreSQL URI that should use Managed Identity
|
142
|
+
if store_uri.startswith("postgresql://") and (
|
143
|
+
"auth_method=managed_identity" in store_uri or
|
144
|
+
os.getenv("MLFLOW_POSTGRES_USE_MANAGED_IDENTITY", "").lower() == "true"
|
145
|
+
):
|
146
|
+
from mlflow.store.tracking.postgres_managed_identity import get_postgres_store_with_managed_identity
|
147
|
+
if artifact_uri is None:
|
148
|
+
artifact_uri = DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
|
149
|
+
return get_postgres_store_with_managed_identity(store_uri, artifact_uri)
|
150
|
+
|
151
|
+
if artifact_uri is None:
|
152
|
+
artifact_uri = DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
|
153
|
+
return SqlAlchemyStore(store_uri, artifact_uri)
|
154
|
+
|
155
|
+
|
156
|
+
def _get_rest_store(store_uri, **_):
|
157
|
+
return RestStore(partial(get_default_host_creds, store_uri))
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
def _get_databricks_rest_store(store_uri, **_):
|
163
|
+
return RestStore(partial(get_databricks_host_creds, store_uri))
|
164
|
+
|
165
|
+
|
166
|
+
def _get_databricks_uc_rest_store(store_uri, **_):
|
167
|
+
from mlflow.exceptions import MlflowException
|
168
|
+
from mlflow.version import VERSION
|
169
|
+
|
170
|
+
supported_schemes = [
|
171
|
+
scheme
|
172
|
+
for scheme in _tracking_store_registry._registry
|
173
|
+
if scheme not in {_DATABRICKS_UNITY_CATALOG_SCHEME, _OSS_UNITY_CATALOG_SCHEME}
|
174
|
+
]
|
175
|
+
raise MlflowException(
|
176
|
+
f"Detected Unity Catalog tracking URI '{store_uri}'. "
|
177
|
+
"Setting the tracking URI to a Unity Catalog backend is not supported in the current "
|
178
|
+
f"version of the MLflow client ({VERSION}). "
|
179
|
+
"Please specify a different tracking URI via mlflow.set_tracking_uri, with "
|
180
|
+
"one of the supported schemes: "
|
181
|
+
f"{supported_schemes}. If you're trying to access models in the Unity "
|
182
|
+
"Catalog, please upgrade to the latest version of the MLflow Python "
|
183
|
+
"client, then specify a Unity Catalog model registry URI via "
|
184
|
+
f"mlflow.set_registry_uri('{_DATABRICKS_UNITY_CATALOG_SCHEME}') or "
|
185
|
+
f"mlflow.set_registry_uri('{_DATABRICKS_UNITY_CATALOG_SCHEME}://profile_name') where "
|
186
|
+
"'profile_name' is the name of the Databricks CLI profile to use for "
|
187
|
+
"authentication. A OSS Unity Catalog model registry URI can also be specified via "
|
188
|
+
f"mlflow.set_registry_uri('{_OSS_UNITY_CATALOG_SCHEME}:http://localhost:8080')."
|
189
|
+
"Be sure to leave the registry URI configured to use one of the supported"
|
190
|
+
"schemes listed above."
|
191
|
+
)
|
192
|
+
|
193
|
+
|
194
|
+
_tracking_store_registry = TrackingStoreRegistry()
|
195
|
+
|
196
|
+
|
197
|
+
def _register_tracking_stores():
|
198
|
+
_tracking_store_registry.register("", _get_file_store)
|
199
|
+
_tracking_store_registry.register("file", _get_file_store)
|
200
|
+
_tracking_store_registry.register("databricks", _get_databricks_rest_store)
|
201
|
+
_tracking_store_registry.register(
|
202
|
+
_DATABRICKS_UNITY_CATALOG_SCHEME, _get_databricks_uc_rest_store
|
203
|
+
)
|
204
|
+
_tracking_store_registry.register(_OSS_UNITY_CATALOG_SCHEME, _get_databricks_uc_rest_store)
|
205
|
+
|
206
|
+
|
207
|
+
for scheme in ["http", "https"]:
|
208
|
+
_tracking_store_registry.register(scheme, _get_rest_store)
|
209
|
+
|
210
|
+
for scheme in DATABASE_ENGINES:
|
211
|
+
_tracking_store_registry.register(scheme, _get_sqlalchemy_store)
|
212
|
+
|
213
|
+
_tracking_store_registry.register_entrypoints()
|
214
|
+
|
215
|
+
|
216
|
+
def _register(scheme, builder):
|
217
|
+
_tracking_store_registry.register(scheme, builder)
|
218
|
+
|
219
|
+
|
220
|
+
_register_tracking_stores()
|
221
|
+
|
222
|
+
|
223
|
+
def _get_store(store_uri=None, artifact_uri=None):
|
224
|
+
return _tracking_store_registry.get_store(store_uri, artifact_uri)
|
225
|
+
|
226
|
+
|
227
|
+
_artifact_repos_cache = OrderedDict()
|
228
|
+
|
229
|
+
|
230
|
+
def _get_artifact_repo(run_id):
|
231
|
+
return _artifact_repos_cache.get(run_id)
|
232
|
+
|
233
|
+
|
234
|
+
# TODO(sueann): move to a projects utils module
|
235
|
+
def _get_git_url_if_present(uri):
|
236
|
+
"""Return the path git_uri#sub_directory if the URI passed is a local path that's part of
|
237
|
+
a Git repo, or returns the original URI otherwise.
|
238
|
+
|
239
|
+
Args:
|
240
|
+
uri: The expanded uri.
|
241
|
+
|
242
|
+
Returns:
|
243
|
+
The git_uri#sub_directory if the uri is part of a Git repo, otherwise return the original
|
244
|
+
uri.
|
245
|
+
"""
|
246
|
+
if "#" in uri:
|
247
|
+
# Already a URI in git repo format
|
248
|
+
return uri
|
249
|
+
try:
|
250
|
+
from git import GitCommandNotFound, InvalidGitRepositoryError, NoSuchPathError, Repo
|
251
|
+
except ImportError as e:
|
252
|
+
_logger.warning(
|
253
|
+
"Failed to import Git (the git executable is probably not on your PATH),"
|
254
|
+
" so Git SHA is not available. Error: %s",
|
255
|
+
e,
|
256
|
+
)
|
257
|
+
return uri
|
258
|
+
try:
|
259
|
+
# Check whether this is part of a git repo
|
260
|
+
repo = Repo(uri, search_parent_directories=True)
|
261
|
+
|
262
|
+
# Repo url
|
263
|
+
repo_url = f"file://{repo.working_tree_dir}"
|
264
|
+
|
265
|
+
# Sub directory
|
266
|
+
rlpath = uri.replace(repo.working_tree_dir, "")
|
267
|
+
if rlpath == "":
|
268
|
+
git_path = repo_url
|
269
|
+
elif rlpath[0] == "/":
|
270
|
+
git_path = repo_url + "#" + rlpath[1:]
|
271
|
+
else:
|
272
|
+
git_path = repo_url + "#" + rlpath
|
273
|
+
return git_path
|
274
|
+
except (InvalidGitRepositoryError, GitCommandNotFound, ValueError, NoSuchPathError):
|
275
|
+
return uri
|
@@ -0,0 +1,179 @@
|
|
1
|
+
"""
|
2
|
+
Utilities for dealing with artifacts in the context of a Run.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import os
|
6
|
+
import pathlib
|
7
|
+
import posixpath
|
8
|
+
import tempfile
|
9
|
+
import urllib.parse
|
10
|
+
import uuid
|
11
|
+
from typing import Any, Optional
|
12
|
+
|
13
|
+
from mlflow.exceptions import MlflowException
|
14
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
15
|
+
from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
|
16
|
+
from mlflow.store.artifact.dbfs_artifact_repo import DbfsRestArtifactRepository
|
17
|
+
from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
|
18
|
+
from mlflow.tracking._tracking_service.utils import _get_store
|
19
|
+
from mlflow.utils.file_utils import path_to_local_file_uri
|
20
|
+
from mlflow.utils.os import is_windows
|
21
|
+
from mlflow.utils.uri import add_databricks_profile_info_to_artifact_uri, append_to_uri_path
|
22
|
+
|
23
|
+
|
24
|
+
def get_artifact_uri(run_id, artifact_path=None, tracking_uri=None):
|
25
|
+
"""Get the absolute URI of the specified artifact in the specified run. If `path` is not
|
26
|
+
specified the artifact root URI of the specified run will be returned; calls to ``log_artifact``
|
27
|
+
and ``log_artifacts`` write artifact(s) to subdirectories of the artifact root URI.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
run_id: The ID of the run for which to obtain an absolute artifact URI.
|
31
|
+
artifact_path: The run-relative artifact path. For example,
|
32
|
+
``path/to/artifact``. If unspecified, the artifact root URI for the
|
33
|
+
specified run will be returned.
|
34
|
+
tracking_uri: The tracking URI from which to get the run and its artifact location. If
|
35
|
+
not given, the current default tracking URI is used.
|
36
|
+
|
37
|
+
Returns:
|
38
|
+
An *absolute* URI referring to the specified artifact or the specified run's artifact
|
39
|
+
root. For example, if an artifact path is provided and the specified run uses an
|
40
|
+
S3-backed store, this may be a uri of the form
|
41
|
+
``s3://<bucket_name>/path/to/artifact/root/path/to/artifact``. If an artifact path
|
42
|
+
is not provided and the specified run uses an S3-backed store, this may be a URI of
|
43
|
+
the form ``s3://<bucket_name>/path/to/artifact/root``.
|
44
|
+
|
45
|
+
"""
|
46
|
+
if not run_id:
|
47
|
+
raise MlflowException(
|
48
|
+
message="A run_id must be specified in order to obtain an artifact uri!",
|
49
|
+
error_code=INVALID_PARAMETER_VALUE,
|
50
|
+
)
|
51
|
+
|
52
|
+
store = _get_store(tracking_uri)
|
53
|
+
run = store.get_run(run_id)
|
54
|
+
# Maybe move this method to RunsArtifactRepository so the circular dependency is clearer.
|
55
|
+
assert urllib.parse.urlparse(run.info.artifact_uri).scheme != "runs" # avoid an infinite loop
|
56
|
+
if artifact_path is None:
|
57
|
+
return run.info.artifact_uri
|
58
|
+
else:
|
59
|
+
return append_to_uri_path(run.info.artifact_uri, artifact_path)
|
60
|
+
|
61
|
+
|
62
|
+
# TODO: This would be much simpler if artifact_repo.download_artifacts could take the absolute path
|
63
|
+
# or no path.
|
64
|
+
def _get_root_uri_and_artifact_path(artifact_uri):
|
65
|
+
"""Parse the artifact_uri to get the root_uri and artifact_path.
|
66
|
+
|
67
|
+
Args:
|
68
|
+
artifact_uri: The *absolute* URI of the artifact.
|
69
|
+
"""
|
70
|
+
if os.path.exists(artifact_uri):
|
71
|
+
if not is_windows():
|
72
|
+
# If we're dealing with local files, just reference the direct pathing.
|
73
|
+
# non-nt-based file systems can directly reference path information, while nt-based
|
74
|
+
# systems need to url-encode special characters in directory listings to be able to
|
75
|
+
# resolve them (i.e., spaces converted to %20 within a file name or path listing)
|
76
|
+
root_uri = os.path.dirname(artifact_uri)
|
77
|
+
artifact_path = os.path.basename(artifact_uri)
|
78
|
+
return root_uri, artifact_path
|
79
|
+
else: # if we're dealing with nt-based systems, we need to utilize pathname2url to encode.
|
80
|
+
artifact_uri = path_to_local_file_uri(artifact_uri)
|
81
|
+
|
82
|
+
parsed_uri = urllib.parse.urlparse(str(artifact_uri))
|
83
|
+
prefix = ""
|
84
|
+
if parsed_uri.scheme and not parsed_uri.path.startswith("/"):
|
85
|
+
# relative path is a special case, urllib does not reconstruct it properly
|
86
|
+
prefix = parsed_uri.scheme + ":"
|
87
|
+
parsed_uri = parsed_uri._replace(scheme="")
|
88
|
+
|
89
|
+
# For models:/ URIs, it doesn't make sense to initialize a ModelsArtifactRepository with only
|
90
|
+
# the model name portion of the URI, then call download_artifacts with the version info.
|
91
|
+
if ModelsArtifactRepository.is_models_uri(artifact_uri):
|
92
|
+
root_uri, artifact_path = ModelsArtifactRepository.split_models_uri(artifact_uri)
|
93
|
+
else:
|
94
|
+
artifact_path = posixpath.basename(parsed_uri.path)
|
95
|
+
parsed_uri = parsed_uri._replace(path=posixpath.dirname(parsed_uri.path))
|
96
|
+
root_uri = prefix + urllib.parse.urlunparse(parsed_uri)
|
97
|
+
return root_uri, artifact_path
|
98
|
+
|
99
|
+
|
100
|
+
def _download_artifact_from_uri(
|
101
|
+
artifact_uri: str,
|
102
|
+
output_path: Optional[str] = None,
|
103
|
+
lineage_header_info: Optional[dict[str, Any]] = None,
|
104
|
+
tracking_uri: Optional[str] = None,
|
105
|
+
) -> str:
|
106
|
+
"""
|
107
|
+
Args:
|
108
|
+
artifact_uri: The *absolute* URI of the artifact to download.
|
109
|
+
output_path: The local filesystem path to which to download the artifact. If unspecified,
|
110
|
+
a local output path will be created.
|
111
|
+
lineage_header_info: The model lineage header info to be consumed by lineage services.
|
112
|
+
tracking_uri: The tracking URI to be used when downloading artifacts.
|
113
|
+
"""
|
114
|
+
root_uri, artifact_path = _get_root_uri_and_artifact_path(artifact_uri)
|
115
|
+
repo = get_artifact_repository(artifact_uri=root_uri, tracking_uri=tracking_uri)
|
116
|
+
|
117
|
+
try:
|
118
|
+
if isinstance(repo, ModelsArtifactRepository):
|
119
|
+
return repo.download_artifacts(
|
120
|
+
artifact_path=artifact_path,
|
121
|
+
dst_path=output_path,
|
122
|
+
lineage_header_info=lineage_header_info,
|
123
|
+
)
|
124
|
+
return repo.download_artifacts(artifact_path=artifact_path, dst_path=output_path)
|
125
|
+
except Exception as e:
|
126
|
+
if artifact_uri.startswith("m-"):
|
127
|
+
# When a Model ID like string is passed, suggest using 'models:/{artifact_uri}' instead.
|
128
|
+
raise MlflowException(
|
129
|
+
f"Invalid uri `{artifact_uri}` is passed. Maybe you meant 'models:/{artifact_uri}'?"
|
130
|
+
) from e
|
131
|
+
raise
|
132
|
+
|
133
|
+
|
134
|
+
def _upload_artifact_to_uri(local_path, artifact_uri):
|
135
|
+
"""Uploads a local artifact (file) to a specified URI.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
local_path: The local path of the file to upload.
|
139
|
+
artifact_uri: The *absolute* URI of the path to upload the artifact to.
|
140
|
+
|
141
|
+
"""
|
142
|
+
root_uri, artifact_path = _get_root_uri_and_artifact_path(artifact_uri)
|
143
|
+
get_artifact_repository(artifact_uri=root_uri).log_artifact(local_path, artifact_path)
|
144
|
+
|
145
|
+
|
146
|
+
def _upload_artifacts_to_databricks(
|
147
|
+
source, run_id, source_host_uri=None, target_databricks_profile_uri=None
|
148
|
+
):
|
149
|
+
"""Copy the artifacts from ``source`` to the destination Databricks workspace (DBFS) given by
|
150
|
+
``databricks_profile_uri`` or the current tracking URI.
|
151
|
+
|
152
|
+
Args:
|
153
|
+
source: Source location for the artifacts to copy.
|
154
|
+
run_id: Run ID to associate the artifacts with.
|
155
|
+
source_host_uri: Specifies the source artifact's host URI (e.g. Databricks tracking URI)
|
156
|
+
if applicable. If not given, defaults to the current tracking URI.
|
157
|
+
target_databricks_profile_uri: Specifies the destination Databricks host. If not given,
|
158
|
+
defaults to the current tracking URI.
|
159
|
+
|
160
|
+
Returns:
|
161
|
+
The DBFS location in the target Databricks workspace the model files have been
|
162
|
+
uploaded to.
|
163
|
+
"""
|
164
|
+
|
165
|
+
with tempfile.TemporaryDirectory() as local_dir:
|
166
|
+
source_with_profile = add_databricks_profile_info_to_artifact_uri(source, source_host_uri)
|
167
|
+
_download_artifact_from_uri(source_with_profile, local_dir)
|
168
|
+
dest_root = "dbfs:/databricks/mlflow/tmp-external-source/"
|
169
|
+
dest_root_with_profile = add_databricks_profile_info_to_artifact_uri(
|
170
|
+
dest_root, target_databricks_profile_uri
|
171
|
+
)
|
172
|
+
dest_repo = DbfsRestArtifactRepository(dest_root_with_profile)
|
173
|
+
dest_artifact_path = run_id if run_id else uuid.uuid4().hex
|
174
|
+
# Allow uploading from the same run id multiple times by randomizing a suffix
|
175
|
+
if len(dest_repo.list_artifacts(dest_artifact_path)) > 0:
|
176
|
+
dest_artifact_path = dest_artifact_path + "-" + uuid.uuid4().hex[0:4]
|
177
|
+
dest_repo.log_artifacts(local_dir, artifact_path=dest_artifact_path)
|
178
|
+
dirname = pathlib.PurePath(source).name # innermost directory name
|
179
|
+
return posixpath.join(dest_root, dest_artifact_path, dirname) # new source
|