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,294 @@
|
|
1
|
+
"""
|
2
|
+
Initialize the environment and start model serving in a Docker container.
|
3
|
+
|
4
|
+
To be executed only during the model deployment.
|
5
|
+
|
6
|
+
"""
|
7
|
+
|
8
|
+
import logging
|
9
|
+
import multiprocessing
|
10
|
+
import os
|
11
|
+
import shutil
|
12
|
+
import signal
|
13
|
+
import sys
|
14
|
+
from pathlib import Path
|
15
|
+
from subprocess import Popen, check_call
|
16
|
+
|
17
|
+
import mlflow
|
18
|
+
import mlflow.version
|
19
|
+
from mlflow import pyfunc
|
20
|
+
from mlflow.environment_variables import MLFLOW_DISABLE_ENV_CREATION
|
21
|
+
from mlflow.models import Model
|
22
|
+
from mlflow.models.model import MLMODEL_FILE_NAME
|
23
|
+
from mlflow.pyfunc import _extract_conda_env, mlserver, scoring_server
|
24
|
+
from mlflow.store.artifact.models_artifact_repo import REGISTERED_MODEL_META_FILE_NAME
|
25
|
+
from mlflow.utils import env_manager as em
|
26
|
+
from mlflow.utils.environment import _PythonEnv
|
27
|
+
from mlflow.utils.virtualenv import _get_or_create_virtualenv
|
28
|
+
from mlflow.utils.yaml_utils import read_yaml
|
29
|
+
from mlflow.version import VERSION as MLFLOW_VERSION
|
30
|
+
|
31
|
+
MODEL_PATH = "/opt/ml/model"
|
32
|
+
|
33
|
+
|
34
|
+
DEFAULT_SAGEMAKER_SERVER_PORT = 8080
|
35
|
+
DEFAULT_INFERENCE_SERVER_PORT = 8000
|
36
|
+
DEFAULT_NGINX_SERVER_PORT = 8080
|
37
|
+
DEFAULT_MLSERVER_PORT = 8080
|
38
|
+
|
39
|
+
SUPPORTED_FLAVORS = [pyfunc.FLAVOR_NAME]
|
40
|
+
|
41
|
+
DISABLE_NGINX = "DISABLE_NGINX"
|
42
|
+
ENABLE_MLSERVER = "ENABLE_MLSERVER"
|
43
|
+
|
44
|
+
SERVING_ENVIRONMENT = "SERVING_ENVIRONMENT"
|
45
|
+
|
46
|
+
|
47
|
+
_logger = logging.getLogger(__name__)
|
48
|
+
|
49
|
+
|
50
|
+
def _init(cmd, env_manager): # noqa: D417
|
51
|
+
"""
|
52
|
+
Initialize the container and execute command.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
cmd: Command param passed by Sagemaker. Can be "serve" or "train" (unimplemented).
|
56
|
+
"""
|
57
|
+
if cmd == "serve":
|
58
|
+
_serve(env_manager)
|
59
|
+
elif cmd == "train":
|
60
|
+
_train()
|
61
|
+
else:
|
62
|
+
raise Exception(f"Unrecognized command {cmd}, full args = {sys.argv}")
|
63
|
+
|
64
|
+
|
65
|
+
def _serve(env_manager):
|
66
|
+
"""
|
67
|
+
Serve the model.
|
68
|
+
|
69
|
+
Read the MLmodel config, initialize the Conda environment if needed and start python server.
|
70
|
+
"""
|
71
|
+
model_config_path = os.path.join(MODEL_PATH, MLMODEL_FILE_NAME)
|
72
|
+
m = Model.load(model_config_path)
|
73
|
+
|
74
|
+
if pyfunc.FLAVOR_NAME in m.flavors:
|
75
|
+
_serve_pyfunc(m, env_manager)
|
76
|
+
else:
|
77
|
+
raise Exception("This container only supports models with the PyFunc flavors.")
|
78
|
+
|
79
|
+
|
80
|
+
def _install_pyfunc_deps(
|
81
|
+
model_path=None, install_mlflow=False, enable_mlserver=False, env_manager=em.VIRTUALENV
|
82
|
+
):
|
83
|
+
"""
|
84
|
+
Creates a conda env for serving the model at the specified path and installs almost all serving
|
85
|
+
dependencies into the environment - MLflow is not installed as it's not available via conda.
|
86
|
+
"""
|
87
|
+
activate_cmd = _install_model_dependencies_to_env(model_path, env_manager) if model_path else []
|
88
|
+
|
89
|
+
# NB: install gunicorn[gevent] from pip rather than from conda because gunicorn is already
|
90
|
+
# dependency of mlflow on pip and we expect mlflow to be part of the environment.
|
91
|
+
server_deps = ["gunicorn[gevent]"]
|
92
|
+
if enable_mlserver:
|
93
|
+
server_deps = [
|
94
|
+
"'mlserver>=1.2.0,!=1.3.1,<1.4.0'",
|
95
|
+
"'mlserver-mlflow>=1.2.0,!=1.3.1,<1.4.0'",
|
96
|
+
]
|
97
|
+
|
98
|
+
install_server_deps = [f"pip install {' '.join(server_deps)}"]
|
99
|
+
if Popen(["bash", "-c", " && ".join(activate_cmd + install_server_deps)]).wait() != 0:
|
100
|
+
raise Exception("Failed to install serving dependencies into the model environment.")
|
101
|
+
|
102
|
+
# NB: If we don't use virtualenv or conda env, we don't need to install mlflow here as
|
103
|
+
# it's already installed in the container.
|
104
|
+
if len(activate_cmd):
|
105
|
+
if _container_includes_mlflow_source():
|
106
|
+
# If the MLflow source code is copied to the container,
|
107
|
+
# we always need to run `pip install /opt/mlflow` otherwise
|
108
|
+
# the MLflow dependencies are not installed.
|
109
|
+
install_mlflow_cmd = ["pip install /opt/mlflow/."]
|
110
|
+
elif install_mlflow:
|
111
|
+
install_mlflow_cmd = [f"pip install mlflow=={MLFLOW_VERSION}"]
|
112
|
+
else:
|
113
|
+
install_mlflow_cmd = []
|
114
|
+
|
115
|
+
if install_mlflow_cmd:
|
116
|
+
if Popen(["bash", "-c", " && ".join(activate_cmd + install_mlflow_cmd)]).wait() != 0:
|
117
|
+
raise Exception("Failed to install mlflow into the model environment.")
|
118
|
+
return activate_cmd
|
119
|
+
|
120
|
+
|
121
|
+
def _install_model_dependencies_to_env(model_path, env_manager) -> list[str]:
|
122
|
+
""":
|
123
|
+
Installs model dependencies to the specified environment, which can be either a local
|
124
|
+
environment, a conda environment, or a virtualenv.
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
Empty list if local environment, otherwise a list of bash commands to activate the
|
128
|
+
virtualenv or conda environment.
|
129
|
+
"""
|
130
|
+
model_config_path = os.path.join(model_path, MLMODEL_FILE_NAME)
|
131
|
+
model = Model.load(model_config_path)
|
132
|
+
|
133
|
+
conf = model.flavors.get(pyfunc.FLAVOR_NAME, {})
|
134
|
+
if pyfunc.ENV not in conf:
|
135
|
+
return []
|
136
|
+
env_conf = conf[mlflow.pyfunc.ENV]
|
137
|
+
|
138
|
+
if env_manager == em.LOCAL:
|
139
|
+
# Install pip dependencies directly into the local environment
|
140
|
+
python_env_config_path = os.path.join(model_path, env_conf[em.VIRTUALENV])
|
141
|
+
python_env = _PythonEnv.from_yaml(python_env_config_path)
|
142
|
+
deps = " ".join(python_env.build_dependencies + python_env.dependencies)
|
143
|
+
deps = deps.replace("requirements.txt", os.path.join(model_path, "requirements.txt"))
|
144
|
+
if Popen(["bash", "-c", f"python -m pip install {deps}"]).wait() != 0:
|
145
|
+
raise Exception("Failed to install model dependencies.")
|
146
|
+
return []
|
147
|
+
|
148
|
+
_logger.info("creating and activating custom environment")
|
149
|
+
|
150
|
+
env = _extract_conda_env(env_conf)
|
151
|
+
env_path_dst = os.path.join("/opt/mlflow/", env)
|
152
|
+
env_path_dst_dir = os.path.dirname(env_path_dst)
|
153
|
+
if not os.path.exists(env_path_dst_dir):
|
154
|
+
os.makedirs(env_path_dst_dir)
|
155
|
+
shutil.copy2(os.path.join(MODEL_PATH, env), env_path_dst)
|
156
|
+
|
157
|
+
if env_manager == em.CONDA:
|
158
|
+
conda_create_model_env = f"conda env create -n custom_env -f {env_path_dst}"
|
159
|
+
if Popen(["bash", "-c", conda_create_model_env]).wait() != 0:
|
160
|
+
raise Exception("Failed to create model environment.")
|
161
|
+
activate_cmd = ["source /miniconda/bin/activate custom_env"]
|
162
|
+
|
163
|
+
elif env_manager == em.VIRTUALENV:
|
164
|
+
env_activate_cmd = _get_or_create_virtualenv(model_path, env_manager=env_manager)
|
165
|
+
path = env_activate_cmd.split(" ")[-1]
|
166
|
+
os.symlink(path, "/opt/activate")
|
167
|
+
activate_cmd = [env_activate_cmd]
|
168
|
+
|
169
|
+
return activate_cmd
|
170
|
+
|
171
|
+
|
172
|
+
def _serve_pyfunc(model, env_manager):
|
173
|
+
# option to disable manually nginx. The default behavior is to enable nginx.
|
174
|
+
disable_nginx = os.getenv(DISABLE_NGINX, "false").lower() == "true"
|
175
|
+
enable_mlserver = os.getenv(ENABLE_MLSERVER, "false").lower() == "true"
|
176
|
+
disable_env_creation = MLFLOW_DISABLE_ENV_CREATION.get()
|
177
|
+
|
178
|
+
conf = model.flavors[pyfunc.FLAVOR_NAME]
|
179
|
+
bash_cmds = []
|
180
|
+
if pyfunc.ENV in conf:
|
181
|
+
# NB: MLFLOW_DISABLE_ENV_CREATION is False only for SageMaker deployment, where the model
|
182
|
+
# files are loaded into the container at runtime rather than build time. In this case,
|
183
|
+
# we need to create a virtual environment and install the model dependencies into it when
|
184
|
+
# starting the container.
|
185
|
+
if not disable_env_creation:
|
186
|
+
_install_pyfunc_deps(
|
187
|
+
MODEL_PATH,
|
188
|
+
install_mlflow=True,
|
189
|
+
enable_mlserver=enable_mlserver,
|
190
|
+
env_manager=env_manager,
|
191
|
+
)
|
192
|
+
if env_manager == em.CONDA:
|
193
|
+
bash_cmds.append("source /miniconda/bin/activate custom_env")
|
194
|
+
elif env_manager == em.VIRTUALENV:
|
195
|
+
bash_cmds.append("source /opt/activate")
|
196
|
+
procs = []
|
197
|
+
|
198
|
+
start_nginx = True
|
199
|
+
if disable_nginx or enable_mlserver:
|
200
|
+
start_nginx = False
|
201
|
+
|
202
|
+
if start_nginx:
|
203
|
+
nginx_conf = Path(mlflow.models.__file__).parent.joinpath(
|
204
|
+
"container", "scoring_server", "nginx.conf"
|
205
|
+
)
|
206
|
+
|
207
|
+
nginx = Popen(["nginx", "-c", nginx_conf]) if start_nginx else None
|
208
|
+
|
209
|
+
# link the log streams to stdout/err so they will be logged to the container logs.
|
210
|
+
# Default behavior is to do the redirection unless explicitly specified
|
211
|
+
# by environment variable.
|
212
|
+
check_call(["ln", "-sf", "/dev/stdout", "/var/log/nginx/access.log"])
|
213
|
+
check_call(["ln", "-sf", "/dev/stderr", "/var/log/nginx/error.log"])
|
214
|
+
|
215
|
+
procs.append(nginx)
|
216
|
+
|
217
|
+
cpu_count = multiprocessing.cpu_count()
|
218
|
+
inference_server_kwargs = {}
|
219
|
+
if enable_mlserver:
|
220
|
+
inference_server = mlserver
|
221
|
+
# Allows users to choose the number of workers using MLServer var env settings.
|
222
|
+
# Default to cpu count
|
223
|
+
nworkers = int(os.getenv("MLSERVER_INFER_WORKERS", cpu_count))
|
224
|
+
# Since MLServer will run without NGINX, expose the server in the `8080`
|
225
|
+
# port, which is the assumed "public" port.
|
226
|
+
port = DEFAULT_MLSERVER_PORT
|
227
|
+
|
228
|
+
model_meta = _read_registered_model_meta(MODEL_PATH)
|
229
|
+
model_dict = model.to_dict()
|
230
|
+
inference_server_kwargs = {
|
231
|
+
"model_name": model_meta.get("model_name"),
|
232
|
+
"model_version": model_meta.get(
|
233
|
+
"model_version", model_dict.get("run_id", model_dict.get("model_uuid"))
|
234
|
+
),
|
235
|
+
}
|
236
|
+
else:
|
237
|
+
inference_server = scoring_server
|
238
|
+
nworkers = int(os.getenv("MLFLOW_MODELS_WORKERS", cpu_count))
|
239
|
+
port = DEFAULT_INFERENCE_SERVER_PORT
|
240
|
+
|
241
|
+
cmd, cmd_env = inference_server.get_cmd(
|
242
|
+
model_uri=MODEL_PATH, nworkers=nworkers, port=port, **inference_server_kwargs
|
243
|
+
)
|
244
|
+
|
245
|
+
bash_cmds.append(cmd)
|
246
|
+
inference_server_process = Popen(["/bin/bash", "-c", " && ".join(bash_cmds)], env=cmd_env)
|
247
|
+
procs.append(inference_server_process)
|
248
|
+
|
249
|
+
signal.signal(signal.SIGTERM, lambda a, b: _sigterm_handler(pids=[p.pid for p in procs]))
|
250
|
+
# If either subprocess exits, so do we.
|
251
|
+
awaited_pids = _await_subprocess_exit_any(procs=procs)
|
252
|
+
_sigterm_handler(awaited_pids)
|
253
|
+
|
254
|
+
|
255
|
+
def _read_registered_model_meta(model_path):
|
256
|
+
model_meta = {}
|
257
|
+
if os.path.isfile(os.path.join(model_path, REGISTERED_MODEL_META_FILE_NAME)):
|
258
|
+
model_meta = read_yaml(model_path, REGISTERED_MODEL_META_FILE_NAME)
|
259
|
+
|
260
|
+
return model_meta
|
261
|
+
|
262
|
+
|
263
|
+
def _container_includes_mlflow_source():
|
264
|
+
return os.path.exists("/opt/mlflow/pyproject.toml")
|
265
|
+
|
266
|
+
|
267
|
+
def _train():
|
268
|
+
raise Exception("Train is not implemented.")
|
269
|
+
|
270
|
+
|
271
|
+
def _await_subprocess_exit_any(procs):
|
272
|
+
pids = [proc.pid for proc in procs]
|
273
|
+
while True:
|
274
|
+
pid, _ = os.wait()
|
275
|
+
if pid in pids:
|
276
|
+
break
|
277
|
+
return pids
|
278
|
+
|
279
|
+
|
280
|
+
def _sigterm_handler(pids):
|
281
|
+
"""
|
282
|
+
Cleanup when terminating.
|
283
|
+
|
284
|
+
Attempt to kill all launched processes and exit.
|
285
|
+
|
286
|
+
"""
|
287
|
+
_logger.info("Got sigterm signal, exiting.")
|
288
|
+
for pid in pids:
|
289
|
+
try:
|
290
|
+
os.kill(pid, signal.SIGTERM)
|
291
|
+
except OSError:
|
292
|
+
pass
|
293
|
+
|
294
|
+
sys.exit(0)
|
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
worker_processes 1;
|
2
|
+
daemon off; # Prevent forking
|
3
|
+
|
4
|
+
|
5
|
+
pid /tmp/nginx.pid;
|
6
|
+
error_log /var/log/nginx/error.log;
|
7
|
+
|
8
|
+
events {
|
9
|
+
# defaults
|
10
|
+
}
|
11
|
+
|
12
|
+
http {
|
13
|
+
include /etc/nginx/mime.types;
|
14
|
+
default_type application/octet-stream;
|
15
|
+
access_log /var/log/nginx/access.log combined;
|
16
|
+
|
17
|
+
upstream uvicorn {
|
18
|
+
server 127.0.0.1:8000;
|
19
|
+
}
|
20
|
+
|
21
|
+
server {
|
22
|
+
listen 8080 deferred;
|
23
|
+
client_max_body_size 5m;
|
24
|
+
|
25
|
+
keepalive_timeout 75;
|
26
|
+
|
27
|
+
location ~ ^/(ping|invocations) {
|
28
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
29
|
+
proxy_set_header Host $http_host;
|
30
|
+
proxy_redirect off;
|
31
|
+
proxy_pass http://uvicorn;
|
32
|
+
client_max_body_size 100m;
|
33
|
+
}
|
34
|
+
|
35
|
+
location / {
|
36
|
+
return 404 "{}";
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,287 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from abc import ABC, abstractmethod
|
4
|
+
from contextlib import contextmanager
|
5
|
+
from dataclasses import dataclass, field
|
6
|
+
from enum import Enum
|
7
|
+
from typing import TYPE_CHECKING, Any, Optional
|
8
|
+
|
9
|
+
from mlflow.utils.annotations import experimental
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from mlflow.models.model import Model
|
13
|
+
|
14
|
+
_logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class DependenciesSchemasType(Enum):
|
18
|
+
"""
|
19
|
+
Enum to define the different types of dependencies schemas for the model.
|
20
|
+
"""
|
21
|
+
|
22
|
+
RETRIEVERS = "retrievers"
|
23
|
+
|
24
|
+
|
25
|
+
@experimental(version="2.13.0")
|
26
|
+
def set_retriever_schema(
|
27
|
+
*,
|
28
|
+
primary_key: str,
|
29
|
+
text_column: str,
|
30
|
+
doc_uri: Optional[str] = None,
|
31
|
+
other_columns: Optional[list[str]] = None,
|
32
|
+
name: Optional[str] = "retriever",
|
33
|
+
):
|
34
|
+
"""
|
35
|
+
Specify the return schema of a retriever span within your agent or generative AI app code.
|
36
|
+
|
37
|
+
**Note**: MLflow recommends that your retriever return the default MLflow retriever output
|
38
|
+
schema described in https://mlflow.org/docs/latest/tracing/tracing-schema#retriever-spans,
|
39
|
+
in which case you do not need to call `set_retriever_schema`. APIs that read MLflow traces
|
40
|
+
and look for retriever spans, such as MLflow evaluation, will automatically detect retriever
|
41
|
+
spans that match MLflow's default retriever schema.
|
42
|
+
|
43
|
+
If your retriever does not return the default MLflow retriever output schema, call this API to
|
44
|
+
specify which fields in each retrieved document correspond to the page content, document
|
45
|
+
URI, document ID, etc. This enables downstream features like MLflow evaluation to properly
|
46
|
+
identify these fields. Note that `set_retriever_schema` assumes that your retriever span
|
47
|
+
returns a list of objects.
|
48
|
+
|
49
|
+
|
50
|
+
Args:
|
51
|
+
primary_key: The primary key of the retriever or vector index.
|
52
|
+
text_column: The name of the text column to use for the embeddings.
|
53
|
+
doc_uri: The name of the column that contains the document URI.
|
54
|
+
other_columns: A list of other columns that are part of the vector index
|
55
|
+
that need to be retrieved during trace logging.
|
56
|
+
name: The name of the retriever tool or vector store index.
|
57
|
+
|
58
|
+
.. code-block:: Python
|
59
|
+
:caption: Example
|
60
|
+
|
61
|
+
from mlflow.models import set_retriever_schema
|
62
|
+
|
63
|
+
# The following call sets the schema for a custom retriever that retrieves content from
|
64
|
+
# MLflow documentation, with an output schema like:
|
65
|
+
# [
|
66
|
+
# {
|
67
|
+
# 'document_id': '9a8292da3a9d4005a988bf0bfdd0024c',
|
68
|
+
# 'chunk_text': 'MLflow is an open-source platform, purpose-built to assist...',
|
69
|
+
# 'doc_uri': 'https://mlflow.org/docs/latest/index.html',
|
70
|
+
# 'title': 'MLflow: A Tool for Managing the Machine Learning Lifecycle'
|
71
|
+
# },
|
72
|
+
# {
|
73
|
+
# 'document_id': '7537fe93c97f4fdb9867412e9c1f9e5b',
|
74
|
+
# 'chunk_text': 'A great way to get started with MLflow is...',
|
75
|
+
# 'doc_uri': 'https://mlflow.org/docs/latest/getting-started/',
|
76
|
+
# 'title': 'Getting Started with MLflow'
|
77
|
+
# },
|
78
|
+
# ...
|
79
|
+
# ]
|
80
|
+
set_retriever_schema(
|
81
|
+
primary_key="chunk_id",
|
82
|
+
text_column="chunk_text",
|
83
|
+
doc_uri="doc_uri",
|
84
|
+
other_columns=["title"],
|
85
|
+
name="my_custom_retriever",
|
86
|
+
)
|
87
|
+
"""
|
88
|
+
retriever_schemas = globals().get(DependenciesSchemasType.RETRIEVERS.value, [])
|
89
|
+
|
90
|
+
# Check if a retriever schema with the same name already exists
|
91
|
+
existing_schema = next((schema for schema in retriever_schemas if schema["name"] == name), None)
|
92
|
+
|
93
|
+
if existing_schema is not None:
|
94
|
+
# Compare all relevant fields
|
95
|
+
if (
|
96
|
+
existing_schema["primary_key"] == primary_key
|
97
|
+
and existing_schema["text_column"] == text_column
|
98
|
+
and existing_schema["doc_uri"] == doc_uri
|
99
|
+
and existing_schema["other_columns"] == (other_columns or [])
|
100
|
+
):
|
101
|
+
# No difference, no need to warn or update
|
102
|
+
return
|
103
|
+
else:
|
104
|
+
# Differences found, issue a warning
|
105
|
+
_logger.warning(
|
106
|
+
f"A retriever schema with the name '{name}' already exists. "
|
107
|
+
"Overriding the existing schema."
|
108
|
+
)
|
109
|
+
# Override the fields of the existing schema
|
110
|
+
existing_schema["primary_key"] = primary_key
|
111
|
+
existing_schema["text_column"] = text_column
|
112
|
+
existing_schema["doc_uri"] = doc_uri
|
113
|
+
existing_schema["other_columns"] = other_columns or []
|
114
|
+
else:
|
115
|
+
retriever_schemas.append(
|
116
|
+
{
|
117
|
+
"primary_key": primary_key,
|
118
|
+
"text_column": text_column,
|
119
|
+
"doc_uri": doc_uri,
|
120
|
+
"other_columns": other_columns or [],
|
121
|
+
"name": name,
|
122
|
+
}
|
123
|
+
)
|
124
|
+
|
125
|
+
globals()[DependenciesSchemasType.RETRIEVERS.value] = retriever_schemas
|
126
|
+
|
127
|
+
|
128
|
+
def _get_retriever_schema():
|
129
|
+
"""
|
130
|
+
Get the vector search schema defined by the user.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
VectorSearchIndex: The vector search index schema.
|
134
|
+
"""
|
135
|
+
retriever_schemas = globals().get(DependenciesSchemasType.RETRIEVERS.value, [])
|
136
|
+
if not retriever_schemas:
|
137
|
+
return []
|
138
|
+
|
139
|
+
return [
|
140
|
+
RetrieverSchema(
|
141
|
+
name=retriever.get("name"),
|
142
|
+
primary_key=retriever.get("primary_key"),
|
143
|
+
text_column=retriever.get("text_column"),
|
144
|
+
doc_uri=retriever.get("doc_uri"),
|
145
|
+
other_columns=retriever.get("other_columns"),
|
146
|
+
)
|
147
|
+
for retriever in retriever_schemas
|
148
|
+
]
|
149
|
+
|
150
|
+
|
151
|
+
def _clear_retriever_schema():
|
152
|
+
"""
|
153
|
+
Clear the vector search schema defined by the user.
|
154
|
+
"""
|
155
|
+
globals().pop(DependenciesSchemasType.RETRIEVERS.value, None)
|
156
|
+
|
157
|
+
|
158
|
+
def _clear_dependencies_schemas():
|
159
|
+
"""
|
160
|
+
Clear all the dependencies schema defined by the user.
|
161
|
+
"""
|
162
|
+
# Clear the vector search schema
|
163
|
+
_clear_retriever_schema()
|
164
|
+
|
165
|
+
|
166
|
+
@contextmanager
|
167
|
+
def _get_dependencies_schemas():
|
168
|
+
dependencies_schemas = DependenciesSchemas(retriever_schemas=_get_retriever_schema())
|
169
|
+
try:
|
170
|
+
yield dependencies_schemas
|
171
|
+
finally:
|
172
|
+
_clear_dependencies_schemas()
|
173
|
+
|
174
|
+
|
175
|
+
def _get_dependencies_schema_from_model(model: "Model") -> Optional[dict[str, Any]]:
|
176
|
+
"""
|
177
|
+
Get the dependencies schema from the logged model metadata.
|
178
|
+
|
179
|
+
`dependencies_schemas` is a dictionary that defines the dependencies schemas, such as
|
180
|
+
the retriever schemas. This code is now only useful for Databricks integration.
|
181
|
+
"""
|
182
|
+
if model.metadata and "dependencies_schemas" in model.metadata:
|
183
|
+
dependencies_schemas = model.metadata["dependencies_schemas"]
|
184
|
+
return {
|
185
|
+
"dependencies_schemas": {
|
186
|
+
dependency: json.dumps(schema)
|
187
|
+
for dependency, schema in dependencies_schemas.items()
|
188
|
+
}
|
189
|
+
}
|
190
|
+
return None
|
191
|
+
|
192
|
+
|
193
|
+
@dataclass
|
194
|
+
class Schema(ABC):
|
195
|
+
"""
|
196
|
+
Base class for defining the resources needed to serve a model.
|
197
|
+
|
198
|
+
Args:
|
199
|
+
type (ResourceType): The type of the schema.
|
200
|
+
"""
|
201
|
+
|
202
|
+
type: DependenciesSchemasType
|
203
|
+
|
204
|
+
@abstractmethod
|
205
|
+
def to_dict(self):
|
206
|
+
"""
|
207
|
+
Convert the resource to a dictionary.
|
208
|
+
Subclasses must implement this method.
|
209
|
+
"""
|
210
|
+
|
211
|
+
@classmethod
|
212
|
+
@abstractmethod
|
213
|
+
def from_dict(cls, data: dict[str, str]):
|
214
|
+
"""
|
215
|
+
Convert the dictionary to a Resource.
|
216
|
+
Subclasses must implement this method.
|
217
|
+
"""
|
218
|
+
|
219
|
+
|
220
|
+
@dataclass
|
221
|
+
class RetrieverSchema(Schema):
|
222
|
+
"""
|
223
|
+
Define vector search index resource to serve a model.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
name (str): The name of the vector search index schema.
|
227
|
+
primary_key (str): The primary key for the index.
|
228
|
+
text_column (str): The main text column for the index.
|
229
|
+
doc_uri (Optional[str]): The document URI for the index.
|
230
|
+
other_columns (Optional[List[str]]): Additional columns in the index.
|
231
|
+
"""
|
232
|
+
|
233
|
+
def __init__(
|
234
|
+
self,
|
235
|
+
name: str,
|
236
|
+
primary_key: str,
|
237
|
+
text_column: str,
|
238
|
+
doc_uri: Optional[str] = None,
|
239
|
+
other_columns: Optional[list[str]] = None,
|
240
|
+
):
|
241
|
+
super().__init__(type=DependenciesSchemasType.RETRIEVERS)
|
242
|
+
self.name = name
|
243
|
+
self.primary_key = primary_key
|
244
|
+
self.text_column = text_column
|
245
|
+
self.doc_uri = doc_uri
|
246
|
+
self.other_columns = other_columns or []
|
247
|
+
|
248
|
+
def to_dict(self):
|
249
|
+
return {
|
250
|
+
self.type.value: [
|
251
|
+
{
|
252
|
+
"name": self.name,
|
253
|
+
"primary_key": self.primary_key,
|
254
|
+
"text_column": self.text_column,
|
255
|
+
"doc_uri": self.doc_uri,
|
256
|
+
"other_columns": self.other_columns,
|
257
|
+
}
|
258
|
+
]
|
259
|
+
}
|
260
|
+
|
261
|
+
@classmethod
|
262
|
+
def from_dict(cls, data: dict[str, str]):
|
263
|
+
return cls(
|
264
|
+
name=data["name"],
|
265
|
+
primary_key=data["primary_key"],
|
266
|
+
text_column=data["text_column"],
|
267
|
+
doc_uri=data.get("doc_uri"),
|
268
|
+
other_columns=data.get("other_columns", []),
|
269
|
+
)
|
270
|
+
|
271
|
+
|
272
|
+
@dataclass
|
273
|
+
class DependenciesSchemas:
|
274
|
+
retriever_schemas: list[RetrieverSchema] = field(default_factory=list)
|
275
|
+
|
276
|
+
def to_dict(self) -> dict[str, dict[DependenciesSchemasType, list[dict[str, Any]]]]:
|
277
|
+
if not self.retriever_schemas:
|
278
|
+
return None
|
279
|
+
|
280
|
+
return {
|
281
|
+
"dependencies_schemas": {
|
282
|
+
DependenciesSchemasType.RETRIEVERS.value: [
|
283
|
+
index.to_dict()[DependenciesSchemasType.RETRIEVERS.value][0]
|
284
|
+
for index in self.retriever_schemas
|
285
|
+
],
|
286
|
+
}
|
287
|
+
}
|