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,103 @@
|
|
1
|
+
"""
|
2
|
+
File containing all of the run tags in the mlflow. namespace.
|
3
|
+
|
4
|
+
See the System Tags section in the MLflow Tracking documentation for information on the
|
5
|
+
meaning of these tags.
|
6
|
+
"""
|
7
|
+
|
8
|
+
MLFLOW_EXPERIMENT_SOURCE_ID = "mlflow.experiment.sourceId"
|
9
|
+
MLFLOW_EXPERIMENT_SOURCE_TYPE = "mlflow.experiment.sourceType"
|
10
|
+
MLFLOW_RUN_NAME = "mlflow.runName"
|
11
|
+
MLFLOW_RUN_NOTE = "mlflow.note.content"
|
12
|
+
MLFLOW_PARENT_RUN_ID = "mlflow.parentRunId"
|
13
|
+
MLFLOW_ARTIFACT_LOCATION = "mlflow.artifactLocation"
|
14
|
+
MLFLOW_USER = "mlflow.user"
|
15
|
+
MLFLOW_SOURCE_TYPE = "mlflow.source.type"
|
16
|
+
MLFLOW_SOURCE_NAME = "mlflow.source.name"
|
17
|
+
MLFLOW_GIT_COMMIT = "mlflow.source.git.commit"
|
18
|
+
MLFLOW_GIT_BRANCH = "mlflow.source.git.branch"
|
19
|
+
MLFLOW_GIT_REPO_URL = "mlflow.source.git.repoURL"
|
20
|
+
MLFLOW_LOGGED_MODELS = "mlflow.log-model.history"
|
21
|
+
MLFLOW_MODEL_IS_EXTERNAL = "mlflow.model.isExternal"
|
22
|
+
MLFLOW_MODEL_VERSIONS = "mlflow.modelVersions"
|
23
|
+
MLFLOW_PROJECT_ENV = "mlflow.project.env"
|
24
|
+
MLFLOW_PROJECT_ENTRY_POINT = "mlflow.project.entryPoint"
|
25
|
+
MLFLOW_DOCKER_IMAGE_URI = "mlflow.docker.image.uri"
|
26
|
+
MLFLOW_DOCKER_IMAGE_ID = "mlflow.docker.image.id"
|
27
|
+
# Indicates that an MLflow run was created by an autologging integration
|
28
|
+
MLFLOW_AUTOLOGGING = "mlflow.autologging"
|
29
|
+
# Indicates the artifacts type and path that are logged
|
30
|
+
MLFLOW_LOGGED_ARTIFACTS = "mlflow.loggedArtifacts"
|
31
|
+
MLFLOW_LOGGED_IMAGES = "mlflow.loggedImages"
|
32
|
+
MLFLOW_RUN_SOURCE_TYPE = "mlflow.runSourceType"
|
33
|
+
|
34
|
+
MLFLOW_DATABRICKS_NOTEBOOK_ID = "mlflow.databricks.notebookID"
|
35
|
+
MLFLOW_DATABRICKS_NOTEBOOK_PATH = "mlflow.databricks.notebookPath"
|
36
|
+
MLFLOW_DATABRICKS_WEBAPP_URL = "mlflow.databricks.webappURL"
|
37
|
+
MLFLOW_DATABRICKS_RUN_URL = "mlflow.databricks.runURL"
|
38
|
+
MLFLOW_DATABRICKS_CLUSTER_ID = "mlflow.databricks.cluster.id"
|
39
|
+
MLFLOW_DATABRICKS_WORKSPACE_URL = "mlflow.databricks.workspaceURL"
|
40
|
+
MLFLOW_DATABRICKS_WORKSPACE_ID = "mlflow.databricks.workspaceID"
|
41
|
+
# The unique ID of a command execution in a Databricks notebook
|
42
|
+
MLFLOW_DATABRICKS_NOTEBOOK_COMMAND_ID = "mlflow.databricks.notebook.commandID"
|
43
|
+
# The SHELL_JOB_ID and SHELL_JOB_RUN_ID tags are used for tracking the
|
44
|
+
# Databricks Job ID and Databricks Job Run ID associated with an MLflow Project run
|
45
|
+
MLFLOW_DATABRICKS_SHELL_JOB_ID = "mlflow.databricks.shellJobID"
|
46
|
+
MLFLOW_DATABRICKS_SHELL_JOB_RUN_ID = "mlflow.databricks.shellJobRunID"
|
47
|
+
# The JOB_ID, JOB_RUN_ID, and JOB_TYPE tags are used for automatically recording Job information
|
48
|
+
# when MLflow Tracking APIs are used within a Databricks Job
|
49
|
+
MLFLOW_DATABRICKS_JOB_ID = "mlflow.databricks.jobID"
|
50
|
+
MLFLOW_DATABRICKS_JOB_RUN_ID = "mlflow.databricks.jobRunID"
|
51
|
+
# Here MLFLOW_DATABRICKS_JOB_TYPE means the job task type and MLFLOW_DATABRICKS_JOB_TYPE_INFO
|
52
|
+
# implies the job type which could be normal, ephemeral, etc.
|
53
|
+
MLFLOW_DATABRICKS_JOB_TYPE = "mlflow.databricks.jobType"
|
54
|
+
MLFLOW_DATABRICKS_JOB_TYPE_INFO = "mlflow.databricks.jobTypeInfo"
|
55
|
+
# For MLflow Repo Lineage tracking
|
56
|
+
MLFLOW_DATABRICKS_GIT_REPO_URL = "mlflow.databricks.gitRepoUrl"
|
57
|
+
MLFLOW_DATABRICKS_GIT_REPO_COMMIT = "mlflow.databricks.gitRepoCommit"
|
58
|
+
MLFLOW_DATABRICKS_GIT_REPO_PROVIDER = "mlflow.databricks.gitRepoProvider"
|
59
|
+
MLFLOW_DATABRICKS_GIT_REPO_RELATIVE_PATH = "mlflow.databricks.gitRepoRelativePath"
|
60
|
+
MLFLOW_DATABRICKS_GIT_REPO_REFERENCE = "mlflow.databricks.gitRepoReference"
|
61
|
+
MLFLOW_DATABRICKS_GIT_REPO_REFERENCE_TYPE = "mlflow.databricks.gitRepoReferenceType"
|
62
|
+
MLFLOW_DATABRICKS_GIT_REPO_STATUS = "mlflow.databricks.gitRepoStatus"
|
63
|
+
|
64
|
+
# Databricks model serving endpoint information
|
65
|
+
MLFLOW_DATABRICKS_MODEL_SERVING_ENDPOINT_NAME = "mlflow.databricks.modelServingEndpointName"
|
66
|
+
|
67
|
+
# For MLflow Dataset tracking
|
68
|
+
MLFLOW_DATASET_CONTEXT = "mlflow.data.context"
|
69
|
+
|
70
|
+
MLFLOW_PROJECT_BACKEND = "mlflow.project.backend"
|
71
|
+
|
72
|
+
MLFLOW_EXPERIMENT_PRIMARY_METRIC_NAME = "mlflow.experiment.primaryMetric.name"
|
73
|
+
MLFLOW_EXPERIMENT_PRIMARY_METRIC_GREATER_IS_BETTER = (
|
74
|
+
"mlflow.experiment.primaryMetric.greaterIsBetter"
|
75
|
+
)
|
76
|
+
|
77
|
+
# For automatic model checkpointing
|
78
|
+
LATEST_CHECKPOINT_ARTIFACT_TAG_KEY = "mlflow.latest_checkpoint_artifact"
|
79
|
+
|
80
|
+
# A set of tags that cannot be updated by the user
|
81
|
+
IMMUTABLE_TAGS = {MLFLOW_USER, MLFLOW_ARTIFACT_LOCATION}
|
82
|
+
|
83
|
+
# The list of tags generated from resolve_tags() that are required for tracing UI
|
84
|
+
TRACE_RESOLVE_TAGS_ALLOWLIST = (
|
85
|
+
MLFLOW_DATABRICKS_NOTEBOOK_COMMAND_ID,
|
86
|
+
MLFLOW_DATABRICKS_NOTEBOOK_ID,
|
87
|
+
MLFLOW_DATABRICKS_NOTEBOOK_PATH,
|
88
|
+
MLFLOW_DATABRICKS_WEBAPP_URL,
|
89
|
+
MLFLOW_DATABRICKS_WORKSPACE_ID,
|
90
|
+
MLFLOW_DATABRICKS_WORKSPACE_URL,
|
91
|
+
MLFLOW_SOURCE_NAME,
|
92
|
+
MLFLOW_SOURCE_TYPE,
|
93
|
+
MLFLOW_USER,
|
94
|
+
MLFLOW_GIT_COMMIT,
|
95
|
+
MLFLOW_GIT_BRANCH,
|
96
|
+
MLFLOW_GIT_REPO_URL,
|
97
|
+
)
|
98
|
+
|
99
|
+
|
100
|
+
def _get_run_name_from_tags(tags):
|
101
|
+
for tag in tags:
|
102
|
+
if tag.key == MLFLOW_RUN_NAME:
|
103
|
+
return tag.value
|
@@ -0,0 +1,486 @@
|
|
1
|
+
import contextlib
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
import os
|
5
|
+
import shutil
|
6
|
+
import sys
|
7
|
+
from pathlib import Path
|
8
|
+
from typing import Any
|
9
|
+
|
10
|
+
import yaml
|
11
|
+
|
12
|
+
from mlflow.exceptions import MlflowException
|
13
|
+
from mlflow.models import Model
|
14
|
+
from mlflow.models.model import MLMODEL_FILE_NAME
|
15
|
+
from mlflow.protos.databricks_pb2 import (
|
16
|
+
INVALID_PARAMETER_VALUE,
|
17
|
+
RESOURCE_ALREADY_EXISTS,
|
18
|
+
RESOURCE_DOES_NOT_EXIST,
|
19
|
+
)
|
20
|
+
from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
|
21
|
+
from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
|
22
|
+
from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
|
23
|
+
from mlflow.tracking.artifact_utils import _download_artifact_from_uri
|
24
|
+
from mlflow.utils import get_parent_module
|
25
|
+
from mlflow.utils.databricks_utils import is_in_databricks_runtime
|
26
|
+
from mlflow.utils.file_utils import _copy_file_or_tree
|
27
|
+
from mlflow.utils.requirements_utils import _capture_imported_modules
|
28
|
+
from mlflow.utils.uri import append_to_uri_path
|
29
|
+
|
30
|
+
FLAVOR_CONFIG_CODE = "code"
|
31
|
+
|
32
|
+
_logger = logging.getLogger(__name__)
|
33
|
+
|
34
|
+
|
35
|
+
def _get_all_flavor_configurations(model_path):
|
36
|
+
"""Obtains all the flavor configurations from the specified MLflow model path.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
model_path: The path to the root directory of the MLflow model for which to load
|
40
|
+
the specified flavor configuration.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
The dictionary contains all flavor configurations with flavor name as key.
|
44
|
+
|
45
|
+
"""
|
46
|
+
|
47
|
+
return Model.load(model_path).flavors
|
48
|
+
|
49
|
+
|
50
|
+
def _get_flavor_configuration(model_path, flavor_name):
|
51
|
+
"""Obtains the configuration for the specified flavor from the specified
|
52
|
+
MLflow model path. If the model does not contain the specified flavor,
|
53
|
+
an exception will be thrown.
|
54
|
+
|
55
|
+
Args:
|
56
|
+
model_path: The path to the root directory of the MLflow model for which to load
|
57
|
+
the specified flavor configuration.
|
58
|
+
flavor_name: The name of the flavor configuration to load.
|
59
|
+
|
60
|
+
Returns:
|
61
|
+
The flavor configuration as a dictionary.
|
62
|
+
|
63
|
+
"""
|
64
|
+
try:
|
65
|
+
return Model.load(model_path).flavors[flavor_name]
|
66
|
+
except KeyError as ex:
|
67
|
+
raise MlflowException(
|
68
|
+
f'Model does not have the "{flavor_name}" flavor', RESOURCE_DOES_NOT_EXIST
|
69
|
+
) from ex
|
70
|
+
|
71
|
+
|
72
|
+
def _get_flavor_configuration_from_uri(model_uri, flavor_name, logger):
|
73
|
+
"""Obtains the configuration for the specified flavor from the specified
|
74
|
+
MLflow model uri. If the model does not contain the specified flavor,
|
75
|
+
an exception will be thrown.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
model_uri: The path to the root directory of the MLflow model for which to load
|
79
|
+
the specified flavor configuration.
|
80
|
+
flavor_name: The name of the flavor configuration to load.
|
81
|
+
logger: The local flavor's logger to report the resolved path of the model uri.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
The flavor configuration as a dictionary.
|
85
|
+
"""
|
86
|
+
try:
|
87
|
+
resolved_uri = model_uri
|
88
|
+
if RunsArtifactRepository.is_runs_uri(model_uri):
|
89
|
+
resolved_uri = RunsArtifactRepository.get_underlying_uri(model_uri)
|
90
|
+
logger.info("'%s' resolved as '%s'", model_uri, resolved_uri)
|
91
|
+
elif ModelsArtifactRepository.is_models_uri(model_uri):
|
92
|
+
resolved_uri = ModelsArtifactRepository.get_underlying_uri(model_uri)
|
93
|
+
logger.info("'%s' resolved as '%s'", model_uri, resolved_uri)
|
94
|
+
|
95
|
+
try:
|
96
|
+
ml_model_file = _download_artifact_from_uri(
|
97
|
+
artifact_uri=append_to_uri_path(resolved_uri, MLMODEL_FILE_NAME)
|
98
|
+
)
|
99
|
+
except Exception:
|
100
|
+
logger.debug(
|
101
|
+
f'Failed to download an "{MLMODEL_FILE_NAME}" model file from '
|
102
|
+
f"resolved URI {resolved_uri}. "
|
103
|
+
f"Falling back to downloading from original model URI {model_uri}",
|
104
|
+
exc_info=True,
|
105
|
+
)
|
106
|
+
ml_model_file = get_artifact_repository(artifact_uri=model_uri).download_artifacts(
|
107
|
+
artifact_path=MLMODEL_FILE_NAME
|
108
|
+
)
|
109
|
+
except Exception as ex:
|
110
|
+
raise MlflowException(
|
111
|
+
f'Failed to download an "{MLMODEL_FILE_NAME}" model file from "{model_uri}"',
|
112
|
+
RESOURCE_DOES_NOT_EXIST,
|
113
|
+
) from ex
|
114
|
+
return _get_flavor_configuration_from_ml_model_file(ml_model_file, flavor_name)
|
115
|
+
|
116
|
+
|
117
|
+
def _get_flavor_configuration_from_ml_model_file(ml_model_file, flavor_name):
|
118
|
+
model_conf = Model.load(ml_model_file)
|
119
|
+
if flavor_name not in model_conf.flavors:
|
120
|
+
raise MlflowException(
|
121
|
+
f'Model does not have the "{flavor_name}" flavor',
|
122
|
+
RESOURCE_DOES_NOT_EXIST,
|
123
|
+
)
|
124
|
+
return model_conf.flavors[flavor_name]
|
125
|
+
|
126
|
+
|
127
|
+
def _validate_code_paths(code_paths):
|
128
|
+
if code_paths is not None:
|
129
|
+
if not isinstance(code_paths, list):
|
130
|
+
raise TypeError(f"Argument code_paths should be a list, not {type(code_paths)}")
|
131
|
+
|
132
|
+
|
133
|
+
def _validate_and_copy_code_paths(code_paths, path, default_subpath="code"):
|
134
|
+
"""Validates that a code path is a valid list and copies the code paths to a directory. This
|
135
|
+
can later be used to log custom code as an artifact.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
code_paths: A list of files or directories containing code that should be logged
|
139
|
+
as artifacts.
|
140
|
+
path: The local model path.
|
141
|
+
default_subpath: The default directory name used to store code artifacts.
|
142
|
+
"""
|
143
|
+
_validate_code_paths(code_paths)
|
144
|
+
if code_paths is not None:
|
145
|
+
code_dir_subpath = default_subpath
|
146
|
+
for code_path in code_paths:
|
147
|
+
try:
|
148
|
+
_copy_file_or_tree(src=code_path, dst=path, dst_dir=code_dir_subpath)
|
149
|
+
except OSError as e:
|
150
|
+
# A common error is code-paths includes Databricks Notebook. We include it in error
|
151
|
+
# message when running in Databricks, but not in other envs tp avoid confusion.
|
152
|
+
example = ", such as Databricks Notebooks" if is_in_databricks_runtime() else ""
|
153
|
+
raise MlflowException(
|
154
|
+
message=(
|
155
|
+
f"Failed to copy the specified code path '{code_path}' into the model "
|
156
|
+
"artifacts. It appears that your code path includes file(s) that cannot "
|
157
|
+
f"be copied{example}. Please specify a code path that does not include "
|
158
|
+
"such files and try again.",
|
159
|
+
),
|
160
|
+
error_code=INVALID_PARAMETER_VALUE,
|
161
|
+
) from e
|
162
|
+
else:
|
163
|
+
code_dir_subpath = None
|
164
|
+
return code_dir_subpath
|
165
|
+
|
166
|
+
|
167
|
+
def _infer_and_copy_code_paths(flavor, path, default_subpath="code"):
|
168
|
+
# Capture all imported modules with full module name during loading model.
|
169
|
+
modules = _capture_imported_modules(path, flavor, record_full_module=True)
|
170
|
+
|
171
|
+
all_modules = set(modules)
|
172
|
+
|
173
|
+
for module in modules:
|
174
|
+
parent_module = module
|
175
|
+
while "." in parent_module:
|
176
|
+
parent_module = get_parent_module(parent_module)
|
177
|
+
all_modules.add(parent_module)
|
178
|
+
|
179
|
+
# Generate code_paths set from the imported modules full name list.
|
180
|
+
# It only picks necessary files, because:
|
181
|
+
# 1. Reduce risk of logging files containing user credentials to MLflow
|
182
|
+
# artifact repository.
|
183
|
+
# 2. In databricks runtime, notebook files might exist under a code_paths directory,
|
184
|
+
# if logging the whole directory to MLflow artifact repository, these
|
185
|
+
# notebook files are not accessible and trigger exceptions. On the other
|
186
|
+
# hand, these notebook files are not used as code_paths modules because
|
187
|
+
# code in notebook files are loaded into python `__main__` module.
|
188
|
+
code_paths = set()
|
189
|
+
for full_module_name in all_modules:
|
190
|
+
relative_path_str = full_module_name.replace(".", os.sep)
|
191
|
+
relative_path = Path(relative_path_str)
|
192
|
+
if relative_path.is_dir():
|
193
|
+
init_file_path = relative_path / "__init__.py"
|
194
|
+
if init_file_path.exists():
|
195
|
+
code_paths.add(init_file_path)
|
196
|
+
|
197
|
+
py_module_path = Path(relative_path_str + ".py")
|
198
|
+
if py_module_path.is_file():
|
199
|
+
code_paths.add(py_module_path)
|
200
|
+
|
201
|
+
if code_paths:
|
202
|
+
for code_path in code_paths:
|
203
|
+
src_dir_path = code_path.parent
|
204
|
+
src_file_name = code_path.name
|
205
|
+
dest_dir_path = Path(path) / default_subpath / src_dir_path
|
206
|
+
dest_file_path = dest_dir_path / src_file_name
|
207
|
+
dest_dir_path.mkdir(parents=True, exist_ok=True)
|
208
|
+
shutil.copyfile(code_path, dest_file_path)
|
209
|
+
return default_subpath
|
210
|
+
|
211
|
+
return None
|
212
|
+
|
213
|
+
|
214
|
+
def _validate_infer_and_copy_code_paths(
|
215
|
+
code_paths, path, infer_code_paths, flavor, default_subpath="code"
|
216
|
+
):
|
217
|
+
if infer_code_paths:
|
218
|
+
if code_paths:
|
219
|
+
raise MlflowException(
|
220
|
+
"If 'infer_code_path' is set to True, 'code_paths' param cannot be set."
|
221
|
+
)
|
222
|
+
return _infer_and_copy_code_paths(flavor, path, default_subpath)
|
223
|
+
else:
|
224
|
+
return _validate_and_copy_code_paths(code_paths, path, default_subpath)
|
225
|
+
|
226
|
+
|
227
|
+
def _validate_path_exists(path, name):
|
228
|
+
if path and not os.path.exists(path):
|
229
|
+
raise MlflowException(
|
230
|
+
message=(
|
231
|
+
f"Failed to copy the specified {name} path '{path}' into the model "
|
232
|
+
f"artifacts. The specified {name}path does not exist. Please specify a valid "
|
233
|
+
f"{name} path and try again."
|
234
|
+
),
|
235
|
+
error_code=INVALID_PARAMETER_VALUE,
|
236
|
+
)
|
237
|
+
|
238
|
+
|
239
|
+
def _validate_and_copy_file_to_directory(file_path: str, dir_path: str, name: str):
|
240
|
+
"""Copies the file at file_path to the directory at dir_path.
|
241
|
+
|
242
|
+
Args:
|
243
|
+
file_path: A file that should be logged as an artifact.
|
244
|
+
dir_path: The path of the directory to save the file to.
|
245
|
+
name: The name for the kind of file being copied.
|
246
|
+
"""
|
247
|
+
_validate_path_exists(file_path, name)
|
248
|
+
try:
|
249
|
+
_copy_file_or_tree(src=file_path, dst=dir_path)
|
250
|
+
except OSError as e:
|
251
|
+
# A common error is code-paths includes Databricks Notebook. We include it in error
|
252
|
+
# message when running in Databricks, but not in other envs tp avoid confusion.
|
253
|
+
example = ", such as Databricks Notebooks" if is_in_databricks_runtime() else ""
|
254
|
+
raise MlflowException(
|
255
|
+
message=(
|
256
|
+
f"Failed to copy the specified code path '{file_path}' into the model "
|
257
|
+
"artifacts. It appears that your code path includes file(s) that cannot "
|
258
|
+
f"be copied{example}. Please specify a code path that does not include "
|
259
|
+
"such files and try again.",
|
260
|
+
),
|
261
|
+
error_code=INVALID_PARAMETER_VALUE,
|
262
|
+
) from e
|
263
|
+
|
264
|
+
|
265
|
+
def _add_code_to_system_path(code_path):
|
266
|
+
sys.path = [code_path] + sys.path
|
267
|
+
|
268
|
+
|
269
|
+
def _validate_and_prepare_target_save_path(path):
|
270
|
+
if os.path.exists(path) and any(os.scandir(path)):
|
271
|
+
raise MlflowException(
|
272
|
+
message=f"Path '{path}' already exists and is not empty",
|
273
|
+
error_code=RESOURCE_ALREADY_EXISTS,
|
274
|
+
)
|
275
|
+
|
276
|
+
os.makedirs(path, exist_ok=True)
|
277
|
+
|
278
|
+
|
279
|
+
def _add_code_from_conf_to_system_path(local_path, conf, code_key=FLAVOR_CONFIG_CODE):
|
280
|
+
"""Checks if any code_paths were logged with the model in the flavor conf and prepends
|
281
|
+
the directory to the system path.
|
282
|
+
|
283
|
+
Args:
|
284
|
+
local_path: The local path containing model artifacts.
|
285
|
+
conf: The flavor-specific conf that should contain the FLAVOR_CONFIG_CODE
|
286
|
+
key, which specifies the directory containing custom code logged as artifacts.
|
287
|
+
code_key: The key used by the flavor to indicate custom code artifacts.
|
288
|
+
By default this is FLAVOR_CONFIG_CODE.
|
289
|
+
"""
|
290
|
+
assert isinstance(conf, dict), "`conf` argument must be a dict."
|
291
|
+
|
292
|
+
if code_key in conf and conf[code_key]:
|
293
|
+
code_path = os.path.join(local_path, conf[code_key])
|
294
|
+
_add_code_to_system_path(code_path)
|
295
|
+
|
296
|
+
|
297
|
+
def _validate_onnx_session_options(onnx_session_options):
|
298
|
+
"""Validates that the specified onnx_session_options dict is valid.
|
299
|
+
|
300
|
+
Args:
|
301
|
+
onnx_session_options: The onnx_session_options dict to validate.
|
302
|
+
"""
|
303
|
+
import onnxruntime as ort
|
304
|
+
|
305
|
+
if onnx_session_options is not None:
|
306
|
+
if not isinstance(onnx_session_options, dict):
|
307
|
+
raise TypeError(
|
308
|
+
f"Argument onnx_session_options should be a dict, not {type(onnx_session_options)}"
|
309
|
+
)
|
310
|
+
for key, value in onnx_session_options.items():
|
311
|
+
if key != "extra_session_config" and not hasattr(ort.SessionOptions, key):
|
312
|
+
raise ValueError(
|
313
|
+
f"Key {key} in onnx_session_options is not a valid "
|
314
|
+
"ONNX Runtime session options key"
|
315
|
+
)
|
316
|
+
elif key == "extra_session_config" and not isinstance(value, dict):
|
317
|
+
raise TypeError(
|
318
|
+
f"Value for key {key} in onnx_session_options should be a dict, "
|
319
|
+
"not {type(value)}"
|
320
|
+
)
|
321
|
+
elif key == "execution_mode" and value.upper() not in [
|
322
|
+
"PARALLEL",
|
323
|
+
"SEQUENTIAL",
|
324
|
+
]:
|
325
|
+
raise ValueError(
|
326
|
+
f"Value for key {key} in onnx_session_options should be "
|
327
|
+
f"'parallel' or 'sequential', not {value}"
|
328
|
+
)
|
329
|
+
elif key == "graph_optimization_level" and value not in [0, 1, 2, 99]:
|
330
|
+
raise ValueError(
|
331
|
+
f"Value for key {key} in onnx_session_options should be 0, 1, 2, or 99, "
|
332
|
+
f"not {value}"
|
333
|
+
)
|
334
|
+
elif key in ["intra_op_num_threads", "intra_op_num_threads"] and value < 0:
|
335
|
+
raise ValueError(
|
336
|
+
f"Value for key {key} in onnx_session_options should be >= 0, not {value}"
|
337
|
+
)
|
338
|
+
|
339
|
+
|
340
|
+
def _get_overridden_pyfunc_model_config(
|
341
|
+
pyfunc_config: dict[str, Any], load_config: dict[str, Any], logger
|
342
|
+
) -> dict[str, Any]:
|
343
|
+
"""
|
344
|
+
Updates the inference configuration according to the model's configuration and the overrides.
|
345
|
+
Only arguments already present in the inference configuration can be updated. The environment
|
346
|
+
variable ``MLFLOW_PYFUNC_INFERENCE_CONFIG`` can also be used to provide additional inference
|
347
|
+
configuration.
|
348
|
+
"""
|
349
|
+
|
350
|
+
overrides = {}
|
351
|
+
if env_overrides := os.getenv("MLFLOW_PYFUNC_INFERENCE_CONFIG"):
|
352
|
+
logger.debug(
|
353
|
+
"Inference configuration is being loaded from ``MLFLOW_PYFUNC_INFERENCE_CONFIG``"
|
354
|
+
" environ."
|
355
|
+
)
|
356
|
+
overrides.update(dict(json.loads(env_overrides)))
|
357
|
+
|
358
|
+
if load_config:
|
359
|
+
overrides.update(load_config)
|
360
|
+
|
361
|
+
if not overrides:
|
362
|
+
return pyfunc_config
|
363
|
+
|
364
|
+
if not pyfunc_config:
|
365
|
+
logger.warning(
|
366
|
+
f"Argument(s) {', '.join(overrides.keys())} were ignored since the model's ``pyfunc``"
|
367
|
+
" flavor doesn't accept model configuration. Use ``model_config`` when logging"
|
368
|
+
" the model to allow it."
|
369
|
+
)
|
370
|
+
|
371
|
+
return None
|
372
|
+
|
373
|
+
valid_keys = set(pyfunc_config.keys()) & set(overrides.keys())
|
374
|
+
ignored_keys = set(overrides.keys()) - valid_keys
|
375
|
+
allowed_config = {key: overrides[key] for key in valid_keys}
|
376
|
+
if ignored_keys:
|
377
|
+
logger.warning(
|
378
|
+
f"Argument(s) {', '.join(ignored_keys)} were ignored since they are not valid keys in"
|
379
|
+
" the corresponding section of the ``pyfunc`` flavor. Use ``model_config`` when"
|
380
|
+
" logging the model to include the keys you plan to indicate. Current allowed"
|
381
|
+
f" configuration includes {', '.join(pyfunc_config.keys())}"
|
382
|
+
)
|
383
|
+
pyfunc_config.update(allowed_config)
|
384
|
+
return pyfunc_config
|
385
|
+
|
386
|
+
|
387
|
+
def _validate_and_get_model_config_from_file(model_config):
|
388
|
+
model_config = os.path.abspath(model_config)
|
389
|
+
if os.path.exists(model_config):
|
390
|
+
with open(model_config) as file:
|
391
|
+
try:
|
392
|
+
return yaml.safe_load(file)
|
393
|
+
except yaml.YAMLError as e:
|
394
|
+
raise MlflowException(
|
395
|
+
f"The provided `model_config` file '{model_config}' is not a valid YAML "
|
396
|
+
f"file: {e}",
|
397
|
+
error_code=INVALID_PARAMETER_VALUE,
|
398
|
+
)
|
399
|
+
else:
|
400
|
+
raise MlflowException(
|
401
|
+
"An invalid `model_config` file was passed. The provided `model_config` "
|
402
|
+
f"file '{model_config}'is not a valid file path.",
|
403
|
+
error_code=INVALID_PARAMETER_VALUE,
|
404
|
+
)
|
405
|
+
|
406
|
+
|
407
|
+
def _validate_pyfunc_model_config(model_config):
|
408
|
+
"""
|
409
|
+
Validates the values passes in the model_config section. There are no typing
|
410
|
+
restrictions but we require them being JSON-serializable.
|
411
|
+
"""
|
412
|
+
|
413
|
+
if not model_config:
|
414
|
+
return
|
415
|
+
|
416
|
+
if isinstance(model_config, Path):
|
417
|
+
_validate_and_get_model_config_from_file(os.fspath(model_config))
|
418
|
+
elif isinstance(model_config, str):
|
419
|
+
_validate_and_get_model_config_from_file(model_config)
|
420
|
+
elif isinstance(model_config, dict) and all(isinstance(key, str) for key in model_config):
|
421
|
+
try:
|
422
|
+
json.dumps(model_config)
|
423
|
+
except (TypeError, OverflowError):
|
424
|
+
raise MlflowException(
|
425
|
+
"Values in the provided ``model_config`` are of an unsupported type. Only "
|
426
|
+
"JSON-serializable data types can be provided as values.",
|
427
|
+
error_code=INVALID_PARAMETER_VALUE,
|
428
|
+
)
|
429
|
+
else:
|
430
|
+
raise MlflowException(
|
431
|
+
"An invalid ``model_config`` structure was passed. ``model_config`` must be a "
|
432
|
+
"valid file path or of type ``dict`` with string keys.",
|
433
|
+
error_code=INVALID_PARAMETER_VALUE,
|
434
|
+
)
|
435
|
+
|
436
|
+
|
437
|
+
RECORD_ENV_VAR_ALLOWLIST = {
|
438
|
+
# api key related
|
439
|
+
"API_KEY",
|
440
|
+
"API_TOKEN",
|
441
|
+
# databricks auth related
|
442
|
+
"DATABRICKS_HOST",
|
443
|
+
"DATABRICKS_USERNAME",
|
444
|
+
"DATABRICKS_PASSWORD",
|
445
|
+
"DATABRICKS_TOKEN",
|
446
|
+
"DATABRICKS_INSECURE",
|
447
|
+
"DATABRICKS_CLIENT_ID",
|
448
|
+
"DATABRICKS_CLIENT_SECRET",
|
449
|
+
"_DATABRICKS_WORKSPACE_HOST",
|
450
|
+
"_DATABRICKS_WORKSPACE_ID",
|
451
|
+
}
|
452
|
+
|
453
|
+
|
454
|
+
@contextlib.contextmanager
|
455
|
+
def env_var_tracker():
|
456
|
+
"""
|
457
|
+
Context manager for temporarily tracking environment variables accessed.
|
458
|
+
It tracks environment variables accessed during the context manager's lifetime.
|
459
|
+
"""
|
460
|
+
from mlflow.environment_variables import MLFLOW_RECORD_ENV_VARS_IN_MODEL_LOGGING
|
461
|
+
|
462
|
+
tracked_env_names = set()
|
463
|
+
|
464
|
+
if MLFLOW_RECORD_ENV_VARS_IN_MODEL_LOGGING.get():
|
465
|
+
original_getitem = os._Environ.__getitem__
|
466
|
+
original_get = os._Environ.get
|
467
|
+
|
468
|
+
def updated_get_item(self, key):
|
469
|
+
result = original_getitem(self, key)
|
470
|
+
tracked_env_names.add(key)
|
471
|
+
return result
|
472
|
+
|
473
|
+
def updated_get(self, key, *args, **kwargs):
|
474
|
+
if key in self:
|
475
|
+
tracked_env_names.add(key)
|
476
|
+
return original_get(self, key, *args, **kwargs)
|
477
|
+
|
478
|
+
try:
|
479
|
+
os._Environ.__getitem__ = updated_get_item
|
480
|
+
os._Environ.get = updated_get
|
481
|
+
yield tracked_env_names
|
482
|
+
finally:
|
483
|
+
os._Environ.__getitem__ = original_getitem
|
484
|
+
os._Environ.get = original_get
|
485
|
+
else:
|
486
|
+
yield tracked_env_names
|