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,432 @@
|
|
1
|
+
"""
|
2
|
+
Defines an MlflowAutologgingQueueingClient developer API that provides batching, queueing, and
|
3
|
+
asynchronous execution capabilities for a subset of MLflow Tracking logging operations used most
|
4
|
+
frequently by autologging operations.
|
5
|
+
|
6
|
+
TODO(dbczumar): Migrate request batching, queueing, and async execution support from
|
7
|
+
MlflowAutologgingQueueingClient to MlflowClient in order to provide broader benefits to end users.
|
8
|
+
Remove this developer API.
|
9
|
+
"""
|
10
|
+
|
11
|
+
import logging
|
12
|
+
import os
|
13
|
+
from collections import namedtuple
|
14
|
+
from concurrent.futures import ThreadPoolExecutor
|
15
|
+
from itertools import zip_longest
|
16
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
17
|
+
|
18
|
+
from mlflow.entities import Metric, Param, RunTag
|
19
|
+
from mlflow.entities.dataset_input import DatasetInput
|
20
|
+
from mlflow.exceptions import MlflowException
|
21
|
+
from mlflow.utils import _truncate_dict, chunk_list
|
22
|
+
from mlflow.utils.time import get_current_time_millis
|
23
|
+
from mlflow.utils.validation import (
|
24
|
+
MAX_DATASETS_PER_BATCH,
|
25
|
+
MAX_ENTITIES_PER_BATCH,
|
26
|
+
MAX_ENTITY_KEY_LENGTH,
|
27
|
+
MAX_METRICS_PER_BATCH,
|
28
|
+
MAX_PARAM_VAL_LENGTH,
|
29
|
+
MAX_PARAMS_TAGS_PER_BATCH,
|
30
|
+
MAX_TAG_VAL_LENGTH,
|
31
|
+
)
|
32
|
+
|
33
|
+
if TYPE_CHECKING:
|
34
|
+
from mlflow.data.dataset import Dataset
|
35
|
+
|
36
|
+
_logger = logging.getLogger(__name__)
|
37
|
+
|
38
|
+
_PendingCreateRun = namedtuple(
|
39
|
+
"_PendingCreateRun", ["experiment_id", "start_time", "tags", "run_name"]
|
40
|
+
)
|
41
|
+
_PendingSetTerminated = namedtuple("_PendingSetTerminated", ["status", "end_time"])
|
42
|
+
|
43
|
+
|
44
|
+
class PendingRunId:
|
45
|
+
"""
|
46
|
+
Serves as a placeholder for the ID of a run that does not yet exist, enabling additional
|
47
|
+
metadata (e.g. metrics, params, ...) to be enqueued for the run prior to its creation.
|
48
|
+
"""
|
49
|
+
|
50
|
+
|
51
|
+
class RunOperations:
|
52
|
+
"""
|
53
|
+
Represents a collection of operations on one or more MLflow Runs, such as run creation
|
54
|
+
or metric logging.
|
55
|
+
"""
|
56
|
+
|
57
|
+
def __init__(self, operation_futures):
|
58
|
+
self._operation_futures = operation_futures
|
59
|
+
|
60
|
+
def await_completion(self):
|
61
|
+
"""
|
62
|
+
Blocks on completion of the MLflow Run operations.
|
63
|
+
"""
|
64
|
+
failed_operations = []
|
65
|
+
for future in self._operation_futures:
|
66
|
+
try:
|
67
|
+
future.result()
|
68
|
+
except Exception as e:
|
69
|
+
failed_operations.append(e)
|
70
|
+
|
71
|
+
if len(failed_operations) > 0:
|
72
|
+
raise MlflowException(
|
73
|
+
message=(
|
74
|
+
"The following failures occurred while performing one or more logging"
|
75
|
+
f" operations: {failed_operations}"
|
76
|
+
)
|
77
|
+
)
|
78
|
+
|
79
|
+
|
80
|
+
# Define a threadpool for use across `MlflowAutologgingQueueingClient` instances to ensure that
|
81
|
+
# `MlflowAutologgingQueueingClient` instances can be pickled (ThreadPoolExecutor objects are not
|
82
|
+
# pickleable and therefore cannot be assigned as instance attributes).
|
83
|
+
#
|
84
|
+
# We limit the number of threads used for run operations, using at most 8 threads or 2 * the number
|
85
|
+
# of CPU cores available on the system (whichever is smaller)
|
86
|
+
num_cpus = os.cpu_count() or 4
|
87
|
+
num_logging_workers = min(num_cpus * 2, 8)
|
88
|
+
_AUTOLOGGING_QUEUEING_CLIENT_THREAD_POOL = ThreadPoolExecutor(
|
89
|
+
max_workers=num_logging_workers,
|
90
|
+
thread_name_prefix="MlflowAutologgingQueueingClient",
|
91
|
+
)
|
92
|
+
|
93
|
+
|
94
|
+
class MlflowAutologgingQueueingClient:
|
95
|
+
"""
|
96
|
+
Efficiently implements a subset of MLflow Tracking's `MlflowClient` and fluent APIs to provide
|
97
|
+
automatic batching and async execution of run operations by way of queueing, as well as
|
98
|
+
parameter / tag truncation for autologging use cases. Run operations defined by this client,
|
99
|
+
such as `create_run` and `log_metrics`, enqueue data for future persistence to MLflow
|
100
|
+
Tracking. Data is not persisted until the queue is flushed via the `flush()` method, which
|
101
|
+
supports synchronous and asynchronous execution.
|
102
|
+
|
103
|
+
MlflowAutologgingQueueingClient is not threadsafe; none of its APIs should be called
|
104
|
+
concurrently.
|
105
|
+
"""
|
106
|
+
|
107
|
+
def __init__(self, tracking_uri=None):
|
108
|
+
from mlflow.tracking.client import MlflowClient
|
109
|
+
|
110
|
+
self._client = MlflowClient(tracking_uri)
|
111
|
+
self._pending_ops_by_run_id = {}
|
112
|
+
|
113
|
+
def __enter__(self):
|
114
|
+
"""
|
115
|
+
Enables `MlflowAutologgingQueueingClient` to be used as a context manager with
|
116
|
+
synchronous flushing upon exit, removing the need to call `flush()` for use cases
|
117
|
+
where logging completion can be waited upon synchronously.
|
118
|
+
|
119
|
+
Run content is only flushed if the context exited without an exception.
|
120
|
+
"""
|
121
|
+
return self
|
122
|
+
|
123
|
+
def __exit__(self, exc_type, exc, traceback):
|
124
|
+
"""
|
125
|
+
Enables `MlflowAutologgingQueueingClient` to be used as a context manager with
|
126
|
+
synchronous flushing upon exit, removing the need to call `flush()` for use cases
|
127
|
+
where logging completion can be waited upon synchronously.
|
128
|
+
|
129
|
+
Run content is only flushed if the context exited without an exception.
|
130
|
+
"""
|
131
|
+
# NB: Run content is only flushed upon context exit to ensure that we don't elide the
|
132
|
+
# original exception thrown by the context (because `flush()` itself may throw). This
|
133
|
+
# is consistent with the behavior of a routine that calls `flush()` explicitly: content
|
134
|
+
# is not logged if an exception preempts the call to `flush()`
|
135
|
+
if exc is None and exc_type is None and traceback is None:
|
136
|
+
self.flush(synchronous=True)
|
137
|
+
else:
|
138
|
+
_logger.debug(
|
139
|
+
"Skipping run content logging upon MlflowAutologgingQueueingClient context because"
|
140
|
+
" an exception was raised within the context: %s",
|
141
|
+
exc,
|
142
|
+
)
|
143
|
+
|
144
|
+
def create_run(
|
145
|
+
self,
|
146
|
+
experiment_id: str,
|
147
|
+
start_time: Optional[int] = None,
|
148
|
+
tags: Optional[dict[str, Any]] = None,
|
149
|
+
run_name: Optional[str] = None,
|
150
|
+
) -> PendingRunId:
|
151
|
+
"""
|
152
|
+
Enqueues a CreateRun operation with the specified attributes, returning a `PendingRunId`
|
153
|
+
instance that can be used as input to other client logging APIs (e.g. `log_metrics`,
|
154
|
+
`log_params`, ...).
|
155
|
+
|
156
|
+
Returns:
|
157
|
+
A `PendingRunId` that can be passed as the `run_id` parameter to other client
|
158
|
+
logging APIs, such as `log_params` and `log_metrics`.
|
159
|
+
"""
|
160
|
+
tags = tags or {}
|
161
|
+
tags = _truncate_dict(
|
162
|
+
tags, max_key_length=MAX_ENTITY_KEY_LENGTH, max_value_length=MAX_TAG_VAL_LENGTH
|
163
|
+
)
|
164
|
+
run_id = PendingRunId()
|
165
|
+
self._get_pending_operations(run_id).enqueue(
|
166
|
+
create_run=_PendingCreateRun(
|
167
|
+
experiment_id=experiment_id,
|
168
|
+
start_time=start_time,
|
169
|
+
tags=[RunTag(key, str(value)) for key, value in tags.items()],
|
170
|
+
run_name=run_name,
|
171
|
+
)
|
172
|
+
)
|
173
|
+
return run_id
|
174
|
+
|
175
|
+
def set_terminated(
|
176
|
+
self,
|
177
|
+
run_id: Union[str, PendingRunId],
|
178
|
+
status: Optional[str] = None,
|
179
|
+
end_time: Optional[int] = None,
|
180
|
+
) -> None:
|
181
|
+
"""
|
182
|
+
Enqueues an UpdateRun operation with the specified `status` and `end_time` attributes
|
183
|
+
for the specified `run_id`.
|
184
|
+
"""
|
185
|
+
self._get_pending_operations(run_id).enqueue(
|
186
|
+
set_terminated=_PendingSetTerminated(status=status, end_time=end_time)
|
187
|
+
)
|
188
|
+
|
189
|
+
def log_params(self, run_id: Union[str, PendingRunId], params: dict[str, Any]) -> None:
|
190
|
+
"""
|
191
|
+
Enqueues a collection of Parameters to be logged to the run specified by `run_id`.
|
192
|
+
"""
|
193
|
+
params = _truncate_dict(
|
194
|
+
params, max_key_length=MAX_ENTITY_KEY_LENGTH, max_value_length=MAX_PARAM_VAL_LENGTH
|
195
|
+
)
|
196
|
+
params_arr = [Param(key, str(value)) for key, value in params.items()]
|
197
|
+
self._get_pending_operations(run_id).enqueue(params=params_arr)
|
198
|
+
|
199
|
+
def log_inputs(
|
200
|
+
self, run_id: Union[str, PendingRunId], datasets: Optional[list[DatasetInput]]
|
201
|
+
) -> None:
|
202
|
+
"""
|
203
|
+
Enqueues a collection of Dataset to be logged to the run specified by `run_id`.
|
204
|
+
"""
|
205
|
+
if datasets is None or len(datasets) == 0:
|
206
|
+
return
|
207
|
+
self._get_pending_operations(run_id).enqueue(datasets=datasets)
|
208
|
+
|
209
|
+
def log_metrics(
|
210
|
+
self,
|
211
|
+
run_id: Union[str, PendingRunId],
|
212
|
+
metrics: dict[str, float],
|
213
|
+
step: Optional[int] = None,
|
214
|
+
dataset: Optional["Dataset"] = None,
|
215
|
+
model_id: Optional[str] = None,
|
216
|
+
) -> None:
|
217
|
+
"""
|
218
|
+
Enqueues a collection of Metrics to be logged to the run specified by `run_id` at the
|
219
|
+
step specified by `step`.
|
220
|
+
"""
|
221
|
+
metrics = _truncate_dict(metrics, max_key_length=MAX_ENTITY_KEY_LENGTH)
|
222
|
+
timestamp_ms = get_current_time_millis()
|
223
|
+
metrics_arr = [
|
224
|
+
Metric(
|
225
|
+
key,
|
226
|
+
value,
|
227
|
+
timestamp_ms,
|
228
|
+
step or 0,
|
229
|
+
model_id=model_id,
|
230
|
+
dataset_name=dataset and dataset.name,
|
231
|
+
dataset_digest=dataset and dataset.digest,
|
232
|
+
)
|
233
|
+
for key, value in metrics.items()
|
234
|
+
]
|
235
|
+
self._get_pending_operations(run_id).enqueue(metrics=metrics_arr)
|
236
|
+
|
237
|
+
def set_tags(self, run_id: Union[str, PendingRunId], tags: dict[str, Any]) -> None:
|
238
|
+
"""
|
239
|
+
Enqueues a collection of Tags to be logged to the run specified by `run_id`.
|
240
|
+
"""
|
241
|
+
tags = _truncate_dict(
|
242
|
+
tags, max_key_length=MAX_ENTITY_KEY_LENGTH, max_value_length=MAX_TAG_VAL_LENGTH
|
243
|
+
)
|
244
|
+
tags_arr = [RunTag(key, str(value)) for key, value in tags.items()]
|
245
|
+
self._get_pending_operations(run_id).enqueue(tags=tags_arr)
|
246
|
+
|
247
|
+
def flush(self, synchronous=True):
|
248
|
+
"""
|
249
|
+
Flushes all queued run operations, resulting in the creation or mutation of runs
|
250
|
+
and run data.
|
251
|
+
|
252
|
+
Args:
|
253
|
+
synchronous: If `True`, run operations are performed synchronously, and a
|
254
|
+
`RunOperations` result object is only returned once all operations
|
255
|
+
are complete. If `False`, run operations are performed asynchronously,
|
256
|
+
and an `RunOperations` object is returned that represents the ongoing
|
257
|
+
run operations.
|
258
|
+
|
259
|
+
Returns:
|
260
|
+
A `RunOperations` instance representing the flushed operations. These operations
|
261
|
+
are already complete if `synchronous` is `True`. If `synchronous` is `False`, these
|
262
|
+
operations may still be inflight. Operation completion can be synchronously waited
|
263
|
+
on via `RunOperations.await_completion()`.
|
264
|
+
"""
|
265
|
+
logging_futures = []
|
266
|
+
for pending_operations in self._pending_ops_by_run_id.values():
|
267
|
+
future = _AUTOLOGGING_QUEUEING_CLIENT_THREAD_POOL.submit(
|
268
|
+
self._flush_pending_operations,
|
269
|
+
pending_operations=pending_operations,
|
270
|
+
)
|
271
|
+
logging_futures.append(future)
|
272
|
+
self._pending_ops_by_run_id = {}
|
273
|
+
|
274
|
+
logging_operations = RunOperations(logging_futures)
|
275
|
+
if synchronous:
|
276
|
+
logging_operations.await_completion()
|
277
|
+
return logging_operations
|
278
|
+
|
279
|
+
def _get_pending_operations(self, run_id):
|
280
|
+
"""
|
281
|
+
Returns:
|
282
|
+
A `_PendingRunOperations` containing all pending operations for the
|
283
|
+
specified `run_id`.
|
284
|
+
"""
|
285
|
+
if run_id not in self._pending_ops_by_run_id:
|
286
|
+
self._pending_ops_by_run_id[run_id] = _PendingRunOperations(run_id=run_id)
|
287
|
+
return self._pending_ops_by_run_id[run_id]
|
288
|
+
|
289
|
+
def _try_operation(self, fn, *args, **kwargs):
|
290
|
+
"""
|
291
|
+
Attempt to evaluate the specified function, `fn`, on the specified `*args` and `**kwargs`,
|
292
|
+
returning either the result of the function evaluation (if evaluation was successful) or
|
293
|
+
the exception raised by the function evaluation (if evaluation was unsuccessful).
|
294
|
+
"""
|
295
|
+
try:
|
296
|
+
return fn(*args, **kwargs)
|
297
|
+
except Exception as e:
|
298
|
+
return e
|
299
|
+
|
300
|
+
def _flush_pending_operations(self, pending_operations):
|
301
|
+
"""
|
302
|
+
Synchronously and sequentially flushes the specified list of pending run operations.
|
303
|
+
|
304
|
+
NB: Operations are not parallelized on a per-run basis because MLflow's File Store, which
|
305
|
+
is frequently used for local ML development, does not support threadsafe metadata logging
|
306
|
+
within a given run.
|
307
|
+
"""
|
308
|
+
if pending_operations.create_run:
|
309
|
+
create_run_tags = pending_operations.create_run.tags
|
310
|
+
num_additional_tags_to_include_during_creation = MAX_ENTITIES_PER_BATCH - len(
|
311
|
+
create_run_tags
|
312
|
+
)
|
313
|
+
if num_additional_tags_to_include_during_creation > 0:
|
314
|
+
create_run_tags.extend(
|
315
|
+
pending_operations.tags_queue[:num_additional_tags_to_include_during_creation]
|
316
|
+
)
|
317
|
+
pending_operations.tags_queue = pending_operations.tags_queue[
|
318
|
+
num_additional_tags_to_include_during_creation:
|
319
|
+
]
|
320
|
+
|
321
|
+
new_run = self._client.create_run(
|
322
|
+
experiment_id=pending_operations.create_run.experiment_id,
|
323
|
+
start_time=pending_operations.create_run.start_time,
|
324
|
+
tags={tag.key: tag.value for tag in create_run_tags},
|
325
|
+
)
|
326
|
+
pending_operations.run_id = new_run.info.run_id
|
327
|
+
|
328
|
+
run_id = pending_operations.run_id
|
329
|
+
assert not isinstance(run_id, PendingRunId), "Run ID cannot be pending for logging"
|
330
|
+
|
331
|
+
operation_results = []
|
332
|
+
|
333
|
+
param_batches_to_log = chunk_list(
|
334
|
+
pending_operations.params_queue,
|
335
|
+
chunk_size=MAX_PARAMS_TAGS_PER_BATCH,
|
336
|
+
)
|
337
|
+
tag_batches_to_log = chunk_list(
|
338
|
+
pending_operations.tags_queue,
|
339
|
+
chunk_size=MAX_PARAMS_TAGS_PER_BATCH,
|
340
|
+
)
|
341
|
+
for params_batch, tags_batch in zip_longest(
|
342
|
+
param_batches_to_log, tag_batches_to_log, fillvalue=[]
|
343
|
+
):
|
344
|
+
metrics_batch_size = min(
|
345
|
+
MAX_ENTITIES_PER_BATCH - len(params_batch) - len(tags_batch),
|
346
|
+
MAX_METRICS_PER_BATCH,
|
347
|
+
)
|
348
|
+
metrics_batch_size = max(metrics_batch_size, 0)
|
349
|
+
metrics_batch = pending_operations.metrics_queue[:metrics_batch_size]
|
350
|
+
pending_operations.metrics_queue = pending_operations.metrics_queue[metrics_batch_size:]
|
351
|
+
|
352
|
+
operation_results.append(
|
353
|
+
self._try_operation(
|
354
|
+
self._client.log_batch,
|
355
|
+
run_id=run_id,
|
356
|
+
metrics=metrics_batch,
|
357
|
+
params=params_batch,
|
358
|
+
tags=tags_batch,
|
359
|
+
)
|
360
|
+
)
|
361
|
+
|
362
|
+
for metrics_batch in chunk_list(
|
363
|
+
pending_operations.metrics_queue, chunk_size=MAX_METRICS_PER_BATCH
|
364
|
+
):
|
365
|
+
operation_results.append(
|
366
|
+
self._try_operation(self._client.log_batch, run_id=run_id, metrics=metrics_batch)
|
367
|
+
)
|
368
|
+
|
369
|
+
for datasets_batch in chunk_list(
|
370
|
+
pending_operations.datasets_queue, chunk_size=MAX_DATASETS_PER_BATCH
|
371
|
+
):
|
372
|
+
operation_results.append(
|
373
|
+
self._try_operation(self._client.log_inputs, run_id=run_id, datasets=datasets_batch)
|
374
|
+
)
|
375
|
+
|
376
|
+
if pending_operations.set_terminated:
|
377
|
+
operation_results.append(
|
378
|
+
self._try_operation(
|
379
|
+
self._client.set_terminated,
|
380
|
+
run_id=run_id,
|
381
|
+
status=pending_operations.set_terminated.status,
|
382
|
+
end_time=pending_operations.set_terminated.end_time,
|
383
|
+
)
|
384
|
+
)
|
385
|
+
|
386
|
+
failures = [result for result in operation_results if isinstance(result, Exception)]
|
387
|
+
if len(failures) > 0:
|
388
|
+
raise MlflowException(
|
389
|
+
message=(
|
390
|
+
f"Failed to perform one or more operations on the run with ID {run_id}."
|
391
|
+
f" Failed operations: {failures}"
|
392
|
+
)
|
393
|
+
)
|
394
|
+
|
395
|
+
|
396
|
+
class _PendingRunOperations:
|
397
|
+
"""
|
398
|
+
Represents a collection of queued / pending MLflow Run operations.
|
399
|
+
"""
|
400
|
+
|
401
|
+
def __init__(self, run_id):
|
402
|
+
self.run_id = run_id
|
403
|
+
self.create_run = None
|
404
|
+
self.set_terminated = None
|
405
|
+
self.params_queue = []
|
406
|
+
self.tags_queue = []
|
407
|
+
self.metrics_queue = []
|
408
|
+
self.datasets_queue = []
|
409
|
+
|
410
|
+
def enqueue(
|
411
|
+
self,
|
412
|
+
params=None,
|
413
|
+
tags=None,
|
414
|
+
metrics=None,
|
415
|
+
datasets=None,
|
416
|
+
create_run=None,
|
417
|
+
set_terminated=None,
|
418
|
+
):
|
419
|
+
"""
|
420
|
+
Enqueues a new pending logging operation for the associated MLflow Run.
|
421
|
+
"""
|
422
|
+
if create_run:
|
423
|
+
assert not self.create_run, "Attempted to create the same run multiple times"
|
424
|
+
self.create_run = create_run
|
425
|
+
if set_terminated:
|
426
|
+
assert not self.set_terminated, "Attempted to terminate the same run multiple times"
|
427
|
+
self.set_terminated = set_terminated
|
428
|
+
|
429
|
+
self.params_queue += params or []
|
430
|
+
self.tags_queue += tags or []
|
431
|
+
self.metrics_queue += metrics or []
|
432
|
+
self.datasets_queue += datasets or []
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import logging
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Any, Optional
|
4
|
+
|
5
|
+
from mlflow.utils.autologging_utils import AUTOLOGGING_INTEGRATIONS
|
6
|
+
|
7
|
+
_logger = logging.getLogger(__name__)
|
8
|
+
|
9
|
+
|
10
|
+
@dataclass
|
11
|
+
class AutoLoggingConfig:
|
12
|
+
"""
|
13
|
+
A dataclass to hold common autologging configuration options.
|
14
|
+
"""
|
15
|
+
|
16
|
+
log_input_examples: bool
|
17
|
+
log_model_signatures: bool
|
18
|
+
log_traces: bool
|
19
|
+
extra_tags: Optional[dict[str, Any]] = None
|
20
|
+
log_models: bool = True
|
21
|
+
|
22
|
+
@classmethod
|
23
|
+
def init(cls, flavor_name: str):
|
24
|
+
config_dict = AUTOLOGGING_INTEGRATIONS.get(flavor_name, {})
|
25
|
+
# NB: These defaults are only used when the autolog() function for the
|
26
|
+
# flavor does not specify the corresponding configuration option
|
27
|
+
return cls(
|
28
|
+
log_models=config_dict.get("log_models", False),
|
29
|
+
log_input_examples=config_dict.get("log_input_examples", False),
|
30
|
+
log_model_signatures=config_dict.get("log_model_signatures", False),
|
31
|
+
log_traces=config_dict.get("log_traces", True),
|
32
|
+
extra_tags=config_dict.get("extra_tags", None),
|
33
|
+
)
|