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
mlflow/store/db/utils.py
ADDED
@@ -0,0 +1,314 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
import time
|
4
|
+
from contextlib import contextmanager
|
5
|
+
|
6
|
+
import sqlalchemy
|
7
|
+
from alembic.migration import MigrationContext
|
8
|
+
from alembic.script import ScriptDirectory
|
9
|
+
from sqlalchemy import sql
|
10
|
+
|
11
|
+
# We need to import sqlalchemy.pool to convert poolclass string to class object
|
12
|
+
from sqlalchemy.pool import (
|
13
|
+
AssertionPool,
|
14
|
+
AsyncAdaptedQueuePool,
|
15
|
+
FallbackAsyncAdaptedQueuePool,
|
16
|
+
NullPool,
|
17
|
+
QueuePool,
|
18
|
+
SingletonThreadPool,
|
19
|
+
StaticPool,
|
20
|
+
)
|
21
|
+
|
22
|
+
from mlflow.environment_variables import (
|
23
|
+
MLFLOW_MYSQL_SSL_CA,
|
24
|
+
MLFLOW_MYSQL_SSL_CERT,
|
25
|
+
MLFLOW_MYSQL_SSL_KEY,
|
26
|
+
MLFLOW_SQLALCHEMYSTORE_ECHO,
|
27
|
+
MLFLOW_SQLALCHEMYSTORE_MAX_OVERFLOW,
|
28
|
+
MLFLOW_SQLALCHEMYSTORE_POOL_RECYCLE,
|
29
|
+
MLFLOW_SQLALCHEMYSTORE_POOL_SIZE,
|
30
|
+
MLFLOW_SQLALCHEMYSTORE_POOLCLASS,
|
31
|
+
)
|
32
|
+
from mlflow.exceptions import MlflowException
|
33
|
+
from mlflow.protos.databricks_pb2 import (
|
34
|
+
BAD_REQUEST,
|
35
|
+
INTERNAL_ERROR,
|
36
|
+
TEMPORARILY_UNAVAILABLE,
|
37
|
+
)
|
38
|
+
from mlflow.store.db.db_types import SQLITE
|
39
|
+
from mlflow.store.model_registry.dbmodels.models import (
|
40
|
+
SqlModelVersion,
|
41
|
+
SqlModelVersionTag,
|
42
|
+
SqlRegisteredModel,
|
43
|
+
SqlRegisteredModelAlias,
|
44
|
+
SqlRegisteredModelTag,
|
45
|
+
)
|
46
|
+
from mlflow.store.tracking.dbmodels.initial_models import Base as InitialBase
|
47
|
+
from mlflow.store.tracking.dbmodels.models import (
|
48
|
+
SqlDataset,
|
49
|
+
SqlExperiment,
|
50
|
+
SqlExperimentTag,
|
51
|
+
SqlInput,
|
52
|
+
SqlInputTag,
|
53
|
+
SqlLatestMetric,
|
54
|
+
SqlMetric,
|
55
|
+
SqlParam,
|
56
|
+
SqlRun,
|
57
|
+
SqlTag,
|
58
|
+
SqlTraceInfo,
|
59
|
+
SqlTraceMetadata,
|
60
|
+
SqlTraceTag,
|
61
|
+
)
|
62
|
+
|
63
|
+
_logger = logging.getLogger(__name__)
|
64
|
+
|
65
|
+
MAX_RETRY_COUNT = 10
|
66
|
+
|
67
|
+
|
68
|
+
def _get_package_dir():
|
69
|
+
"""Returns directory containing MLflow python package."""
|
70
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
71
|
+
return os.path.normpath(os.path.join(current_dir, os.pardir, os.pardir))
|
72
|
+
|
73
|
+
|
74
|
+
def _all_tables_exist(engine):
|
75
|
+
return {
|
76
|
+
t
|
77
|
+
for t in sqlalchemy.inspect(engine).get_table_names()
|
78
|
+
# Filter out alembic tables
|
79
|
+
if not t.startswith("alembic_")
|
80
|
+
} == {
|
81
|
+
SqlExperiment.__tablename__,
|
82
|
+
SqlRun.__tablename__,
|
83
|
+
SqlMetric.__tablename__,
|
84
|
+
SqlParam.__tablename__,
|
85
|
+
SqlTag.__tablename__,
|
86
|
+
SqlExperimentTag.__tablename__,
|
87
|
+
SqlLatestMetric.__tablename__,
|
88
|
+
SqlRegisteredModel.__tablename__,
|
89
|
+
SqlModelVersion.__tablename__,
|
90
|
+
SqlRegisteredModelTag.__tablename__,
|
91
|
+
SqlModelVersionTag.__tablename__,
|
92
|
+
SqlRegisteredModelAlias.__tablename__,
|
93
|
+
SqlDataset.__tablename__,
|
94
|
+
SqlInput.__tablename__,
|
95
|
+
SqlInputTag.__tablename__,
|
96
|
+
SqlTraceInfo.__tablename__,
|
97
|
+
SqlTraceTag.__tablename__,
|
98
|
+
SqlTraceMetadata.__tablename__,
|
99
|
+
}
|
100
|
+
|
101
|
+
|
102
|
+
def _initialize_tables(engine):
|
103
|
+
_logger.info("Creating initial MLflow database tables...")
|
104
|
+
InitialBase.metadata.create_all(engine)
|
105
|
+
_upgrade_db(engine)
|
106
|
+
|
107
|
+
|
108
|
+
def _get_latest_schema_revision():
|
109
|
+
"""Get latest schema revision as a string."""
|
110
|
+
# We aren't executing any commands against a DB, so we leave the DB URL unspecified
|
111
|
+
config = _get_alembic_config(db_url="")
|
112
|
+
script = ScriptDirectory.from_config(config)
|
113
|
+
heads = script.get_heads()
|
114
|
+
if len(heads) != 1:
|
115
|
+
raise MlflowException(
|
116
|
+
f"Migration script directory was in unexpected state. Got {len(heads)} head "
|
117
|
+
f"database versions but expected only 1. Found versions: {heads}"
|
118
|
+
)
|
119
|
+
return heads[0]
|
120
|
+
|
121
|
+
|
122
|
+
def _verify_schema(engine):
|
123
|
+
head_revision = _get_latest_schema_revision()
|
124
|
+
current_rev = _get_schema_version(engine)
|
125
|
+
if current_rev != head_revision:
|
126
|
+
raise MlflowException(
|
127
|
+
f"Detected out-of-date database schema (found version {current_rev}, "
|
128
|
+
f"but expected {head_revision}). Take a backup of your database, then run "
|
129
|
+
"'mlflow db upgrade <database_uri>' "
|
130
|
+
"to migrate your database to the latest schema. NOTE: schema migration may "
|
131
|
+
"result in database downtime - please consult your database's documentation for "
|
132
|
+
"more detail."
|
133
|
+
)
|
134
|
+
|
135
|
+
|
136
|
+
def _get_managed_session_maker(SessionMaker, db_type):
|
137
|
+
"""
|
138
|
+
Creates a factory for producing exception-safe SQLAlchemy sessions that are made available
|
139
|
+
using a context manager. Any session produced by this factory is automatically committed
|
140
|
+
if no exceptions are encountered within its associated context. If an exception is
|
141
|
+
encountered, the session is rolled back. Finally, any session produced by this factory is
|
142
|
+
automatically closed when the session's associated context is exited.
|
143
|
+
"""
|
144
|
+
|
145
|
+
@contextmanager
|
146
|
+
def make_managed_session():
|
147
|
+
"""Provide a transactional scope around a series of operations."""
|
148
|
+
with SessionMaker() as session:
|
149
|
+
try:
|
150
|
+
if db_type == SQLITE:
|
151
|
+
session.execute(sql.text("PRAGMA foreign_keys = ON;"))
|
152
|
+
session.execute(sql.text("PRAGMA busy_timeout = 20000;"))
|
153
|
+
session.execute(sql.text("PRAGMA case_sensitive_like = true;"))
|
154
|
+
yield session
|
155
|
+
session.commit()
|
156
|
+
except MlflowException:
|
157
|
+
session.rollback()
|
158
|
+
raise
|
159
|
+
except sqlalchemy.exc.OperationalError as e:
|
160
|
+
session.rollback()
|
161
|
+
_logger.exception(
|
162
|
+
"SQLAlchemy database error. The following exception is caught.\n%s",
|
163
|
+
e,
|
164
|
+
)
|
165
|
+
raise MlflowException(message=e, error_code=TEMPORARILY_UNAVAILABLE) from e
|
166
|
+
except sqlalchemy.exc.SQLAlchemyError as e:
|
167
|
+
session.rollback()
|
168
|
+
raise MlflowException(message=e, error_code=BAD_REQUEST) from e
|
169
|
+
except Exception as e:
|
170
|
+
session.rollback()
|
171
|
+
raise MlflowException(message=e, error_code=INTERNAL_ERROR) from e
|
172
|
+
|
173
|
+
return make_managed_session
|
174
|
+
|
175
|
+
|
176
|
+
def _get_alembic_config(db_url, alembic_dir=None):
|
177
|
+
"""
|
178
|
+
Constructs an alembic Config object referencing the specified database and migration script
|
179
|
+
directory.
|
180
|
+
|
181
|
+
Args:
|
182
|
+
db_url: Database URL, like sqlite:///<absolute-path-to-local-db-file>. See
|
183
|
+
https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls for a full list of
|
184
|
+
valid database URLs.
|
185
|
+
alembic_dir: Path to migration script directory. Uses canonical migration script
|
186
|
+
directory under mlflow/alembic if unspecified. TODO: remove this argument in MLflow 1.1,
|
187
|
+
as it's only used to run special migrations for pre-1.0 users to remove duplicate
|
188
|
+
constraint names.
|
189
|
+
"""
|
190
|
+
from alembic.config import Config
|
191
|
+
|
192
|
+
final_alembic_dir = (
|
193
|
+
os.path.join(_get_package_dir(), "store", "db_migrations")
|
194
|
+
if alembic_dir is None
|
195
|
+
else alembic_dir
|
196
|
+
)
|
197
|
+
# Escape any '%' that appears in a db_url. This could be in a password,
|
198
|
+
# url, or anything that is part of a potentially complex database url
|
199
|
+
db_url = db_url.replace("%", "%%")
|
200
|
+
config = Config(os.path.join(final_alembic_dir, "alembic.ini"))
|
201
|
+
config.set_main_option("script_location", final_alembic_dir)
|
202
|
+
config.set_main_option("sqlalchemy.url", db_url)
|
203
|
+
return config
|
204
|
+
|
205
|
+
|
206
|
+
def _upgrade_db(engine): # noqa: D417
|
207
|
+
"""
|
208
|
+
Upgrade the schema of an MLflow tracking database to the latest supported version.
|
209
|
+
Note that schema migrations can be slow and are not guaranteed to be transactional -
|
210
|
+
we recommend taking a backup of your database before running migrations.
|
211
|
+
|
212
|
+
Args:
|
213
|
+
url: Database URL, like sqlite:///<absolute-path-to-local-db-file>. See
|
214
|
+
https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls for a full list of
|
215
|
+
valid database URLs.
|
216
|
+
"""
|
217
|
+
# alembic adds significant import time, so we import it lazily
|
218
|
+
from alembic import command
|
219
|
+
|
220
|
+
db_url = str(engine.url)
|
221
|
+
_logger.info("Updating database tables")
|
222
|
+
config = _get_alembic_config(db_url)
|
223
|
+
# Initialize a shared connection to be used for the database upgrade, ensuring that
|
224
|
+
# any connection-dependent state (e.g., the state of an in-memory database) is preserved
|
225
|
+
# for reference by the upgrade routine. For more information, see
|
226
|
+
# https://alembic.sqlalchemy.org/en/latest/cookbook.html#sharing-a-
|
227
|
+
# connection-with-a-series-of-migration-commands-and-environments
|
228
|
+
with engine.begin() as connection:
|
229
|
+
config.attributes["connection"] = connection
|
230
|
+
command.upgrade(config, "heads")
|
231
|
+
|
232
|
+
|
233
|
+
def _get_schema_version(engine):
|
234
|
+
with engine.connect() as connection:
|
235
|
+
mc = MigrationContext.configure(connection)
|
236
|
+
return mc.get_current_revision()
|
237
|
+
|
238
|
+
|
239
|
+
def create_sqlalchemy_engine_with_retry(db_uri):
|
240
|
+
attempts = 0
|
241
|
+
while True:
|
242
|
+
attempts += 1
|
243
|
+
engine = create_sqlalchemy_engine(db_uri)
|
244
|
+
try:
|
245
|
+
sqlalchemy.inspect(engine)
|
246
|
+
return engine
|
247
|
+
except Exception as e:
|
248
|
+
if attempts < MAX_RETRY_COUNT:
|
249
|
+
sleep_duration = 0.1 * ((2**attempts) - 1)
|
250
|
+
_logger.warning(
|
251
|
+
"SQLAlchemy engine could not be created. The following exception is caught.\n"
|
252
|
+
"%s\nOperation will be retried in %.1f seconds",
|
253
|
+
e,
|
254
|
+
sleep_duration,
|
255
|
+
)
|
256
|
+
time.sleep(sleep_duration)
|
257
|
+
continue
|
258
|
+
raise
|
259
|
+
|
260
|
+
|
261
|
+
def create_sqlalchemy_engine(db_uri):
|
262
|
+
pool_size = MLFLOW_SQLALCHEMYSTORE_POOL_SIZE.get()
|
263
|
+
pool_max_overflow = MLFLOW_SQLALCHEMYSTORE_MAX_OVERFLOW.get()
|
264
|
+
pool_recycle = MLFLOW_SQLALCHEMYSTORE_POOL_RECYCLE.get()
|
265
|
+
echo = MLFLOW_SQLALCHEMYSTORE_ECHO.get()
|
266
|
+
poolclass = MLFLOW_SQLALCHEMYSTORE_POOLCLASS.get()
|
267
|
+
kwargs = {}
|
268
|
+
# Send argument only if they have been injected.
|
269
|
+
# Some engine does not support them (for example sqllite)
|
270
|
+
if pool_size:
|
271
|
+
kwargs["pool_size"] = pool_size
|
272
|
+
if pool_max_overflow:
|
273
|
+
kwargs["max_overflow"] = pool_max_overflow
|
274
|
+
if pool_recycle:
|
275
|
+
kwargs["pool_recycle"] = pool_recycle
|
276
|
+
if echo:
|
277
|
+
kwargs["echo"] = echo
|
278
|
+
if poolclass:
|
279
|
+
pool_class_map = {
|
280
|
+
"AssertionPool": AssertionPool,
|
281
|
+
"AsyncAdaptedQueuePool": AsyncAdaptedQueuePool,
|
282
|
+
"FallbackAsyncAdaptedQueuePool": FallbackAsyncAdaptedQueuePool,
|
283
|
+
"NullPool": NullPool,
|
284
|
+
"QueuePool": QueuePool,
|
285
|
+
"SingletonThreadPool": SingletonThreadPool,
|
286
|
+
"StaticPool": StaticPool,
|
287
|
+
}
|
288
|
+
if poolclass not in pool_class_map:
|
289
|
+
list_str = " ".join(pool_class_map.keys())
|
290
|
+
err_str = (
|
291
|
+
f"Invalid poolclass parameter: {poolclass}. Set environment variable "
|
292
|
+
f"poolclass to empty or one of the following values: {list_str}"
|
293
|
+
)
|
294
|
+
_logger.warning(err_str)
|
295
|
+
raise ValueError(err_str)
|
296
|
+
kwargs["poolclass"] = pool_class_map[poolclass]
|
297
|
+
if kwargs:
|
298
|
+
_logger.info("Create SQLAlchemy engine with pool options %s", kwargs)
|
299
|
+
|
300
|
+
# Handle MySQL SSL certificates via connect_args
|
301
|
+
if db_uri.startswith("mysql"):
|
302
|
+
connect_args = {
|
303
|
+
k: v
|
304
|
+
for k, v in {
|
305
|
+
"ssl_ca": MLFLOW_MYSQL_SSL_CA.get(),
|
306
|
+
"ssl_cert": MLFLOW_MYSQL_SSL_CERT.get(),
|
307
|
+
"ssl_key": MLFLOW_MYSQL_SSL_KEY.get(),
|
308
|
+
}.items()
|
309
|
+
if v
|
310
|
+
}
|
311
|
+
if connect_args:
|
312
|
+
kwargs["connect_args"] = connect_args
|
313
|
+
|
314
|
+
return sqlalchemy.create_engine(db_uri, pool_pre_ping=True, **kwargs)
|
File without changes
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# A generic, single database configuration.
|
2
|
+
|
3
|
+
[alembic]
|
4
|
+
# path to migration scripts
|
5
|
+
script_location = mlflow/store/db_migrations
|
6
|
+
|
7
|
+
# template used to generate migration files
|
8
|
+
# file_template = %%(rev)s_%%(slug)s
|
9
|
+
|
10
|
+
# timezone to use when rendering the date
|
11
|
+
# within the migration file as well as the filename.
|
12
|
+
# string value is passed to dateutil.tz.gettz()
|
13
|
+
# leave blank for localtime
|
14
|
+
# timezone =
|
15
|
+
|
16
|
+
# max length of characters to apply to the
|
17
|
+
# "slug" field
|
18
|
+
# truncate_slug_length = 40
|
19
|
+
|
20
|
+
# set to 'true' to run the environment during
|
21
|
+
# the 'revision' command, regardless of autogenerate
|
22
|
+
# revision_environment = false
|
23
|
+
|
24
|
+
# set to 'true' to allow .pyc and .pyo files without
|
25
|
+
# a source .py file to be detected as revisions in the
|
26
|
+
# versions/ directory
|
27
|
+
# sourceless = false
|
28
|
+
|
29
|
+
# version location specification; this defaults
|
30
|
+
# to alembic/versions. When using multiple version
|
31
|
+
# directories, initial revisions must be specified with --version-path
|
32
|
+
# version_locations = %(here)s/bar %(here)s/bat alembic/versions
|
33
|
+
|
34
|
+
# the output encoding used when revision files
|
35
|
+
# are written from script.py.mako
|
36
|
+
# output_encoding = utf-8
|
37
|
+
|
38
|
+
sqlalchemy.url = ""
|
39
|
+
|
40
|
+
|
41
|
+
# Logging configuration
|
42
|
+
[loggers]
|
43
|
+
keys = root,sqlalchemy,alembic
|
44
|
+
|
45
|
+
[handlers]
|
46
|
+
keys = console
|
47
|
+
|
48
|
+
[formatters]
|
49
|
+
keys = generic
|
50
|
+
|
51
|
+
[logger_root]
|
52
|
+
level = WARN
|
53
|
+
handlers = console
|
54
|
+
qualname =
|
55
|
+
|
56
|
+
[logger_sqlalchemy]
|
57
|
+
level = WARN
|
58
|
+
handlers =
|
59
|
+
qualname = sqlalchemy.engine
|
60
|
+
|
61
|
+
[logger_alembic]
|
62
|
+
level = INFO
|
63
|
+
handlers =
|
64
|
+
qualname = alembic
|
65
|
+
|
66
|
+
[handler_console]
|
67
|
+
class = StreamHandler
|
68
|
+
args = (sys.stderr,)
|
69
|
+
level = NOTSET
|
70
|
+
formatter = generic
|
71
|
+
|
72
|
+
[formatter_generic]
|
73
|
+
format = %(levelname)-5.5s [%(name)s] %(message)s
|
74
|
+
datefmt = %H:%M:%S
|
@@ -0,0 +1,84 @@
|
|
1
|
+
from logging.config import fileConfig
|
2
|
+
|
3
|
+
from alembic import context
|
4
|
+
from sqlalchemy import engine_from_config, pool
|
5
|
+
|
6
|
+
# this is the Alembic Config object, which provides
|
7
|
+
# access to the values within the .ini file in use.
|
8
|
+
config = context.config
|
9
|
+
|
10
|
+
# Interpret the config file for Python logging.
|
11
|
+
# This line sets up loggers basically.
|
12
|
+
fileConfig(config.config_file_name, disable_existing_loggers=False)
|
13
|
+
|
14
|
+
# add your model's MetaData object here
|
15
|
+
# for 'autogenerate' support
|
16
|
+
# from myapp import mymodel
|
17
|
+
# target_metadata = mymodel.Base.metadata
|
18
|
+
from mlflow.store.db.base_sql_model import Base
|
19
|
+
|
20
|
+
target_metadata = Base.metadata
|
21
|
+
|
22
|
+
# other values from the config, defined by the needs of env.py,
|
23
|
+
# can be acquired:
|
24
|
+
# my_important_option = config.get_main_option("my_important_option")
|
25
|
+
# ... etc.
|
26
|
+
|
27
|
+
|
28
|
+
def run_migrations_offline():
|
29
|
+
"""Run migrations in 'offline' mode.
|
30
|
+
|
31
|
+
This configures the context with just a URL
|
32
|
+
and not an Engine, though an Engine is acceptable
|
33
|
+
here as well. By skipping the Engine creation
|
34
|
+
we don't even need a DBAPI to be available.
|
35
|
+
|
36
|
+
Calls to context.execute() here emit the given string to the
|
37
|
+
script output.
|
38
|
+
|
39
|
+
"""
|
40
|
+
url = config.get_main_option("sqlalchemy.url")
|
41
|
+
# Try https://stackoverflow.com/questions/30378233/sqlite-lack-of-alter-support-alembic-migration-failing-because-of-this-solutio
|
42
|
+
context.configure(
|
43
|
+
url=url, target_metadata=target_metadata, literal_binds=True, render_as_batch=True
|
44
|
+
)
|
45
|
+
|
46
|
+
with context.begin_transaction():
|
47
|
+
context.run_migrations()
|
48
|
+
|
49
|
+
|
50
|
+
def run_migrations_online():
|
51
|
+
"""Run migrations in 'online' mode.
|
52
|
+
|
53
|
+
In this scenario we need to create an Engine
|
54
|
+
and associate a connection with the context.
|
55
|
+
|
56
|
+
"""
|
57
|
+
# If available, use a shared connection for the database upgrade, ensuring that any
|
58
|
+
# connection-dependent state (e.g., the state of an in-memory database) is preserved
|
59
|
+
# for reference by the upgrade routine. For more information, see
|
60
|
+
# https://alembic.sqlalchemy.org/en/latest/cookbook.html#sharing-a-
|
61
|
+
# connection-with-a-series-of-migration-commands-and-environments
|
62
|
+
connection = config.attributes.get("connection")
|
63
|
+
if connection is None:
|
64
|
+
engine = engine_from_config(
|
65
|
+
config.get_section(config.config_ini_section),
|
66
|
+
prefix="sqlalchemy.",
|
67
|
+
poolclass=pool.NullPool,
|
68
|
+
)
|
69
|
+
else:
|
70
|
+
engine = connection.engine
|
71
|
+
|
72
|
+
with engine.connect() as connection:
|
73
|
+
context.configure(
|
74
|
+
connection=connection, target_metadata=target_metadata, render_as_batch=True
|
75
|
+
)
|
76
|
+
|
77
|
+
with context.begin_transaction():
|
78
|
+
context.run_migrations()
|
79
|
+
|
80
|
+
|
81
|
+
if context.is_offline_mode():
|
82
|
+
run_migrations_offline()
|
83
|
+
else:
|
84
|
+
run_migrations_online()
|
@@ -0,0 +1,88 @@
|
|
1
|
+
"""add cascading deletion to datasets from experiments
|
2
|
+
|
3
|
+
Revision ID: 0584bdc529eb
|
4
|
+
Revises: f5a4f2784254
|
5
|
+
Create Date: 2024-11-11 15:27:53.189685
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
import sqlalchemy as sa
|
10
|
+
from alembic import op
|
11
|
+
|
12
|
+
from mlflow.exceptions import MlflowException
|
13
|
+
from mlflow.store.tracking.dbmodels.models import SqlDataset, SqlExperiment
|
14
|
+
|
15
|
+
# revision identifiers, used by Alembic.
|
16
|
+
revision = "0584bdc529eb"
|
17
|
+
down_revision = "f5a4f2784254"
|
18
|
+
branch_labels = None
|
19
|
+
depends_on = None
|
20
|
+
|
21
|
+
|
22
|
+
def get_datasets_experiment_fk_name():
|
23
|
+
conn = op.get_bind()
|
24
|
+
metadata = sa.MetaData()
|
25
|
+
metadata.bind = conn
|
26
|
+
datasets_table = sa.Table(
|
27
|
+
SqlDataset.__tablename__,
|
28
|
+
metadata,
|
29
|
+
autoload_with=conn,
|
30
|
+
)
|
31
|
+
|
32
|
+
for constraint in datasets_table.foreign_key_constraints:
|
33
|
+
if (
|
34
|
+
constraint.referred_table.name == SqlExperiment.__tablename__
|
35
|
+
and constraint.column_keys[0] == "experiment_id"
|
36
|
+
):
|
37
|
+
return constraint.name
|
38
|
+
|
39
|
+
raise MlflowException(
|
40
|
+
"Unable to find the foreign key constraint name from datasets to experiments. "
|
41
|
+
"All foreign key constraints in datasets table: \n"
|
42
|
+
f"{datasets_table.foreign_key_constraints}"
|
43
|
+
)
|
44
|
+
|
45
|
+
|
46
|
+
def upgrade():
|
47
|
+
dialect_name = op.get_context().dialect.name
|
48
|
+
|
49
|
+
# standardize the constraint to sqlite naming convention
|
50
|
+
new_fk_constraint_name = (
|
51
|
+
f"fk_{SqlDataset.__tablename__}_experiment_id_{SqlExperiment.__tablename__}"
|
52
|
+
)
|
53
|
+
|
54
|
+
if dialect_name == "sqlite":
|
55
|
+
# Only way to drop unnamed fk constraint in sqllite
|
56
|
+
# See https://alembic.sqlalchemy.org/en/latest/batch.html#dropping-unnamed-or-named-foreign-key-constraints
|
57
|
+
with op.batch_alter_table(
|
58
|
+
SqlDataset.__tablename__,
|
59
|
+
schema=None,
|
60
|
+
naming_convention={
|
61
|
+
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
|
62
|
+
},
|
63
|
+
) as batch_op:
|
64
|
+
# in SQLite, constraint.name is None, so we have to hardcode it
|
65
|
+
batch_op.drop_constraint(new_fk_constraint_name, type_="foreignkey")
|
66
|
+
# Need to explicitly name the fk constraint with batch alter table
|
67
|
+
batch_op.create_foreign_key(
|
68
|
+
new_fk_constraint_name,
|
69
|
+
SqlExperiment.__tablename__,
|
70
|
+
["experiment_id"],
|
71
|
+
["experiment_id"],
|
72
|
+
ondelete="CASCADE",
|
73
|
+
)
|
74
|
+
else:
|
75
|
+
old_fk_constraint_name = get_datasets_experiment_fk_name()
|
76
|
+
op.drop_constraint(old_fk_constraint_name, SqlDataset.__tablename__, type_="foreignkey")
|
77
|
+
op.create_foreign_key(
|
78
|
+
new_fk_constraint_name,
|
79
|
+
SqlDataset.__tablename__,
|
80
|
+
SqlExperiment.__tablename__,
|
81
|
+
["experiment_id"],
|
82
|
+
["experiment_id"],
|
83
|
+
ondelete="CASCADE",
|
84
|
+
)
|
85
|
+
|
86
|
+
|
87
|
+
def downgrade():
|
88
|
+
pass
|
@@ -0,0 +1,49 @@
|
|
1
|
+
"""drop_duplicate_killed_constraint
|
2
|
+
|
3
|
+
Revision ID: 0a8213491aaa
|
4
|
+
Revises: cfd24bdc0731
|
5
|
+
Create Date: 2020-01-28 15:26:14.757445
|
6
|
+
|
7
|
+
This migration drops a duplicate constraint on the `runs.status` column that was left as a byproduct
|
8
|
+
of an erroneous implementation of the `cfd24bdc0731_update_run_status_constraint_with_killed`
|
9
|
+
migration in MLflow 1.5. The implementation of this migration has since been fixed.
|
10
|
+
"""
|
11
|
+
|
12
|
+
import logging
|
13
|
+
|
14
|
+
from alembic import op
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
# revision identifiers, used by Alembic.
|
19
|
+
revision = "0a8213491aaa"
|
20
|
+
down_revision = "cfd24bdc0731"
|
21
|
+
branch_labels = None
|
22
|
+
depends_on = None
|
23
|
+
|
24
|
+
|
25
|
+
def upgrade():
|
26
|
+
# Attempt to drop any existing `status` constraints on the `runs` table. This operation
|
27
|
+
# may fail against certain backends with different classes of Exception. For example,
|
28
|
+
# in MySQL <= 8.0.15, dropping constraints produces an invalid `ALTER TABLE` expression.
|
29
|
+
# Further, in certain versions of sqlite, `ALTER` (which is invoked by `drop_constraint`)
|
30
|
+
# is unsupported on `CHECK` constraints. Accordingly, we catch the generic `Exception`
|
31
|
+
# object because the failure modes are not well-enumerated or consistent across database
|
32
|
+
# backends. Because failures automatically stop batch operations and the `drop_constraint()`
|
33
|
+
# operation is expected to fail under certain circumstances, we execute `drop_constraint()`
|
34
|
+
# outside of the batch operation context.
|
35
|
+
try:
|
36
|
+
# For other database backends, the status check constraint is dropped by
|
37
|
+
# cfd24bdc0731_update_run_status_constraint_with_killed.py
|
38
|
+
if op.get_bind().engine.name == "mysql":
|
39
|
+
op.drop_constraint(constraint_name="status", table_name="runs", type_="check")
|
40
|
+
except Exception as e:
|
41
|
+
_logger.warning(
|
42
|
+
"Failed to drop check constraint. Dropping check constraints may not be supported"
|
43
|
+
" by your SQL database. Exception content: %s",
|
44
|
+
e,
|
45
|
+
)
|
46
|
+
|
47
|
+
|
48
|
+
def downgrade():
|
49
|
+
pass
|
@@ -0,0 +1,24 @@
|
|
1
|
+
"""add deleted_time field to runs table
|
2
|
+
|
3
|
+
Revision ID: 0c779009ac13
|
4
|
+
Revises: bd07f7e963c5
|
5
|
+
Create Date: 2022-07-27 14:13:36.162861
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
import sqlalchemy as sa
|
10
|
+
from alembic import op
|
11
|
+
|
12
|
+
# revision identifiers, used by Alembic.
|
13
|
+
revision = "0c779009ac13"
|
14
|
+
down_revision = "bd07f7e963c5"
|
15
|
+
branch_labels = None
|
16
|
+
depends_on = None
|
17
|
+
|
18
|
+
|
19
|
+
def upgrade():
|
20
|
+
op.add_column("runs", sa.Column("deleted_time", sa.BigInteger, nullable=True, default=None))
|
21
|
+
|
22
|
+
|
23
|
+
def downgrade():
|
24
|
+
pass
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""allow nulls for metric values
|
2
|
+
|
3
|
+
Revision ID: 181f10493468
|
4
|
+
Revises: 90e64c465722
|
5
|
+
Create Date: 2019-07-10 22:40:18.787993
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
import sqlalchemy as sa
|
10
|
+
from alembic import op
|
11
|
+
|
12
|
+
# revision identifiers, used by Alembic.
|
13
|
+
revision = "181f10493468"
|
14
|
+
down_revision = "90e64c465722"
|
15
|
+
branch_labels = None
|
16
|
+
depends_on = None
|
17
|
+
|
18
|
+
|
19
|
+
def upgrade():
|
20
|
+
with op.batch_alter_table("metrics") as batch_op:
|
21
|
+
batch_op.alter_column("value", type_=sa.types.Float(precision=53), nullable=False)
|
22
|
+
batch_op.add_column(
|
23
|
+
sa.Column(
|
24
|
+
"is_nan", sa.Boolean(create_constraint=False), nullable=False, server_default="0"
|
25
|
+
)
|
26
|
+
)
|
27
|
+
batch_op.drop_constraint(constraint_name="metric_pk", type_="primary")
|
28
|
+
batch_op.create_primary_key(
|
29
|
+
constraint_name="metric_pk",
|
30
|
+
columns=["key", "timestamp", "step", "run_uuid", "value", "is_nan"],
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
def downgrade():
|
35
|
+
pass
|