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,178 @@
|
|
1
|
+
import matplotlib.pyplot as plt
|
2
|
+
import numpy as np
|
3
|
+
|
4
|
+
|
5
|
+
def _cumulative_gain_curve(y_true, y_score, pos_label=None):
|
6
|
+
"""
|
7
|
+
This method is copied from scikit-plot package.
|
8
|
+
See https://github.com/reiinakano/scikit-plot/blob/2dd3e6a76df77edcbd724c4db25575f70abb57cb/scikitplot/helpers.py#L157
|
9
|
+
|
10
|
+
This function generates the points necessary to plot the Cumulative Gain
|
11
|
+
|
12
|
+
Note: This implementation is restricted to the binary classification task.
|
13
|
+
|
14
|
+
Args:
|
15
|
+
y_true (array-like, shape (n_samples)): True labels of the data.
|
16
|
+
|
17
|
+
y_score (array-like, shape (n_samples)): Target scores, can either be
|
18
|
+
probability estimates of the positive class, confidence values, or
|
19
|
+
non-thresholded measure of decisions (as returned by
|
20
|
+
decision_function on some classifiers).
|
21
|
+
|
22
|
+
pos_label (int or str, default=None): Label considered as positive and
|
23
|
+
others are considered negative
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
percentages (numpy.ndarray): An array containing the X-axis values for
|
27
|
+
plotting the Cumulative Gains chart.
|
28
|
+
|
29
|
+
gains (numpy.ndarray): An array containing the Y-axis values for one
|
30
|
+
curve of the Cumulative Gains chart.
|
31
|
+
|
32
|
+
Raises:
|
33
|
+
ValueError: If `y_true` is not composed of 2 classes. The Cumulative
|
34
|
+
Gain Chart is only relevant in binary classification.
|
35
|
+
"""
|
36
|
+
y_true = np.asarray(y_true)
|
37
|
+
y_score = np.asarray(y_score)
|
38
|
+
|
39
|
+
# ensure binary classification if pos_label is not specified
|
40
|
+
classes = np.unique(y_true)
|
41
|
+
if pos_label is None and not (
|
42
|
+
np.array_equal(classes, [0, 1])
|
43
|
+
or np.array_equal(classes, [-1, 1])
|
44
|
+
or np.array_equal(classes, [0])
|
45
|
+
or np.array_equal(classes, [-1])
|
46
|
+
or np.array_equal(classes, [1])
|
47
|
+
):
|
48
|
+
raise ValueError("Data is not binary and pos_label is not specified")
|
49
|
+
elif pos_label is None:
|
50
|
+
pos_label = 1.0
|
51
|
+
|
52
|
+
# make y_true a boolean vector
|
53
|
+
y_true = y_true == pos_label
|
54
|
+
|
55
|
+
sorted_indices = np.argsort(y_score)[::-1]
|
56
|
+
y_true = y_true[sorted_indices]
|
57
|
+
gains = np.cumsum(y_true)
|
58
|
+
|
59
|
+
percentages = np.arange(start=1, stop=len(y_true) + 1)
|
60
|
+
|
61
|
+
gains = gains / float(np.sum(y_true))
|
62
|
+
percentages = percentages / float(len(y_true))
|
63
|
+
|
64
|
+
gains = np.insert(gains, 0, [0])
|
65
|
+
percentages = np.insert(percentages, 0, [0])
|
66
|
+
|
67
|
+
return percentages, gains
|
68
|
+
|
69
|
+
|
70
|
+
def plot_lift_curve(
|
71
|
+
y_true,
|
72
|
+
y_probas,
|
73
|
+
title="Lift Curve",
|
74
|
+
ax=None,
|
75
|
+
figsize=None,
|
76
|
+
title_fontsize="large",
|
77
|
+
text_fontsize="medium",
|
78
|
+
pos_label=None,
|
79
|
+
):
|
80
|
+
"""
|
81
|
+
This method is copied from scikit-plot package.
|
82
|
+
See https://github.com/reiinakano/scikit-plot/blob/2dd3e6a76df77edcbd724c4db25575f70abb57cb/scikitplot/metrics.py#L1133
|
83
|
+
|
84
|
+
Generates the Lift Curve from labels and scores/probabilities
|
85
|
+
|
86
|
+
The lift curve is used to determine the effectiveness of a
|
87
|
+
binary classifier. A detailed explanation can be found at
|
88
|
+
http://www2.cs.uregina.ca/~dbd/cs831/notes/lift_chart/lift_chart.html.
|
89
|
+
The implementation here works only for binary classification.
|
90
|
+
|
91
|
+
Args:
|
92
|
+
y_true (array-like, shape (n_samples)):
|
93
|
+
Ground truth (correct) target values.
|
94
|
+
|
95
|
+
y_probas (array-like, shape (n_samples, n_classes)):
|
96
|
+
Prediction probabilities for each class returned by a classifier.
|
97
|
+
|
98
|
+
title (string, optional): Title of the generated plot. Defaults to
|
99
|
+
"Lift Curve".
|
100
|
+
|
101
|
+
ax (:class:`matplotlib.axes.Axes`, optional): The axes upon which to
|
102
|
+
plot the learning curve. If None, the plot is drawn on a new set of
|
103
|
+
axes.
|
104
|
+
|
105
|
+
figsize (2-tuple, optional): Tuple denoting figure size of the plot
|
106
|
+
e.g. (6, 6). Defaults to ``None``.
|
107
|
+
|
108
|
+
title_fontsize (string or int, optional): Matplotlib-style fontsizes.
|
109
|
+
Use e.g. "small", "medium", "large" or integer-values. Defaults to
|
110
|
+
"large".
|
111
|
+
|
112
|
+
text_fontsize (string or int, optional): Matplotlib-style fontsizes.
|
113
|
+
Use e.g. "small", "medium", "large" or integer-values. Defaults to
|
114
|
+
"medium".
|
115
|
+
|
116
|
+
pos_label (optional): Label for the positive class.
|
117
|
+
|
118
|
+
Returns:
|
119
|
+
ax (:class:`matplotlib.axes.Axes`): The axes on which the plot was
|
120
|
+
drawn.
|
121
|
+
|
122
|
+
Example:
|
123
|
+
>>> lr = LogisticRegression()
|
124
|
+
>>> lr = lr.fit(X_train, y_train)
|
125
|
+
>>> y_probas = lr.predict_proba(X_test)
|
126
|
+
>>> plot_lift_curve(y_test, y_probas)
|
127
|
+
<matplotlib.axes._subplots.AxesSubplot object at 0x7fe967d64490>
|
128
|
+
>>> plt.show()
|
129
|
+
|
130
|
+
.. image:: _static/examples/plot_lift_curve.png
|
131
|
+
:align: center
|
132
|
+
:alt: Lift Curve
|
133
|
+
"""
|
134
|
+
y_true = np.array(y_true)
|
135
|
+
y_probas = np.array(y_probas)
|
136
|
+
|
137
|
+
classes = np.unique(y_true)
|
138
|
+
if len(classes) != 2:
|
139
|
+
raise ValueError(f"Cannot calculate Lift Curve for data with {len(classes)} category/ies")
|
140
|
+
|
141
|
+
# Compute Cumulative Gain Curves
|
142
|
+
percentages, gains1 = _cumulative_gain_curve(y_true, y_probas[:, 0], classes[0])
|
143
|
+
percentages, gains2 = _cumulative_gain_curve(y_true, y_probas[:, 1], classes[1])
|
144
|
+
|
145
|
+
percentages = percentages[1:]
|
146
|
+
gains1 = gains1[1:]
|
147
|
+
gains2 = gains2[1:]
|
148
|
+
|
149
|
+
gains1 = gains1 / percentages
|
150
|
+
gains2 = gains2 / percentages
|
151
|
+
|
152
|
+
if ax is None:
|
153
|
+
_, ax = plt.subplots(1, 1, figsize=figsize)
|
154
|
+
|
155
|
+
ax.set_title(title, fontsize=title_fontsize)
|
156
|
+
|
157
|
+
label0 = f"Class {classes[0]}"
|
158
|
+
label1 = f"Class {classes[1]}"
|
159
|
+
# show (positive) next to the positive class in the legend
|
160
|
+
if pos_label:
|
161
|
+
if pos_label == classes[0]:
|
162
|
+
label0 = f"Class {classes[0]} (positive)"
|
163
|
+
elif pos_label == classes[1]:
|
164
|
+
label1 = f"Class {classes[1]} (positive)"
|
165
|
+
# do not mark positive class if pos_label is not in classes
|
166
|
+
|
167
|
+
ax.plot(percentages, gains1, lw=3, label=label0)
|
168
|
+
ax.plot(percentages, gains2, lw=3, label=label1)
|
169
|
+
|
170
|
+
ax.plot([0, 1], [1, 1], "k--", lw=2, label="Baseline")
|
171
|
+
|
172
|
+
ax.set_xlabel("Percentage of sample", fontsize=text_fontsize)
|
173
|
+
ax.set_ylabel("Lift", fontsize=text_fontsize)
|
174
|
+
ax.tick_params(labelsize=text_fontsize)
|
175
|
+
ax.grid("on")
|
176
|
+
ax.legend(loc="best", fontsize=text_fontsize)
|
177
|
+
|
178
|
+
return ax
|
@@ -0,0 +1,123 @@
|
|
1
|
+
import logging
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Any, Callable, Optional
|
4
|
+
|
5
|
+
import numpy as np
|
6
|
+
|
7
|
+
from mlflow.metrics.base import MetricValue
|
8
|
+
from mlflow.models.evaluation.base import EvaluationMetric
|
9
|
+
|
10
|
+
_logger = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
|
13
|
+
@dataclass
|
14
|
+
class MetricDefinition:
|
15
|
+
"""
|
16
|
+
A namedtuple representing a metric function and its properties.
|
17
|
+
|
18
|
+
function : the metric function
|
19
|
+
name : the name of the metric function
|
20
|
+
index : the index of the function in the ``extra_metrics`` argument of mlflow.evaluate
|
21
|
+
"""
|
22
|
+
|
23
|
+
function: Callable[..., Any]
|
24
|
+
name: str
|
25
|
+
index: int
|
26
|
+
version: Optional[str] = None
|
27
|
+
genai_metric_args: Optional[dict[str, Any]] = None
|
28
|
+
|
29
|
+
@classmethod
|
30
|
+
def from_index_and_metric(cls, index: int, metric: EvaluationMetric):
|
31
|
+
return cls(
|
32
|
+
function=metric.eval_fn,
|
33
|
+
index=index,
|
34
|
+
name=metric.name,
|
35
|
+
version=metric.version,
|
36
|
+
genai_metric_args=metric.genai_metric_args,
|
37
|
+
)
|
38
|
+
|
39
|
+
def evaluate(self, eval_fn_args) -> Optional[MetricValue]:
|
40
|
+
"""
|
41
|
+
This function calls the metric function and performs validations on the returned
|
42
|
+
result to ensure that they are in the expected format. It will warn and will not log metrics
|
43
|
+
that are in the wrong format.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
eval_fn_args: A dictionary of args needed to compute the eval metrics.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
MetricValue
|
50
|
+
"""
|
51
|
+
if self.index < 0:
|
52
|
+
exception_header = f"Did not log builtin metric '{self.name}' because it"
|
53
|
+
else:
|
54
|
+
exception_header = (
|
55
|
+
f"Did not log metric '{self.name}' at index "
|
56
|
+
f"{self.index} in the `extra_metrics` parameter because it"
|
57
|
+
)
|
58
|
+
|
59
|
+
metric: MetricValue = self.function(*eval_fn_args)
|
60
|
+
|
61
|
+
def _is_numeric(value):
|
62
|
+
return isinstance(value, (int, float, np.number))
|
63
|
+
|
64
|
+
def _is_string(value):
|
65
|
+
return isinstance(value, str)
|
66
|
+
|
67
|
+
if metric is None:
|
68
|
+
_logger.warning(f"{exception_header} returned None.")
|
69
|
+
return
|
70
|
+
|
71
|
+
if _is_numeric(metric):
|
72
|
+
return MetricValue(aggregate_results={self.name: metric})
|
73
|
+
|
74
|
+
if not isinstance(metric, MetricValue):
|
75
|
+
_logger.warning(f"{exception_header} did not return a MetricValue.")
|
76
|
+
return
|
77
|
+
|
78
|
+
scores = metric.scores
|
79
|
+
justifications = metric.justifications
|
80
|
+
aggregates = metric.aggregate_results
|
81
|
+
|
82
|
+
if scores is not None:
|
83
|
+
if not isinstance(scores, list):
|
84
|
+
_logger.warning(
|
85
|
+
f"{exception_header} must return MetricValue with scores as a list."
|
86
|
+
)
|
87
|
+
return
|
88
|
+
if any(not (_is_numeric(s) or _is_string(s) or s is None) for s in scores):
|
89
|
+
_logger.warning(
|
90
|
+
f"{exception_header} must return MetricValue with numeric or string scores."
|
91
|
+
)
|
92
|
+
return
|
93
|
+
|
94
|
+
if justifications is not None:
|
95
|
+
if not isinstance(justifications, list):
|
96
|
+
_logger.warning(
|
97
|
+
f"{exception_header} must return MetricValue with justifications as a list."
|
98
|
+
)
|
99
|
+
return
|
100
|
+
if any(not (_is_string(just) or just is None) for just in justifications):
|
101
|
+
_logger.warning(
|
102
|
+
f"{exception_header} must return MetricValue with string justifications."
|
103
|
+
)
|
104
|
+
return
|
105
|
+
|
106
|
+
if aggregates is not None:
|
107
|
+
if not isinstance(aggregates, dict):
|
108
|
+
_logger.warning(
|
109
|
+
f"{exception_header} must return MetricValue with aggregate_results as a dict."
|
110
|
+
)
|
111
|
+
return
|
112
|
+
|
113
|
+
if any(
|
114
|
+
not (isinstance(k, str) and (_is_numeric(v) or v is None))
|
115
|
+
for k, v in aggregates.items()
|
116
|
+
):
|
117
|
+
_logger.warning(
|
118
|
+
f"{exception_header} must return MetricValue with aggregate_results with "
|
119
|
+
"str keys and numeric values."
|
120
|
+
)
|
121
|
+
return
|
122
|
+
|
123
|
+
return metric
|
@@ -0,0 +1,179 @@
|
|
1
|
+
import contextlib
|
2
|
+
import inspect
|
3
|
+
import logging
|
4
|
+
from typing import Any, Callable
|
5
|
+
|
6
|
+
from mlflow.ml_package_versions import FLAVOR_TO_MODULE_NAME
|
7
|
+
from mlflow.utils.autologging_utils import (
|
8
|
+
AUTOLOGGING_INTEGRATIONS,
|
9
|
+
autologging_conf_lock,
|
10
|
+
get_autolog_function,
|
11
|
+
is_autolog_supported,
|
12
|
+
)
|
13
|
+
from mlflow.utils.autologging_utils.safety import revert_patches
|
14
|
+
from mlflow.utils.import_hooks import (
|
15
|
+
_post_import_hooks,
|
16
|
+
get_post_import_hooks,
|
17
|
+
register_post_import_hook,
|
18
|
+
)
|
19
|
+
|
20
|
+
_logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
|
23
|
+
# This flag is used to display the message only once when tracing is enabled during the evaluation.
|
24
|
+
_SHOWN_TRACE_MESSAGE_BEFORE = False
|
25
|
+
|
26
|
+
|
27
|
+
@contextlib.contextmanager
|
28
|
+
@autologging_conf_lock
|
29
|
+
def configure_autologging_for_evaluation(enable_tracing: bool = True):
|
30
|
+
"""
|
31
|
+
Temporarily override the autologging configuration for all flavors during the model evaluation.
|
32
|
+
For example, model auto-logging must be disabled during the evaluation. After the evaluation
|
33
|
+
is done, the original autologging configurations are restored.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
enable_tracing (bool): Whether to enable tracing for the supported flavors during eval.
|
37
|
+
"""
|
38
|
+
original_import_hooks = {}
|
39
|
+
new_import_hooks = {}
|
40
|
+
|
41
|
+
# AUTOLOGGING_INTEGRATIONS can change during we iterate over flavors and enable/disable
|
42
|
+
# autologging, therefore, we snapshot the current configuration to restore it later.
|
43
|
+
global_config_snapshot = AUTOLOGGING_INTEGRATIONS.copy()
|
44
|
+
|
45
|
+
for flavor in FLAVOR_TO_MODULE_NAME:
|
46
|
+
if not is_autolog_supported(flavor):
|
47
|
+
continue
|
48
|
+
|
49
|
+
original_config = global_config_snapshot.get(flavor, {}).copy()
|
50
|
+
|
51
|
+
# If autologging is explicitly disabled, do nothing.
|
52
|
+
if original_config.get("disable", False):
|
53
|
+
continue
|
54
|
+
|
55
|
+
# NB: Using post-import hook to configure the autologging lazily when the target
|
56
|
+
# flavor's module is imported, rather than configuring it immediately. This is
|
57
|
+
# because the evaluation code usually only uses a subset of the supported flavors,
|
58
|
+
# hence we want to avoid unnecessary overhead of configuring all flavors.
|
59
|
+
@autologging_conf_lock
|
60
|
+
def _setup_autolog(module):
|
61
|
+
try:
|
62
|
+
autolog = get_autolog_function(flavor)
|
63
|
+
|
64
|
+
# If tracing is supported and not explicitly disabled, enable it.
|
65
|
+
if enable_tracing and _should_enable_tracing(flavor, global_config_snapshot):
|
66
|
+
new_config = {
|
67
|
+
k: False if k.startswith("log_") else v for k, v in original_config.items()
|
68
|
+
}
|
69
|
+
# log_models needs to be disabled
|
70
|
+
# so we don't init LoggedModels during eval for some GenAI flavors
|
71
|
+
new_config |= {"log_traces": True, "silent": True, "log_models": False}
|
72
|
+
_kwargs_safe_invoke(autolog, new_config)
|
73
|
+
|
74
|
+
global _SHOWN_TRACE_MESSAGE_BEFORE
|
75
|
+
if not _SHOWN_TRACE_MESSAGE_BEFORE:
|
76
|
+
_logger.info(
|
77
|
+
"Auto tracing is temporarily enabled during the model evaluation "
|
78
|
+
"for computing some metrics and debugging. To disable tracing, call "
|
79
|
+
"`mlflow.autolog(disable=True)`."
|
80
|
+
)
|
81
|
+
_SHOWN_TRACE_MESSAGE_BEFORE = True
|
82
|
+
else:
|
83
|
+
autolog(disable=True)
|
84
|
+
|
85
|
+
except Exception:
|
86
|
+
_logger.debug(f"Failed to update autologging config for {flavor}.", exc_info=True)
|
87
|
+
|
88
|
+
module = FLAVOR_TO_MODULE_NAME[flavor]
|
89
|
+
try:
|
90
|
+
original_import_hooks[module] = get_post_import_hooks(module)
|
91
|
+
new_import_hooks[module] = _setup_autolog
|
92
|
+
register_post_import_hook(_setup_autolog, module, overwrite=True)
|
93
|
+
except Exception:
|
94
|
+
_logger.debug(f"Failed to register post-import hook for {flavor}.", exc_info=True)
|
95
|
+
|
96
|
+
try:
|
97
|
+
yield
|
98
|
+
finally:
|
99
|
+
# Remove post-import hooks and patches the are registered during the evaluation.
|
100
|
+
for module, hooks in new_import_hooks.items():
|
101
|
+
# Restore original post-import hooks if any. Note that we don't use
|
102
|
+
# register_post_import_hook method to bypass some pre-checks and just
|
103
|
+
# restore the original state.
|
104
|
+
if hooks is None:
|
105
|
+
_post_import_hooks.pop(module, None)
|
106
|
+
else:
|
107
|
+
_post_import_hooks[module] = original_import_hooks[module]
|
108
|
+
|
109
|
+
# If any autologging configuration is updated, restore original autologging configurations.
|
110
|
+
for flavor, new_config in AUTOLOGGING_INTEGRATIONS.copy().items():
|
111
|
+
original_config = global_config_snapshot.get(flavor)
|
112
|
+
if original_config != new_config:
|
113
|
+
try:
|
114
|
+
autolog = get_autolog_function(flavor)
|
115
|
+
if original_config:
|
116
|
+
_kwargs_safe_invoke(autolog, original_config)
|
117
|
+
AUTOLOGGING_INTEGRATIONS[flavor] = original_config
|
118
|
+
else:
|
119
|
+
# If the original configuration is empty, autologging was not enabled before
|
120
|
+
autolog(disable=True)
|
121
|
+
# Remove all safe_patch applied by autologging
|
122
|
+
revert_patches(flavor)
|
123
|
+
# We also need to remove the config entry from AUTOLOGGING_INTEGRATIONS,
|
124
|
+
# so as not to confuse with the case user explicitly disabled autologging.
|
125
|
+
AUTOLOGGING_INTEGRATIONS.pop(flavor, None)
|
126
|
+
except ImportError:
|
127
|
+
pass
|
128
|
+
except Exception as e:
|
129
|
+
if original_config is None or (
|
130
|
+
not original_config.get("disable", False)
|
131
|
+
and not original_config.get("silent", False)
|
132
|
+
):
|
133
|
+
_logger.warning(
|
134
|
+
f"Exception raised while calling autologging for {flavor}: {e}"
|
135
|
+
)
|
136
|
+
|
137
|
+
|
138
|
+
def _should_enable_tracing(flavor: str, autologging_config: dict[str, Any]) -> bool:
|
139
|
+
"""
|
140
|
+
Check if tracing should be enabled for the given flavor during the model evaluation.
|
141
|
+
"""
|
142
|
+
# 1. Check if the autologging or tracing is globally disabled
|
143
|
+
# TODO: This check should not take precedence over the flavor-specific configuration
|
144
|
+
# set by the explicit mlflow.<flavor>.autolog() call by users.
|
145
|
+
# However, in Databricks, sometimes mlflow.<flavor>.autolog() is automatically
|
146
|
+
# called in the kernel startup, which is confused with the user's action. In
|
147
|
+
# such cases, even when user disables autologging globally, the flavor-specific
|
148
|
+
# autologging remains enabled. We are going to fix the Databricks side issue,
|
149
|
+
# and after that, we should move this check down after the flavor-specific check.
|
150
|
+
global_config = autologging_config.get("mlflow", {})
|
151
|
+
if global_config.get("disable", False) or (not global_config.get("log_traces", True)):
|
152
|
+
return False
|
153
|
+
|
154
|
+
if not _is_trace_autologging_supported(flavor):
|
155
|
+
return False
|
156
|
+
|
157
|
+
# 3. Check if tracing is explicitly disabled for the flavor
|
158
|
+
flavor_config = autologging_config.get(flavor, {})
|
159
|
+
return flavor_config.get("log_traces", True)
|
160
|
+
|
161
|
+
|
162
|
+
def _kwargs_safe_invoke(func: Callable[..., Any], kwargs: dict[str, Any]):
|
163
|
+
"""
|
164
|
+
Invoke the function with the given dictionary as keyword arguments, but only include the
|
165
|
+
arguments that are present in the function's signature.
|
166
|
+
|
167
|
+
This is particularly used for calling autolog() function with the configuration dictionary
|
168
|
+
stored in AUTOLOGGING_INTEGRATIONS. While the config keys mostly align with the autolog()'s
|
169
|
+
signature by design, some keys are not present in autolog(), such as "globally_configured".
|
170
|
+
"""
|
171
|
+
sig = inspect.signature(func)
|
172
|
+
return func(**{k: v for k, v in kwargs.items() if k in sig.parameters})
|
173
|
+
|
174
|
+
|
175
|
+
def _is_trace_autologging_supported(flavor_name: str) -> bool:
|
176
|
+
"""Check if the given flavor supports trace autologging."""
|
177
|
+
if autolog_func := get_autolog_function(flavor_name):
|
178
|
+
return "log_traces" in inspect.signature(autolog_func).parameters
|
179
|
+
return False
|