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,487 @@
|
|
1
|
+
"""
|
2
|
+
This module provides a set of functions to manage the global tracer provider for MLflow tracing.
|
3
|
+
|
4
|
+
Every tracing operation in MLflow *MUST* be managed through this module, instead of directly
|
5
|
+
using the OpenTelemetry APIs. This is because MLflow needs to control the initialization of the
|
6
|
+
tracer provider and ensure that it won't interfere with the other external libraries that might
|
7
|
+
use OpenTelemetry e.g. PromptFlow, Snowpark.
|
8
|
+
"""
|
9
|
+
|
10
|
+
import contextvars
|
11
|
+
import functools
|
12
|
+
import json
|
13
|
+
import logging
|
14
|
+
from contextlib import contextmanager
|
15
|
+
from typing import TYPE_CHECKING, Optional
|
16
|
+
|
17
|
+
from opentelemetry import context as context_api
|
18
|
+
from opentelemetry import trace
|
19
|
+
from opentelemetry.sdk.trace import TracerProvider
|
20
|
+
|
21
|
+
import mlflow
|
22
|
+
from mlflow.exceptions import MlflowException, MlflowTracingException
|
23
|
+
from mlflow.tracing.config import reset_config
|
24
|
+
from mlflow.tracing.constant import SpanAttributeKey
|
25
|
+
from mlflow.tracing.destination import Databricks, MlflowExperiment, TraceDestination
|
26
|
+
from mlflow.tracing.utils.exception import raise_as_trace_exception
|
27
|
+
from mlflow.tracing.utils.once import Once
|
28
|
+
from mlflow.tracing.utils.otlp import get_otlp_exporter, should_use_otlp_exporter
|
29
|
+
from mlflow.utils.annotations import experimental
|
30
|
+
from mlflow.utils.databricks_utils import (
|
31
|
+
is_in_databricks_model_serving_environment,
|
32
|
+
is_mlflow_tracing_enabled_in_model_serving,
|
33
|
+
)
|
34
|
+
|
35
|
+
if TYPE_CHECKING:
|
36
|
+
from mlflow.entities import Span
|
37
|
+
|
38
|
+
# Global tracer provider instance. We manage the tracer provider by ourselves instead of using
|
39
|
+
# the global tracer provider provided by OpenTelemetry.
|
40
|
+
_MLFLOW_TRACER_PROVIDER = None
|
41
|
+
|
42
|
+
# Once() object ensures a function is executed only once in a process.
|
43
|
+
# Note that it doesn't work as expected in a distributed environment.
|
44
|
+
_MLFLOW_TRACER_PROVIDER_INITIALIZED = Once()
|
45
|
+
|
46
|
+
# A trace destination specified by the user via the `set_destination` function.
|
47
|
+
# This destination, when set, will take precedence over other configurations.
|
48
|
+
_MLFLOW_TRACE_USER_DESTINATION = None
|
49
|
+
|
50
|
+
_logger = logging.getLogger(__name__)
|
51
|
+
|
52
|
+
|
53
|
+
def start_span_in_context(name: str) -> trace.Span:
|
54
|
+
"""
|
55
|
+
Start a new OpenTelemetry span in the current context.
|
56
|
+
|
57
|
+
Note that this function doesn't set the started span as the active span in the context. To do
|
58
|
+
that, the upstream also need to call `use_span()` function in the OpenTelemetry trace APIs.
|
59
|
+
|
60
|
+
Args:
|
61
|
+
name: The name of the span.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
The newly created OpenTelemetry span.
|
65
|
+
"""
|
66
|
+
return _get_tracer(__name__).start_span(name)
|
67
|
+
|
68
|
+
|
69
|
+
def start_detached_span(
|
70
|
+
name: str,
|
71
|
+
parent: Optional[trace.Span] = None,
|
72
|
+
experiment_id: Optional[str] = None,
|
73
|
+
start_time_ns: Optional[int] = None,
|
74
|
+
) -> Optional[tuple[str, trace.Span]]:
|
75
|
+
"""
|
76
|
+
Start a new OpenTelemetry span that is not part of the current trace context, but with the
|
77
|
+
explicit parent span ID if provided.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
name: The name of the span.
|
81
|
+
parent: The parent OpenTelemetry span. If not provided, the span will be created as a root
|
82
|
+
span.
|
83
|
+
experiment_id: The ID of the experiment. This is used to associate the span with a specific
|
84
|
+
experiment in MLflow.
|
85
|
+
start_time_ns: The start time of the span in nanoseconds.
|
86
|
+
If not provided, the current timestamp is used.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
The newly created OpenTelemetry span.
|
90
|
+
"""
|
91
|
+
tracer = _get_tracer(__name__)
|
92
|
+
context = trace.set_span_in_context(parent) if parent else None
|
93
|
+
attributes = {}
|
94
|
+
|
95
|
+
# Set start time and experiment to attribute so we can pass it to the span processor
|
96
|
+
if start_time_ns:
|
97
|
+
attributes[SpanAttributeKey.START_TIME_NS] = json.dumps(start_time_ns)
|
98
|
+
if experiment_id:
|
99
|
+
attributes[SpanAttributeKey.EXPERIMENT_ID] = json.dumps(experiment_id)
|
100
|
+
return tracer.start_span(name, context=context, attributes=attributes, start_time=start_time_ns)
|
101
|
+
|
102
|
+
|
103
|
+
@contextmanager
|
104
|
+
def safe_set_span_in_context(span: "Span"):
|
105
|
+
"""
|
106
|
+
A context manager that sets the given OpenTelemetry span as the active span in the current
|
107
|
+
context.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
span: An MLflow span object to set as the active span.
|
111
|
+
|
112
|
+
Example:
|
113
|
+
|
114
|
+
.. code-block:: python
|
115
|
+
|
116
|
+
import mlflow
|
117
|
+
|
118
|
+
|
119
|
+
with mlflow.start_span("my_span") as span:
|
120
|
+
span.set_attribute("my_key", "my_value")
|
121
|
+
|
122
|
+
# The span is automatically detached from the context when the context manager exits.
|
123
|
+
"""
|
124
|
+
token = set_span_in_context(span)
|
125
|
+
try:
|
126
|
+
yield
|
127
|
+
finally:
|
128
|
+
detach_span_from_context(token)
|
129
|
+
|
130
|
+
|
131
|
+
def set_span_in_context(span: "Span") -> contextvars.Token:
|
132
|
+
"""
|
133
|
+
Set the given OpenTelemetry span as the active span in the current context.
|
134
|
+
|
135
|
+
Args:
|
136
|
+
span: An MLflow span object to set as the active span.
|
137
|
+
|
138
|
+
Returns:
|
139
|
+
A token object that will be required when detaching the span from the context.
|
140
|
+
"""
|
141
|
+
context = trace.set_span_in_context(span._span)
|
142
|
+
token = context_api.attach(context)
|
143
|
+
return token # noqa: RET504
|
144
|
+
|
145
|
+
|
146
|
+
def detach_span_from_context(token: contextvars.Token):
|
147
|
+
"""
|
148
|
+
Remove the active span from the current context.
|
149
|
+
|
150
|
+
Args:
|
151
|
+
token: The token returned by `_set_span_to_active` function.
|
152
|
+
"""
|
153
|
+
context_api.detach(token)
|
154
|
+
|
155
|
+
|
156
|
+
@experimental(version="2.21.0")
|
157
|
+
def set_destination(destination: TraceDestination):
|
158
|
+
"""
|
159
|
+
Set a custom span destination to which MLflow will export the traces.
|
160
|
+
|
161
|
+
A destination specified by this function will take precedence over
|
162
|
+
other configurations, such as tracking URI, OTLP environment variables.
|
163
|
+
|
164
|
+
To reset the destination, call the :py:func:`mlflow.tracing.reset()` function.
|
165
|
+
|
166
|
+
Args:
|
167
|
+
destination: A ``TraceDestination`` object that specifies the destination of the trace data.
|
168
|
+
|
169
|
+
Example:
|
170
|
+
|
171
|
+
.. code-block:: python
|
172
|
+
|
173
|
+
import mlflow
|
174
|
+
from mlflow.tracing.destination import MlflowExperiment
|
175
|
+
|
176
|
+
# Setting the destination to an MLflow experiment with ID "123"
|
177
|
+
mlflow.tracing.set_destination(MlflowExperiment(experiment_id="123"))
|
178
|
+
|
179
|
+
# Reset the destination (to an active experiment as default)
|
180
|
+
mlflow.tracing.reset()
|
181
|
+
"""
|
182
|
+
if not isinstance(destination, TraceDestination):
|
183
|
+
raise MlflowException.invalid_parameter_value(
|
184
|
+
f"Invalid destination type: {type(destination)}. "
|
185
|
+
"The destination must be an instance of TraceDestination."
|
186
|
+
)
|
187
|
+
|
188
|
+
if isinstance(destination, Databricks) and (
|
189
|
+
mlflow.get_tracking_uri() is None or not mlflow.get_tracking_uri().startswith("databricks")
|
190
|
+
):
|
191
|
+
mlflow.set_tracking_uri("databricks")
|
192
|
+
_logger.info(
|
193
|
+
"Automatically setting the tracking URI to `databricks` "
|
194
|
+
"because the tracing destination is set to Databricks."
|
195
|
+
)
|
196
|
+
|
197
|
+
# The destination needs to be persisted because the tracer setup can be re-initialized
|
198
|
+
# e.g. when the tracing is disabled and re-enabled, or tracking URI is changed, etc.
|
199
|
+
global _MLFLOW_TRACE_USER_DESTINATION
|
200
|
+
_MLFLOW_TRACE_USER_DESTINATION = destination
|
201
|
+
|
202
|
+
_setup_tracer_provider()
|
203
|
+
|
204
|
+
|
205
|
+
def _get_tracer(module_name: str):
|
206
|
+
"""
|
207
|
+
Get a tracer instance for the given module name.
|
208
|
+
|
209
|
+
If the tracer provider is not initialized, this function will initialize the tracer provider.
|
210
|
+
Other simultaneous calls to this function will block until the initialization is done.
|
211
|
+
"""
|
212
|
+
# Initiate tracer provider only once in the application lifecycle
|
213
|
+
_MLFLOW_TRACER_PROVIDER_INITIALIZED.do_once(_setup_tracer_provider)
|
214
|
+
return _MLFLOW_TRACER_PROVIDER.get_tracer(module_name)
|
215
|
+
|
216
|
+
|
217
|
+
def _get_trace_exporter():
|
218
|
+
"""
|
219
|
+
Get the exporter instance that is used by the current tracer provider.
|
220
|
+
"""
|
221
|
+
if _MLFLOW_TRACER_PROVIDER:
|
222
|
+
processors = _MLFLOW_TRACER_PROVIDER._active_span_processor._span_processors
|
223
|
+
# There should be only one processor used for MLflow tracing
|
224
|
+
processor = processors[0]
|
225
|
+
return processor.span_exporter
|
226
|
+
|
227
|
+
|
228
|
+
def _setup_tracer_provider(disabled=False):
|
229
|
+
"""
|
230
|
+
Instantiate a tracer provider and set it as the global tracer provider.
|
231
|
+
|
232
|
+
Note that this function ALWAYS updates the global tracer provider, regardless of the current
|
233
|
+
state. It is the caller's responsibility to ensure that the tracer provider is initialized
|
234
|
+
only once, and update the _MLFLOW_TRACER_PROVIDER_INITIALIZED flag accordingly.
|
235
|
+
"""
|
236
|
+
global _MLFLOW_TRACER_PROVIDER
|
237
|
+
|
238
|
+
if disabled:
|
239
|
+
_MLFLOW_TRACER_PROVIDER = trace.NoOpTracerProvider()
|
240
|
+
return
|
241
|
+
|
242
|
+
# TODO: Update this logic to pluggable registry where
|
243
|
+
# 1. Partners can implement span processor/exporter and destination class.
|
244
|
+
# 2. They can register their implementation to the registry via entry points.
|
245
|
+
# 3. MLflow will pick the implementation based on given destination id.
|
246
|
+
if _MLFLOW_TRACE_USER_DESTINATION is not None:
|
247
|
+
experiment_id = _MLFLOW_TRACE_USER_DESTINATION.experiment_id
|
248
|
+
|
249
|
+
tracking_uri = None
|
250
|
+
if isinstance(_MLFLOW_TRACE_USER_DESTINATION, MlflowExperiment):
|
251
|
+
tracking_uri = _MLFLOW_TRACE_USER_DESTINATION.tracking_uri
|
252
|
+
|
253
|
+
processor = _get_mlflow_span_processor(
|
254
|
+
tracking_uri=tracking_uri or mlflow.get_tracking_uri(), experiment_id=experiment_id
|
255
|
+
)
|
256
|
+
|
257
|
+
elif should_use_otlp_exporter():
|
258
|
+
# Export to OpenTelemetry Collector when configured
|
259
|
+
from mlflow.tracing.processor.otel import OtelSpanProcessor
|
260
|
+
|
261
|
+
exporter = get_otlp_exporter()
|
262
|
+
processor = OtelSpanProcessor(exporter)
|
263
|
+
|
264
|
+
elif is_in_databricks_model_serving_environment():
|
265
|
+
# Export to Inference Table when running in Databricks Model Serving
|
266
|
+
if not is_mlflow_tracing_enabled_in_model_serving():
|
267
|
+
_MLFLOW_TRACER_PROVIDER = trace.NoOpTracerProvider()
|
268
|
+
return
|
269
|
+
|
270
|
+
from mlflow.tracing.export.inference_table import InferenceTableSpanExporter
|
271
|
+
from mlflow.tracing.processor.inference_table import InferenceTableSpanProcessor
|
272
|
+
|
273
|
+
exporter = InferenceTableSpanExporter()
|
274
|
+
processor = InferenceTableSpanProcessor(exporter)
|
275
|
+
|
276
|
+
else:
|
277
|
+
# Default to MLflow Tracking Server
|
278
|
+
processor = _get_mlflow_span_processor(tracking_uri=mlflow.get_tracking_uri())
|
279
|
+
|
280
|
+
tracer_provider = TracerProvider()
|
281
|
+
tracer_provider.add_span_processor(processor)
|
282
|
+
_MLFLOW_TRACER_PROVIDER = tracer_provider
|
283
|
+
|
284
|
+
from mlflow.tracing.utils.warning import suppress_warning
|
285
|
+
|
286
|
+
# Demote the "Failed to detach context" log raised by the OpenTelemetry logger to DEBUG
|
287
|
+
# level so that it does not show up in the user's console. This warning may indicate
|
288
|
+
# some incorrect context handling, but in many cases just false positive that does not
|
289
|
+
# cause any issue in the generated trace.
|
290
|
+
# Note that we need to apply it permanently rather than just the scope of prediction call,
|
291
|
+
# because the exception can happen for streaming case, where the error log might be
|
292
|
+
# generated when the iterator is consumed and we don't know when it will happen.
|
293
|
+
suppress_warning("opentelemetry.context", "Failed to detach context")
|
294
|
+
|
295
|
+
# These Otel warnings are occasionally raised in a valid case, e.g. we timeout a trace
|
296
|
+
# but some spans are still active. We suppress them because they are not actionable.
|
297
|
+
suppress_warning("opentelemetry.sdk.trace", "Setting attribute on ended span")
|
298
|
+
suppress_warning("opentelemetry.sdk.trace", "Calling end() on an ended span")
|
299
|
+
|
300
|
+
|
301
|
+
def _get_mlflow_span_processor(tracking_uri: str, experiment_id: Optional[str] = None):
|
302
|
+
"""
|
303
|
+
Get the MLflow span processor instance that is used by the current tracer provider.
|
304
|
+
"""
|
305
|
+
# Databricks and SQL backends support V3 traces
|
306
|
+
from mlflow.tracing.export.mlflow_v3 import MlflowV3SpanExporter
|
307
|
+
from mlflow.tracing.processor.mlflow_v3 import MlflowV3SpanProcessor
|
308
|
+
|
309
|
+
exporter = MlflowV3SpanExporter(tracking_uri=tracking_uri)
|
310
|
+
return MlflowV3SpanProcessor(exporter, experiment_id=experiment_id)
|
311
|
+
|
312
|
+
|
313
|
+
@raise_as_trace_exception
|
314
|
+
def disable():
|
315
|
+
"""
|
316
|
+
Disable tracing.
|
317
|
+
|
318
|
+
.. note::
|
319
|
+
|
320
|
+
This function sets up `OpenTelemetry` to use
|
321
|
+
`NoOpTracerProvider <https://github.com/open-telemetry/opentelemetry-python/blob/4febd337b019ea013ccaab74893bd9883eb59000/opentelemetry-api/src/opentelemetry/trace/__init__.py#L222>`_
|
322
|
+
and effectively disables all tracing operations.
|
323
|
+
|
324
|
+
Example:
|
325
|
+
|
326
|
+
.. code-block:: python
|
327
|
+
:test:
|
328
|
+
|
329
|
+
import mlflow
|
330
|
+
|
331
|
+
|
332
|
+
@mlflow.trace
|
333
|
+
def f():
|
334
|
+
return 0
|
335
|
+
|
336
|
+
|
337
|
+
# Tracing is enabled by default
|
338
|
+
f()
|
339
|
+
assert len(mlflow.search_traces()) == 1
|
340
|
+
|
341
|
+
# Disable tracing
|
342
|
+
mlflow.tracing.disable()
|
343
|
+
f()
|
344
|
+
assert len(mlflow.search_traces()) == 1
|
345
|
+
|
346
|
+
"""
|
347
|
+
if not is_tracing_enabled():
|
348
|
+
return
|
349
|
+
|
350
|
+
_setup_tracer_provider(disabled=True)
|
351
|
+
_MLFLOW_TRACER_PROVIDER_INITIALIZED.done = True
|
352
|
+
|
353
|
+
|
354
|
+
@raise_as_trace_exception
|
355
|
+
def enable():
|
356
|
+
"""
|
357
|
+
Enable tracing.
|
358
|
+
|
359
|
+
Example:
|
360
|
+
|
361
|
+
.. code-block:: python
|
362
|
+
:test:
|
363
|
+
|
364
|
+
import mlflow
|
365
|
+
|
366
|
+
|
367
|
+
@mlflow.trace
|
368
|
+
def f():
|
369
|
+
return 0
|
370
|
+
|
371
|
+
|
372
|
+
# Tracing is enabled by default
|
373
|
+
f()
|
374
|
+
assert len(mlflow.search_traces()) == 1
|
375
|
+
|
376
|
+
# Disable tracing
|
377
|
+
mlflow.tracing.disable()
|
378
|
+
f()
|
379
|
+
assert len(mlflow.search_traces()) == 1
|
380
|
+
|
381
|
+
# Re-enable tracing
|
382
|
+
mlflow.tracing.enable()
|
383
|
+
f()
|
384
|
+
assert len(mlflow.search_traces()) == 2
|
385
|
+
|
386
|
+
"""
|
387
|
+
if is_tracing_enabled() and _MLFLOW_TRACER_PROVIDER_INITIALIZED.done:
|
388
|
+
_logger.info("Tracing is already enabled")
|
389
|
+
return
|
390
|
+
|
391
|
+
_setup_tracer_provider()
|
392
|
+
_MLFLOW_TRACER_PROVIDER_INITIALIZED.done = True
|
393
|
+
|
394
|
+
|
395
|
+
def trace_disabled(f):
|
396
|
+
"""
|
397
|
+
A decorator that temporarily disables tracing for the duration of the decorated function.
|
398
|
+
|
399
|
+
.. code-block:: python
|
400
|
+
|
401
|
+
@trace_disabled
|
402
|
+
def f():
|
403
|
+
with mlflow.start_span("my_span") as span:
|
404
|
+
span.set_attribute("my_key", "my_value")
|
405
|
+
|
406
|
+
return
|
407
|
+
|
408
|
+
|
409
|
+
# This function will not generate any trace
|
410
|
+
f()
|
411
|
+
|
412
|
+
:meta private:
|
413
|
+
"""
|
414
|
+
|
415
|
+
@functools.wraps(f)
|
416
|
+
def wrapper(*args, **kwargs):
|
417
|
+
is_func_called = False
|
418
|
+
result = None
|
419
|
+
try:
|
420
|
+
if is_tracing_enabled():
|
421
|
+
disable()
|
422
|
+
try:
|
423
|
+
is_func_called = True
|
424
|
+
result = f(*args, **kwargs)
|
425
|
+
finally:
|
426
|
+
enable()
|
427
|
+
else:
|
428
|
+
is_func_called = True
|
429
|
+
result = f(*args, **kwargs)
|
430
|
+
# We should only catch the exception from disable() and enable()
|
431
|
+
# and let other exceptions propagate.
|
432
|
+
except MlflowTracingException as e:
|
433
|
+
_logger.warning(
|
434
|
+
f"An error occurred while disabling or re-enabling tracing: {e} "
|
435
|
+
"The original function will still be executed, but the tracing "
|
436
|
+
"state may not be as expected. For full traceback, set "
|
437
|
+
"logging level to debug.",
|
438
|
+
exc_info=_logger.isEnabledFor(logging.DEBUG),
|
439
|
+
)
|
440
|
+
# If the exception is raised before the original function
|
441
|
+
# is called, we should call the original function
|
442
|
+
if not is_func_called:
|
443
|
+
result = f(*args, **kwargs)
|
444
|
+
|
445
|
+
return result
|
446
|
+
|
447
|
+
return wrapper
|
448
|
+
|
449
|
+
|
450
|
+
def reset():
|
451
|
+
"""
|
452
|
+
Reset the flags that indicates whether the MLflow tracer provider has been initialized.
|
453
|
+
This ensures that the tracer provider is re-initialized when next tracing
|
454
|
+
operation is performed.
|
455
|
+
"""
|
456
|
+
# Set NoOp tracer provider to reset the global tracer to the initial state.
|
457
|
+
_setup_tracer_provider(disabled=True)
|
458
|
+
# Flip _MLFLOW_TRACE_PROVIDER_INITIALIZED flag to False so that
|
459
|
+
# the next tracing operation will re-initialize the provider.
|
460
|
+
_MLFLOW_TRACER_PROVIDER_INITIALIZED.done = False
|
461
|
+
|
462
|
+
# Reset the custom destination set by the user
|
463
|
+
global _MLFLOW_TRACE_USER_DESTINATION
|
464
|
+
_MLFLOW_TRACE_USER_DESTINATION = None
|
465
|
+
|
466
|
+
# Reset the tracing configuration to defaults
|
467
|
+
reset_config()
|
468
|
+
|
469
|
+
|
470
|
+
@raise_as_trace_exception
|
471
|
+
def is_tracing_enabled() -> bool:
|
472
|
+
"""
|
473
|
+
Check if tracing is enabled based on whether the global tracer
|
474
|
+
is instantiated or not.
|
475
|
+
|
476
|
+
Trace is considered as "enabled" if the followings
|
477
|
+
1. The default state (before any tracing operation)
|
478
|
+
2. The tracer is not either ProxyTracer or NoOpTracer
|
479
|
+
"""
|
480
|
+
if not _MLFLOW_TRACER_PROVIDER_INITIALIZED.done:
|
481
|
+
return True
|
482
|
+
|
483
|
+
tracer = _get_tracer(__name__)
|
484
|
+
# Occasionally ProxyTracer instance wraps the actual tracer
|
485
|
+
if isinstance(tracer, trace.ProxyTracer):
|
486
|
+
tracer = tracer._tracer
|
487
|
+
return not isinstance(tracer, trace.NoOpTracer)
|
@@ -0,0 +1,200 @@
|
|
1
|
+
import contextlib
|
2
|
+
import logging
|
3
|
+
import threading
|
4
|
+
from dataclasses import dataclass, field
|
5
|
+
from typing import Generator, Optional, Sequence
|
6
|
+
|
7
|
+
from mlflow.entities import LiveSpan, Trace, TraceData, TraceInfo
|
8
|
+
from mlflow.entities.model_registry import PromptVersion
|
9
|
+
from mlflow.environment_variables import MLFLOW_TRACE_TIMEOUT_SECONDS
|
10
|
+
from mlflow.tracing.utils.timeout import get_trace_cache_with_timeout
|
11
|
+
from mlflow.tracing.utils.truncation import set_request_response_preview
|
12
|
+
|
13
|
+
_logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
# Internal representation to keep the state of a trace.
|
17
|
+
# Dict[str, Span] is used instead of TraceData to allow access by span_id.
|
18
|
+
@dataclass
|
19
|
+
class _Trace:
|
20
|
+
info: TraceInfo
|
21
|
+
span_dict: dict[str, LiveSpan] = field(default_factory=dict)
|
22
|
+
prompts: list[PromptVersion] = field(default_factory=list)
|
23
|
+
|
24
|
+
def to_mlflow_trace(self) -> Trace:
|
25
|
+
trace_data = TraceData()
|
26
|
+
for span in self.span_dict.values():
|
27
|
+
# Convert LiveSpan, mutable objects, into immutable Span objects before persisting.
|
28
|
+
trace_data.spans.append(span.to_immutable_span())
|
29
|
+
|
30
|
+
set_request_response_preview(self.info, trace_data)
|
31
|
+
return Trace(self.info, trace_data)
|
32
|
+
|
33
|
+
def get_root_span(self) -> Optional[LiveSpan]:
|
34
|
+
for span in self.span_dict.values():
|
35
|
+
if span.parent_id is None:
|
36
|
+
return span
|
37
|
+
return None
|
38
|
+
|
39
|
+
|
40
|
+
@dataclass
|
41
|
+
class ManagerTrace:
|
42
|
+
"""
|
43
|
+
Wrapper around a trace and its associated prompts.
|
44
|
+
"""
|
45
|
+
|
46
|
+
trace: Trace
|
47
|
+
prompts: Sequence[PromptVersion]
|
48
|
+
|
49
|
+
|
50
|
+
class InMemoryTraceManager:
|
51
|
+
"""
|
52
|
+
Manage spans and traces created by the tracing system in memory.
|
53
|
+
"""
|
54
|
+
|
55
|
+
_instance_lock = threading.Lock()
|
56
|
+
_instance = None
|
57
|
+
|
58
|
+
@classmethod
|
59
|
+
def get_instance(cls):
|
60
|
+
if cls._instance is None:
|
61
|
+
with cls._instance_lock:
|
62
|
+
if cls._instance is None:
|
63
|
+
cls._instance = InMemoryTraceManager()
|
64
|
+
return cls._instance
|
65
|
+
|
66
|
+
def __init__(self):
|
67
|
+
# In-memory cache to store trace_od -> _Trace mapping.
|
68
|
+
self._traces = get_trace_cache_with_timeout()
|
69
|
+
|
70
|
+
# Store mapping between OpenTelemetry trace ID and MLflow trace ID
|
71
|
+
self._otel_id_to_mlflow_trace_id: dict[int, str] = {}
|
72
|
+
self._lock = threading.Lock() # Lock for _traces
|
73
|
+
|
74
|
+
def register_trace(self, otel_trace_id: int, trace_info: TraceInfo):
|
75
|
+
"""
|
76
|
+
Register a new trace info object to the in-memory trace registry.
|
77
|
+
|
78
|
+
Args:
|
79
|
+
otel_trace_id: The OpenTelemetry trace ID for the new trace.
|
80
|
+
trace_info: The trace info object to be stored.
|
81
|
+
"""
|
82
|
+
# Check for a new timeout setting whenever a new trace is created.
|
83
|
+
self._check_timeout_update()
|
84
|
+
with self._lock:
|
85
|
+
self._traces[trace_info.trace_id] = _Trace(trace_info)
|
86
|
+
self._otel_id_to_mlflow_trace_id[otel_trace_id] = trace_info.trace_id
|
87
|
+
|
88
|
+
def register_span(self, span: LiveSpan):
|
89
|
+
"""
|
90
|
+
Store the given span in the in-memory trace data.
|
91
|
+
|
92
|
+
Args:
|
93
|
+
span: The span to be stored.
|
94
|
+
"""
|
95
|
+
if not isinstance(span, LiveSpan):
|
96
|
+
_logger.debug(f"Invalid span object {type(span)} is passed. Skipping.")
|
97
|
+
return
|
98
|
+
|
99
|
+
with self._lock:
|
100
|
+
trace_data_dict = self._traces[span.request_id].span_dict
|
101
|
+
trace_data_dict[span.span_id] = span
|
102
|
+
|
103
|
+
def register_prompt(self, trace_id: str, prompt: PromptVersion):
|
104
|
+
"""
|
105
|
+
Register a prompt to link to the trace with the given trace ID.
|
106
|
+
|
107
|
+
Args:
|
108
|
+
trace_id: The ID of the trace to which the prompt belongs.
|
109
|
+
prompt: The prompt version to be registered.
|
110
|
+
"""
|
111
|
+
with self._lock:
|
112
|
+
self._traces[trace_id].prompts.append(prompt)
|
113
|
+
|
114
|
+
@contextlib.contextmanager
|
115
|
+
def get_trace(self, trace_id: str) -> Generator[Optional[_Trace], None, None]:
|
116
|
+
"""
|
117
|
+
Yield the trace info for the given trace ID..
|
118
|
+
This is designed to be used as a context manager to ensure the trace info is accessed
|
119
|
+
with the lock held.
|
120
|
+
"""
|
121
|
+
with self._lock:
|
122
|
+
yield self._traces.get(trace_id)
|
123
|
+
|
124
|
+
def get_span_from_id(self, trace_id: str, span_id: str) -> Optional[LiveSpan]:
|
125
|
+
"""
|
126
|
+
Get a span object for the given trace_id and span_id.
|
127
|
+
"""
|
128
|
+
with self._lock:
|
129
|
+
trace = self._traces.get(trace_id)
|
130
|
+
|
131
|
+
return trace.span_dict.get(span_id) if trace else None
|
132
|
+
|
133
|
+
def get_root_span_id(self, trace_id) -> Optional[str]:
|
134
|
+
"""
|
135
|
+
Get the root span ID for the given trace ID.
|
136
|
+
"""
|
137
|
+
with self._lock:
|
138
|
+
trace = self._traces.get(trace_id)
|
139
|
+
|
140
|
+
if trace:
|
141
|
+
for span in trace.span_dict.values():
|
142
|
+
if span.parent_id is None:
|
143
|
+
return span.span_id
|
144
|
+
|
145
|
+
return None
|
146
|
+
|
147
|
+
def get_mlflow_trace_id_from_otel_id(self, otel_trace_id: int) -> Optional[str]:
|
148
|
+
"""
|
149
|
+
Get the MLflow trace ID for the given OpenTelemetry trace ID.
|
150
|
+
"""
|
151
|
+
return self._otel_id_to_mlflow_trace_id.get(otel_trace_id)
|
152
|
+
|
153
|
+
def set_trace_metadata(self, trace_id: str, key: str, value: str):
|
154
|
+
"""
|
155
|
+
Set the trace metadata for the given request ID.
|
156
|
+
"""
|
157
|
+
with self.get_trace(trace_id) as trace:
|
158
|
+
if trace:
|
159
|
+
trace.info.trace_metadata[key] = value
|
160
|
+
|
161
|
+
def pop_trace(self, otel_trace_id: int) -> Optional[ManagerTrace]:
|
162
|
+
"""
|
163
|
+
Pop trace data for the given OpenTelemetry trace ID and
|
164
|
+
return it as a ManagerTrace wrapper containing the trace and prompts.
|
165
|
+
"""
|
166
|
+
with self._lock:
|
167
|
+
mlflow_trace_id = self._otel_id_to_mlflow_trace_id.pop(otel_trace_id, None)
|
168
|
+
internal_trace = self._traces.pop(mlflow_trace_id, None) if mlflow_trace_id else None
|
169
|
+
if internal_trace is None:
|
170
|
+
return None
|
171
|
+
return ManagerTrace(
|
172
|
+
trace=internal_trace.to_mlflow_trace(), prompts=internal_trace.prompts
|
173
|
+
)
|
174
|
+
|
175
|
+
def _check_timeout_update(self):
|
176
|
+
"""
|
177
|
+
TTL/Timeout may be updated by users after initial cache creation. This method checks
|
178
|
+
for the update and create a new cache instance with the updated timeout.
|
179
|
+
"""
|
180
|
+
new_timeout = MLFLOW_TRACE_TIMEOUT_SECONDS.get()
|
181
|
+
if new_timeout != getattr(self._traces, "timeout", None):
|
182
|
+
if len(self._traces) > 0:
|
183
|
+
_logger.warning(
|
184
|
+
f"The timeout of the trace buffer has been updated to {new_timeout} seconds. "
|
185
|
+
"This operation discards all in-progress traces at the moment. Please make "
|
186
|
+
"sure to update the timeout when there are no in-progress traces."
|
187
|
+
)
|
188
|
+
|
189
|
+
with self._lock:
|
190
|
+
# We need to check here again in case this method runs in parallel
|
191
|
+
if new_timeout != getattr(self._traces, "timeout", None):
|
192
|
+
self._traces = get_trace_cache_with_timeout()
|
193
|
+
|
194
|
+
@classmethod
|
195
|
+
def reset(cls):
|
196
|
+
"""Clear all the aggregated trace data. This should only be used for testing."""
|
197
|
+
if cls._instance:
|
198
|
+
with cls._instance._lock:
|
199
|
+
cls._instance._traces.clear()
|
200
|
+
cls._instance = None
|