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,168 @@
|
|
1
|
+
import base64
|
2
|
+
|
3
|
+
from mlflow.exceptions import MlflowException
|
4
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
5
|
+
from mlflow.protos.databricks_uc_registry_messages_pb2 import (
|
6
|
+
MODEL_VERSION_OPERATION_READ,
|
7
|
+
GenerateTemporaryModelVersionCredentialsRequest,
|
8
|
+
GenerateTemporaryModelVersionCredentialsResponse,
|
9
|
+
ModelVersionLineageDirection,
|
10
|
+
StorageMode,
|
11
|
+
)
|
12
|
+
from mlflow.protos.databricks_uc_registry_service_pb2 import UcModelRegistryService
|
13
|
+
from mlflow.store._unity_catalog.lineage.constants import _DATABRICKS_LINEAGE_ID_HEADER
|
14
|
+
from mlflow.store.artifact.artifact_repo import ArtifactRepository
|
15
|
+
from mlflow.store.artifact.databricks_sdk_models_artifact_repo import (
|
16
|
+
DatabricksSDKModelsArtifactRepository,
|
17
|
+
)
|
18
|
+
from mlflow.store.artifact.presigned_url_artifact_repo import PresignedUrlArtifactRepository
|
19
|
+
from mlflow.store.artifact.utils.models import (
|
20
|
+
get_model_name_and_version,
|
21
|
+
)
|
22
|
+
from mlflow.utils._spark_utils import _get_active_spark_session
|
23
|
+
from mlflow.utils._unity_catalog_utils import (
|
24
|
+
emit_model_version_lineage,
|
25
|
+
get_artifact_repo_from_storage_info,
|
26
|
+
get_full_name_from_sc,
|
27
|
+
is_databricks_sdk_models_artifact_repository_enabled,
|
28
|
+
)
|
29
|
+
from mlflow.utils.databricks_utils import get_databricks_host_creds
|
30
|
+
from mlflow.utils.proto_json_utils import message_to_json
|
31
|
+
from mlflow.utils.rest_utils import (
|
32
|
+
_REST_API_PATH_PREFIX,
|
33
|
+
call_endpoint,
|
34
|
+
extract_api_info_for_service,
|
35
|
+
)
|
36
|
+
from mlflow.utils.uri import (
|
37
|
+
_DATABRICKS_UNITY_CATALOG_SCHEME,
|
38
|
+
get_databricks_profile_uri_from_artifact_uri,
|
39
|
+
get_db_info_from_uri,
|
40
|
+
is_databricks_unity_catalog_uri,
|
41
|
+
)
|
42
|
+
|
43
|
+
_METHOD_TO_INFO = extract_api_info_for_service(UcModelRegistryService, _REST_API_PATH_PREFIX)
|
44
|
+
|
45
|
+
|
46
|
+
class UnityCatalogModelsArtifactRepository(ArtifactRepository):
|
47
|
+
"""
|
48
|
+
Performs storage operations on artifacts controlled by a Unity Catalog model registry
|
49
|
+
|
50
|
+
Temporary scoped tokens for the appropriate cloud storage locations are fetched from the
|
51
|
+
remote backend and used to download model artifacts.
|
52
|
+
|
53
|
+
The artifact_uri is expected to be of the form `models:/<model_name>/<model_version>`
|
54
|
+
|
55
|
+
Note : This artifact repository is meant is to be instantiated by the ModelsArtifactRepository
|
56
|
+
when the client is pointing to a Unity Catalog model registry.
|
57
|
+
"""
|
58
|
+
|
59
|
+
def __init__(self, artifact_uri, registry_uri):
|
60
|
+
if not is_databricks_unity_catalog_uri(registry_uri):
|
61
|
+
raise MlflowException(
|
62
|
+
message="Attempted to instantiate an artifact repo to access models in the "
|
63
|
+
f"Unity Catalog with non-Unity Catalog registry URI '{registry_uri}'. "
|
64
|
+
f"Please specify a Unity Catalog registry URI of the "
|
65
|
+
f"form '{_DATABRICKS_UNITY_CATALOG_SCHEME}[://profile]', e.g. by calling "
|
66
|
+
f"mlflow.set_registry_uri('{_DATABRICKS_UNITY_CATALOG_SCHEME}') if using the "
|
67
|
+
f"MLflow Python client",
|
68
|
+
error_code=INVALID_PARAMETER_VALUE,
|
69
|
+
)
|
70
|
+
super().__init__(artifact_uri)
|
71
|
+
from mlflow.tracking.client import MlflowClient
|
72
|
+
|
73
|
+
registry_uri_from_artifact_uri = get_databricks_profile_uri_from_artifact_uri(
|
74
|
+
artifact_uri, result_scheme=_DATABRICKS_UNITY_CATALOG_SCHEME
|
75
|
+
)
|
76
|
+
if registry_uri_from_artifact_uri is not None:
|
77
|
+
registry_uri = registry_uri_from_artifact_uri
|
78
|
+
_, key_prefix = get_db_info_from_uri(registry_uri)
|
79
|
+
if key_prefix is not None:
|
80
|
+
raise MlflowException(
|
81
|
+
"Remote model registry access via model URIs of the form "
|
82
|
+
"'models://<scope>@<prefix>/<model_name>/<version_or_stage>' is unsupported for "
|
83
|
+
"models in the Unity Catalog. We recommend that you access the Unity Catalog "
|
84
|
+
"from the current Databricks workspace instead."
|
85
|
+
)
|
86
|
+
self.registry_uri = registry_uri
|
87
|
+
self.client = MlflowClient(registry_uri=self.registry_uri)
|
88
|
+
try:
|
89
|
+
spark = _get_active_spark_session()
|
90
|
+
except Exception:
|
91
|
+
pass
|
92
|
+
model_name, self.model_version = get_model_name_and_version(self.client, artifact_uri)
|
93
|
+
self.model_name = get_full_name_from_sc(model_name, spark)
|
94
|
+
|
95
|
+
def _get_blob_storage_path(self):
|
96
|
+
return self.client.get_model_version_download_uri(self.model_name, self.model_version)
|
97
|
+
|
98
|
+
def _get_scoped_token(self, lineage_header_info=None):
|
99
|
+
extra_headers = {}
|
100
|
+
if lineage_header_info:
|
101
|
+
header_json = message_to_json(lineage_header_info)
|
102
|
+
header_base64 = base64.b64encode(header_json.encode())
|
103
|
+
extra_headers[_DATABRICKS_LINEAGE_ID_HEADER] = header_base64
|
104
|
+
|
105
|
+
db_creds = get_databricks_host_creds(self.registry_uri)
|
106
|
+
endpoint, method = _METHOD_TO_INFO[GenerateTemporaryModelVersionCredentialsRequest]
|
107
|
+
req_body = message_to_json(
|
108
|
+
GenerateTemporaryModelVersionCredentialsRequest(
|
109
|
+
name=self.model_name,
|
110
|
+
version=self.model_version,
|
111
|
+
operation=MODEL_VERSION_OPERATION_READ,
|
112
|
+
)
|
113
|
+
)
|
114
|
+
response_proto = GenerateTemporaryModelVersionCredentialsResponse()
|
115
|
+
return call_endpoint(
|
116
|
+
host_creds=db_creds,
|
117
|
+
endpoint=endpoint,
|
118
|
+
method=method,
|
119
|
+
json_body=req_body,
|
120
|
+
response_proto=response_proto,
|
121
|
+
extra_headers=extra_headers,
|
122
|
+
).credentials
|
123
|
+
|
124
|
+
def _get_artifact_repo(self, lineage_header_info=None):
|
125
|
+
"""
|
126
|
+
Get underlying ArtifactRepository instance for model version blob
|
127
|
+
storage
|
128
|
+
"""
|
129
|
+
host_creds = get_databricks_host_creds(self.registry_uri)
|
130
|
+
if is_databricks_sdk_models_artifact_repository_enabled(host_creds):
|
131
|
+
entities = lineage_header_info.entities if lineage_header_info else []
|
132
|
+
emit_model_version_lineage(
|
133
|
+
host_creds,
|
134
|
+
self.model_name,
|
135
|
+
self.model_version,
|
136
|
+
entities,
|
137
|
+
ModelVersionLineageDirection.DOWNSTREAM,
|
138
|
+
)
|
139
|
+
return DatabricksSDKModelsArtifactRepository(self.model_name, self.model_version)
|
140
|
+
scoped_token = self._get_scoped_token(lineage_header_info=lineage_header_info)
|
141
|
+
if scoped_token.storage_mode == StorageMode.DEFAULT_STORAGE:
|
142
|
+
return PresignedUrlArtifactRepository(
|
143
|
+
get_databricks_host_creds(self.registry_uri), self.model_name, self.model_version
|
144
|
+
)
|
145
|
+
|
146
|
+
blob_storage_path = self._get_blob_storage_path()
|
147
|
+
return get_artifact_repo_from_storage_info(
|
148
|
+
storage_location=blob_storage_path,
|
149
|
+
scoped_token=scoped_token,
|
150
|
+
base_credential_refresh_def=self._get_scoped_token,
|
151
|
+
)
|
152
|
+
|
153
|
+
def list_artifacts(self, path=None):
|
154
|
+
return self._get_artifact_repo().list_artifacts(path=path)
|
155
|
+
|
156
|
+
def download_artifacts(self, artifact_path, dst_path=None, lineage_header_info=None):
|
157
|
+
return self._get_artifact_repo(lineage_header_info=lineage_header_info).download_artifacts(
|
158
|
+
artifact_path, dst_path
|
159
|
+
)
|
160
|
+
|
161
|
+
def log_artifact(self, local_file, artifact_path=None):
|
162
|
+
raise MlflowException("This repository does not support logging artifacts.")
|
163
|
+
|
164
|
+
def log_artifacts(self, local_dir, artifact_path=None):
|
165
|
+
raise MlflowException("This repository does not support logging artifacts.")
|
166
|
+
|
167
|
+
def delete_artifacts(self, artifact_path=None):
|
168
|
+
raise NotImplementedError("This artifact repository does not support deleting artifacts")
|
@@ -0,0 +1,168 @@
|
|
1
|
+
import base64
|
2
|
+
|
3
|
+
from mlflow.exceptions import MlflowException
|
4
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
5
|
+
from mlflow.protos.databricks_uc_registry_service_pb2 import UcModelRegistryService
|
6
|
+
from mlflow.protos.unity_catalog_oss_messages_pb2 import (
|
7
|
+
READ_MODEL_VERSION as MODEL_VERSION_OPERATION_READ_OSS,
|
8
|
+
)
|
9
|
+
from mlflow.protos.unity_catalog_oss_messages_pb2 import (
|
10
|
+
GenerateTemporaryModelVersionCredential as GenerateTemporaryModelVersionCredentialsOSS,
|
11
|
+
)
|
12
|
+
from mlflow.protos.unity_catalog_oss_messages_pb2 import (
|
13
|
+
TemporaryCredentials,
|
14
|
+
)
|
15
|
+
from mlflow.protos.unity_catalog_oss_service_pb2 import UnityCatalogService
|
16
|
+
from mlflow.store._unity_catalog.lineage.constants import _DATABRICKS_LINEAGE_ID_HEADER
|
17
|
+
from mlflow.store.artifact.artifact_repo import ArtifactRepository
|
18
|
+
from mlflow.store.artifact.utils.models import (
|
19
|
+
get_model_name_and_version,
|
20
|
+
)
|
21
|
+
from mlflow.utils._spark_utils import _get_active_spark_session
|
22
|
+
from mlflow.utils._unity_catalog_utils import (
|
23
|
+
get_artifact_repo_from_storage_info,
|
24
|
+
get_full_name_from_sc,
|
25
|
+
)
|
26
|
+
from mlflow.utils.oss_registry_utils import get_oss_host_creds
|
27
|
+
from mlflow.utils.proto_json_utils import message_to_json
|
28
|
+
from mlflow.utils.rest_utils import (
|
29
|
+
_REST_API_PATH_PREFIX,
|
30
|
+
_UC_OSS_REST_API_PATH_PREFIX,
|
31
|
+
call_endpoint,
|
32
|
+
extract_api_info_for_service,
|
33
|
+
)
|
34
|
+
from mlflow.utils.uri import (
|
35
|
+
_OSS_UNITY_CATALOG_SCHEME,
|
36
|
+
get_databricks_profile_uri_from_artifact_uri,
|
37
|
+
get_db_info_from_uri,
|
38
|
+
is_oss_unity_catalog_uri,
|
39
|
+
)
|
40
|
+
|
41
|
+
_METHOD_TO_INFO = extract_api_info_for_service(UcModelRegistryService, _REST_API_PATH_PREFIX)
|
42
|
+
_METHOD_TO_INFO_OSS = extract_api_info_for_service(
|
43
|
+
UnityCatalogService, _UC_OSS_REST_API_PATH_PREFIX
|
44
|
+
)
|
45
|
+
|
46
|
+
import urllib.parse
|
47
|
+
|
48
|
+
from mlflow.store.artifact.local_artifact_repo import LocalArtifactRepository
|
49
|
+
from mlflow.utils.uri import is_file_uri
|
50
|
+
|
51
|
+
|
52
|
+
class UnityCatalogOSSModelsArtifactRepository(ArtifactRepository):
|
53
|
+
"""
|
54
|
+
Performs storage operations on artifacts controlled by a Unity Catalog model registry
|
55
|
+
|
56
|
+
Temporary scoped tokens for the appropriate cloud storage locations are fetched from the
|
57
|
+
remote backend and used to download model artifacts.
|
58
|
+
|
59
|
+
The artifact_uri is expected to be of the form `models:/<model_name>/<model_version>`
|
60
|
+
|
61
|
+
Note : This artifact repository is meant is to be instantiated by the ModelsArtifactRepository
|
62
|
+
when the client is pointing to a Unity Catalog model registry.
|
63
|
+
"""
|
64
|
+
|
65
|
+
def __init__(self, artifact_uri, registry_uri):
|
66
|
+
if not is_oss_unity_catalog_uri(registry_uri):
|
67
|
+
raise MlflowException(
|
68
|
+
message="Attempted to instantiate an artifact repo to access models in the "
|
69
|
+
f"OSS Unity Catalog with non-Unity Catalog registry URI '{registry_uri}'. "
|
70
|
+
f"Please specify a Unity Catalog registry URI of the "
|
71
|
+
f"form '{_OSS_UNITY_CATALOG_SCHEME}[://profile]', e.g. by calling "
|
72
|
+
f"mlflow.set_registry_uri('{_OSS_UNITY_CATALOG_SCHEME}') if using the "
|
73
|
+
f"MLflow Python client",
|
74
|
+
error_code=INVALID_PARAMETER_VALUE,
|
75
|
+
)
|
76
|
+
super().__init__(artifact_uri)
|
77
|
+
from mlflow.tracking.client import MlflowClient
|
78
|
+
|
79
|
+
registry_uri_from_artifact_uri = get_databricks_profile_uri_from_artifact_uri(
|
80
|
+
artifact_uri, result_scheme=_OSS_UNITY_CATALOG_SCHEME
|
81
|
+
)
|
82
|
+
if registry_uri_from_artifact_uri is not None:
|
83
|
+
registry_uri = registry_uri_from_artifact_uri
|
84
|
+
|
85
|
+
_, key_prefix = get_db_info_from_uri(urllib.parse.urlparse(registry_uri).path)
|
86
|
+
if key_prefix is not None:
|
87
|
+
raise MlflowException(
|
88
|
+
"Remote model registry access via model URIs of the form "
|
89
|
+
"'models://<scope>@<prefix>/<model_name>/<version_or_stage>' is unsupported for "
|
90
|
+
"models in the Unity Catalog. We recommend that you access the Unity Catalog "
|
91
|
+
"from the current Databricks workspace instead."
|
92
|
+
)
|
93
|
+
self.registry_uri = registry_uri
|
94
|
+
self.client = MlflowClient(registry_uri=self.registry_uri)
|
95
|
+
try:
|
96
|
+
spark = _get_active_spark_session()
|
97
|
+
except Exception:
|
98
|
+
pass
|
99
|
+
model_name, self.model_version = get_model_name_and_version(self.client, artifact_uri)
|
100
|
+
self.model_name = get_full_name_from_sc(model_name, spark)
|
101
|
+
|
102
|
+
def _get_blob_storage_path(self):
|
103
|
+
return self.client.get_model_version_download_uri(self.model_name, self.model_version)
|
104
|
+
|
105
|
+
def _get_scoped_token(self, lineage_header_info=None):
|
106
|
+
extra_headers = {}
|
107
|
+
if lineage_header_info:
|
108
|
+
header_json = message_to_json(lineage_header_info)
|
109
|
+
header_base64 = base64.b64encode(header_json.encode())
|
110
|
+
extra_headers[_DATABRICKS_LINEAGE_ID_HEADER] = header_base64
|
111
|
+
oss_creds = get_oss_host_creds(
|
112
|
+
self.registry_uri
|
113
|
+
) # Implement ENV variable the same way the databricks user/token is specified
|
114
|
+
oss_endpoint, oss_method = _METHOD_TO_INFO_OSS[GenerateTemporaryModelVersionCredentialsOSS]
|
115
|
+
[catalog_name, schema_name, model_name] = self.model_name.split(
|
116
|
+
"."
|
117
|
+
) # self.model_name is actually the full name
|
118
|
+
oss_req_body = message_to_json(
|
119
|
+
GenerateTemporaryModelVersionCredentialsOSS(
|
120
|
+
catalog_name=catalog_name,
|
121
|
+
schema_name=schema_name,
|
122
|
+
model_name=model_name,
|
123
|
+
version=int(self.model_version),
|
124
|
+
operation=MODEL_VERSION_OPERATION_READ_OSS,
|
125
|
+
)
|
126
|
+
)
|
127
|
+
oss_response_proto = TemporaryCredentials()
|
128
|
+
return call_endpoint(
|
129
|
+
host_creds=oss_creds,
|
130
|
+
endpoint=oss_endpoint,
|
131
|
+
method=oss_method,
|
132
|
+
json_body=oss_req_body,
|
133
|
+
response_proto=oss_response_proto,
|
134
|
+
extra_headers=extra_headers,
|
135
|
+
)
|
136
|
+
|
137
|
+
def _get_artifact_repo(self, lineage_header_info=None):
|
138
|
+
"""
|
139
|
+
Get underlying ArtifactRepository instance for model version blob
|
140
|
+
storage
|
141
|
+
"""
|
142
|
+
blob_storage_path = self._get_blob_storage_path()
|
143
|
+
if is_file_uri(blob_storage_path):
|
144
|
+
return LocalArtifactRepository(artifact_uri=blob_storage_path)
|
145
|
+
scoped_token = self._get_scoped_token(lineage_header_info=lineage_header_info)
|
146
|
+
return get_artifact_repo_from_storage_info(
|
147
|
+
storage_location=blob_storage_path,
|
148
|
+
scoped_token=scoped_token,
|
149
|
+
base_credential_refresh_def=self._get_scoped_token,
|
150
|
+
is_oss=True,
|
151
|
+
)
|
152
|
+
|
153
|
+
def list_artifacts(self, path=None):
|
154
|
+
return self._get_artifact_repo().list_artifacts(path=path)
|
155
|
+
|
156
|
+
def download_artifacts(self, artifact_path, dst_path=None, lineage_header_info=None):
|
157
|
+
return self._get_artifact_repo(lineage_header_info=lineage_header_info).download_artifacts(
|
158
|
+
artifact_path, dst_path
|
159
|
+
)
|
160
|
+
|
161
|
+
def log_artifact(self, local_file, artifact_path=None):
|
162
|
+
raise MlflowException("This repository does not support logging artifacts.")
|
163
|
+
|
164
|
+
def log_artifacts(self, local_dir, artifact_path=None):
|
165
|
+
raise MlflowException("This repository does not support logging artifacts.")
|
166
|
+
|
167
|
+
def delete_artifacts(self, artifact_path=None):
|
168
|
+
raise NotImplementedError("This artifact repository does not support deleting artifacts")
|
File without changes
|
@@ -0,0 +1,148 @@
|
|
1
|
+
import urllib.parse
|
2
|
+
from pathlib import Path
|
3
|
+
from typing import NamedTuple, Optional, Union
|
4
|
+
|
5
|
+
import mlflow.tracking
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.utils.uri import (
|
8
|
+
get_databricks_profile_uri_from_artifact_uri,
|
9
|
+
is_databricks_uri,
|
10
|
+
is_models_uri,
|
11
|
+
)
|
12
|
+
|
13
|
+
_MODELS_URI_SUFFIX_LATEST = "latest"
|
14
|
+
|
15
|
+
|
16
|
+
def is_using_databricks_registry(uri):
|
17
|
+
profile_uri = get_databricks_profile_uri_from_artifact_uri(uri) or mlflow.get_registry_uri()
|
18
|
+
return is_databricks_uri(profile_uri)
|
19
|
+
|
20
|
+
|
21
|
+
def _improper_model_uri_msg(uri, scheme: str = "models"):
|
22
|
+
if scheme not in ("models", "prompts"):
|
23
|
+
raise ValueError(f"Unsupported scheme for model/prompt URI: {scheme!r}")
|
24
|
+
entity_type = "Models" if scheme == "models" else "Prompts"
|
25
|
+
return (
|
26
|
+
f"Not a proper {scheme}:/ URI: {uri}. "
|
27
|
+
+ f"{entity_type} URIs must be of the form '{scheme}:/name/suffix' "
|
28
|
+
+ f"or '{scheme}:/name@alias' where suffix is a version"
|
29
|
+
+ (f", stage, or the string {_MODELS_URI_SUFFIX_LATEST!r}" if scheme == "models" else "")
|
30
|
+
+ f" and where alias is a registered {scheme[:-1]} alias. "
|
31
|
+
+ "Only one of suffix or alias can be defined at a time."
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
def _get_latest_model_version(client, name, stage):
|
36
|
+
"""
|
37
|
+
Returns the latest version of the stage if stage is not None. Otherwise return the latest of all
|
38
|
+
versions.
|
39
|
+
"""
|
40
|
+
latest = client.get_latest_versions(name, None if stage is None else [stage])
|
41
|
+
if len(latest) == 0:
|
42
|
+
stage_str = "" if stage is None else f" and stage '{stage}'"
|
43
|
+
raise MlflowException(f"No versions of model with name '{name}'{stage_str} found")
|
44
|
+
return max(int(x.version) for x in latest)
|
45
|
+
|
46
|
+
|
47
|
+
class ParsedModelUri(NamedTuple):
|
48
|
+
model_id: Optional[str] = None
|
49
|
+
name: Optional[str] = None
|
50
|
+
version: Optional[str] = None
|
51
|
+
stage: Optional[str] = None
|
52
|
+
alias: Optional[str] = None
|
53
|
+
|
54
|
+
|
55
|
+
def _parse_model_uri(uri, scheme: str = "models") -> ParsedModelUri:
|
56
|
+
"""
|
57
|
+
Returns a ParsedModelUri tuple. Since a models:/ or prompts:/ URI can only have one of
|
58
|
+
{version, stage, 'latest', alias}, it will return
|
59
|
+
- (id, None, None, None) to look for a specific model by ID,
|
60
|
+
- (name, version, None, None) to look for a specific version,
|
61
|
+
- (name, None, stage, None) to look for the latest version of a stage,
|
62
|
+
- (name, None, None, None) to look for the latest of all versions.
|
63
|
+
- (name, None, None, alias) to look for a registered model alias.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
uri: The URI to parse (e.g., "models:/name/version" or "prompts:/name@alias")
|
67
|
+
scheme: The expected URI scheme (default: "models", can be "prompts")
|
68
|
+
"""
|
69
|
+
parsed = urllib.parse.urlparse(uri, allow_fragments=False)
|
70
|
+
if parsed.scheme != scheme:
|
71
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
72
|
+
path = parsed.path
|
73
|
+
if not path.startswith("/") or len(path) <= 1:
|
74
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
75
|
+
|
76
|
+
parts = path.lstrip("/").split("/")
|
77
|
+
if len(parts) > 2 or parts[0].strip() == "":
|
78
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
79
|
+
|
80
|
+
if len(parts) == 2:
|
81
|
+
name, suffix = parts
|
82
|
+
if suffix.strip() == "":
|
83
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
84
|
+
# The URI is in the suffix format
|
85
|
+
if suffix.isdigit():
|
86
|
+
# The suffix is a specific version, e.g. "models:/AdsModel1/123"
|
87
|
+
return ParsedModelUri(name=name, version=suffix)
|
88
|
+
elif suffix.lower() == _MODELS_URI_SUFFIX_LATEST.lower() and scheme == "models":
|
89
|
+
# The suffix is the 'latest' string (case insensitive), e.g. "models:/AdsModel1/latest"
|
90
|
+
# Only supported for models, not prompts
|
91
|
+
return ParsedModelUri(name=name)
|
92
|
+
elif scheme == "models":
|
93
|
+
# The suffix is a specific stage (case insensitive), e.g. "models:/AdsModel1/Production"
|
94
|
+
# Only supported for models, not prompts
|
95
|
+
return ParsedModelUri(name=name, stage=suffix)
|
96
|
+
else:
|
97
|
+
# For prompts, only version numbers are supported, not stages or 'latest'
|
98
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
99
|
+
elif "@" in path:
|
100
|
+
# The URI is an alias URI, e.g. "models:/AdsModel1@Champion"
|
101
|
+
alias_parts = parts[0].rsplit("@", 1)
|
102
|
+
if len(alias_parts) != 2 or alias_parts[1].strip() == "":
|
103
|
+
raise MlflowException(_improper_model_uri_msg(uri, scheme))
|
104
|
+
return ParsedModelUri(name=alias_parts[0], alias=alias_parts[1])
|
105
|
+
else:
|
106
|
+
# The URI is of the form "models:/<model_id>"
|
107
|
+
return ParsedModelUri(parts[0])
|
108
|
+
|
109
|
+
|
110
|
+
def _parse_model_id_if_present(possible_model_uri: Union[str, Path]) -> Optional[str]:
|
111
|
+
"""
|
112
|
+
Parses the model ID from the given string. If the string represents a UC model URI, we get the
|
113
|
+
model version to extract the model ID. If the string is not a models:/ URI, returns None.
|
114
|
+
|
115
|
+
Args:
|
116
|
+
possible_model_uri: The string that may be a models:/ URI.
|
117
|
+
|
118
|
+
Returns:
|
119
|
+
The model ID if the string is a models:/ URI, otherwise None.
|
120
|
+
"""
|
121
|
+
uri = str(possible_model_uri)
|
122
|
+
if is_models_uri(uri):
|
123
|
+
parsed_model_uri = _parse_model_uri(uri)
|
124
|
+
if parsed_model_uri.model_id is not None:
|
125
|
+
return parsed_model_uri.model_id
|
126
|
+
elif parsed_model_uri.name is not None and parsed_model_uri.version is not None:
|
127
|
+
client = mlflow.tracking.MlflowClient()
|
128
|
+
return client.get_model_version(
|
129
|
+
parsed_model_uri.name, parsed_model_uri.version
|
130
|
+
).model_id
|
131
|
+
return None
|
132
|
+
|
133
|
+
|
134
|
+
def get_model_name_and_version(client, models_uri):
|
135
|
+
(model_id, model_name, model_version, model_stage, model_alias) = _parse_model_uri(models_uri)
|
136
|
+
if model_id is not None:
|
137
|
+
return (model_id,)
|
138
|
+
if model_version is not None:
|
139
|
+
return model_name, model_version
|
140
|
+
|
141
|
+
# NB: Call get_model_version_by_alias of registry client directly to bypass prompt check
|
142
|
+
if isinstance(client, mlflow.MlflowClient):
|
143
|
+
client = client._get_registry_client()
|
144
|
+
|
145
|
+
if model_alias is not None:
|
146
|
+
mv = client.get_model_version_by_alias(model_name, model_alias)
|
147
|
+
return model_name, mv.version
|
148
|
+
return model_name, str(_get_latest_model_version(client, model_name, model_stage))
|
File without changes
|