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,363 @@
|
|
1
|
+
"""
|
2
|
+
NOTE: The contents of this file have been inlined from the wrapt package's source code
|
3
|
+
https://github.com/GrahamDumpleton/wrapt/blob/1.12.1/src/wrapt/importer.py.
|
4
|
+
Some modifications, have been made in order to:
|
5
|
+
- avoid duplicate registration of import hooks
|
6
|
+
- inline functions from dependent wrapt submodules rather than importing them.
|
7
|
+
|
8
|
+
This module implements a post import hook mechanism styled after what is described in PEP-369.
|
9
|
+
Note that it doesn't cope with modules being reloaded.
|
10
|
+
It also extends the functionality to support custom hooks for import errors
|
11
|
+
(as opposed to only successful imports).
|
12
|
+
"""
|
13
|
+
|
14
|
+
import importlib # noqa: F401
|
15
|
+
import sys
|
16
|
+
import threading
|
17
|
+
|
18
|
+
string_types = (str,)
|
19
|
+
|
20
|
+
|
21
|
+
# from .decorators import synchronized
|
22
|
+
# NOTE: Instead of using this import (from wrapt's decorator module, see
|
23
|
+
# https://github.com/GrahamDumpleton/wrapt/blob/68316bea668fd905a4acb21f37f12596d8c30d80/src/wrapt/decorators.py#L430-L456),
|
24
|
+
# we define a decorator with similar behavior that acquires a lock while calling the decorated
|
25
|
+
# function
|
26
|
+
def synchronized(lock):
|
27
|
+
def decorator(f):
|
28
|
+
# See e.g. https://www.python.org/dev/peps/pep-0318/#examples
|
29
|
+
def new_fn(*args, **kwargs):
|
30
|
+
with lock:
|
31
|
+
return f(*args, **kwargs)
|
32
|
+
|
33
|
+
return new_fn
|
34
|
+
|
35
|
+
return decorator
|
36
|
+
|
37
|
+
|
38
|
+
# The dictionary registering any post import hooks to be triggered once
|
39
|
+
# the target module has been imported. Once a module has been imported
|
40
|
+
# and the hooks fired, the list of hooks recorded against the target
|
41
|
+
# module will be truncated but the list left in the dictionary. This
|
42
|
+
# acts as a flag to indicate that the module had already been imported.
|
43
|
+
|
44
|
+
_post_import_hooks = {}
|
45
|
+
_post_import_hooks_lock = threading.RLock()
|
46
|
+
|
47
|
+
# A dictionary for any import hook error handlers to be triggered when the
|
48
|
+
# target module import fails.
|
49
|
+
|
50
|
+
_import_error_hooks = {}
|
51
|
+
_import_error_hooks_lock = threading.RLock()
|
52
|
+
|
53
|
+
_import_hook_finder_init = False
|
54
|
+
|
55
|
+
# Register a new post import hook for the target module name. This
|
56
|
+
# differs from the PEP-369 implementation in that it also allows the
|
57
|
+
# hook function to be specified as a string consisting of the name of
|
58
|
+
# the callback in the form 'module:function'. This will result in a
|
59
|
+
# proxy callback being registered which will defer loading of the
|
60
|
+
# specified module containing the callback function until required.
|
61
|
+
|
62
|
+
|
63
|
+
def _create_import_hook_from_string(name):
|
64
|
+
def import_hook(module):
|
65
|
+
module_name, function = name.split(":")
|
66
|
+
attrs = function.split(".")
|
67
|
+
__import__(module_name)
|
68
|
+
callback = sys.modules[module_name]
|
69
|
+
for attr in attrs:
|
70
|
+
callback = getattr(callback, attr)
|
71
|
+
return callback(module)
|
72
|
+
|
73
|
+
return import_hook
|
74
|
+
|
75
|
+
|
76
|
+
def register_generic_import_hook(hook, name, hook_dict, overwrite):
|
77
|
+
# Create a deferred import hook if hook is a string name rather than
|
78
|
+
# a callable function.
|
79
|
+
|
80
|
+
if isinstance(hook, string_types):
|
81
|
+
hook = _create_import_hook_from_string(hook)
|
82
|
+
|
83
|
+
# Automatically install the import hook finder if it has not already
|
84
|
+
# been installed.
|
85
|
+
|
86
|
+
global _import_hook_finder_init
|
87
|
+
if not _import_hook_finder_init:
|
88
|
+
_import_hook_finder_init = True
|
89
|
+
sys.meta_path.insert(0, ImportHookFinder())
|
90
|
+
|
91
|
+
# Determine if any prior registration of an import hook for
|
92
|
+
# the target modules has occurred and act appropriately.
|
93
|
+
|
94
|
+
hooks = hook_dict.get(name, None)
|
95
|
+
|
96
|
+
if hooks is None:
|
97
|
+
# No prior registration of import hooks for the target
|
98
|
+
# module. We need to check whether the module has already been
|
99
|
+
# imported. If it has we fire the hook immediately and add an
|
100
|
+
# empty list to the registry to indicate that the module has
|
101
|
+
# already been imported and hooks have fired. Otherwise add
|
102
|
+
# the post import hook to the registry.
|
103
|
+
|
104
|
+
module = sys.modules.get(name, None)
|
105
|
+
|
106
|
+
if module is not None:
|
107
|
+
hook_dict[name] = []
|
108
|
+
hook(module)
|
109
|
+
|
110
|
+
else:
|
111
|
+
hook_dict[name] = [hook]
|
112
|
+
|
113
|
+
elif hooks == []:
|
114
|
+
# A prior registration of import hooks for the target
|
115
|
+
# module was done and the hooks already fired. Fire the hook
|
116
|
+
# immediately.
|
117
|
+
|
118
|
+
module = sys.modules[name]
|
119
|
+
hook(module)
|
120
|
+
|
121
|
+
else:
|
122
|
+
# A prior registration of import hooks for the target
|
123
|
+
# module was done but the module has not yet been imported.
|
124
|
+
|
125
|
+
def hooks_equal(existing_hook, hook):
|
126
|
+
if hasattr(existing_hook, "__name__") and hasattr(hook, "__name__"):
|
127
|
+
return existing_hook.__name__ == hook.__name__
|
128
|
+
else:
|
129
|
+
return False
|
130
|
+
|
131
|
+
if overwrite:
|
132
|
+
hook_dict[name] = [
|
133
|
+
existing_hook
|
134
|
+
for existing_hook in hook_dict[name]
|
135
|
+
if not hooks_equal(existing_hook, hook)
|
136
|
+
]
|
137
|
+
|
138
|
+
hook_dict[name].append(hook)
|
139
|
+
|
140
|
+
|
141
|
+
@synchronized(_import_error_hooks_lock)
|
142
|
+
def register_import_error_hook(hook, name, overwrite=True):
|
143
|
+
"""
|
144
|
+
Args:
|
145
|
+
hook: A function or string entrypoint to invoke when the specified module is imported
|
146
|
+
and an error occurs.
|
147
|
+
name: The name of the module for which to fire the hook at import error detection time.
|
148
|
+
overwrite: Specifies the desired behavior when a preexisting hook for the same
|
149
|
+
function / entrypoint already exists for the specified module. If `True`,
|
150
|
+
all preexisting hooks matching the specified function / entrypoint will be
|
151
|
+
removed and replaced with a single instance of the specified `hook`.
|
152
|
+
"""
|
153
|
+
register_generic_import_hook(hook, name, _import_error_hooks, overwrite)
|
154
|
+
|
155
|
+
|
156
|
+
@synchronized(_post_import_hooks_lock)
|
157
|
+
def register_post_import_hook(hook, name, overwrite=True):
|
158
|
+
"""
|
159
|
+
Args:
|
160
|
+
hook: A function or string entrypoint to invoke when the specified module is imported.
|
161
|
+
name: The name of the module for which to fire the hook at import time.
|
162
|
+
overwrite: Specifies the desired behavior when a preexisting hook for the same
|
163
|
+
function / entrypoint already exists for the specified module. If `True`,
|
164
|
+
all preexisting hooks matching the specified function / entrypoint will be
|
165
|
+
removed and replaced with a single instance of the specified `hook`.
|
166
|
+
"""
|
167
|
+
register_generic_import_hook(hook, name, _post_import_hooks, overwrite)
|
168
|
+
|
169
|
+
|
170
|
+
@synchronized(_post_import_hooks_lock)
|
171
|
+
def get_post_import_hooks(name):
|
172
|
+
return _post_import_hooks.get(name)
|
173
|
+
|
174
|
+
|
175
|
+
# Register post import hooks defined as package entry points.
|
176
|
+
|
177
|
+
|
178
|
+
def _create_import_hook_from_entrypoint(entrypoint):
|
179
|
+
def import_hook(module):
|
180
|
+
__import__(entrypoint.module_name)
|
181
|
+
callback = sys.modules[entrypoint.module_name]
|
182
|
+
for attr in entrypoint.attrs:
|
183
|
+
callback = getattr(callback, attr)
|
184
|
+
return callback(module)
|
185
|
+
|
186
|
+
return import_hook
|
187
|
+
|
188
|
+
|
189
|
+
def discover_post_import_hooks(group):
|
190
|
+
# New in 3.9: https://docs.python.org/3/library/importlib.resources.html#importlib.resources.files
|
191
|
+
if sys.version_info.major > 2 and sys.version_info.minor > 8:
|
192
|
+
from importlib.resources import files # clint: disable=lazy-builtin-import
|
193
|
+
|
194
|
+
for entrypoint in (
|
195
|
+
resource.name for resource in files(group).iterdir() if resource.is_file()
|
196
|
+
):
|
197
|
+
callback = _create_import_hook_from_entrypoint(entrypoint)
|
198
|
+
register_post_import_hook(callback, entrypoint.name)
|
199
|
+
else:
|
200
|
+
from importlib.resources import contents # clint: disable=lazy-builtin-import
|
201
|
+
|
202
|
+
for entrypoint in contents(group):
|
203
|
+
callback = _create_import_hook_from_entrypoint(entrypoint)
|
204
|
+
register_post_import_hook(callback, entrypoint.name)
|
205
|
+
|
206
|
+
|
207
|
+
# Indicate that a module has been loaded. Any post import hooks which
|
208
|
+
# were registered against the target module will be invoked. If an
|
209
|
+
# exception is raised in any of the post import hooks, that will cause
|
210
|
+
# the import of the target module to fail.
|
211
|
+
|
212
|
+
|
213
|
+
@synchronized(_post_import_hooks_lock)
|
214
|
+
def notify_module_loaded(module):
|
215
|
+
name = getattr(module, "__name__", None)
|
216
|
+
hooks = _post_import_hooks.get(name)
|
217
|
+
|
218
|
+
if hooks:
|
219
|
+
_post_import_hooks[name] = []
|
220
|
+
|
221
|
+
for hook in hooks:
|
222
|
+
hook(module)
|
223
|
+
|
224
|
+
|
225
|
+
@synchronized(_import_error_hooks_lock)
|
226
|
+
def notify_module_import_error(module_name):
|
227
|
+
hooks = _import_error_hooks.get(module_name)
|
228
|
+
|
229
|
+
if hooks:
|
230
|
+
# Error hooks differ from post import hooks, in that we don't clear the
|
231
|
+
# hook as soon as it fires.
|
232
|
+
for hook in hooks:
|
233
|
+
hook(module_name)
|
234
|
+
|
235
|
+
|
236
|
+
# A custom module import finder. This intercepts attempts to import
|
237
|
+
# modules and watches out for attempts to import target modules of
|
238
|
+
# interest. When a module of interest is imported, then any post import
|
239
|
+
# hooks which are registered will be invoked.
|
240
|
+
|
241
|
+
|
242
|
+
class _ImportHookChainedLoader:
|
243
|
+
def __init__(self, loader):
|
244
|
+
self.loader = loader
|
245
|
+
|
246
|
+
def load_module(self, fullname):
|
247
|
+
try:
|
248
|
+
module = self.loader.load_module(fullname)
|
249
|
+
notify_module_loaded(module)
|
250
|
+
except (ImportError, AttributeError):
|
251
|
+
notify_module_import_error(fullname)
|
252
|
+
raise
|
253
|
+
|
254
|
+
return module
|
255
|
+
|
256
|
+
|
257
|
+
class ImportHookFinder:
|
258
|
+
def __init__(self):
|
259
|
+
self.in_progress = {}
|
260
|
+
|
261
|
+
@synchronized(_post_import_hooks_lock)
|
262
|
+
@synchronized(_import_error_hooks_lock)
|
263
|
+
def find_module(self, fullname, path=None):
|
264
|
+
# If the module being imported is not one we have registered
|
265
|
+
# import hooks for, we can return immediately. We will
|
266
|
+
# take no further part in the importing of this module.
|
267
|
+
|
268
|
+
if fullname not in _post_import_hooks and fullname not in _import_error_hooks:
|
269
|
+
return None
|
270
|
+
|
271
|
+
# When we are interested in a specific module, we will call back
|
272
|
+
# into the import system a second time to defer to the import
|
273
|
+
# finder that is supposed to handle the importing of the module.
|
274
|
+
# We set an in progress flag for the target module so that on
|
275
|
+
# the second time through we don't trigger another call back
|
276
|
+
# into the import system and cause a infinite loop.
|
277
|
+
|
278
|
+
if fullname in self.in_progress:
|
279
|
+
return None
|
280
|
+
|
281
|
+
self.in_progress[fullname] = True
|
282
|
+
|
283
|
+
# Now call back into the import system again.
|
284
|
+
|
285
|
+
try:
|
286
|
+
# For Python 3 we need to use find_spec().loader
|
287
|
+
# from the importlib.util module. It doesn't actually
|
288
|
+
# import the target module and only finds the
|
289
|
+
# loader. If a loader is found, we need to return
|
290
|
+
# our own loader which will then in turn call the
|
291
|
+
# real loader to import the module and invoke the
|
292
|
+
# post import hooks.
|
293
|
+
try:
|
294
|
+
import importlib.util # clint: disable=lazy-builtin-import
|
295
|
+
|
296
|
+
loader = importlib.util.find_spec(fullname).loader
|
297
|
+
# If an ImportError (or AttributeError) is encountered while finding the module,
|
298
|
+
# notify the hooks for import errors
|
299
|
+
except (ImportError, AttributeError):
|
300
|
+
notify_module_import_error(fullname)
|
301
|
+
loader = importlib.find_loader(fullname, path)
|
302
|
+
if loader:
|
303
|
+
return _ImportHookChainedLoader(loader)
|
304
|
+
finally:
|
305
|
+
del self.in_progress[fullname]
|
306
|
+
|
307
|
+
@synchronized(_post_import_hooks_lock)
|
308
|
+
@synchronized(_import_error_hooks_lock)
|
309
|
+
def find_spec(self, fullname, path, target=None):
|
310
|
+
# If the module being imported is not one we have registered
|
311
|
+
# import hooks for, we can return immediately. We will
|
312
|
+
# take no further part in the importing of this module.
|
313
|
+
|
314
|
+
if fullname not in _post_import_hooks and fullname not in _import_error_hooks:
|
315
|
+
return None
|
316
|
+
|
317
|
+
# When we are interested in a specific module, we will call back
|
318
|
+
# into the import system a second time to defer to the import
|
319
|
+
# finder that is supposed to handle the importing of the module.
|
320
|
+
# We set an in progress flag for the target module so that on
|
321
|
+
# the second time through we don't trigger another call back
|
322
|
+
# into the import system and cause a infinite loop.
|
323
|
+
|
324
|
+
if fullname in self.in_progress:
|
325
|
+
return None
|
326
|
+
|
327
|
+
self.in_progress[fullname] = True
|
328
|
+
|
329
|
+
# Now call back into the import system again.
|
330
|
+
|
331
|
+
try:
|
332
|
+
import importlib.util # clint: disable=lazy-builtin-import
|
333
|
+
|
334
|
+
spec = importlib.util.find_spec(fullname)
|
335
|
+
# Replace the module spec's loader with a wrapped version that executes import
|
336
|
+
# hooks when the module is loaded
|
337
|
+
spec.loader = _ImportHookChainedLoader(spec.loader)
|
338
|
+
return spec
|
339
|
+
except (ImportError, AttributeError):
|
340
|
+
notify_module_import_error(fullname)
|
341
|
+
finally:
|
342
|
+
del self.in_progress[fullname]
|
343
|
+
|
344
|
+
|
345
|
+
# Decorator for marking that a function should be called as a post
|
346
|
+
# import hook when the target module is imported.
|
347
|
+
# If error_handler is True, then apply the marked function as an import hook
|
348
|
+
# for import errors (instead of successful imports).
|
349
|
+
# It is assumed that all error hooks are added during driver start-up,
|
350
|
+
# and thus added prior to any import calls. If an error hook is added
|
351
|
+
# after a module has already failed the import, there's no guarantee
|
352
|
+
# that the hook will fire.
|
353
|
+
|
354
|
+
|
355
|
+
def when_imported(name, error_handler=False):
|
356
|
+
def register(hook):
|
357
|
+
if error_handler:
|
358
|
+
register_import_error_hook(hook, name)
|
359
|
+
else:
|
360
|
+
register_post_import_hook(hook, name)
|
361
|
+
return hook
|
362
|
+
|
363
|
+
return register
|
@@ -0,0 +1,51 @@
|
|
1
|
+
"""Utility to lazy load modules."""
|
2
|
+
|
3
|
+
import importlib
|
4
|
+
import sys
|
5
|
+
import types
|
6
|
+
|
7
|
+
|
8
|
+
class LazyLoader(types.ModuleType):
|
9
|
+
"""Class for module lazy loading.
|
10
|
+
|
11
|
+
This class helps lazily load modules at package level, which avoids pulling in large
|
12
|
+
dependencies like `tensorflow` or `torch`. This class is mirrored from wandb's LazyLoader:
|
13
|
+
https://github.com/wandb/wandb/blob/79b2d4b73e3a9e4488e503c3131ff74d151df689/wandb/sdk/lib/lazyloader.py#L9
|
14
|
+
"""
|
15
|
+
|
16
|
+
def __init__(self, local_name, parent_module_globals, name):
|
17
|
+
self._local_name = local_name
|
18
|
+
self._parent_module_globals = parent_module_globals
|
19
|
+
|
20
|
+
self._module = None
|
21
|
+
super().__init__(str(name))
|
22
|
+
|
23
|
+
def _load(self):
|
24
|
+
"""Load the module and insert it into the parent's globals."""
|
25
|
+
if self._module:
|
26
|
+
# If already loaded, return the loaded module.
|
27
|
+
return self._module
|
28
|
+
|
29
|
+
# Import the target module and insert it into the parent's namespace
|
30
|
+
module = importlib.import_module(self.__name__)
|
31
|
+
self._parent_module_globals[self._local_name] = module
|
32
|
+
sys.modules[self._local_name] = module
|
33
|
+
|
34
|
+
# Update this object's dict so that if someone keeps a reference to the `LazyLoader`,
|
35
|
+
# lookups are efficient (`__getattr__` is only called on lookups that fail).
|
36
|
+
self.__dict__.update(module.__dict__)
|
37
|
+
|
38
|
+
return module
|
39
|
+
|
40
|
+
def __getattr__(self, item):
|
41
|
+
module = self._load()
|
42
|
+
return getattr(module, item)
|
43
|
+
|
44
|
+
def __dir__(self):
|
45
|
+
module = self._load()
|
46
|
+
return dir(module)
|
47
|
+
|
48
|
+
def __repr__(self):
|
49
|
+
if not self._module:
|
50
|
+
return f"<module '{self.__name__} (Not loaded yet)'>"
|
51
|
+
return repr(self._module)
|
@@ -0,0 +1,168 @@
|
|
1
|
+
import contextlib
|
2
|
+
import logging
|
3
|
+
import logging.config
|
4
|
+
import re
|
5
|
+
import sys
|
6
|
+
|
7
|
+
from mlflow.environment_variables import MLFLOW_LOGGING_LEVEL
|
8
|
+
|
9
|
+
# Logging format example:
|
10
|
+
# 2018/11/20 12:36:37 INFO mlflow.sagemaker: Creating new SageMaker endpoint
|
11
|
+
LOGGING_LINE_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s"
|
12
|
+
LOGGING_DATETIME_FORMAT = "%Y/%m/%d %H:%M:%S"
|
13
|
+
|
14
|
+
|
15
|
+
class MlflowLoggingStream:
|
16
|
+
"""
|
17
|
+
A Python stream for use with event logging APIs throughout MLflow (`eprint()`,
|
18
|
+
`logger.info()`, etc.). This stream wraps `sys.stderr`, forwarding `write()` and
|
19
|
+
`flush()` calls to the stream referred to by `sys.stderr` at the time of the call.
|
20
|
+
It also provides capabilities for disabling the stream to silence event logs.
|
21
|
+
"""
|
22
|
+
|
23
|
+
def __init__(self):
|
24
|
+
self._enabled = True
|
25
|
+
|
26
|
+
def write(self, text):
|
27
|
+
if self._enabled:
|
28
|
+
sys.stderr.write(text)
|
29
|
+
|
30
|
+
def flush(self):
|
31
|
+
if self._enabled:
|
32
|
+
sys.stderr.flush()
|
33
|
+
|
34
|
+
@property
|
35
|
+
def enabled(self):
|
36
|
+
return self._enabled
|
37
|
+
|
38
|
+
@enabled.setter
|
39
|
+
def enabled(self, value):
|
40
|
+
self._enabled = value
|
41
|
+
|
42
|
+
|
43
|
+
MLFLOW_LOGGING_STREAM = MlflowLoggingStream()
|
44
|
+
|
45
|
+
|
46
|
+
def disable_logging():
|
47
|
+
"""
|
48
|
+
Disables the `MlflowLoggingStream` used by event logging APIs throughout MLflow
|
49
|
+
(`eprint()`, `logger.info()`, etc), silencing all subsequent event logs.
|
50
|
+
"""
|
51
|
+
MLFLOW_LOGGING_STREAM.enabled = False
|
52
|
+
|
53
|
+
|
54
|
+
def enable_logging():
|
55
|
+
"""
|
56
|
+
Enables the `MlflowLoggingStream` used by event logging APIs throughout MLflow
|
57
|
+
(`eprint()`, `logger.info()`, etc), emitting all subsequent event logs. This
|
58
|
+
reverses the effects of `disable_logging()`.
|
59
|
+
"""
|
60
|
+
MLFLOW_LOGGING_STREAM.enabled = True
|
61
|
+
|
62
|
+
|
63
|
+
class MlflowFormatter(logging.Formatter):
|
64
|
+
"""
|
65
|
+
Custom Formatter Class to support colored log
|
66
|
+
ANSI characters might not work natively on older Windows, so disabling the feature for win32.
|
67
|
+
See https://github.com/borntyping/python-colorlog/blob/dfa10f59186d3d716aec4165ee79e58f2265c0eb/colorlog/escape_codes.py#L16C8-L16C31
|
68
|
+
"""
|
69
|
+
|
70
|
+
# Copied from color log package https://github.com/borntyping/python-colorlog/blob/dfa10f59186d3d716aec4165ee79e58f2265c0eb/colorlog/escape_codes.py#L33-L50
|
71
|
+
COLORS = {
|
72
|
+
"black": 30,
|
73
|
+
"red": 31,
|
74
|
+
"green": 32,
|
75
|
+
"yellow": 33,
|
76
|
+
"blue": 34,
|
77
|
+
"purple": 35,
|
78
|
+
"cyan": 36,
|
79
|
+
"white": 37,
|
80
|
+
"light_black": 90,
|
81
|
+
"light_red": 91,
|
82
|
+
"light_green": 92,
|
83
|
+
"light_yellow": 93,
|
84
|
+
"light_blue": 94,
|
85
|
+
"light_purple": 95,
|
86
|
+
"light_cyan": 96,
|
87
|
+
"light_white": 97,
|
88
|
+
}
|
89
|
+
RESET = "\033[0m"
|
90
|
+
|
91
|
+
def format(self, record):
|
92
|
+
if color := getattr(record, "color", None):
|
93
|
+
if color in self.COLORS and sys.platform != "win32":
|
94
|
+
color_code = self._escape(self.COLORS[color])
|
95
|
+
return f"{color_code}{super().format(record)}{self.RESET}"
|
96
|
+
return super().format(record)
|
97
|
+
|
98
|
+
def _escape(self, code: int) -> str:
|
99
|
+
return f"\033[{code}m"
|
100
|
+
|
101
|
+
|
102
|
+
def _configure_mlflow_loggers(root_module_name):
|
103
|
+
logging.config.dictConfig(
|
104
|
+
{
|
105
|
+
"version": 1,
|
106
|
+
"disable_existing_loggers": False,
|
107
|
+
"formatters": {
|
108
|
+
"mlflow_formatter": {
|
109
|
+
"()": MlflowFormatter,
|
110
|
+
"format": LOGGING_LINE_FORMAT,
|
111
|
+
"datefmt": LOGGING_DATETIME_FORMAT,
|
112
|
+
},
|
113
|
+
},
|
114
|
+
"handlers": {
|
115
|
+
"mlflow_handler": {
|
116
|
+
"formatter": "mlflow_formatter",
|
117
|
+
"class": "logging.StreamHandler",
|
118
|
+
"stream": MLFLOW_LOGGING_STREAM,
|
119
|
+
},
|
120
|
+
},
|
121
|
+
"loggers": {
|
122
|
+
root_module_name: {
|
123
|
+
"handlers": ["mlflow_handler"],
|
124
|
+
"level": (MLFLOW_LOGGING_LEVEL.get() or "INFO").upper(),
|
125
|
+
"propagate": False,
|
126
|
+
},
|
127
|
+
},
|
128
|
+
}
|
129
|
+
)
|
130
|
+
|
131
|
+
|
132
|
+
def eprint(*args, **kwargs):
|
133
|
+
print(*args, file=MLFLOW_LOGGING_STREAM, **kwargs)
|
134
|
+
|
135
|
+
|
136
|
+
class LoggerMessageFilter(logging.Filter):
|
137
|
+
def __init__(self, module: str, filter_regex: re.Pattern):
|
138
|
+
super().__init__()
|
139
|
+
self._pattern = filter_regex
|
140
|
+
self._module = module
|
141
|
+
|
142
|
+
def filter(self, record):
|
143
|
+
if record.name == self._module and self._pattern.search(record.msg):
|
144
|
+
return False
|
145
|
+
return True
|
146
|
+
|
147
|
+
|
148
|
+
@contextlib.contextmanager
|
149
|
+
def suppress_logs(module: str, filter_regex: re.Pattern):
|
150
|
+
"""
|
151
|
+
Context manager that suppresses log messages from the specified module that match the specified
|
152
|
+
regular expression. This is useful for suppressing expected log messages from third-party
|
153
|
+
libraries that are not relevant to the current test.
|
154
|
+
"""
|
155
|
+
logger = logging.getLogger(module)
|
156
|
+
filter = LoggerMessageFilter(module=module, filter_regex=filter_regex)
|
157
|
+
logger.addFilter(filter)
|
158
|
+
try:
|
159
|
+
yield
|
160
|
+
finally:
|
161
|
+
logger.removeFilter(filter)
|
162
|
+
|
163
|
+
|
164
|
+
def _debug(s: str) -> None:
|
165
|
+
"""
|
166
|
+
Debug function to test logging level.
|
167
|
+
"""
|
168
|
+
logging.getLogger(__name__).debug(s)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import os
|
2
|
+
import pathlib
|
3
|
+
from mimetypes import guess_type
|
4
|
+
|
5
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
6
|
+
|
7
|
+
|
8
|
+
# TODO: Create a module to define constants to avoid circular imports
|
9
|
+
# and move MLMODEL_FILE_NAME and MLPROJECT_FILE_NAME in the module.
|
10
|
+
def get_text_extensions():
|
11
|
+
exts = [
|
12
|
+
"txt",
|
13
|
+
"log",
|
14
|
+
"err",
|
15
|
+
"cfg",
|
16
|
+
"conf",
|
17
|
+
"cnf",
|
18
|
+
"cf",
|
19
|
+
"ini",
|
20
|
+
"properties",
|
21
|
+
"prop",
|
22
|
+
"hocon",
|
23
|
+
"toml",
|
24
|
+
"yaml",
|
25
|
+
"yml",
|
26
|
+
"xml",
|
27
|
+
"json",
|
28
|
+
"js",
|
29
|
+
"py",
|
30
|
+
"py3",
|
31
|
+
"csv",
|
32
|
+
"tsv",
|
33
|
+
"md",
|
34
|
+
"rst",
|
35
|
+
]
|
36
|
+
|
37
|
+
if not IS_TRACING_SDK_ONLY:
|
38
|
+
from mlflow.models.model import MLMODEL_FILE_NAME
|
39
|
+
from mlflow.projects._project_spec import MLPROJECT_FILE_NAME
|
40
|
+
|
41
|
+
exts.extend([MLMODEL_FILE_NAME, MLPROJECT_FILE_NAME])
|
42
|
+
|
43
|
+
return exts
|
44
|
+
|
45
|
+
|
46
|
+
def _guess_mime_type(file_path):
|
47
|
+
filename = pathlib.Path(file_path).name
|
48
|
+
extension = os.path.splitext(filename)[-1].replace(".", "")
|
49
|
+
# for MLmodel/mlproject with no extensions
|
50
|
+
if extension == "":
|
51
|
+
extension = filename
|
52
|
+
if extension in get_text_extensions():
|
53
|
+
return "text/plain"
|
54
|
+
mime_type, _ = guess_type(filename)
|
55
|
+
if not mime_type:
|
56
|
+
# As a fallback, if mime type is not detected, treat it as a binary file
|
57
|
+
return "application/octet-stream"
|
58
|
+
return mime_type
|