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,105 @@
|
|
1
|
+
# NB: These keys are placeholders and subject to change
|
2
|
+
class TraceMetadataKey:
|
3
|
+
INPUTS = "mlflow.traceInputs"
|
4
|
+
OUTPUTS = "mlflow.traceOutputs"
|
5
|
+
SOURCE_RUN = "mlflow.sourceRun"
|
6
|
+
MODEL_ID = "mlflow.modelId"
|
7
|
+
# Trace size statistics including total size, number of spans, and max span size
|
8
|
+
SIZE_STATS = "mlflow.trace.sizeStats"
|
9
|
+
# Aggregated token usage information in a single trace, stored as a dumped JSON string.
|
10
|
+
TOKEN_USAGE = "mlflow.trace.tokenUsage"
|
11
|
+
# Store the user ID/name of the application request. Do not confuse this with mlflow.user
|
12
|
+
# tag, which stores "who created the trace" i.e. developer or system name.
|
13
|
+
TRACE_USER = "mlflow.trace.user"
|
14
|
+
# Store the session ID of the application request.
|
15
|
+
TRACE_SESSION = "mlflow.trace.session"
|
16
|
+
|
17
|
+
# Total size of the trace in bytes. Deprecated, use SIZE_STATS instead.
|
18
|
+
SIZE_BYTES = "mlflow.trace.sizeBytes"
|
19
|
+
|
20
|
+
|
21
|
+
class TraceTagKey:
|
22
|
+
TRACE_NAME = "mlflow.traceName"
|
23
|
+
EVAL_REQUEST_ID = "eval.requestId"
|
24
|
+
|
25
|
+
|
26
|
+
class TokenUsageKey:
|
27
|
+
"""Key for the token usage information in the `mlflow.chat.tokenUsage` span attribute."""
|
28
|
+
|
29
|
+
INPUT_TOKENS = "input_tokens"
|
30
|
+
OUTPUT_TOKENS = "output_tokens"
|
31
|
+
TOTAL_TOKENS = "total_tokens"
|
32
|
+
|
33
|
+
@classmethod
|
34
|
+
def all_keys(cls):
|
35
|
+
return [cls.INPUT_TOKENS, cls.OUTPUT_TOKENS, cls.TOTAL_TOKENS]
|
36
|
+
|
37
|
+
|
38
|
+
class TraceSizeStatsKey:
|
39
|
+
TOTAL_SIZE_BYTES = "total_size_bytes"
|
40
|
+
NUM_SPANS = "num_spans"
|
41
|
+
MAX_SPAN_SIZE_BYTES = "max"
|
42
|
+
P25_SPAN_SIZE_BYTES = "p25"
|
43
|
+
P50_SPAN_SIZE_BYTES = "p50"
|
44
|
+
P75_SPAN_SIZE_BYTES = "p75"
|
45
|
+
|
46
|
+
|
47
|
+
# A set of reserved attribute keys
|
48
|
+
class SpanAttributeKey:
|
49
|
+
EXPERIMENT_ID = "mlflow.experimentId"
|
50
|
+
REQUEST_ID = "mlflow.traceRequestId"
|
51
|
+
INPUTS = "mlflow.spanInputs"
|
52
|
+
OUTPUTS = "mlflow.spanOutputs"
|
53
|
+
SPAN_TYPE = "mlflow.spanType"
|
54
|
+
FUNCTION_NAME = "mlflow.spanFunctionName"
|
55
|
+
START_TIME_NS = "mlflow.spanStartTimeNs"
|
56
|
+
# these attributes are for standardized chat messages and tool definitions
|
57
|
+
# in CHAT_MODEL and LLM spans. they are used for rendering the rich chat
|
58
|
+
# display in the trace UI, as well as downstream consumers of trace data
|
59
|
+
# such as evaluation
|
60
|
+
CHAT_MESSAGES = "mlflow.chat.messages"
|
61
|
+
CHAT_TOOLS = "mlflow.chat.tools"
|
62
|
+
# This attribute is used to store token usage information from LLM responses.
|
63
|
+
# Stored in {"input_tokens": int, "output_tokens": int, "total_tokens": int} format.
|
64
|
+
CHAT_USAGE = "mlflow.chat.tokenUsage"
|
65
|
+
# This attribute is used to populate `intermediate_outputs` property of a trace data
|
66
|
+
# representing intermediate outputs of the trace. This attribute is not empty only on
|
67
|
+
# the root span of a trace created by the `mlflow.log_trace` API. The `intermediate_outputs`
|
68
|
+
# property of the normal trace is generated by the outputs of non-root spans.
|
69
|
+
INTERMEDIATE_OUTPUTS = "mlflow.trace.intermediate_outputs"
|
70
|
+
|
71
|
+
|
72
|
+
class AssessmentMetadataKey:
|
73
|
+
SOURCE_RUN_ID = "mlflow.assessment.sourceRunId"
|
74
|
+
|
75
|
+
|
76
|
+
# All storage backends are guaranteed to support request_metadata key/value up to 250 characters
|
77
|
+
MAX_CHARS_IN_TRACE_INFO_METADATA = 250
|
78
|
+
# All storage backends are guaranteed to support tag keys up to 250 characters,
|
79
|
+
# values up to 4096 characters
|
80
|
+
MAX_CHARS_IN_TRACE_INFO_TAGS_KEY = 250
|
81
|
+
MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE = 4096
|
82
|
+
TRUNCATION_SUFFIX = "..."
|
83
|
+
|
84
|
+
TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX = 10000
|
85
|
+
TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS = 1000
|
86
|
+
|
87
|
+
# Trace request ID must have the prefix "tr-" appended to the OpenTelemetry trace ID
|
88
|
+
TRACE_REQUEST_ID_PREFIX = "tr-"
|
89
|
+
|
90
|
+
# Schema version of traces and spans.
|
91
|
+
TRACE_SCHEMA_VERSION = 3
|
92
|
+
|
93
|
+
# Key for the trace schema version in the trace. This key is also used in
|
94
|
+
# Databricks model serving to be careful when modifying it.
|
95
|
+
TRACE_SCHEMA_VERSION_KEY = "mlflow.trace_schema.version"
|
96
|
+
|
97
|
+
|
98
|
+
STREAM_CHUNK_EVENT_NAME_FORMAT = "mlflow.chunk.item.{index}"
|
99
|
+
STREAM_CHUNK_EVENT_VALUE_KEY = "mlflow.chunk.value"
|
100
|
+
|
101
|
+
|
102
|
+
# Key for Databricks model serving options to return the trace in the response
|
103
|
+
DATABRICKS_OPTIONS_KEY = "databricks_options"
|
104
|
+
RETURN_TRACE_OPTION_KEY = "return_trace"
|
105
|
+
DATABRICKS_OUTPUT_KEY = "databricks_output"
|
@@ -0,0 +1,81 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from mlflow.exceptions import MlflowException
|
5
|
+
from mlflow.utils.annotations import experimental
|
6
|
+
|
7
|
+
|
8
|
+
@experimental(version="2.21.0")
|
9
|
+
@dataclass
|
10
|
+
class TraceDestination:
|
11
|
+
"""A configuration object for specifying the destination of trace data."""
|
12
|
+
|
13
|
+
@property
|
14
|
+
def type(self) -> str:
|
15
|
+
"""Type of the destination."""
|
16
|
+
raise NotImplementedError
|
17
|
+
|
18
|
+
|
19
|
+
@experimental(version="2.21.0")
|
20
|
+
@dataclass
|
21
|
+
class MlflowExperiment(TraceDestination):
|
22
|
+
"""
|
23
|
+
A destination representing an MLflow experiment.
|
24
|
+
|
25
|
+
By setting this destination in the :py:func:`mlflow.tracing.set_destination` function,
|
26
|
+
MLflow will log traces to the specified experiment.
|
27
|
+
|
28
|
+
Attributes:
|
29
|
+
experiment_id: The ID of the experiment to log traces to. If not specified,
|
30
|
+
the current active experiment will be used.
|
31
|
+
tracking_uri: The tracking URI of the MLflow server to log traces to.
|
32
|
+
If not specified, the current tracking URI will be used.
|
33
|
+
"""
|
34
|
+
|
35
|
+
experiment_id: Optional[str] = None
|
36
|
+
tracking_uri: Optional[str] = None
|
37
|
+
|
38
|
+
@property
|
39
|
+
def type(self) -> str:
|
40
|
+
return "experiment"
|
41
|
+
|
42
|
+
|
43
|
+
@experimental(version="2.22.0")
|
44
|
+
@dataclass
|
45
|
+
class Databricks(TraceDestination):
|
46
|
+
"""
|
47
|
+
A destination representing a Databricks tracing server.
|
48
|
+
|
49
|
+
By setting this destination in the :py:func:`mlflow.tracing.set_destination` function,
|
50
|
+
MLflow will log traces to the specified experiment.
|
51
|
+
|
52
|
+
If neither experiment_id nor experiment_name is specified, an active experiment
|
53
|
+
when traces are created will be used as the destination.
|
54
|
+
If both are specified, they must refer to the same experiment.
|
55
|
+
|
56
|
+
Attributes:
|
57
|
+
experiment_id: The ID of the experiment to log traces to.
|
58
|
+
experiment_name: The name of the experiment to log traces to.
|
59
|
+
"""
|
60
|
+
|
61
|
+
experiment_id: Optional[str] = None
|
62
|
+
experiment_name: Optional[str] = None
|
63
|
+
|
64
|
+
def __post_init__(self):
|
65
|
+
if self.experiment_id is not None:
|
66
|
+
self.experiment_id = str(self.experiment_id)
|
67
|
+
|
68
|
+
if self.experiment_name is not None:
|
69
|
+
from mlflow.tracking._tracking_service.utils import _get_store
|
70
|
+
|
71
|
+
# NB: Use store directly rather than fluent API to avoid dependency on MLflowClient
|
72
|
+
experiment_id = _get_store().get_experiment_by_name(self.experiment_name).experiment_id
|
73
|
+
if self.experiment_id is not None and self.experiment_id != experiment_id:
|
74
|
+
raise MlflowException.invalid_parameter_value(
|
75
|
+
"experiment_id and experiment_name must refer to the same experiment"
|
76
|
+
)
|
77
|
+
self.experiment_id = experiment_id
|
78
|
+
|
79
|
+
@property
|
80
|
+
def type(self) -> str:
|
81
|
+
return "databricks"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
from mlflow.tracing.display.display_handler import (
|
2
|
+
IPythonTraceDisplayHandler,
|
3
|
+
get_notebook_iframe_html,
|
4
|
+
is_using_tracking_server,
|
5
|
+
)
|
6
|
+
|
7
|
+
__all__ = [
|
8
|
+
"IPythonTraceDisplayHandler",
|
9
|
+
"get_display_handler",
|
10
|
+
"is_using_tracking_server",
|
11
|
+
"get_notebook_iframe_html",
|
12
|
+
]
|
13
|
+
|
14
|
+
|
15
|
+
def get_display_handler() -> IPythonTraceDisplayHandler:
|
16
|
+
return IPythonTraceDisplayHandler.get_instance()
|
17
|
+
|
18
|
+
|
19
|
+
def disable_notebook_display():
|
20
|
+
"""
|
21
|
+
Disables displaying the MLflow Trace UI in notebook output cells.
|
22
|
+
Call :py:func:`mlflow.tracing.enable_notebook_display()` to re-enable display.
|
23
|
+
"""
|
24
|
+
IPythonTraceDisplayHandler.disable()
|
25
|
+
|
26
|
+
|
27
|
+
def enable_notebook_display():
|
28
|
+
"""
|
29
|
+
Enables the MLflow Trace UI in notebook output cells. The display is on
|
30
|
+
by default, and the Trace UI will show up when any of the following operations
|
31
|
+
are executed:
|
32
|
+
|
33
|
+
* On trace completion (i.e. whenever a trace is exported)
|
34
|
+
* When calling the :py:func:`mlflow.search_traces` fluent API
|
35
|
+
* When calling the :py:meth:`mlflow.client.MlflowClient.get_trace`
|
36
|
+
or :py:meth:`mlflow.client.MlflowClient.search_traces` client APIs
|
37
|
+
|
38
|
+
To disable, please call :py:func:`mlflow.tracing.disable_notebook_display()`.
|
39
|
+
"""
|
40
|
+
IPythonTraceDisplayHandler.enable()
|
@@ -0,0 +1,196 @@
|
|
1
|
+
import html
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
from typing import TYPE_CHECKING
|
5
|
+
from urllib.parse import urlencode, urljoin
|
6
|
+
|
7
|
+
import mlflow
|
8
|
+
from mlflow.environment_variables import MLFLOW_MAX_TRACES_TO_DISPLAY_IN_NOTEBOOK
|
9
|
+
from mlflow.utils.databricks_utils import is_in_databricks_runtime
|
10
|
+
from mlflow.utils.uri import is_http_uri
|
11
|
+
|
12
|
+
_logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from mlflow.entities import Trace
|
16
|
+
|
17
|
+
|
18
|
+
TRACE_RENDERER_ASSET_PATH = "/static-files/lib/notebook-trace-renderer/index.html"
|
19
|
+
|
20
|
+
IFRAME_HTML = """
|
21
|
+
<div>
|
22
|
+
<style scoped>
|
23
|
+
button {{
|
24
|
+
border: none;
|
25
|
+
border-radius: 4px;
|
26
|
+
background-color: rgb(34, 114, 180);
|
27
|
+
font-family: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", Arial;
|
28
|
+
font-size: 13px;
|
29
|
+
color: white;
|
30
|
+
margin-top: 8px;
|
31
|
+
margin-bottom: 8px;
|
32
|
+
padding: 8px 16px;
|
33
|
+
cursor: pointer;
|
34
|
+
}}
|
35
|
+
button:hover {{
|
36
|
+
background-color: rgb(66, 153, 224);
|
37
|
+
}}
|
38
|
+
</style>
|
39
|
+
<button
|
40
|
+
onclick="
|
41
|
+
const display = this.nextElementSibling.style.display;
|
42
|
+
const isCollapsed = display === 'none';
|
43
|
+
this.nextElementSibling.style.display = isCollapsed ? null : 'none';
|
44
|
+
|
45
|
+
const verb = isCollapsed ? 'Collapse' : 'Expand';
|
46
|
+
this.innerText = `${{verb}} MLflow Trace`;
|
47
|
+
"
|
48
|
+
>Collapse MLflow Trace</button>
|
49
|
+
<iframe
|
50
|
+
id="trace-renderer"
|
51
|
+
style="width: 100%; height: 500px; border: none; resize: vertical;"
|
52
|
+
src="{src}"
|
53
|
+
/>
|
54
|
+
</div>
|
55
|
+
"""
|
56
|
+
|
57
|
+
|
58
|
+
def get_notebook_iframe_html(traces: list["Trace"]):
|
59
|
+
# fetch assets from tracking server
|
60
|
+
uri = urljoin(mlflow.get_tracking_uri(), TRACE_RENDERER_ASSET_PATH)
|
61
|
+
query_string = _get_query_string_for_traces(traces)
|
62
|
+
|
63
|
+
# include mlflow version to invalidate browser cache when mlflow updates
|
64
|
+
src = html.escape(f"{uri}?{query_string}&version={mlflow.__version__}")
|
65
|
+
return IFRAME_HTML.format(src=src)
|
66
|
+
|
67
|
+
|
68
|
+
def _serialize_trace_list(traces: list["Trace"]):
|
69
|
+
return json.dumps(
|
70
|
+
# we can't just call trace.to_json() because this
|
71
|
+
# will cause the trace to be serialized twice (once
|
72
|
+
# by to_json and once by json.dumps)
|
73
|
+
[json.loads(trace._serialize_for_mimebundle()) for trace in traces],
|
74
|
+
ensure_ascii=False,
|
75
|
+
)
|
76
|
+
|
77
|
+
|
78
|
+
def _get_query_string_for_traces(traces: list["Trace"]):
|
79
|
+
query_params = []
|
80
|
+
|
81
|
+
for trace in traces:
|
82
|
+
query_params.append(("trace_id", trace.info.request_id))
|
83
|
+
query_params.append(("experiment_id", trace.info.experiment_id))
|
84
|
+
|
85
|
+
return urlencode(query_params)
|
86
|
+
|
87
|
+
|
88
|
+
def _is_jupyter():
|
89
|
+
try:
|
90
|
+
from IPython import get_ipython
|
91
|
+
|
92
|
+
return get_ipython() is not None
|
93
|
+
except ImportError:
|
94
|
+
return False
|
95
|
+
|
96
|
+
|
97
|
+
def is_using_tracking_server():
|
98
|
+
return is_http_uri(mlflow.get_tracking_uri())
|
99
|
+
|
100
|
+
|
101
|
+
def is_trace_ui_available():
|
102
|
+
# the notebook display feature only works in
|
103
|
+
# Databricks notebooks, or in Jupyter notebooks
|
104
|
+
# with a tracking server
|
105
|
+
return _is_jupyter() and (is_in_databricks_runtime() or is_using_tracking_server())
|
106
|
+
|
107
|
+
|
108
|
+
class IPythonTraceDisplayHandler:
|
109
|
+
_instance = None
|
110
|
+
disabled = False
|
111
|
+
|
112
|
+
@classmethod
|
113
|
+
def get_instance(cls):
|
114
|
+
if cls._instance is None:
|
115
|
+
cls._instance = IPythonTraceDisplayHandler()
|
116
|
+
return cls._instance
|
117
|
+
|
118
|
+
@classmethod
|
119
|
+
def disable(cls):
|
120
|
+
cls.disabled = True
|
121
|
+
|
122
|
+
@classmethod
|
123
|
+
def enable(cls):
|
124
|
+
cls.disabled = False
|
125
|
+
if cls._instance is None:
|
126
|
+
cls._instance = IPythonTraceDisplayHandler()
|
127
|
+
|
128
|
+
def __init__(self):
|
129
|
+
self.traces_to_display = {}
|
130
|
+
if not _is_jupyter():
|
131
|
+
return
|
132
|
+
|
133
|
+
try:
|
134
|
+
from IPython import get_ipython
|
135
|
+
|
136
|
+
# Register a post-run cell display hook to display traces
|
137
|
+
# after the cell has executed. We don't validate that the
|
138
|
+
# user is using a tracking server at this step, because
|
139
|
+
# the user might set it later using mlflow.set_tracking_uri()
|
140
|
+
get_ipython().events.register("post_run_cell", self._display_traces_post_run)
|
141
|
+
except Exception:
|
142
|
+
# swallow exceptions. this function is called as
|
143
|
+
# a side-effect in a few other functions (e.g. log_trace,
|
144
|
+
# get_traces, search_traces), and we don't want to block
|
145
|
+
# the core functionality if the display fails.
|
146
|
+
_logger.debug("Failed to register post-run cell display hook", exc_info=True)
|
147
|
+
|
148
|
+
def _display_traces_post_run(self, result):
|
149
|
+
if self.disabled or not is_trace_ui_available():
|
150
|
+
self.traces_to_display = {}
|
151
|
+
return
|
152
|
+
|
153
|
+
try:
|
154
|
+
from IPython.display import display
|
155
|
+
|
156
|
+
MAX_TRACES_TO_DISPLAY = MLFLOW_MAX_TRACES_TO_DISPLAY_IN_NOTEBOOK.get()
|
157
|
+
traces_to_display = list(self.traces_to_display.values())[:MAX_TRACES_TO_DISPLAY]
|
158
|
+
if len(traces_to_display) == 0:
|
159
|
+
self.traces_to_display = {}
|
160
|
+
return
|
161
|
+
|
162
|
+
display(self.get_mimebundle(traces_to_display), raw=True)
|
163
|
+
|
164
|
+
# reset state
|
165
|
+
self.traces_to_display = {}
|
166
|
+
except Exception:
|
167
|
+
# swallow exceptions. this function is called as
|
168
|
+
# a side-effect in a few other functions (e.g. log_trace,
|
169
|
+
# get_traces, search_traces), and we don't want to block
|
170
|
+
# the core functionality if the display fails.
|
171
|
+
_logger.error("Failed to display traces", exc_info=True)
|
172
|
+
self.traces_to_display = {}
|
173
|
+
|
174
|
+
def get_mimebundle(self, traces: list["Trace"]):
|
175
|
+
if len(traces) == 1:
|
176
|
+
return traces[0]._repr_mimebundle_()
|
177
|
+
else:
|
178
|
+
bundle = {"text/plain": repr(traces)}
|
179
|
+
if is_in_databricks_runtime():
|
180
|
+
bundle["application/databricks.mlflow.trace"] = _serialize_trace_list(traces)
|
181
|
+
else:
|
182
|
+
bundle["text/html"] = get_notebook_iframe_html(traces)
|
183
|
+
return bundle
|
184
|
+
|
185
|
+
def display_traces(self, traces: list["Trace"]):
|
186
|
+
if self.disabled or not is_trace_ui_available():
|
187
|
+
return
|
188
|
+
|
189
|
+
try:
|
190
|
+
if len(traces) == 0:
|
191
|
+
return
|
192
|
+
|
193
|
+
traces_dict = {trace.info.request_id: trace for trace in traces}
|
194
|
+
self.traces_to_display.update(traces_dict)
|
195
|
+
except Exception:
|
196
|
+
_logger.debug("Failed to update traces", exc_info=True)
|
@@ -0,0 +1,186 @@
|
|
1
|
+
import atexit
|
2
|
+
import logging
|
3
|
+
import threading
|
4
|
+
import time
|
5
|
+
from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait
|
6
|
+
from dataclasses import dataclass
|
7
|
+
from queue import Empty, Queue
|
8
|
+
from queue import Full as queue_Full
|
9
|
+
from typing import Any, Callable, Sequence
|
10
|
+
|
11
|
+
from mlflow.environment_variables import (
|
12
|
+
MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE,
|
13
|
+
MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS,
|
14
|
+
)
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
@dataclass
|
20
|
+
class Task:
|
21
|
+
"""A dataclass to represent a simple task."""
|
22
|
+
|
23
|
+
handler: Callable[..., Any]
|
24
|
+
args: Sequence[Any]
|
25
|
+
error_msg: str = ""
|
26
|
+
|
27
|
+
def handle(self) -> None:
|
28
|
+
"""Handle the task execution. This method must not raise any exception."""
|
29
|
+
try:
|
30
|
+
self.handler(*self.args)
|
31
|
+
except Exception as e:
|
32
|
+
_logger.warning(
|
33
|
+
f"{self.error_msg} Error: {e}.",
|
34
|
+
exc_info=_logger.isEnabledFor(logging.DEBUG),
|
35
|
+
)
|
36
|
+
|
37
|
+
|
38
|
+
class AsyncTraceExportQueue:
|
39
|
+
"""A queue-based asynchronous tracing export processor."""
|
40
|
+
|
41
|
+
def __init__(self):
|
42
|
+
self._queue: Queue[Task] = Queue(maxsize=MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE.get())
|
43
|
+
self._lock = threading.RLock()
|
44
|
+
self._max_workers = MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS.get()
|
45
|
+
|
46
|
+
# Thread event that indicates the queue should stop processing tasks
|
47
|
+
self._stop_event = threading.Event()
|
48
|
+
self._is_active = False
|
49
|
+
self._atexit_callback_registered = False
|
50
|
+
|
51
|
+
self._active_tasks = set()
|
52
|
+
|
53
|
+
self._last_full_queue_warning_time = None
|
54
|
+
|
55
|
+
def put(self, task: Task):
|
56
|
+
"""Put a new task to the queue for processing."""
|
57
|
+
if not self.is_active():
|
58
|
+
self.activate()
|
59
|
+
|
60
|
+
# If stop event is set, wait for the queue to be drained before putting the task
|
61
|
+
if self._stop_event.is_set():
|
62
|
+
self._stop_event.wait()
|
63
|
+
|
64
|
+
try:
|
65
|
+
# Do not block if the queue is full, it will block the main application
|
66
|
+
self._queue.put(task, block=False)
|
67
|
+
except queue_Full:
|
68
|
+
if self._last_full_queue_warning_time is None or (
|
69
|
+
time.time() - self._last_full_queue_warning_time > 30
|
70
|
+
):
|
71
|
+
_logger.warning(
|
72
|
+
"Trace export queue is full, trace will be discarded. "
|
73
|
+
"Consider increasing the queue size through "
|
74
|
+
"`MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE` environment variable or "
|
75
|
+
"number of workers through `MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS`"
|
76
|
+
" environment variable."
|
77
|
+
)
|
78
|
+
self._last_full_queue_warning_time = time.time()
|
79
|
+
|
80
|
+
def _consumer_loop(self) -> None:
|
81
|
+
while not self._stop_event.is_set():
|
82
|
+
self._dispatch_task()
|
83
|
+
|
84
|
+
# Drain remaining tasks when stopping
|
85
|
+
while not self._queue.empty():
|
86
|
+
self._dispatch_task()
|
87
|
+
|
88
|
+
def _dispatch_task(self) -> None:
|
89
|
+
"""Dispatch a task from the queue to the worker thread pool."""
|
90
|
+
# NB: Monitor number of active tasks being processed by the workers. If the all
|
91
|
+
# workers are busy, wait for one of them to finish before draining a new task
|
92
|
+
# from the queue. This is because ThreadPoolExecutor does not have a built-in
|
93
|
+
# mechanism to limit the number of pending tasks in the internal queue.
|
94
|
+
# This ruins the purpose of having a size bound for self._queue, because the
|
95
|
+
# TPE's internal queue can grow indefinitely and potentially run out of memory.
|
96
|
+
# Therefore, we should only dispatch a new task when there is a worker available,
|
97
|
+
# and pend the new tasks in the self._queue which has a size bound.
|
98
|
+
if len(self._active_tasks) >= self._max_workers:
|
99
|
+
_, self._active_tasks = wait(self._active_tasks, return_when=FIRST_COMPLETED)
|
100
|
+
|
101
|
+
try:
|
102
|
+
task = self._queue.get(timeout=1)
|
103
|
+
except Empty:
|
104
|
+
return
|
105
|
+
|
106
|
+
def _handle(task):
|
107
|
+
task.handle()
|
108
|
+
self._queue.task_done()
|
109
|
+
|
110
|
+
try:
|
111
|
+
future = self._worker_threadpool.submit(_handle, task)
|
112
|
+
self._active_tasks.add(future)
|
113
|
+
except Exception as e:
|
114
|
+
# In case it fails to submit the task to the worker thread pool
|
115
|
+
# such as interpreter shutdown, handle the task in this thread
|
116
|
+
_logger.debug(
|
117
|
+
f"Failed to submit task to worker thread pool. Error: {e}",
|
118
|
+
exc_info=True,
|
119
|
+
)
|
120
|
+
_handle(task)
|
121
|
+
|
122
|
+
def activate(self) -> None:
|
123
|
+
"""Activate the async queue to accept and handle incoming tasks."""
|
124
|
+
with self._lock:
|
125
|
+
if self._is_active:
|
126
|
+
return
|
127
|
+
|
128
|
+
self._set_up_threads()
|
129
|
+
|
130
|
+
# Callback to ensure remaining tasks are processed before program exit
|
131
|
+
if not self._atexit_callback_registered:
|
132
|
+
atexit.register(self._at_exit_callback)
|
133
|
+
self._atexit_callback_registered = True
|
134
|
+
|
135
|
+
self._is_active = True
|
136
|
+
|
137
|
+
def is_active(self) -> bool:
|
138
|
+
return self._is_active
|
139
|
+
|
140
|
+
def _set_up_threads(self) -> None:
|
141
|
+
"""Set up the consumer and worker threads."""
|
142
|
+
with self._lock:
|
143
|
+
self._worker_threadpool = ThreadPoolExecutor(
|
144
|
+
max_workers=self._max_workers,
|
145
|
+
thread_name_prefix="MlflowTraceLoggingWorker",
|
146
|
+
)
|
147
|
+
self._consumer_thread = threading.Thread(
|
148
|
+
target=self._consumer_loop,
|
149
|
+
name="MLflowTraceLoggingConsumer",
|
150
|
+
daemon=True,
|
151
|
+
)
|
152
|
+
self._consumer_thread.start()
|
153
|
+
|
154
|
+
def _at_exit_callback(self) -> None:
|
155
|
+
"""Callback function executed when the program is exiting."""
|
156
|
+
try:
|
157
|
+
_logger.info(
|
158
|
+
"Flushing the async trace logging queue before program exit. "
|
159
|
+
"This may take a while..."
|
160
|
+
)
|
161
|
+
self.flush(terminate=True)
|
162
|
+
except Exception as e:
|
163
|
+
_logger.error(f"Error while finishing trace export requests: {e}")
|
164
|
+
|
165
|
+
def flush(self, terminate=False) -> None:
|
166
|
+
"""
|
167
|
+
Flush the async logging queue.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
terminate: If True, shut down the logging threads after flushing.
|
171
|
+
"""
|
172
|
+
if not self.is_active():
|
173
|
+
return
|
174
|
+
|
175
|
+
self._stop_event.set()
|
176
|
+
self._consumer_thread.join()
|
177
|
+
|
178
|
+
# Wait for all tasks to be processed
|
179
|
+
self._queue.join()
|
180
|
+
|
181
|
+
self._worker_threadpool.shutdown(wait=True)
|
182
|
+
self._is_active = False
|
183
|
+
# Restart threads to listen to incoming requests after flushing, if not terminating
|
184
|
+
if not terminate:
|
185
|
+
self._stop_event.clear()
|
186
|
+
self.activate()
|