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,55 @@
|
|
1
|
+
from mlflow.llama_index.constant import FLAVOR_NAME
|
2
|
+
from mlflow.utils.annotations import experimental
|
3
|
+
from mlflow.utils.autologging_utils import autologging_integration
|
4
|
+
|
5
|
+
|
6
|
+
@experimental(version="2.15.0")
|
7
|
+
def autolog(
|
8
|
+
log_traces: bool = True,
|
9
|
+
disable: bool = False,
|
10
|
+
silent: bool = False,
|
11
|
+
):
|
12
|
+
"""
|
13
|
+
Enables (or disables) and configures autologging from LlamaIndex to MLflow. Currently, MLflow
|
14
|
+
only supports autologging for tracing.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
log_traces: If ``True``, traces are logged for LlamaIndex models by using. If ``False``,
|
18
|
+
no traces are collected during inference. Default to ``True``.
|
19
|
+
disable: If ``True``, disables the LlamaIndex autologging integration. If ``False``,
|
20
|
+
enables the LlamaIndex autologging integration.
|
21
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during LlamaIndex
|
22
|
+
autologging. If ``False``, show all events and warnings.
|
23
|
+
"""
|
24
|
+
from mlflow.llama_index.tracer import remove_llama_index_tracer, set_llama_index_tracer
|
25
|
+
|
26
|
+
# NB: The @autologging_integration annotation is used for adding shared logic. However, one
|
27
|
+
# caveat is that the wrapped function is NOT executed when disable=True is passed. This prevents
|
28
|
+
# us from running cleaning up logging when autologging is turned off. To workaround this, we
|
29
|
+
# annotate _autolog() instead of this entrypoint, and define the cleanup logic outside it.
|
30
|
+
# TODO: since this implementation is inconsistent, explore a universal way to solve the issue.
|
31
|
+
if log_traces and not disable:
|
32
|
+
set_llama_index_tracer()
|
33
|
+
else:
|
34
|
+
remove_llama_index_tracer()
|
35
|
+
|
36
|
+
_autolog(
|
37
|
+
log_traces=log_traces,
|
38
|
+
disable=disable,
|
39
|
+
silent=silent,
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
# This is required by mlflow.autolog()
|
44
|
+
autolog.integration_name = FLAVOR_NAME
|
45
|
+
|
46
|
+
|
47
|
+
@autologging_integration(FLAVOR_NAME)
|
48
|
+
def _autolog(
|
49
|
+
log_traces: bool,
|
50
|
+
disable: bool = False,
|
51
|
+
silent: bool = False,
|
52
|
+
):
|
53
|
+
"""
|
54
|
+
TODO: Implement patching logic for autologging models and artifacts.
|
55
|
+
"""
|
@@ -0,0 +1,43 @@
|
|
1
|
+
from llama_index.core.base.llms.types import ChatMessage as LLamaChatMessage
|
2
|
+
from llama_index.core.instrumentation.events import BaseEvent
|
3
|
+
from llama_index.core.instrumentation.events.llm import (
|
4
|
+
LLMChatEndEvent,
|
5
|
+
LLMChatStartEvent,
|
6
|
+
LLMCompletionEndEvent,
|
7
|
+
LLMCompletionStartEvent,
|
8
|
+
)
|
9
|
+
|
10
|
+
# llama-index includes llama-index-llms-openai in its requirements
|
11
|
+
# https://github.com/run-llama/llama_index/blob/663e1700f58c2414e549b9f5005abe87a275dd77/pyproject.toml#L52
|
12
|
+
from llama_index.llms.openai.utils import to_openai_message_dict
|
13
|
+
|
14
|
+
from mlflow.types.chat import ChatMessage
|
15
|
+
from mlflow.utils.pydantic_utils import model_dump_compat
|
16
|
+
|
17
|
+
|
18
|
+
def get_chat_messages_from_event(event: BaseEvent) -> list[ChatMessage]:
|
19
|
+
"""
|
20
|
+
Extract chat messages from the LlamaIndex callback event.
|
21
|
+
"""
|
22
|
+
if isinstance(event, LLMCompletionStartEvent):
|
23
|
+
return [ChatMessage(role="user", content=event.prompt)]
|
24
|
+
elif isinstance(event, LLMCompletionEndEvent):
|
25
|
+
return [ChatMessage(role="assistant", content=event.response.text)]
|
26
|
+
elif isinstance(event, LLMChatStartEvent):
|
27
|
+
return [_convert_message_to_mlflow_chat(msg) for msg in event.messages]
|
28
|
+
elif isinstance(event, LLMChatEndEvent):
|
29
|
+
message = event.response.message
|
30
|
+
return [_convert_message_to_mlflow_chat(message)]
|
31
|
+
|
32
|
+
raise ValueError(f"Unsupported event type for chat attribute extraction: {type(event)}")
|
33
|
+
|
34
|
+
|
35
|
+
def _convert_message_to_mlflow_chat(message: LLamaChatMessage) -> ChatMessage:
|
36
|
+
"""Convert a message object from LlamaIndex to MLflow's standard format."""
|
37
|
+
message = to_openai_message_dict(message, drop_none=False)
|
38
|
+
|
39
|
+
# tool calls are pydantic models in llama-index
|
40
|
+
if tool_calls := message.get("tool_calls"):
|
41
|
+
message["tool_calls"] = [model_dump_compat(tool) for tool in tool_calls]
|
42
|
+
|
43
|
+
return ChatMessage.validate_compat(message)
|
@@ -0,0 +1 @@
|
|
1
|
+
FLAVOR_NAME = "llama_index"
|
@@ -0,0 +1,577 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
import tempfile
|
4
|
+
from typing import Any, Optional, Union
|
5
|
+
|
6
|
+
import yaml
|
7
|
+
|
8
|
+
import mlflow
|
9
|
+
from mlflow import pyfunc
|
10
|
+
from mlflow.entities.model_registry.prompt import Prompt
|
11
|
+
from mlflow.exceptions import MlflowException
|
12
|
+
from mlflow.llama_index.constant import FLAVOR_NAME
|
13
|
+
from mlflow.llama_index.pyfunc_wrapper import create_pyfunc_wrapper
|
14
|
+
from mlflow.models import Model, ModelInputExample, ModelSignature
|
15
|
+
from mlflow.models.model import (
|
16
|
+
MLMODEL_FILE_NAME,
|
17
|
+
MODEL_CODE_PATH,
|
18
|
+
MODEL_CONFIG,
|
19
|
+
_update_active_model_id_based_on_mlflow_model,
|
20
|
+
)
|
21
|
+
from mlflow.models.signature import _infer_signature_from_input_example
|
22
|
+
from mlflow.models.utils import (
|
23
|
+
_load_model_code_path,
|
24
|
+
_save_example,
|
25
|
+
_validate_and_get_model_code_path,
|
26
|
+
)
|
27
|
+
from mlflow.tracing.provider import trace_disabled
|
28
|
+
from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
|
29
|
+
from mlflow.tracking.artifact_utils import _download_artifact_from_uri
|
30
|
+
from mlflow.utils.annotations import experimental
|
31
|
+
from mlflow.utils.docstring_utils import LOG_MODEL_PARAM_DOCS, format_docstring
|
32
|
+
from mlflow.utils.environment import (
|
33
|
+
_CONDA_ENV_FILE_NAME,
|
34
|
+
_CONSTRAINTS_FILE_NAME,
|
35
|
+
_PYTHON_ENV_FILE_NAME,
|
36
|
+
_REQUIREMENTS_FILE_NAME,
|
37
|
+
_mlflow_conda_env,
|
38
|
+
_process_conda_env,
|
39
|
+
_process_pip_requirements,
|
40
|
+
_PythonEnv,
|
41
|
+
_validate_env_arguments,
|
42
|
+
)
|
43
|
+
from mlflow.utils.file_utils import get_total_file_size, write_to
|
44
|
+
from mlflow.utils.model_utils import (
|
45
|
+
_add_code_from_conf_to_system_path,
|
46
|
+
_get_flavor_configuration,
|
47
|
+
_validate_and_copy_code_paths,
|
48
|
+
_validate_and_copy_file_to_directory,
|
49
|
+
_validate_and_get_model_config_from_file,
|
50
|
+
_validate_and_prepare_target_save_path,
|
51
|
+
)
|
52
|
+
from mlflow.utils.requirements_utils import _get_pinned_requirement
|
53
|
+
|
54
|
+
_INDEX_PERSIST_FOLDER = "index"
|
55
|
+
_SETTINGS_FILE = "settings.json"
|
56
|
+
|
57
|
+
|
58
|
+
_logger = logging.getLogger(__name__)
|
59
|
+
|
60
|
+
|
61
|
+
def get_default_pip_requirements():
|
62
|
+
"""
|
63
|
+
Returns:
|
64
|
+
A list of default pip requirements for MLflow Models produced by this flavor.
|
65
|
+
Calls to :func:`save_model()` and :func:`log_model()` produce a pip environment
|
66
|
+
that, at a minimum, contains these requirements.
|
67
|
+
"""
|
68
|
+
return [_get_pinned_requirement("llama-index")]
|
69
|
+
|
70
|
+
|
71
|
+
def get_default_conda_env():
|
72
|
+
"""
|
73
|
+
Returns:
|
74
|
+
The default Conda environment for MLflow Models produced by calls to
|
75
|
+
:func:`save_model()` and :func:`log_model()`.
|
76
|
+
"""
|
77
|
+
return _mlflow_conda_env(additional_pip_deps=get_default_pip_requirements())
|
78
|
+
|
79
|
+
|
80
|
+
def _validate_engine_type(engine_type: str):
|
81
|
+
from mlflow.llama_index.pyfunc_wrapper import SUPPORTED_ENGINES
|
82
|
+
|
83
|
+
if engine_type not in SUPPORTED_ENGINES:
|
84
|
+
raise ValueError(
|
85
|
+
f"Currently mlflow only supports the following engine types: "
|
86
|
+
f"{SUPPORTED_ENGINES}. {engine_type} is not supported, so please "
|
87
|
+
"use one of the above types."
|
88
|
+
)
|
89
|
+
|
90
|
+
|
91
|
+
def _get_llama_index_version() -> str:
|
92
|
+
try:
|
93
|
+
import llama_index.core
|
94
|
+
|
95
|
+
return llama_index.core.__version__
|
96
|
+
except ImportError:
|
97
|
+
raise MlflowException(
|
98
|
+
"The llama_index module is not installed. "
|
99
|
+
"Please install it via `pip install llama-index`."
|
100
|
+
)
|
101
|
+
|
102
|
+
|
103
|
+
def _supported_classes():
|
104
|
+
from llama_index.core.base.base_query_engine import BaseQueryEngine
|
105
|
+
from llama_index.core.chat_engine.types import BaseChatEngine
|
106
|
+
from llama_index.core.indices.base import BaseIndex
|
107
|
+
from llama_index.core.retrievers import BaseRetriever
|
108
|
+
|
109
|
+
supported = (BaseIndex, BaseChatEngine, BaseQueryEngine, BaseRetriever)
|
110
|
+
|
111
|
+
try:
|
112
|
+
from llama_index.core.workflow import Workflow
|
113
|
+
|
114
|
+
supported += (Workflow,)
|
115
|
+
except ImportError:
|
116
|
+
pass
|
117
|
+
|
118
|
+
return supported
|
119
|
+
|
120
|
+
|
121
|
+
@experimental(version="2.15.0")
|
122
|
+
@format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
|
123
|
+
@trace_disabled # Suppress traces while loading model
|
124
|
+
def save_model(
|
125
|
+
llama_index_model,
|
126
|
+
path: str,
|
127
|
+
engine_type: Optional[str] = None,
|
128
|
+
model_config: Optional[Union[str, dict[str, Any]]] = None,
|
129
|
+
code_paths=None,
|
130
|
+
mlflow_model: Optional[Model] = None,
|
131
|
+
signature: Optional[ModelSignature] = None,
|
132
|
+
input_example: Optional[ModelInputExample] = None,
|
133
|
+
pip_requirements: Optional[Union[list[str], str]] = None,
|
134
|
+
extra_pip_requirements: Optional[Union[list[str], str]] = None,
|
135
|
+
conda_env=None,
|
136
|
+
metadata: Optional[dict[str, Any]] = None,
|
137
|
+
) -> None:
|
138
|
+
"""
|
139
|
+
Save a LlamaIndex model to a path on the local file system.
|
140
|
+
|
141
|
+
.. attention::
|
142
|
+
|
143
|
+
Saving a non-index object is only supported in the 'Model-from-Code' saving mode.
|
144
|
+
Please refer to the `Models From Code Guide <https://www.mlflow.org/docs/latest/model/models-from-code.html>`_
|
145
|
+
for more information.
|
146
|
+
|
147
|
+
.. note::
|
148
|
+
|
149
|
+
When logging a model, MLflow will automatically save the state of the ``Settings``
|
150
|
+
object so that you can use the same settings at inference time. However, please
|
151
|
+
note that some information in the ``Settings`` object will not be saved, including:
|
152
|
+
|
153
|
+
- API keys for avoiding key leakage.
|
154
|
+
- Function objects which are not serializable.
|
155
|
+
|
156
|
+
Args:
|
157
|
+
llama_index_model: A LlamaIndex object to be saved. Supported model types are:
|
158
|
+
|
159
|
+
1. An Index object.
|
160
|
+
2. An Engine object e.g. ChatEngine, QueryEngine, Retriever.
|
161
|
+
3. A `Workflow <https://docs.llamaindex.ai/en/stable/module_guides/workflow/>`_ object.
|
162
|
+
4. A string representing the path to a script contains LlamaIndex model definition
|
163
|
+
of the one of the above types.
|
164
|
+
|
165
|
+
path: Local path where the serialized model (as YAML) is to be saved.
|
166
|
+
engine_type: Required when saving an Index object to determine the inference interface
|
167
|
+
for the index when loaded as a pyfunc model. This field is **not** required when
|
168
|
+
saving other LlamaIndex objects. The supported values are as follows:
|
169
|
+
|
170
|
+
- ``"chat"``: load the index as an instance of the LlamaIndex
|
171
|
+
`ChatEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/chat_engines/>`_.
|
172
|
+
- ``"query"``: load the index as an instance of the LlamaIndex
|
173
|
+
`QueryEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/>`_.
|
174
|
+
- ``"retriever"``: load the index as an instance of the LlamaIndex
|
175
|
+
`Retriever <https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/>`_.
|
176
|
+
|
177
|
+
model_config: The model configuration to apply when loading the model back with
|
178
|
+
``mlflow.pyfunc.load_model()``. It will be applied in a different way depending on the
|
179
|
+
model type and saving method. See the docstring of :func:`log_model` for more details
|
180
|
+
and usage examples.
|
181
|
+
|
182
|
+
code_paths: {{ code_paths }}
|
183
|
+
mlflow_model: An MLflow model object that specifies the flavor that this model is being
|
184
|
+
added to.
|
185
|
+
signature: A Model Signature object that describes the input and output Schema of the
|
186
|
+
model. The model signature can be inferred using ``infer_signature`` function
|
187
|
+
of ``mlflow.models.signature``.
|
188
|
+
input_example: {{ input_example }}
|
189
|
+
pip_requirements: {{ pip_requirements }}
|
190
|
+
extra_pip_requirements: {{ extra_pip_requirements }}
|
191
|
+
conda_env: {{ conda_env }}
|
192
|
+
metadata: {{ metadata }}
|
193
|
+
"""
|
194
|
+
from llama_index.core.indices.base import BaseIndex
|
195
|
+
|
196
|
+
from mlflow.llama_index.serialize_objects import serialize_settings
|
197
|
+
|
198
|
+
# TODO: make this logic cleaner and maybe a util
|
199
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
200
|
+
model_or_code_path = _validate_and_prepare_llama_index_model_or_path(
|
201
|
+
llama_index_model, temp_dir
|
202
|
+
)
|
203
|
+
|
204
|
+
_validate_env_arguments(conda_env, pip_requirements, extra_pip_requirements)
|
205
|
+
|
206
|
+
path = os.path.abspath(path)
|
207
|
+
_validate_and_prepare_target_save_path(path)
|
208
|
+
|
209
|
+
if isinstance(model_config, str):
|
210
|
+
model_config = _validate_and_get_model_config_from_file(model_config)
|
211
|
+
|
212
|
+
model_code_path = None
|
213
|
+
if isinstance(model_or_code_path, str):
|
214
|
+
model_code_path = model_or_code_path
|
215
|
+
llama_index_model = _load_model_code_path(model_code_path, model_config)
|
216
|
+
_validate_and_copy_file_to_directory(model_code_path, path, "code")
|
217
|
+
|
218
|
+
# Warn when user provides `engine_type` argument while saving an engine directly
|
219
|
+
if not isinstance(llama_index_model, BaseIndex) and engine_type is not None:
|
220
|
+
_logger.warning(
|
221
|
+
"The `engine_type` argument is ignored when saving a non-index object."
|
222
|
+
)
|
223
|
+
|
224
|
+
elif isinstance(model_or_code_path, BaseIndex):
|
225
|
+
_validate_engine_type(engine_type)
|
226
|
+
llama_index_model = model_or_code_path
|
227
|
+
|
228
|
+
elif isinstance(model_or_code_path, _supported_classes()):
|
229
|
+
raise MlflowException.invalid_parameter_value(
|
230
|
+
"Saving a non-index object is only supported in the 'Model-from-Code' saving mode. "
|
231
|
+
"The legacy serialization method is exclusively for saving index objects. Please "
|
232
|
+
"pass the path to the script containing the model definition to save a non-index "
|
233
|
+
"object. For more information, see "
|
234
|
+
"https://www.mlflow.org/docs/latest/model/models-from-code.html",
|
235
|
+
)
|
236
|
+
|
237
|
+
code_dir_subpath = _validate_and_copy_code_paths(code_paths, path)
|
238
|
+
|
239
|
+
if mlflow_model is None:
|
240
|
+
mlflow_model = Model()
|
241
|
+
saved_example = _save_example(mlflow_model, input_example, path)
|
242
|
+
|
243
|
+
if signature is None and saved_example is not None:
|
244
|
+
wrapped_model = create_pyfunc_wrapper(llama_index_model, engine_type, model_config)
|
245
|
+
signature = _infer_signature_from_input_example(saved_example, wrapped_model)
|
246
|
+
elif signature is False:
|
247
|
+
signature = None
|
248
|
+
|
249
|
+
if mlflow_model is None:
|
250
|
+
mlflow_model = Model()
|
251
|
+
if signature is not None:
|
252
|
+
mlflow_model.signature = signature
|
253
|
+
if metadata is not None:
|
254
|
+
mlflow_model.metadata = metadata
|
255
|
+
|
256
|
+
# NB: llama_index.core.Settings is a singleton that manages the storage/service context
|
257
|
+
# for a given llama_index application. Given it holds the required objects for most of
|
258
|
+
# the index's functionality, we look to serialize the entire object. For components of
|
259
|
+
# the object that are not serializable, we log a warning.
|
260
|
+
settings_path = os.path.join(path, _SETTINGS_FILE)
|
261
|
+
serialize_settings(settings_path)
|
262
|
+
|
263
|
+
# Do not save the index/engine object in model-from-code saving mode
|
264
|
+
if not isinstance(model_code_path, str) and isinstance(llama_index_model, BaseIndex):
|
265
|
+
_save_index(llama_index_model, path)
|
266
|
+
|
267
|
+
pyfunc.add_to_model(
|
268
|
+
mlflow_model,
|
269
|
+
loader_module="mlflow.llama_index",
|
270
|
+
conda_env=_CONDA_ENV_FILE_NAME,
|
271
|
+
python_env=_PYTHON_ENV_FILE_NAME,
|
272
|
+
code=code_dir_subpath,
|
273
|
+
model_code_path=model_code_path,
|
274
|
+
model_config=model_config,
|
275
|
+
)
|
276
|
+
mlflow_model.add_flavor(
|
277
|
+
FLAVOR_NAME,
|
278
|
+
llama_index_version=_get_llama_index_version(),
|
279
|
+
code=code_dir_subpath,
|
280
|
+
engine_type=engine_type,
|
281
|
+
)
|
282
|
+
if size := get_total_file_size(path):
|
283
|
+
mlflow_model.model_size_bytes = size
|
284
|
+
mlflow_model.save(os.path.join(path, MLMODEL_FILE_NAME))
|
285
|
+
|
286
|
+
if conda_env is None:
|
287
|
+
default_reqs = None
|
288
|
+
if pip_requirements is None:
|
289
|
+
default_reqs = get_default_pip_requirements()
|
290
|
+
inferred_reqs = mlflow.models.infer_pip_requirements(
|
291
|
+
str(path), FLAVOR_NAME, fallback=default_reqs
|
292
|
+
)
|
293
|
+
default_reqs = sorted(set(inferred_reqs).union(default_reqs))
|
294
|
+
else:
|
295
|
+
default_reqs = None
|
296
|
+
conda_env, pip_requirements, pip_constraints = _process_pip_requirements(
|
297
|
+
default_reqs,
|
298
|
+
pip_requirements,
|
299
|
+
extra_pip_requirements,
|
300
|
+
)
|
301
|
+
else:
|
302
|
+
conda_env, pip_requirements, pip_constraints = _process_conda_env(conda_env)
|
303
|
+
|
304
|
+
with open(os.path.join(path, _CONDA_ENV_FILE_NAME), "w") as f:
|
305
|
+
yaml.safe_dump(conda_env, stream=f, default_flow_style=False)
|
306
|
+
|
307
|
+
if pip_constraints:
|
308
|
+
write_to(os.path.join(path, _CONSTRAINTS_FILE_NAME), "\n".join(pip_constraints))
|
309
|
+
|
310
|
+
write_to(os.path.join(path, _REQUIREMENTS_FILE_NAME), "\n".join(pip_requirements))
|
311
|
+
|
312
|
+
_PythonEnv.current().to_yaml(os.path.join(path, _PYTHON_ENV_FILE_NAME))
|
313
|
+
|
314
|
+
|
315
|
+
@experimental(version="2.15.0")
|
316
|
+
@format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
|
317
|
+
@trace_disabled # Suppress traces while loading model
|
318
|
+
def log_model(
|
319
|
+
llama_index_model,
|
320
|
+
artifact_path: Optional[str] = None,
|
321
|
+
engine_type: Optional[str] = None,
|
322
|
+
model_config: Optional[dict[str, Any]] = None,
|
323
|
+
code_paths: Optional[list[str]] = None,
|
324
|
+
registered_model_name: Optional[str] = None,
|
325
|
+
signature: Optional[ModelSignature] = None,
|
326
|
+
input_example: Optional[ModelInputExample] = None,
|
327
|
+
await_registration_for=DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
|
328
|
+
pip_requirements: Optional[Union[list[str], str]] = None,
|
329
|
+
extra_pip_requirements: Optional[Union[list[str], str]] = None,
|
330
|
+
conda_env=None,
|
331
|
+
metadata: Optional[dict[str, Any]] = None,
|
332
|
+
prompts: Optional[list[Union[str, Prompt]]] = None,
|
333
|
+
name: Optional[str] = None,
|
334
|
+
params: Optional[dict[str, Any]] = None,
|
335
|
+
tags: Optional[dict[str, Any]] = None,
|
336
|
+
model_type: Optional[str] = None,
|
337
|
+
step: int = 0,
|
338
|
+
model_id: Optional[str] = None,
|
339
|
+
**kwargs,
|
340
|
+
):
|
341
|
+
"""
|
342
|
+
Log a LlamaIndex model as an MLflow artifact for the current run.
|
343
|
+
|
344
|
+
.. attention::
|
345
|
+
|
346
|
+
Saving a non-index object is only supported in the 'Model-from-Code' saving mode.
|
347
|
+
Please refer to the `Models From Code Guide <https://www.mlflow.org/docs/latest/model/models-from-code.html>`_
|
348
|
+
for more information.
|
349
|
+
|
350
|
+
.. note::
|
351
|
+
|
352
|
+
When logging a model, MLflow will automatically save the state of the ``Settings``
|
353
|
+
object so that you can use the same settings at inference time. However, please
|
354
|
+
note that some information in the ``Settings`` object will not be saved, including:
|
355
|
+
|
356
|
+
- API keys for avoiding key leakage.
|
357
|
+
- Function objects which are not serializable.
|
358
|
+
|
359
|
+
Args:
|
360
|
+
llama_index_model: A LlamaIndex object to be saved. Supported model types are:
|
361
|
+
|
362
|
+
1. An Index object.
|
363
|
+
2. An Engine object e.g. ChatEngine, QueryEngine, Retriever.
|
364
|
+
3. A `Workflow <https://docs.llamaindex.ai/en/stable/module_guides/workflow/>`_ object.
|
365
|
+
4. A string representing the path to a script contains LlamaIndex model definition
|
366
|
+
of the one of the above types.
|
367
|
+
|
368
|
+
artifact_path: Deprecated. Use `name` instead.
|
369
|
+
engine_type: Required when saving an Index object to determine the inference interface
|
370
|
+
for the index when loaded as a pyfunc model. This field is **not** required when
|
371
|
+
saving other LlamaIndex objects. The supported values are as follows:
|
372
|
+
|
373
|
+
- ``"chat"``: load the index as an instance of the LlamaIndex
|
374
|
+
`ChatEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/chat_engines/>`_.
|
375
|
+
- ``"query"``: load the index as an instance of the LlamaIndex
|
376
|
+
`QueryEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/>`_.
|
377
|
+
- ``"retriever"``: load the index as an instance of the LlamaIndex
|
378
|
+
`Retriever <https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/>`_.
|
379
|
+
|
380
|
+
model_config: The model configuration to apply when loading the model back with
|
381
|
+
``mlflow.pyfunc.load_model()``. It will be applied in a different way depending on the
|
382
|
+
model type and saving method:
|
383
|
+
|
384
|
+
For in-memory Index objects saved directly, it will be passed as keyword arguments to
|
385
|
+
instantiate the LlamaIndex engine with the specified engine type at logging.
|
386
|
+
|
387
|
+
.. code-block:: python
|
388
|
+
|
389
|
+
with mlflow.start_run() as run:
|
390
|
+
model_info = mlflow.llama_index.log_model(
|
391
|
+
index,
|
392
|
+
name="index",
|
393
|
+
engine_type="chat",
|
394
|
+
model_config={"top_k": 10},
|
395
|
+
)
|
396
|
+
|
397
|
+
# When loading back, MLflow will call ``index.as_chat_engine(top_k=10)``
|
398
|
+
engine = mlflow.pyfunc.load_model(model_info.model_uri)
|
399
|
+
|
400
|
+
For other model types saved with the `Model-from-Code <https://www.mlflow.org/docs/latest/model/models-from-code.html>`
|
401
|
+
method, the config will be accessed via the :py:class`~mlflow.models.ModelConfig`
|
402
|
+
object within your model code.
|
403
|
+
|
404
|
+
.. code-block:: python
|
405
|
+
|
406
|
+
with mlflow.start_run() as run:
|
407
|
+
model_info = mlflow.llama_index.log_model(
|
408
|
+
"model.py",
|
409
|
+
name="model",
|
410
|
+
model_config={"qdrant_host": "localhost", "qdrant_port": 6333},
|
411
|
+
)
|
412
|
+
|
413
|
+
model.py:
|
414
|
+
|
415
|
+
.. code-block:: python
|
416
|
+
|
417
|
+
import mlflow
|
418
|
+
from llama_index.vector_stores.qdrant import QdrantVectorStore
|
419
|
+
import qdrant_client
|
420
|
+
|
421
|
+
|
422
|
+
# The model configuration is accessible via the ModelConfig singleton
|
423
|
+
model_config = mlflow.models.ModelConfig()
|
424
|
+
qdrant_host = model_config.get("top_k", 5)
|
425
|
+
qdrant_port = model_config.get("qdrant_port", 6333)
|
426
|
+
|
427
|
+
client = qdrant_client.Client(host=qdrant_host, port=qdrant_port)
|
428
|
+
vectorstore = QdrantVectorStore(client)
|
429
|
+
|
430
|
+
# the rest of the model definition...
|
431
|
+
|
432
|
+
code_paths: {{ code_paths }}
|
433
|
+
registered_model_name: If given, create a model
|
434
|
+
version under ``registered_model_name``, also creating a
|
435
|
+
registered model if one with the given name does not exist.
|
436
|
+
signature: A Model Signature object that describes the input and output Schema of the
|
437
|
+
model. The model signature can be inferred using ``infer_signature`` function
|
438
|
+
of `mlflow.models.signature`.
|
439
|
+
input_example: {{ input_example }}
|
440
|
+
await_registration_for: Number of seconds to wait for the model version
|
441
|
+
to finish being created and is in ``READY`` status.
|
442
|
+
By default, the function waits for five minutes.
|
443
|
+
Specify 0 or None to skip waiting.
|
444
|
+
pip_requirements: {{ pip_requirements }}
|
445
|
+
extra_pip_requirements: {{ extra_pip_requirements }}
|
446
|
+
conda_env: {{ conda_env }}
|
447
|
+
metadata: {{ metadata }}
|
448
|
+
prompts: {{ prompts }}
|
449
|
+
name: {{ name }}
|
450
|
+
params: {{ params }}
|
451
|
+
tags: {{ tags }}
|
452
|
+
model_type: {{ model_type }}
|
453
|
+
step: {{ step }}
|
454
|
+
model_id: {{ model_id }}
|
455
|
+
kwargs: Additional arguments for :py:class:`mlflow.models.model.Model`
|
456
|
+
"""
|
457
|
+
return Model.log(
|
458
|
+
artifact_path=artifact_path,
|
459
|
+
name=name,
|
460
|
+
engine_type=engine_type,
|
461
|
+
model_config=model_config,
|
462
|
+
flavor=mlflow.llama_index,
|
463
|
+
registered_model_name=registered_model_name,
|
464
|
+
llama_index_model=llama_index_model,
|
465
|
+
conda_env=conda_env,
|
466
|
+
code_paths=code_paths,
|
467
|
+
signature=signature,
|
468
|
+
input_example=input_example,
|
469
|
+
await_registration_for=await_registration_for,
|
470
|
+
pip_requirements=pip_requirements,
|
471
|
+
extra_pip_requirements=extra_pip_requirements,
|
472
|
+
metadata=metadata,
|
473
|
+
prompts=prompts,
|
474
|
+
params=params,
|
475
|
+
tags=tags,
|
476
|
+
model_type=model_type,
|
477
|
+
step=step,
|
478
|
+
model_id=model_id,
|
479
|
+
**kwargs,
|
480
|
+
)
|
481
|
+
|
482
|
+
|
483
|
+
def _validate_and_prepare_llama_index_model_or_path(llama_index_model, temp_dir=None):
|
484
|
+
if isinstance(llama_index_model, str):
|
485
|
+
return _validate_and_get_model_code_path(llama_index_model, temp_dir)
|
486
|
+
|
487
|
+
if not isinstance(llama_index_model, _supported_classes()):
|
488
|
+
supported_cls_names = [cls.__name__ for cls in _supported_classes()]
|
489
|
+
raise MlflowException.invalid_parameter_value(
|
490
|
+
message=f"The provided object of type {type(llama_index_model).__name__} is not "
|
491
|
+
"supported. MLflow llama-index flavor only supports saving LlamaIndex objects "
|
492
|
+
f"subclassed from one of the following classes: {supported_cls_names}.",
|
493
|
+
)
|
494
|
+
|
495
|
+
return llama_index_model
|
496
|
+
|
497
|
+
|
498
|
+
def _save_index(index, path):
|
499
|
+
"""Serialize the index."""
|
500
|
+
index_path = os.path.join(path, _INDEX_PERSIST_FOLDER)
|
501
|
+
index.storage_context.persist(persist_dir=index_path)
|
502
|
+
|
503
|
+
|
504
|
+
def _load_llama_model(path, flavor_conf):
|
505
|
+
"""Load the LlamaIndex index/engine/workflow from either model code or serialized index."""
|
506
|
+
from llama_index.core import StorageContext, load_index_from_storage
|
507
|
+
|
508
|
+
_add_code_from_conf_to_system_path(path, flavor_conf)
|
509
|
+
|
510
|
+
# Handle model-from-code
|
511
|
+
pyfunc_flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=pyfunc.FLAVOR_NAME)
|
512
|
+
if model_code_path := pyfunc_flavor_conf.get(MODEL_CODE_PATH):
|
513
|
+
# TODO: The code path saved in the MLModel file is the local absolute path to the code
|
514
|
+
# file when it is saved. We should update the relative path in artifact directory.
|
515
|
+
model_code_path = os.path.join(path, os.path.basename(model_code_path))
|
516
|
+
|
517
|
+
model_config = pyfunc_flavor_conf.get(MODEL_CONFIG) or flavor_conf.get(MODEL_CONFIG, {})
|
518
|
+
if isinstance(model_config, str):
|
519
|
+
config_path = os.path.join(path, os.path.basename(model_config))
|
520
|
+
model_config = _validate_and_get_model_config_from_file(config_path)
|
521
|
+
|
522
|
+
return _load_model_code_path(model_code_path, model_config)
|
523
|
+
else:
|
524
|
+
# Use default vector store when loading from the serialized index
|
525
|
+
index_path = os.path.join(path, _INDEX_PERSIST_FOLDER)
|
526
|
+
storage_context = StorageContext.from_defaults(persist_dir=index_path)
|
527
|
+
return load_index_from_storage(storage_context)
|
528
|
+
|
529
|
+
|
530
|
+
@experimental(version="2.15.0")
|
531
|
+
@trace_disabled # Suppress traces while loading model
|
532
|
+
def load_model(model_uri, dst_path=None):
|
533
|
+
"""
|
534
|
+
Load a LlamaIndex index/engine/workflow from a local file or a run.
|
535
|
+
|
536
|
+
Args:
|
537
|
+
model_uri: The location, in URI format, of the MLflow model. For example:
|
538
|
+
|
539
|
+
- ``/Users/me/path/to/local/model``
|
540
|
+
- ``relative/path/to/local/model``
|
541
|
+
- ``s3://my_bucket/path/to/model``
|
542
|
+
- ``runs:/<mlflow_run_id>/run-relative/path/to/model``
|
543
|
+
- ``mlflow-artifacts:/path/to/model``
|
544
|
+
|
545
|
+
For more information about supported URI schemes, see
|
546
|
+
`Referencing Artifacts <https://www.mlflow.org/docs/latest/tracking.html#
|
547
|
+
artifact-locations>`_.
|
548
|
+
dst_path: The local filesystem path to utilize for downloading the model artifact.
|
549
|
+
This directory must already exist if provided. If unspecified, a local output
|
550
|
+
path will be created.
|
551
|
+
|
552
|
+
Returns:
|
553
|
+
A LlamaIndex index object.
|
554
|
+
"""
|
555
|
+
from mlflow.llama_index.serialize_objects import deserialize_settings
|
556
|
+
|
557
|
+
local_model_path = _download_artifact_from_uri(artifact_uri=model_uri, output_path=dst_path)
|
558
|
+
mlflow_model = Model.load(local_model_path)
|
559
|
+
flavor_conf = _get_flavor_configuration(model_path=local_model_path, flavor_name=FLAVOR_NAME)
|
560
|
+
|
561
|
+
settings_path = os.path.join(local_model_path, _SETTINGS_FILE)
|
562
|
+
# NB: Settings is a singleton and can be loaded via llama_index.core.Settings
|
563
|
+
deserialize_settings(settings_path)
|
564
|
+
model = _load_llama_model(local_model_path, flavor_conf)
|
565
|
+
_update_active_model_id_based_on_mlflow_model(mlflow_model)
|
566
|
+
return model
|
567
|
+
|
568
|
+
|
569
|
+
def _load_pyfunc(path, model_config: Optional[dict[str, Any]] = None):
|
570
|
+
from mlflow.llama_index.pyfunc_wrapper import create_pyfunc_wrapper
|
571
|
+
|
572
|
+
index = load_model(path)
|
573
|
+
flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME)
|
574
|
+
engine_type = flavor_conf.pop(
|
575
|
+
"engine_type", None
|
576
|
+
) # Not present when saving an non-index object
|
577
|
+
return create_pyfunc_wrapper(index, engine_type, model_config)
|