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,93 @@
|
|
1
|
+
import sys
|
2
|
+
|
3
|
+
from mlflow.exceptions import INVALID_PARAMETER_VALUE, MlflowException
|
4
|
+
|
5
|
+
|
6
|
+
def _is_module_imported(module_name: str) -> bool:
|
7
|
+
return module_name in sys.modules
|
8
|
+
|
9
|
+
|
10
|
+
def _try_get_item(x):
|
11
|
+
try:
|
12
|
+
return x.item()
|
13
|
+
except Exception as e:
|
14
|
+
raise MlflowException(
|
15
|
+
f"Failed to convert metric value to float: {e}",
|
16
|
+
error_code=INVALID_PARAMETER_VALUE,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
def _converter_requires(module_name: str):
|
21
|
+
"""Wrapper function that checks if specified `module_name` is already imported before
|
22
|
+
invoking wrapped function.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def decorator(func):
|
26
|
+
def wrapper(x):
|
27
|
+
if not _is_module_imported(module_name):
|
28
|
+
return x
|
29
|
+
|
30
|
+
return func(x)
|
31
|
+
|
32
|
+
return wrapper
|
33
|
+
|
34
|
+
return decorator
|
35
|
+
|
36
|
+
|
37
|
+
def convert_metric_value_to_float_if_possible(x) -> float:
|
38
|
+
if x is None or type(x) == float:
|
39
|
+
return x
|
40
|
+
|
41
|
+
converter_fns_to_try = [
|
42
|
+
convert_metric_value_to_float_if_ndarray,
|
43
|
+
convert_metric_value_to_float_if_tensorflow_tensor,
|
44
|
+
convert_metric_value_to_float_if_torch_tensor,
|
45
|
+
]
|
46
|
+
|
47
|
+
for converter_fn in converter_fns_to_try:
|
48
|
+
possible_float = converter_fn(x)
|
49
|
+
if type(possible_float) == float:
|
50
|
+
return possible_float
|
51
|
+
|
52
|
+
try:
|
53
|
+
return float(x)
|
54
|
+
except ValueError:
|
55
|
+
return x # let backend handle conversion if possible
|
56
|
+
|
57
|
+
|
58
|
+
@_converter_requires("numpy")
|
59
|
+
def convert_metric_value_to_float_if_ndarray(x):
|
60
|
+
import numpy as np
|
61
|
+
|
62
|
+
if isinstance(x, np.ndarray):
|
63
|
+
return float(_try_get_item(x))
|
64
|
+
|
65
|
+
return x
|
66
|
+
|
67
|
+
|
68
|
+
@_converter_requires("torch")
|
69
|
+
def convert_metric_value_to_float_if_torch_tensor(x):
|
70
|
+
import torch
|
71
|
+
|
72
|
+
if isinstance(x, torch.Tensor):
|
73
|
+
extracted_tensor_val = x.detach().cpu()
|
74
|
+
|
75
|
+
return float(_try_get_item(extracted_tensor_val))
|
76
|
+
|
77
|
+
return x
|
78
|
+
|
79
|
+
|
80
|
+
@_converter_requires("tensorflow")
|
81
|
+
def convert_metric_value_to_float_if_tensorflow_tensor(x):
|
82
|
+
import tensorflow as tf
|
83
|
+
|
84
|
+
if isinstance(x, tf.Tensor):
|
85
|
+
try:
|
86
|
+
return float(x)
|
87
|
+
except Exception as e:
|
88
|
+
raise MlflowException(
|
89
|
+
f"Failed to convert metric value to float: {e!r}",
|
90
|
+
error_code=INVALID_PARAMETER_VALUE,
|
91
|
+
)
|
92
|
+
|
93
|
+
return x
|
@@ -0,0 +1,206 @@
|
|
1
|
+
"""
|
2
|
+
Internal module implementing multi-media objects and utilities in MLflow. Multi-media objects are
|
3
|
+
exposed to users at the top-level :py:mod:`mlflow` module.
|
4
|
+
"""
|
5
|
+
|
6
|
+
import warnings
|
7
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
import numpy
|
11
|
+
import PIL
|
12
|
+
|
13
|
+
|
14
|
+
COMPRESSED_IMAGE_SIZE = 256
|
15
|
+
|
16
|
+
|
17
|
+
def compress_image_size(
|
18
|
+
image: "PIL.Image.Image", max_size: Optional[int] = COMPRESSED_IMAGE_SIZE
|
19
|
+
) -> "PIL.Image.Image":
|
20
|
+
"""
|
21
|
+
Scale the image to fit within a square with length `max_size` while maintaining
|
22
|
+
the aspect ratio.
|
23
|
+
"""
|
24
|
+
# scale the image to max(width, height) <= compressed_file_max_size
|
25
|
+
width, height = image.size
|
26
|
+
if width > height:
|
27
|
+
new_width = max_size
|
28
|
+
new_height = int(height * (new_width / width))
|
29
|
+
else:
|
30
|
+
new_height = max_size
|
31
|
+
new_width = int(width * (new_height / height))
|
32
|
+
return image.resize((new_width, new_height))
|
33
|
+
|
34
|
+
|
35
|
+
def convert_to_pil_image(image: Union["numpy.ndarray", list[Any]]) -> "PIL.Image.Image":
|
36
|
+
"""
|
37
|
+
Convert a numpy array to a PIL image.
|
38
|
+
"""
|
39
|
+
import numpy as np
|
40
|
+
|
41
|
+
try:
|
42
|
+
from PIL import Image
|
43
|
+
except ImportError as exc:
|
44
|
+
raise ImportError(
|
45
|
+
"Pillow is required to serialize a numpy array as an image. "
|
46
|
+
"Please install it via: `pip install Pillow`"
|
47
|
+
) from exc
|
48
|
+
|
49
|
+
def _normalize_to_uint8(x):
|
50
|
+
is_int = np.issubdtype(x.dtype, np.integer)
|
51
|
+
low = 0
|
52
|
+
high = 255 if is_int else 1
|
53
|
+
if x.min() < low or x.max() > high:
|
54
|
+
if is_int:
|
55
|
+
raise ValueError(
|
56
|
+
"Integer pixel values out of acceptable range [0, 255]. "
|
57
|
+
f"Found minimum value {x.min()} and maximum value {x.max()}. "
|
58
|
+
"Ensure all pixel values are within the specified range."
|
59
|
+
)
|
60
|
+
else:
|
61
|
+
warnings.warn(
|
62
|
+
"Float pixel values out of acceptable range [0.0, 1.0]. "
|
63
|
+
f"Found minimum value {x.min()} and maximum value {x.max()}. "
|
64
|
+
"Rescaling values to [0.0, 1.0] with min/max scaler.",
|
65
|
+
stacklevel=2,
|
66
|
+
)
|
67
|
+
# Min-max scaling
|
68
|
+
x = (x - x.min()) / (x.max() - x.min())
|
69
|
+
|
70
|
+
# float or bool
|
71
|
+
if not is_int:
|
72
|
+
x = x * 255
|
73
|
+
|
74
|
+
return x.astype(np.uint8)
|
75
|
+
|
76
|
+
# Ref.: https://numpy.org/doc/stable/reference/generated/numpy.dtype.kind.html#numpy-dtype-kind
|
77
|
+
valid_data_types = {
|
78
|
+
"b": "bool",
|
79
|
+
"i": "signed integer",
|
80
|
+
"u": "unsigned integer",
|
81
|
+
"f": "floating",
|
82
|
+
}
|
83
|
+
|
84
|
+
if image.dtype.kind not in valid_data_types:
|
85
|
+
raise TypeError(
|
86
|
+
f"Invalid array data type: '{image.dtype}'. "
|
87
|
+
f"Must be one of {list(valid_data_types.values())}"
|
88
|
+
)
|
89
|
+
|
90
|
+
if image.ndim not in [2, 3]:
|
91
|
+
raise ValueError(f"`image` must be a 2D or 3D array but got image shape: {image.shape}")
|
92
|
+
|
93
|
+
if (image.ndim == 3) and (image.shape[2] not in [1, 3, 4]):
|
94
|
+
raise ValueError(f"Invalid channel length: {image.shape[2]}. Must be one of [1, 3, 4]")
|
95
|
+
|
96
|
+
# squeeze a 3D grayscale image since `Image.fromarray` doesn't accept it.
|
97
|
+
if image.ndim == 3 and image.shape[2] == 1:
|
98
|
+
image = image[:, :, 0]
|
99
|
+
|
100
|
+
image = _normalize_to_uint8(image)
|
101
|
+
return Image.fromarray(image)
|
102
|
+
|
103
|
+
|
104
|
+
# MLflow media object: Image
|
105
|
+
class Image:
|
106
|
+
"""
|
107
|
+
`mlflow.Image` is an image media object that provides a lightweight option
|
108
|
+
for handling images in MLflow.
|
109
|
+
The image can be a numpy array, a PIL image, or a file path to an image. The image is
|
110
|
+
stored as a PIL image and can be logged to MLflow using `mlflow.log_image` or
|
111
|
+
`mlflow.log_table`.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
image: Image can be a numpy array, a PIL image, or a file path to an image.
|
115
|
+
|
116
|
+
.. code-block:: python
|
117
|
+
:caption: Example
|
118
|
+
|
119
|
+
import mlflow
|
120
|
+
import numpy as np
|
121
|
+
from PIL import Image
|
122
|
+
|
123
|
+
# Create an image as a numpy array
|
124
|
+
image = np.zeros((100, 100, 3), dtype=np.uint8)
|
125
|
+
image[:, :50] = [255, 128, 0]
|
126
|
+
# Create an Image object
|
127
|
+
image_obj = mlflow.Image(image)
|
128
|
+
# Convert the Image object to a list of pixel values
|
129
|
+
pixel_values = image_obj.to_list()
|
130
|
+
"""
|
131
|
+
|
132
|
+
def __init__(self, image: Union["numpy.ndarray", "PIL.Image.Image", str, list[Any]]):
|
133
|
+
import numpy as np
|
134
|
+
|
135
|
+
try:
|
136
|
+
from PIL import Image
|
137
|
+
except ImportError as exc:
|
138
|
+
raise ImportError(
|
139
|
+
"`mlflow.Image` requires Pillow to serialize a numpy array as an image. "
|
140
|
+
"Please install it via: `pip install Pillow`."
|
141
|
+
) from exc
|
142
|
+
|
143
|
+
if isinstance(image, str):
|
144
|
+
self.image = Image.open(image)
|
145
|
+
elif isinstance(image, (list, np.ndarray)):
|
146
|
+
self.image = convert_to_pil_image(np.array(image))
|
147
|
+
elif isinstance(image, Image.Image):
|
148
|
+
self.image = image
|
149
|
+
else:
|
150
|
+
raise TypeError(
|
151
|
+
f"Unsupported image object type: {type(image)}. "
|
152
|
+
"`image` must be one of numpy.ndarray, "
|
153
|
+
"PIL.Image.Image, or a filepath to an image."
|
154
|
+
)
|
155
|
+
self.size = self.image.size
|
156
|
+
|
157
|
+
def to_list(self):
|
158
|
+
"""
|
159
|
+
Convert the image to a list of pixel values.
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
List of pixel values.
|
163
|
+
"""
|
164
|
+
return list(self.image.getdata())
|
165
|
+
|
166
|
+
def to_array(self):
|
167
|
+
"""
|
168
|
+
Convert the image to a numpy array.
|
169
|
+
|
170
|
+
Returns:
|
171
|
+
Numpy array of pixel values.
|
172
|
+
"""
|
173
|
+
import numpy as np
|
174
|
+
|
175
|
+
return np.array(self.image)
|
176
|
+
|
177
|
+
def to_pil(self):
|
178
|
+
"""
|
179
|
+
Convert the image to a PIL image.
|
180
|
+
|
181
|
+
Returns:
|
182
|
+
PIL image.
|
183
|
+
"""
|
184
|
+
return self.image
|
185
|
+
|
186
|
+
def save(self, path: str):
|
187
|
+
"""
|
188
|
+
Save the image to a file.
|
189
|
+
|
190
|
+
Args:
|
191
|
+
path: File path to save the image.
|
192
|
+
"""
|
193
|
+
self.image.save(path)
|
194
|
+
|
195
|
+
def resize(self, size: tuple[int, int]):
|
196
|
+
"""
|
197
|
+
Resize the image to the specified size.
|
198
|
+
|
199
|
+
Args:
|
200
|
+
size: Size to resize the image to.
|
201
|
+
|
202
|
+
Returns:
|
203
|
+
A copy of the resized image object.
|
204
|
+
"""
|
205
|
+
image = self.image.resize(size)
|
206
|
+
return Image(image)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import warnings
|
2
|
+
from abc import ABCMeta
|
3
|
+
|
4
|
+
from mlflow.exceptions import MlflowException
|
5
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
6
|
+
from mlflow.utils.plugins import get_entry_points
|
7
|
+
from mlflow.utils.uri import get_uri_scheme
|
8
|
+
|
9
|
+
|
10
|
+
class UnsupportedModelRegistryStoreURIException(MlflowException):
|
11
|
+
"""Exception thrown when building a model registry store with an unsupported URI"""
|
12
|
+
|
13
|
+
def __init__(self, unsupported_uri, supported_uri_schemes):
|
14
|
+
message = (
|
15
|
+
" Model registry functionality is unavailable; got unsupported URI"
|
16
|
+
f" '{unsupported_uri}' for model registry data storage. Supported URI schemes are:"
|
17
|
+
f" {supported_uri_schemes}."
|
18
|
+
" See https://www.mlflow.org/docs/latest/tracking.html#storage for how to run"
|
19
|
+
" an MLflow server against one of the supported backend storage locations."
|
20
|
+
)
|
21
|
+
super().__init__(message, error_code=INVALID_PARAMETER_VALUE)
|
22
|
+
self.supported_uri_schemes = supported_uri_schemes
|
23
|
+
|
24
|
+
|
25
|
+
class StoreRegistry:
|
26
|
+
"""
|
27
|
+
Abstract class defining a scheme-based registry for store implementations.
|
28
|
+
|
29
|
+
This class allows the registration of a function or class to provide an
|
30
|
+
implementation for a given scheme of `store_uri` through the `register`
|
31
|
+
methods. Implementations declared though the entrypoints can be automatically
|
32
|
+
registered through the `register_entrypoints` method.
|
33
|
+
|
34
|
+
When instantiating a store through the `get_store` method, the scheme of
|
35
|
+
the store URI provided (or inferred from environment) will be used to
|
36
|
+
select which implementation to instantiate, which will be called with same
|
37
|
+
arguments passed to the `get_store` method.
|
38
|
+
"""
|
39
|
+
|
40
|
+
__metaclass__ = ABCMeta
|
41
|
+
|
42
|
+
def __init__(self, group_name):
|
43
|
+
self._registry = {}
|
44
|
+
self.group_name = group_name
|
45
|
+
|
46
|
+
def register(self, scheme, store_builder):
|
47
|
+
self._registry[scheme] = store_builder
|
48
|
+
|
49
|
+
def register_entrypoints(self):
|
50
|
+
"""Register tracking stores provided by other packages"""
|
51
|
+
for entrypoint in get_entry_points(self.group_name):
|
52
|
+
try:
|
53
|
+
self.register(entrypoint.name, entrypoint.load())
|
54
|
+
except (AttributeError, ImportError) as exc:
|
55
|
+
warnings.warn(
|
56
|
+
'Failure attempting to register store for scheme "{}": {}'.format(
|
57
|
+
entrypoint.name, str(exc)
|
58
|
+
),
|
59
|
+
stacklevel=2,
|
60
|
+
)
|
61
|
+
|
62
|
+
def get_store_builder(self, store_uri):
|
63
|
+
"""Get a store from the registry based on the scheme of store_uri
|
64
|
+
|
65
|
+
Args:
|
66
|
+
store_uri: The store URI. If None, it will be inferred from the environment. This
|
67
|
+
URI is used to select which tracking store implementation to instantiate
|
68
|
+
and is passed to the constructor of the implementation.
|
69
|
+
|
70
|
+
Returns:
|
71
|
+
A function that returns an instance of
|
72
|
+
``mlflow.store.{tracking|model_registry}.AbstractStore`` that fulfills the store
|
73
|
+
URI requirements.
|
74
|
+
"""
|
75
|
+
scheme = (
|
76
|
+
store_uri
|
77
|
+
if store_uri in {"databricks", "databricks-uc", "uc"}
|
78
|
+
else get_uri_scheme(store_uri)
|
79
|
+
)
|
80
|
+
try:
|
81
|
+
store_builder = self._registry[scheme]
|
82
|
+
except KeyError:
|
83
|
+
raise UnsupportedModelRegistryStoreURIException(
|
84
|
+
unsupported_uri=store_uri, supported_uri_schemes=list(self._registry.keys())
|
85
|
+
)
|
86
|
+
return store_builder
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from abc import ABC, abstractmethod
|
2
|
+
|
3
|
+
from mlflow.utils.annotations import developer_stable
|
4
|
+
|
5
|
+
|
6
|
+
@developer_stable
|
7
|
+
class RequestAuthProvider(ABC):
|
8
|
+
"""
|
9
|
+
Abstract base class for specifying custom request auth to add to outgoing requests
|
10
|
+
|
11
|
+
When a request is sent, MLflow will iterate through all registered RequestAuthProviders.
|
12
|
+
For each provider where ``get_name`` matches auth provider name, MLflow calls the ``get_auth``
|
13
|
+
method on the provider to compute request auth.
|
14
|
+
|
15
|
+
The resulting request auth will then be added and sent with the request.
|
16
|
+
"""
|
17
|
+
|
18
|
+
@abstractmethod
|
19
|
+
def get_name(self):
|
20
|
+
"""Get the name of the request auth provider.
|
21
|
+
|
22
|
+
Returns:
|
23
|
+
str of request auth provider name.
|
24
|
+
"""
|
25
|
+
|
26
|
+
@abstractmethod
|
27
|
+
def get_auth(self):
|
28
|
+
"""
|
29
|
+
Generate request auth object (e.g., `requests.auth import HTTPBasicAuth`). See
|
30
|
+
https://requests.readthedocs.io/en/latest/user/authentication/ for more details.
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
request auth object.
|
34
|
+
"""
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import warnings
|
2
|
+
|
3
|
+
from mlflow.utils.plugins import get_entry_points
|
4
|
+
|
5
|
+
REQUEST_AUTH_PROVIDER_ENTRYPOINT = "mlflow.request_auth_provider"
|
6
|
+
|
7
|
+
|
8
|
+
class RequestAuthProviderRegistry:
|
9
|
+
def __init__(self):
|
10
|
+
self._registry = []
|
11
|
+
|
12
|
+
def register(self, request_auth_provider):
|
13
|
+
self._registry.append(request_auth_provider())
|
14
|
+
|
15
|
+
def register_entrypoints(self):
|
16
|
+
for entrypoint in get_entry_points(REQUEST_AUTH_PROVIDER_ENTRYPOINT):
|
17
|
+
try:
|
18
|
+
self.register(entrypoint.load())
|
19
|
+
except (AttributeError, ImportError) as exc:
|
20
|
+
warnings.warn(
|
21
|
+
'Failure attempting to register request auth provider "{}": {}'.format(
|
22
|
+
entrypoint.name, str(exc)
|
23
|
+
),
|
24
|
+
stacklevel=2,
|
25
|
+
)
|
26
|
+
|
27
|
+
def __iter__(self):
|
28
|
+
return iter(self._registry)
|
29
|
+
|
30
|
+
|
31
|
+
_request_auth_provider_registry = RequestAuthProviderRegistry()
|
32
|
+
_request_auth_provider_registry.register_entrypoints()
|
33
|
+
|
34
|
+
|
35
|
+
def fetch_auth(request_auth):
|
36
|
+
"""
|
37
|
+
Find the request auth from registered providers based on the auth provider's name.
|
38
|
+
The auth provider's name can be provided through environment variable `MLFLOW_TRACKING_AUTH`.
|
39
|
+
|
40
|
+
This function iterates through all request auth providers in the registry. Additional context
|
41
|
+
providers can be registered as described in
|
42
|
+
:py:class:`mlflow.tracking.request_auth.RequestAuthProvider`.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
request_auth: The name of request auth provider.
|
46
|
+
|
47
|
+
Returns:
|
48
|
+
The auth object.
|
49
|
+
"""
|
50
|
+
|
51
|
+
for auth_provider in _request_auth_provider_registry:
|
52
|
+
if auth_provider.get_name() == request_auth:
|
53
|
+
return auth_provider.get_auth()
|
54
|
+
|
55
|
+
warnings.warn(
|
56
|
+
f"Could not find any registered plugin for {request_auth}. "
|
57
|
+
"No authentication header will be added. Please check your "
|
58
|
+
"provider documentation for installing the right plugin or "
|
59
|
+
"correct provider name."
|
60
|
+
)
|
File without changes
|
@@ -0,0 +1,36 @@
|
|
1
|
+
from abc import ABCMeta, abstractmethod
|
2
|
+
|
3
|
+
from mlflow.utils.annotations import developer_stable
|
4
|
+
|
5
|
+
|
6
|
+
@developer_stable
|
7
|
+
class RequestHeaderProvider:
|
8
|
+
"""
|
9
|
+
Abstract base class for specifying custom request headers to add to outgoing requests
|
10
|
+
(e.g. request headers specifying the environment from which mlflow is running).
|
11
|
+
|
12
|
+
When a request is sent, MLflow will iterate through all registered RequestHeaderProviders.
|
13
|
+
For each provider where ``in_context`` returns ``True``, MLflow calls the ``request_headers``
|
14
|
+
method on the provider to compute request headers.
|
15
|
+
|
16
|
+
All resulting request headers will then be merged together and sent with the request.
|
17
|
+
"""
|
18
|
+
|
19
|
+
__metaclass__ = ABCMeta
|
20
|
+
|
21
|
+
@abstractmethod
|
22
|
+
def in_context(self):
|
23
|
+
"""Determine if MLflow is running in this context.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
bool indicating if in this context.
|
27
|
+
|
28
|
+
"""
|
29
|
+
|
30
|
+
@abstractmethod
|
31
|
+
def request_headers(self):
|
32
|
+
"""Generate context-specific request headers.
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
dict of request headers.
|
36
|
+
"""
|
@@ -0,0 +1,38 @@
|
|
1
|
+
from mlflow.tracking.request_header.abstract_request_header_provider import RequestHeaderProvider
|
2
|
+
from mlflow.utils import databricks_utils
|
3
|
+
|
4
|
+
|
5
|
+
class DatabricksRequestHeaderProvider(RequestHeaderProvider):
|
6
|
+
"""
|
7
|
+
Provides request headers indicating the type of Databricks environment from which a request
|
8
|
+
was made.
|
9
|
+
"""
|
10
|
+
|
11
|
+
def in_context(self):
|
12
|
+
return (
|
13
|
+
databricks_utils.is_in_cluster()
|
14
|
+
or databricks_utils.is_in_databricks_notebook()
|
15
|
+
or databricks_utils.is_in_databricks_job()
|
16
|
+
)
|
17
|
+
|
18
|
+
def request_headers(self):
|
19
|
+
request_headers = {}
|
20
|
+
if databricks_utils.is_in_databricks_notebook():
|
21
|
+
request_headers["notebook_id"] = databricks_utils.get_notebook_id()
|
22
|
+
if databricks_utils.is_in_databricks_job():
|
23
|
+
request_headers["job_id"] = databricks_utils.get_job_id()
|
24
|
+
request_headers["job_run_id"] = databricks_utils.get_job_run_id()
|
25
|
+
request_headers["job_type"] = databricks_utils.get_job_type()
|
26
|
+
if databricks_utils.is_in_cluster():
|
27
|
+
request_headers["cluster_id"] = databricks_utils.get_cluster_id()
|
28
|
+
command_run_id = databricks_utils.get_command_run_id()
|
29
|
+
if command_run_id is not None:
|
30
|
+
request_headers["command_run_id"] = command_run_id
|
31
|
+
workload_id = databricks_utils.get_workload_id()
|
32
|
+
workload_class = databricks_utils.get_workload_class()
|
33
|
+
if workload_id is not None:
|
34
|
+
request_headers["workload_id"] = workload_id
|
35
|
+
if workload_class is not None:
|
36
|
+
request_headers["workload_class"] = workload_class
|
37
|
+
|
38
|
+
return request_headers
|
@@ -0,0 +1,17 @@
|
|
1
|
+
from mlflow import __version__
|
2
|
+
from mlflow.tracking.request_header.abstract_request_header_provider import RequestHeaderProvider
|
3
|
+
|
4
|
+
_USER_AGENT = "User-Agent"
|
5
|
+
_DEFAULT_HEADERS = {_USER_AGENT: f"mlflow-python-client/{__version__}"}
|
6
|
+
|
7
|
+
|
8
|
+
class DefaultRequestHeaderProvider(RequestHeaderProvider):
|
9
|
+
"""
|
10
|
+
Provides default request headers for outgoing request.
|
11
|
+
"""
|
12
|
+
|
13
|
+
def in_context(self):
|
14
|
+
return True
|
15
|
+
|
16
|
+
def request_headers(self):
|
17
|
+
return dict(**_DEFAULT_HEADERS)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import logging
|
2
|
+
import warnings
|
3
|
+
|
4
|
+
from mlflow.tracking.request_header.databricks_request_header_provider import (
|
5
|
+
DatabricksRequestHeaderProvider,
|
6
|
+
)
|
7
|
+
from mlflow.tracking.request_header.default_request_header_provider import (
|
8
|
+
DefaultRequestHeaderProvider,
|
9
|
+
)
|
10
|
+
from mlflow.utils.plugins import get_entry_points
|
11
|
+
|
12
|
+
_logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
class RequestHeaderProviderRegistry:
|
16
|
+
def __init__(self):
|
17
|
+
self._registry = []
|
18
|
+
|
19
|
+
def register(self, request_header_provider):
|
20
|
+
self._registry.append(request_header_provider())
|
21
|
+
|
22
|
+
def register_entrypoints(self):
|
23
|
+
"""Register tracking stores provided by other packages"""
|
24
|
+
for entrypoint in get_entry_points("mlflow.request_header_provider"):
|
25
|
+
try:
|
26
|
+
self.register(entrypoint.load())
|
27
|
+
except (AttributeError, ImportError) as exc:
|
28
|
+
warnings.warn(
|
29
|
+
'Failure attempting to register request header provider "{}": {}'.format(
|
30
|
+
entrypoint.name, str(exc)
|
31
|
+
),
|
32
|
+
stacklevel=2,
|
33
|
+
)
|
34
|
+
|
35
|
+
def __iter__(self):
|
36
|
+
return iter(self._registry)
|
37
|
+
|
38
|
+
|
39
|
+
_request_header_provider_registry = RequestHeaderProviderRegistry()
|
40
|
+
_request_header_provider_registry.register(DatabricksRequestHeaderProvider)
|
41
|
+
_request_header_provider_registry.register(DefaultRequestHeaderProvider)
|
42
|
+
|
43
|
+
_request_header_provider_registry.register_entrypoints()
|
44
|
+
|
45
|
+
|
46
|
+
def resolve_request_headers(request_headers=None):
|
47
|
+
"""Generate a set of request headers from registered providers.
|
48
|
+
|
49
|
+
Request headers are resolved in the order that providers are registered. Argument headers are
|
50
|
+
applied last. This function iterates through all request header providers in the registry.
|
51
|
+
Additional context providers can be registered as described in
|
52
|
+
:py:class:`mlflow.tracking.request_header.RequestHeaderProvider`.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
request_headers: A dictionary of request headers to override. If specified, headers passed
|
56
|
+
in this argument will override those inferred from the context.
|
57
|
+
|
58
|
+
Returns:
|
59
|
+
A dictionary of resolved headers.
|
60
|
+
"""
|
61
|
+
|
62
|
+
all_request_headers = {}
|
63
|
+
for provider in _request_header_provider_registry:
|
64
|
+
try:
|
65
|
+
if provider.in_context():
|
66
|
+
# all_request_headers.update(provider.request_headers())
|
67
|
+
for header, value in provider.request_headers().items():
|
68
|
+
all_request_headers[header] = (
|
69
|
+
f"{all_request_headers[header]} {value}"
|
70
|
+
if header in all_request_headers
|
71
|
+
else value
|
72
|
+
)
|
73
|
+
except Exception as e:
|
74
|
+
_logger.warning("Encountered unexpected error during resolving request headers: %s", e)
|
75
|
+
|
76
|
+
if request_headers is not None:
|
77
|
+
all_request_headers.update(request_headers)
|
78
|
+
|
79
|
+
return all_request_headers
|