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,350 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from functools import cached_property
|
4
|
+
from typing import Any, Optional, Union
|
5
|
+
|
6
|
+
import numpy as np
|
7
|
+
|
8
|
+
from mlflow.data.dataset import Dataset
|
9
|
+
from mlflow.data.dataset_source import DatasetSource
|
10
|
+
from mlflow.data.digest_utils import (
|
11
|
+
MAX_ROWS,
|
12
|
+
compute_numpy_digest,
|
13
|
+
get_normalized_md5_digest,
|
14
|
+
)
|
15
|
+
from mlflow.data.evaluation_dataset import EvaluationDataset
|
16
|
+
from mlflow.data.pyfunc_dataset_mixin import PyFuncConvertibleDatasetMixin, PyFuncInputsOutputs
|
17
|
+
from mlflow.data.schema import TensorDatasetSchema
|
18
|
+
from mlflow.exceptions import MlflowException
|
19
|
+
from mlflow.protos.databricks_pb2 import INTERNAL_ERROR, INVALID_PARAMETER_VALUE
|
20
|
+
from mlflow.types.schema import Schema
|
21
|
+
from mlflow.types.utils import _infer_schema
|
22
|
+
|
23
|
+
_logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
|
26
|
+
class TensorFlowDataset(Dataset, PyFuncConvertibleDatasetMixin):
|
27
|
+
"""
|
28
|
+
Represents a TensorFlow dataset for use with MLflow Tracking.
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
features,
|
34
|
+
source: DatasetSource,
|
35
|
+
targets=None,
|
36
|
+
name: Optional[str] = None,
|
37
|
+
digest: Optional[str] = None,
|
38
|
+
):
|
39
|
+
"""
|
40
|
+
Args:
|
41
|
+
features: A TensorFlow dataset or tensor of features.
|
42
|
+
source: The source of the TensorFlow dataset.
|
43
|
+
targets: A TensorFlow dataset or tensor of targets. Optional.
|
44
|
+
name: The name of the dataset. E.g. "wiki_train". If unspecified, a name is
|
45
|
+
automatically generated.
|
46
|
+
digest: The digest (hash, fingerprint) of the dataset. If unspecified, a digest
|
47
|
+
is automatically computed.
|
48
|
+
"""
|
49
|
+
import tensorflow as tf
|
50
|
+
|
51
|
+
if not isinstance(features, tf.data.Dataset) and not tf.is_tensor(features):
|
52
|
+
raise MlflowException(
|
53
|
+
f"'features' must be an instance of tf.data.Dataset or a TensorFlow Tensor."
|
54
|
+
f" Found: {type(features)}.",
|
55
|
+
INVALID_PARAMETER_VALUE,
|
56
|
+
)
|
57
|
+
|
58
|
+
if tf.is_tensor(features) and targets is not None and not tf.is_tensor(targets):
|
59
|
+
raise MlflowException(
|
60
|
+
f"If 'features' is a TensorFlow Tensor, then 'targets' must also be a TensorFlow"
|
61
|
+
f" Tensor. Found: {type(targets)}.",
|
62
|
+
INVALID_PARAMETER_VALUE,
|
63
|
+
)
|
64
|
+
|
65
|
+
if (
|
66
|
+
isinstance(features, tf.data.Dataset)
|
67
|
+
and targets is not None
|
68
|
+
and not isinstance(targets, tf.data.Dataset)
|
69
|
+
):
|
70
|
+
raise MlflowException(
|
71
|
+
"If 'features' is an instance of tf.data.Dataset, then 'targets' must also be an"
|
72
|
+
f" instance of tf.data.Dataset. Found: {type(targets)}.",
|
73
|
+
INVALID_PARAMETER_VALUE,
|
74
|
+
)
|
75
|
+
|
76
|
+
self._features = features
|
77
|
+
self._targets = targets
|
78
|
+
super().__init__(source=source, name=name, digest=digest)
|
79
|
+
|
80
|
+
def _compute_tensorflow_dataset_digest( # noqa: D417
|
81
|
+
self,
|
82
|
+
dataset,
|
83
|
+
targets=None,
|
84
|
+
) -> str:
|
85
|
+
"""Computes a digest for the given Tensorflow dataset.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
dataset: A Tensorflow dataset.
|
89
|
+
|
90
|
+
Returns:
|
91
|
+
A string digest.
|
92
|
+
"""
|
93
|
+
import pandas as pd
|
94
|
+
import tensorflow as tf
|
95
|
+
|
96
|
+
hashable_elements = []
|
97
|
+
|
98
|
+
def hash_tf_dataset_iterator_element(element):
|
99
|
+
if element is None:
|
100
|
+
return
|
101
|
+
flat_element = tf.nest.flatten(element)
|
102
|
+
flattened_array = np.concatenate([x.flatten() for x in flat_element])
|
103
|
+
trimmed_array = flattened_array[0:MAX_ROWS]
|
104
|
+
try:
|
105
|
+
hashable_elements.append(pd.util.hash_array(trimmed_array))
|
106
|
+
except TypeError:
|
107
|
+
hashable_elements.append(np.int64(trimmed_array.size))
|
108
|
+
|
109
|
+
for element in dataset.as_numpy_iterator():
|
110
|
+
hash_tf_dataset_iterator_element(element)
|
111
|
+
if targets is not None:
|
112
|
+
for element in targets.as_numpy_iterator():
|
113
|
+
hash_tf_dataset_iterator_element(element)
|
114
|
+
|
115
|
+
return get_normalized_md5_digest(hashable_elements)
|
116
|
+
|
117
|
+
def _compute_tensor_digest(
|
118
|
+
self,
|
119
|
+
tensor_data,
|
120
|
+
tensor_targets,
|
121
|
+
) -> str:
|
122
|
+
"""Computes a digest for the given Tensorflow tensor.
|
123
|
+
|
124
|
+
Args:
|
125
|
+
tensor_data: A Tensorflow tensor, representing the features.
|
126
|
+
tensor_targets: A Tensorflow tensor, representing the targets. Optional.
|
127
|
+
|
128
|
+
Returns:
|
129
|
+
A string digest.
|
130
|
+
"""
|
131
|
+
if tensor_targets is None:
|
132
|
+
return compute_numpy_digest(tensor_data.numpy())
|
133
|
+
else:
|
134
|
+
return compute_numpy_digest(tensor_data.numpy(), tensor_targets.numpy())
|
135
|
+
|
136
|
+
def _compute_digest(self) -> str:
|
137
|
+
"""
|
138
|
+
Computes a digest for the dataset. Called if the user doesn't supply
|
139
|
+
a digest when constructing the dataset.
|
140
|
+
"""
|
141
|
+
import tensorflow as tf
|
142
|
+
|
143
|
+
if isinstance(self._features, tf.data.Dataset):
|
144
|
+
return self._compute_tensorflow_dataset_digest(self._features, self._targets)
|
145
|
+
return self._compute_tensor_digest(self._features, self._targets)
|
146
|
+
|
147
|
+
def to_dict(self) -> dict[str, str]:
|
148
|
+
"""Create config dictionary for the dataset.
|
149
|
+
|
150
|
+
Returns a string dictionary containing the following fields: name, digest, source, source
|
151
|
+
type, schema, and profile.
|
152
|
+
"""
|
153
|
+
schema = json.dumps(self.schema.to_dict()) if self.schema else None
|
154
|
+
config = super().to_dict()
|
155
|
+
config.update(
|
156
|
+
{
|
157
|
+
"schema": schema,
|
158
|
+
"profile": json.dumps(self.profile),
|
159
|
+
}
|
160
|
+
)
|
161
|
+
return config
|
162
|
+
|
163
|
+
@property
|
164
|
+
def data(self):
|
165
|
+
"""
|
166
|
+
The underlying TensorFlow data.
|
167
|
+
"""
|
168
|
+
return self._features
|
169
|
+
|
170
|
+
@property
|
171
|
+
def source(self) -> DatasetSource:
|
172
|
+
"""
|
173
|
+
The source of the dataset.
|
174
|
+
"""
|
175
|
+
return self._source
|
176
|
+
|
177
|
+
@property
|
178
|
+
def targets(self):
|
179
|
+
"""
|
180
|
+
The targets of the dataset.
|
181
|
+
"""
|
182
|
+
return self._targets
|
183
|
+
|
184
|
+
@property
|
185
|
+
def profile(self) -> Optional[Any]:
|
186
|
+
"""
|
187
|
+
A profile of the dataset. May be None if no profile is available.
|
188
|
+
"""
|
189
|
+
import tensorflow as tf
|
190
|
+
|
191
|
+
profile = {
|
192
|
+
"features_cardinality": int(self._features.cardinality().numpy())
|
193
|
+
if isinstance(self._features, tf.data.Dataset)
|
194
|
+
else int(tf.size(self._features).numpy()),
|
195
|
+
}
|
196
|
+
if self._targets is not None:
|
197
|
+
profile.update(
|
198
|
+
{
|
199
|
+
"targets_cardinality": int(self._targets.cardinality().numpy())
|
200
|
+
if isinstance(self._targets, tf.data.Dataset)
|
201
|
+
else int(tf.size(self._targets).numpy()),
|
202
|
+
}
|
203
|
+
)
|
204
|
+
return profile
|
205
|
+
|
206
|
+
@cached_property
|
207
|
+
def schema(self) -> Optional[TensorDatasetSchema]:
|
208
|
+
"""
|
209
|
+
An MLflow TensorSpec schema representing the tensor dataset
|
210
|
+
"""
|
211
|
+
try:
|
212
|
+
features_schema = TensorFlowDataset._get_tf_object_schema(self._features)
|
213
|
+
targets_schema = None
|
214
|
+
if self._targets is not None:
|
215
|
+
targets_schema = TensorFlowDataset._get_tf_object_schema(self._targets)
|
216
|
+
return TensorDatasetSchema(features=features_schema, targets=targets_schema)
|
217
|
+
except Exception as e:
|
218
|
+
_logger.warning("Failed to infer schema for TensorFlow dataset. Exception: %s", e)
|
219
|
+
return None
|
220
|
+
|
221
|
+
@staticmethod
|
222
|
+
def _get_tf_object_schema(tf_object) -> Schema:
|
223
|
+
import tensorflow as tf
|
224
|
+
|
225
|
+
if isinstance(tf_object, tf.data.Dataset):
|
226
|
+
numpy_data = next(tf_object.as_numpy_iterator())
|
227
|
+
if isinstance(numpy_data, np.ndarray):
|
228
|
+
return _infer_schema(numpy_data)
|
229
|
+
elif isinstance(numpy_data, dict):
|
230
|
+
return TensorFlowDataset._get_schema_from_tf_dataset_dict_numpy_data(numpy_data)
|
231
|
+
elif isinstance(numpy_data, tuple):
|
232
|
+
return TensorFlowDataset._get_schema_from_tf_dataset_tuple_numpy_data(numpy_data)
|
233
|
+
else:
|
234
|
+
raise MlflowException(
|
235
|
+
f"Failed to infer schema for tf.data.Dataset due to unrecognized numpy iterator"
|
236
|
+
f" data type. Numpy iterator data types 'np.ndarray', 'dict', and 'tuple' are"
|
237
|
+
f" supported. Found: {type(numpy_data)}.",
|
238
|
+
INVALID_PARAMETER_VALUE,
|
239
|
+
)
|
240
|
+
elif tf.is_tensor(tf_object):
|
241
|
+
return _infer_schema(tf_object.numpy())
|
242
|
+
else:
|
243
|
+
raise MlflowException(
|
244
|
+
f"Cannot infer schema of an object that is not an instance of tf.data.Dataset or"
|
245
|
+
f" a TensorFlow Tensor. Found: {type(tf_object)}",
|
246
|
+
INTERNAL_ERROR,
|
247
|
+
)
|
248
|
+
|
249
|
+
@staticmethod
|
250
|
+
def _get_schema_from_tf_dataset_dict_numpy_data(numpy_data: dict[Any, Any]) -> Schema:
|
251
|
+
if not all(isinstance(data_element, np.ndarray) for data_element in numpy_data.values()):
|
252
|
+
raise MlflowException(
|
253
|
+
"Failed to infer schema for tf.data.Dataset. Schemas can only be inferred"
|
254
|
+
" if the dataset consists of tensors. Ragged tensors, tensor arrays, and"
|
255
|
+
" other types are not supported. Additionally, datasets with nested tensors"
|
256
|
+
" are not supported.",
|
257
|
+
INVALID_PARAMETER_VALUE,
|
258
|
+
)
|
259
|
+
return _infer_schema(numpy_data)
|
260
|
+
|
261
|
+
@staticmethod
|
262
|
+
def _get_schema_from_tf_dataset_tuple_numpy_data(numpy_data: tuple[Any]) -> Schema:
|
263
|
+
if not all(isinstance(data_element, np.ndarray) for data_element in numpy_data):
|
264
|
+
raise MlflowException(
|
265
|
+
"Failed to infer schema for tf.data.Dataset. Schemas can only be inferred"
|
266
|
+
" if the dataset consists of tensors. Ragged tensors, tensor arrays, and"
|
267
|
+
" other types are not supported. Additionally, datasets with nested tensors"
|
268
|
+
" are not supported.",
|
269
|
+
INVALID_PARAMETER_VALUE,
|
270
|
+
)
|
271
|
+
return _infer_schema(
|
272
|
+
{
|
273
|
+
# MLflow Schemas currently require each tensor to have a name, if more than
|
274
|
+
# one tensor is defined. Accordingly, use the index as the name
|
275
|
+
str(i): data_element
|
276
|
+
for i, data_element in enumerate(numpy_data)
|
277
|
+
}
|
278
|
+
)
|
279
|
+
|
280
|
+
def to_pyfunc(self) -> PyFuncInputsOutputs:
|
281
|
+
"""
|
282
|
+
Converts the dataset to a collection of pyfunc inputs and outputs for model
|
283
|
+
evaluation. Required for use with mlflow.evaluate().
|
284
|
+
"""
|
285
|
+
return PyFuncInputsOutputs(self._features, self._targets)
|
286
|
+
|
287
|
+
def to_evaluation_dataset(self, path=None, feature_names=None) -> EvaluationDataset:
|
288
|
+
"""
|
289
|
+
Converts the dataset to an EvaluationDataset for model evaluation. Only supported if the
|
290
|
+
dataset is a Tensor. Required for use with mlflow.evaluate().
|
291
|
+
"""
|
292
|
+
import tensorflow as tf
|
293
|
+
|
294
|
+
# check that data and targets are Tensors
|
295
|
+
if not tf.is_tensor(self._features):
|
296
|
+
raise MlflowException("Data must be a Tensor to convert to an EvaluationDataset.")
|
297
|
+
if self._targets is not None and not tf.is_tensor(self._targets):
|
298
|
+
raise MlflowException("Targets must be a Tensor to convert to an EvaluationDataset.")
|
299
|
+
return EvaluationDataset(
|
300
|
+
data=self._features.numpy(),
|
301
|
+
targets=self._targets.numpy() if self._targets is not None else None,
|
302
|
+
path=path,
|
303
|
+
feature_names=feature_names,
|
304
|
+
name=self.name,
|
305
|
+
digest=self.digest,
|
306
|
+
)
|
307
|
+
|
308
|
+
|
309
|
+
def from_tensorflow(
|
310
|
+
features,
|
311
|
+
source: Optional[Union[str, DatasetSource]] = None,
|
312
|
+
targets=None,
|
313
|
+
name: Optional[str] = None,
|
314
|
+
digest: Optional[str] = None,
|
315
|
+
) -> TensorFlowDataset:
|
316
|
+
"""Constructs a TensorFlowDataset object from TensorFlow data, optional targets, and source.
|
317
|
+
|
318
|
+
If the source is path like, then this will construct a DatasetSource object from the source
|
319
|
+
path. Otherwise, the source is assumed to be a DatasetSource object.
|
320
|
+
|
321
|
+
Args:
|
322
|
+
features: A TensorFlow dataset or tensor of features.
|
323
|
+
source: The source from which the data was derived, e.g. a filesystem
|
324
|
+
path, an S3 URI, an HTTPS URL, a delta table name with version, or
|
325
|
+
spark table etc. If source is not a path like string,
|
326
|
+
pass in a DatasetSource object directly. If no source is specified,
|
327
|
+
a CodeDatasetSource is used, which will source information from the run
|
328
|
+
context.
|
329
|
+
targets: A TensorFlow dataset or tensor of targets. Optional.
|
330
|
+
name: The name of the dataset. If unspecified, a name is generated.
|
331
|
+
digest: A dataset digest (hash). If unspecified, a digest is computed
|
332
|
+
automatically.
|
333
|
+
"""
|
334
|
+
from mlflow.data.code_dataset_source import CodeDatasetSource
|
335
|
+
from mlflow.data.dataset_source_registry import resolve_dataset_source
|
336
|
+
from mlflow.tracking.context import registry
|
337
|
+
|
338
|
+
if source is not None:
|
339
|
+
if isinstance(source, DatasetSource):
|
340
|
+
resolved_source = source
|
341
|
+
else:
|
342
|
+
resolved_source = resolve_dataset_source(
|
343
|
+
source,
|
344
|
+
)
|
345
|
+
else:
|
346
|
+
context_tags = registry.resolve_tags()
|
347
|
+
resolved_source = CodeDatasetSource(tags=context_tags)
|
348
|
+
return TensorFlowDataset(
|
349
|
+
features=features, source=resolved_source, targets=targets, name=name, digest=digest
|
350
|
+
)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from mlflow.data.dataset_source import DatasetSource
|
5
|
+
from mlflow.exceptions import MlflowException
|
6
|
+
|
7
|
+
_logger = logging.getLogger(__name__)
|
8
|
+
|
9
|
+
|
10
|
+
class UCVolumeDatasetSource(DatasetSource):
|
11
|
+
"""Represents the source of a dataset stored in Databricks Unified Catalog Volume.
|
12
|
+
|
13
|
+
If you are using a delta table, please use `mlflow.data.delta_dataset_source.DeltaDatasetSource`
|
14
|
+
instead. This `UCVolumeDatasetSource` does not provide loading function, and is mostly useful
|
15
|
+
when you are logging a `mlflow.data.meta_dataset.MetaDataset` to MLflow, i.e., you want
|
16
|
+
to log the source of dataset to MLflow without loading the dataset.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
path: the UC path of your data. It should be a valid UC path following the pattern
|
20
|
+
"/Volumes/{catalog}/{schema}/{volume}/{file_path}". For example,
|
21
|
+
"/Volumes/MyCatalog/MySchema/MyVolume/MyFile.json".
|
22
|
+
"""
|
23
|
+
|
24
|
+
def __init__(self, path: str):
|
25
|
+
self.path = path
|
26
|
+
self._verify_uc_path_is_valid()
|
27
|
+
|
28
|
+
def _verify_uc_path_is_valid(self):
|
29
|
+
"""Verify if the path exists in Databricks Unified Catalog."""
|
30
|
+
try:
|
31
|
+
from databricks.sdk import WorkspaceClient
|
32
|
+
|
33
|
+
w = WorkspaceClient()
|
34
|
+
except ImportError:
|
35
|
+
_logger.warning(
|
36
|
+
"Cannot verify the path of `UCVolumeDatasetSource` because of missing"
|
37
|
+
"`databricks-sdk`. Please install `databricks-sdk` via "
|
38
|
+
"`pip install -U databricks-sdk`. This does not block creating "
|
39
|
+
"`UCVolumeDatasetSource`, but your `UCVolumeDatasetSource` might be invalid."
|
40
|
+
)
|
41
|
+
return
|
42
|
+
except Exception:
|
43
|
+
_logger.warning(
|
44
|
+
"Cannot verify the path of `UCVolumeDatasetSource` due to a connection failure "
|
45
|
+
"with Databricks workspace. Please run `mlflow.login()` to log in to Databricks. "
|
46
|
+
"This does not block creating `UCVolumeDatasetSource`, but your "
|
47
|
+
"`UCVolumeDatasetSource` might be invalid."
|
48
|
+
)
|
49
|
+
return
|
50
|
+
|
51
|
+
try:
|
52
|
+
# Check if `self.path` points to a valid UC file.
|
53
|
+
w.files.get_metadata(self.path)
|
54
|
+
except Exception:
|
55
|
+
try:
|
56
|
+
# Check if `self.path` points to a valid UC directory.
|
57
|
+
w.files.get_directory_metadata(self.path)
|
58
|
+
# Append a slash to `self.path` to indicate it's a directory.
|
59
|
+
self.path += "/" if not self.path.endswith("/") else ""
|
60
|
+
except Exception:
|
61
|
+
# Neither file nor directory exists, we throw an exception.
|
62
|
+
raise MlflowException(f"{self.path} does not exist in Databricks Unified Catalog.")
|
63
|
+
|
64
|
+
@staticmethod
|
65
|
+
def _get_source_type() -> str:
|
66
|
+
return "uc_volume"
|
67
|
+
|
68
|
+
@staticmethod
|
69
|
+
def _can_resolve(raw_source: Any):
|
70
|
+
raise NotImplementedError
|
71
|
+
|
72
|
+
@classmethod
|
73
|
+
def _resolve(cls, raw_source: str):
|
74
|
+
raise NotImplementedError
|
75
|
+
|
76
|
+
def to_dict(self) -> dict[Any, Any]:
|
77
|
+
return {"path": self.path}
|
78
|
+
|
79
|
+
@classmethod
|
80
|
+
def from_dict(cls, source_dict: dict[Any, Any]) -> "UCVolumeDatasetSource":
|
81
|
+
return cls(**source_dict)
|
mlflow/db.py
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
|
4
|
+
@click.group("db")
|
5
|
+
def commands():
|
6
|
+
"""
|
7
|
+
Commands for managing an MLflow tracking database.
|
8
|
+
"""
|
9
|
+
|
10
|
+
|
11
|
+
@commands.command()
|
12
|
+
@click.argument("url")
|
13
|
+
def upgrade(url):
|
14
|
+
"""
|
15
|
+
Upgrade the schema of an MLflow tracking database to the latest supported version.
|
16
|
+
|
17
|
+
**IMPORTANT**: Schema migrations can be slow and are not guaranteed to be transactional -
|
18
|
+
**always take a backup of your database before running migrations**. The migrations README,
|
19
|
+
which is located at
|
20
|
+
https://github.com/mlflow/mlflow/blob/master/mlflow/store/db_migrations/README.md, describes
|
21
|
+
large migrations and includes information about how to estimate their performance and
|
22
|
+
recover from failures.
|
23
|
+
"""
|
24
|
+
import mlflow.store.db.utils
|
25
|
+
|
26
|
+
engine = mlflow.store.db.utils.create_sqlalchemy_engine_with_retry(url)
|
27
|
+
mlflow.store.db.utils._upgrade_db(engine)
|
mlflow/dspy/__init__.py
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
from mlflow.dspy.autolog import autolog
|
2
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
3
|
+
|
4
|
+
__all__ = ["autolog"]
|
5
|
+
|
6
|
+
# Import model logging APIs only if mlflow skinny or full package is installed,
|
7
|
+
# i.e., skip if only mlflow-tracing package is installed.
|
8
|
+
if not IS_TRACING_SDK_ONLY:
|
9
|
+
from mlflow.dspy.load import _load_pyfunc, load_model
|
10
|
+
from mlflow.dspy.save import log_model, save_model
|
11
|
+
|
12
|
+
__all__ += [
|
13
|
+
"save_model",
|
14
|
+
"log_model",
|
15
|
+
"load_model",
|
16
|
+
"_load_pyfunc",
|
17
|
+
]
|
mlflow/dspy/autolog.py
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
import importlib
|
2
|
+
|
3
|
+
from packaging.version import Version
|
4
|
+
|
5
|
+
import mlflow
|
6
|
+
from mlflow.dspy.constant import FLAVOR_NAME
|
7
|
+
from mlflow.tracing.provider import trace_disabled
|
8
|
+
from mlflow.tracing.utils import construct_full_inputs
|
9
|
+
from mlflow.utils.annotations import experimental
|
10
|
+
from mlflow.utils.autologging_utils import (
|
11
|
+
autologging_integration,
|
12
|
+
get_autologging_config,
|
13
|
+
safe_patch,
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
@experimental(version="2.18.0")
|
18
|
+
def autolog(
|
19
|
+
log_traces: bool = True,
|
20
|
+
log_traces_from_compile: bool = False,
|
21
|
+
log_traces_from_eval: bool = True,
|
22
|
+
log_compiles: bool = False,
|
23
|
+
log_evals: bool = False,
|
24
|
+
disable: bool = False,
|
25
|
+
silent: bool = False,
|
26
|
+
):
|
27
|
+
"""
|
28
|
+
Enables (or disables) and configures autologging from DSPy to MLflow. Currently, the
|
29
|
+
MLflow DSPy flavor only supports autologging for tracing.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
log_traces: If ``True``, traces are logged for DSPy models by using. If ``False``,
|
33
|
+
no traces are collected during inference. Default to ``True``.
|
34
|
+
log_traces_from_compile: If ``True``, traces are logged when compiling (optimizing)
|
35
|
+
DSPy programs. If ``False``, traces are only logged from normal model inference and
|
36
|
+
disabled when compiling. Default to ``False``.
|
37
|
+
log_traces_from_eval: If ``True``, traces are logged for DSPy models when running DSPy's
|
38
|
+
`built-in evaluator <https://dspy.ai/learn/evaluation/metrics/#evaluation>`_.
|
39
|
+
If ``False``, traces are only logged from normal model inference and disabled when
|
40
|
+
running the evaluator. Default to ``True``.
|
41
|
+
log_compiles: If ``True``, information about the optimization process is logged when
|
42
|
+
`Teleprompter.compile()` is called.
|
43
|
+
log_evals: If ``True``, information about the evaluation call is logged when
|
44
|
+
`Evaluate.__call__()` is called.
|
45
|
+
disable: If ``True``, disables the DSPy autologging integration. If ``False``,
|
46
|
+
enables the DSPy autologging integration.
|
47
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during DSPy
|
48
|
+
autologging. If ``False``, show all events and warnings.
|
49
|
+
"""
|
50
|
+
# NB: The @autologging_integration annotation is used for adding shared logic. However, one
|
51
|
+
# caveat is that the wrapped function is NOT executed when disable=True is passed. This prevents
|
52
|
+
# us from running cleaning up logging when autologging is turned off. To workaround this, we
|
53
|
+
# annotate _autolog() instead of this entrypoint, and define the cleanup logic outside it.
|
54
|
+
# This needs to be called before doing any safe-patching (otherwise safe-patch will be no-op).
|
55
|
+
# TODO: since this implementation is inconsistent, explore a universal way to solve the issue.
|
56
|
+
_autolog(
|
57
|
+
log_traces=log_traces,
|
58
|
+
log_traces_from_compile=log_traces_from_compile,
|
59
|
+
log_traces_from_eval=log_traces_from_eval,
|
60
|
+
log_compiles=log_compiles,
|
61
|
+
log_evals=log_evals,
|
62
|
+
disable=disable,
|
63
|
+
silent=silent,
|
64
|
+
)
|
65
|
+
|
66
|
+
import dspy
|
67
|
+
|
68
|
+
from mlflow.dspy.callback import MlflowCallback
|
69
|
+
from mlflow.dspy.util import log_dspy_dataset, save_dspy_module_state
|
70
|
+
|
71
|
+
# Enable tracing by setting the MlflowCallback
|
72
|
+
if not disable:
|
73
|
+
if not any(isinstance(c, MlflowCallback) for c in dspy.settings.callbacks):
|
74
|
+
dspy.settings.configure(callbacks=[*dspy.settings.callbacks, MlflowCallback()])
|
75
|
+
else:
|
76
|
+
dspy.settings.configure(
|
77
|
+
callbacks=[c for c in dspy.settings.callbacks if not isinstance(c, MlflowCallback)]
|
78
|
+
)
|
79
|
+
|
80
|
+
# Patch teleprompter/evaluator not to generate traces by default
|
81
|
+
def patch_fn(original, self, *args, **kwargs):
|
82
|
+
# NB: Since calling mlflow.dspy.autolog() again does not unpatch a function, we need to
|
83
|
+
# check this flag at runtime to determine if we should generate traces.
|
84
|
+
# method to disable tracing for compile and evaluate by default
|
85
|
+
@trace_disabled
|
86
|
+
def _trace_disabled_fn(self, *args, **kwargs):
|
87
|
+
return original(self, *args, **kwargs)
|
88
|
+
|
89
|
+
def _compile_fn(self, *args, **kwargs):
|
90
|
+
if callback := _active_callback():
|
91
|
+
callback.optimizer_stack_level += 1
|
92
|
+
try:
|
93
|
+
if get_autologging_config(FLAVOR_NAME, "log_traces_from_compile"):
|
94
|
+
result = original(self, *args, **kwargs)
|
95
|
+
else:
|
96
|
+
result = _trace_disabled_fn(self, *args, **kwargs)
|
97
|
+
return result
|
98
|
+
finally:
|
99
|
+
if callback:
|
100
|
+
callback.optimizer_stack_level -= 1
|
101
|
+
if callback.optimizer_stack_level == 0:
|
102
|
+
# Reset the callback state after the completion of root compile
|
103
|
+
callback.reset()
|
104
|
+
|
105
|
+
if isinstance(self, Teleprompter):
|
106
|
+
if not get_autologging_config(FLAVOR_NAME, "log_compiles"):
|
107
|
+
return _compile_fn(self, *args, **kwargs)
|
108
|
+
|
109
|
+
program = _compile_fn(self, *args, **kwargs)
|
110
|
+
# Save the state of the best model in json format
|
111
|
+
# so that users can see the demonstrations and instructions.
|
112
|
+
save_dspy_module_state(program, "best_model.json")
|
113
|
+
|
114
|
+
# Teleprompter.get_params is introduced in dspy 2.6.15
|
115
|
+
params = (
|
116
|
+
self.get_params()
|
117
|
+
if Version(importlib.metadata.version("dspy")) >= Version("2.6.15")
|
118
|
+
else {}
|
119
|
+
)
|
120
|
+
# Construct the dict of arguments passed to the compile call
|
121
|
+
inputs = construct_full_inputs(original, self, *args, **kwargs)
|
122
|
+
# Update params with the arguments passed to the compile call
|
123
|
+
params.update(inputs)
|
124
|
+
mlflow.log_params(
|
125
|
+
{k: v for k, v in inputs.items() if isinstance(v, (int, float, str, bool))}
|
126
|
+
)
|
127
|
+
|
128
|
+
if trainset := inputs.get("trainset"):
|
129
|
+
log_dspy_dataset(trainset, "trainset.json")
|
130
|
+
if valset := inputs.get("valset"):
|
131
|
+
log_dspy_dataset(valset, "valset.json")
|
132
|
+
return program
|
133
|
+
|
134
|
+
if isinstance(self, Teleprompter) and get_autologging_config(
|
135
|
+
FLAVOR_NAME, "log_traces_from_compile"
|
136
|
+
):
|
137
|
+
return original(self, *args, **kwargs)
|
138
|
+
|
139
|
+
if isinstance(self, Evaluate) and get_autologging_config(
|
140
|
+
FLAVOR_NAME, "log_traces_from_eval"
|
141
|
+
):
|
142
|
+
return original(self, *args, **kwargs)
|
143
|
+
|
144
|
+
return _trace_disabled_fn(self, *args, **kwargs)
|
145
|
+
|
146
|
+
from dspy.evaluate import Evaluate
|
147
|
+
from dspy.teleprompt import Teleprompter
|
148
|
+
|
149
|
+
compile_patch = "compile"
|
150
|
+
for cls in Teleprompter.__subclasses__():
|
151
|
+
# NB: This is to avoid the abstraction inheritance of superclasses that are defined
|
152
|
+
# only for the purposes of abstraction. The recursion behavior of the
|
153
|
+
# __subclasses__ dunder method will target the appropriate subclasses we need to patch.
|
154
|
+
if hasattr(cls, compile_patch):
|
155
|
+
safe_patch(
|
156
|
+
FLAVOR_NAME,
|
157
|
+
cls,
|
158
|
+
compile_patch,
|
159
|
+
patch_fn,
|
160
|
+
manage_run=get_autologging_config(FLAVOR_NAME, "log_compiles"),
|
161
|
+
)
|
162
|
+
|
163
|
+
call_patch = "__call__"
|
164
|
+
if hasattr(Evaluate, call_patch):
|
165
|
+
safe_patch(
|
166
|
+
FLAVOR_NAME,
|
167
|
+
Evaluate,
|
168
|
+
call_patch,
|
169
|
+
patch_fn,
|
170
|
+
)
|
171
|
+
|
172
|
+
|
173
|
+
# This is required by mlflow.autolog()
|
174
|
+
autolog.integration_name = FLAVOR_NAME
|
175
|
+
|
176
|
+
|
177
|
+
@autologging_integration(FLAVOR_NAME)
|
178
|
+
def _autolog(
|
179
|
+
log_traces: bool,
|
180
|
+
log_traces_from_compile: bool,
|
181
|
+
log_traces_from_eval: bool,
|
182
|
+
log_compiles: bool,
|
183
|
+
log_evals: bool,
|
184
|
+
disable: bool = False,
|
185
|
+
silent: bool = False,
|
186
|
+
):
|
187
|
+
pass
|
188
|
+
|
189
|
+
|
190
|
+
def _active_callback():
|
191
|
+
import dspy
|
192
|
+
|
193
|
+
from mlflow.dspy.callback import MlflowCallback
|
194
|
+
|
195
|
+
for callback in dspy.settings.callbacks:
|
196
|
+
if isinstance(callback, MlflowCallback):
|
197
|
+
return callback
|