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
mlflow/rfunc/__init__.py
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
"""Export and import of generic R models.
|
2
|
+
|
3
|
+
This module defines generic filesystem format for R models and provides utilities
|
4
|
+
for saving and loading to and from this format. The format is self contained in the sense
|
5
|
+
that it includes all necessary information for anyone to load it and use it. Dependencies
|
6
|
+
are either stored directly with the model or referenced via a Conda environment.
|
7
|
+
|
8
|
+
The convention for rfunc models is to have a ``predict`` method or function with the following
|
9
|
+
signature::
|
10
|
+
|
11
|
+
predict(data: DataFrame) -> DataFrame
|
12
|
+
|
13
|
+
This convention is relied on by other MLflow components.
|
14
|
+
|
15
|
+
Rfunc model format is defined as a directory structure containing all required data, code, and
|
16
|
+
configuration:
|
17
|
+
|
18
|
+
.. code::
|
19
|
+
|
20
|
+
./dst-path/
|
21
|
+
./MLmodel: configuration
|
22
|
+
|
23
|
+
It must contain MLmodel file in its root with "r_function" format.
|
24
|
+
|
25
|
+
Example:
|
26
|
+
|
27
|
+
.. code:: shell
|
28
|
+
|
29
|
+
>tree R/mlflow/R/inst/examples/R/lm/model
|
30
|
+
├── MLmodel
|
31
|
+
└── r_model.bin
|
32
|
+
|
33
|
+
>cat R/mlflow/R/inst/examples/R/lm/model/MLmodel
|
34
|
+
time_created: 1.5337659e+09
|
35
|
+
flavors:
|
36
|
+
r_function:
|
37
|
+
version: 0.1.0
|
38
|
+
model: r_model.bin
|
39
|
+
|
40
|
+
"""
|
41
|
+
|
42
|
+
FLAVOR_NAME = "crate"
|
mlflow/rfunc/backend.py
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
import re
|
4
|
+
import subprocess
|
5
|
+
import sys
|
6
|
+
|
7
|
+
from mlflow.exceptions import MlflowException
|
8
|
+
from mlflow.models import FlavorBackend
|
9
|
+
from mlflow.tracking.artifact_utils import _download_artifact_from_uri
|
10
|
+
from mlflow.utils.string_utils import quote
|
11
|
+
|
12
|
+
_logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
class RFuncBackend(FlavorBackend):
|
16
|
+
"""
|
17
|
+
Flavor backend implementation for the generic R models.
|
18
|
+
Predict and serve locally models with 'crate' flavor.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def build_image(
|
22
|
+
self, model_uri, image_name, install_mlflow, mlflow_home, enable_mlserver, base_image=None
|
23
|
+
):
|
24
|
+
pass
|
25
|
+
|
26
|
+
def generate_dockerfile(
|
27
|
+
self, model_uri, output_path, install_mlflow, mlflow_home, enable_mlserver, base_image=None
|
28
|
+
):
|
29
|
+
pass
|
30
|
+
|
31
|
+
version_pattern = re.compile(r"version ([0-9]+\.[0-9]+\.[0-9]+)")
|
32
|
+
|
33
|
+
def predict(
|
34
|
+
self,
|
35
|
+
model_uri,
|
36
|
+
input_path,
|
37
|
+
output_path,
|
38
|
+
content_type,
|
39
|
+
pip_requirements_override=None,
|
40
|
+
extra_envs=None,
|
41
|
+
):
|
42
|
+
"""
|
43
|
+
Generate predictions using R model saved with MLflow.
|
44
|
+
Return the prediction results as a JSON.
|
45
|
+
"""
|
46
|
+
if pip_requirements_override is not None:
|
47
|
+
raise MlflowException("pip_requirements_override is not supported in the R backend.")
|
48
|
+
model_path = _download_artifact_from_uri(model_uri)
|
49
|
+
str_cmd = (
|
50
|
+
"mlflow:::mlflow_rfunc_predict(model_path = '{0}', input_path = {1}, "
|
51
|
+
"output_path = {2}, content_type = {3})"
|
52
|
+
)
|
53
|
+
command = str_cmd.format(
|
54
|
+
quote(model_path),
|
55
|
+
_str_optional(input_path),
|
56
|
+
_str_optional(output_path),
|
57
|
+
_str_optional(content_type),
|
58
|
+
)
|
59
|
+
_execute(command, extra_envs=extra_envs)
|
60
|
+
|
61
|
+
def serve(
|
62
|
+
self,
|
63
|
+
model_uri,
|
64
|
+
port,
|
65
|
+
host,
|
66
|
+
timeout,
|
67
|
+
enable_mlserver,
|
68
|
+
synchronous=True,
|
69
|
+
stdout=None,
|
70
|
+
stderr=None,
|
71
|
+
):
|
72
|
+
"""
|
73
|
+
Generate R model locally.
|
74
|
+
|
75
|
+
NOTE: The `enable_mlserver` parameter is there to comply with the
|
76
|
+
FlavorBackend interface but is not supported by MLServer yet.
|
77
|
+
https://github.com/SeldonIO/MLServer/issues/183
|
78
|
+
"""
|
79
|
+
if enable_mlserver:
|
80
|
+
raise Exception("The MLServer inference server is not yet supported in the R backend.")
|
81
|
+
|
82
|
+
if timeout:
|
83
|
+
_logger.warning("Timeout is not yet supported in the R backend.")
|
84
|
+
|
85
|
+
if not synchronous:
|
86
|
+
raise Exception("RBackend does not support call with synchronous=False")
|
87
|
+
|
88
|
+
if stdout is not None or stderr is not None:
|
89
|
+
raise Exception("RBackend does not support redirect stdout/stderr.")
|
90
|
+
|
91
|
+
model_path = _download_artifact_from_uri(model_uri)
|
92
|
+
command = "mlflow::mlflow_rfunc_serve('{}', port = {}, host = '{}')".format(
|
93
|
+
quote(model_path), port, host
|
94
|
+
)
|
95
|
+
_execute(command)
|
96
|
+
|
97
|
+
def can_score_model(self):
|
98
|
+
# `Rscript --version` writes to stderr in R < 4.2.0 but stdout in R >= 4.2.0.
|
99
|
+
process = subprocess.Popen(
|
100
|
+
["Rscript", "--version"],
|
101
|
+
close_fds=True,
|
102
|
+
stdout=subprocess.PIPE,
|
103
|
+
stderr=subprocess.STDOUT,
|
104
|
+
)
|
105
|
+
stdout, _ = process.communicate()
|
106
|
+
if process.wait() != 0:
|
107
|
+
return False
|
108
|
+
|
109
|
+
version = self.version_pattern.search(stdout.decode("utf-8"))
|
110
|
+
if not version:
|
111
|
+
return False
|
112
|
+
version = [int(x) for x in version.group(1).split(".")]
|
113
|
+
return version[0] > 3 or version[0] == 3 and version[1] >= 3
|
114
|
+
|
115
|
+
|
116
|
+
def _execute(command, extra_envs=None):
|
117
|
+
env = os.environ.copy()
|
118
|
+
if extra_envs:
|
119
|
+
env.update(extra_envs)
|
120
|
+
|
121
|
+
process = subprocess.Popen(
|
122
|
+
["Rscript", "-e", command],
|
123
|
+
env=env,
|
124
|
+
close_fds=False,
|
125
|
+
stdin=sys.stdin,
|
126
|
+
stdout=sys.stdout,
|
127
|
+
stderr=sys.stderr,
|
128
|
+
)
|
129
|
+
if process.wait() != 0:
|
130
|
+
raise Exception("Command returned non zero exit code.")
|
131
|
+
|
132
|
+
|
133
|
+
def _str_optional(s):
|
134
|
+
return "NULL" if s is None else f"'{quote(str(s))}'"
|
mlflow/runs.py
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
"""
|
2
|
+
CLI for runs
|
3
|
+
"""
|
4
|
+
|
5
|
+
import json
|
6
|
+
|
7
|
+
import click
|
8
|
+
|
9
|
+
from mlflow.entities import ViewType
|
10
|
+
from mlflow.environment_variables import MLFLOW_EXPERIMENT_ID
|
11
|
+
from mlflow.tracking import _get_store
|
12
|
+
from mlflow.utils.string_utils import _create_table
|
13
|
+
from mlflow.utils.time import conv_longdate_to_str
|
14
|
+
|
15
|
+
RUN_ID = click.option("--run-id", type=click.STRING, required=True)
|
16
|
+
|
17
|
+
|
18
|
+
@click.group("runs")
|
19
|
+
def commands():
|
20
|
+
"""
|
21
|
+
Manage runs. To manage runs of experiments associated with a tracking server, set the
|
22
|
+
MLFLOW_TRACKING_URI environment variable to the URL of the desired server.
|
23
|
+
"""
|
24
|
+
|
25
|
+
|
26
|
+
@commands.command("list")
|
27
|
+
@click.option(
|
28
|
+
"--experiment-id",
|
29
|
+
envvar=MLFLOW_EXPERIMENT_ID.name,
|
30
|
+
type=click.STRING,
|
31
|
+
help="Specify the experiment ID for list of runs.",
|
32
|
+
required=True,
|
33
|
+
)
|
34
|
+
@click.option(
|
35
|
+
"--view",
|
36
|
+
"-v",
|
37
|
+
default="active_only",
|
38
|
+
help="Select view type for list experiments. Valid view types are "
|
39
|
+
"'active_only' (default), 'deleted_only', and 'all'.",
|
40
|
+
)
|
41
|
+
def list_run(experiment_id, view):
|
42
|
+
"""
|
43
|
+
List all runs of the specified experiment in the configured tracking server.
|
44
|
+
"""
|
45
|
+
store = _get_store()
|
46
|
+
view_type = ViewType.from_string(view) if view else ViewType.ACTIVE_ONLY
|
47
|
+
runs = store.search_runs([experiment_id], None, view_type)
|
48
|
+
table = []
|
49
|
+
for run in runs:
|
50
|
+
run_name = run.info.run_name or ""
|
51
|
+
table.append([conv_longdate_to_str(run.info.start_time), run_name, run.info.run_id])
|
52
|
+
click.echo(_create_table(sorted(table, reverse=True), headers=["Date", "Name", "ID"]))
|
53
|
+
|
54
|
+
|
55
|
+
@commands.command("delete")
|
56
|
+
@RUN_ID
|
57
|
+
def delete_run(run_id):
|
58
|
+
"""
|
59
|
+
Mark a run for deletion. Return an error if the run does not exist or
|
60
|
+
is already marked. You can restore a marked run with ``restore_run``,
|
61
|
+
or permanently delete a run in the backend store.
|
62
|
+
"""
|
63
|
+
store = _get_store()
|
64
|
+
store.delete_run(run_id)
|
65
|
+
click.echo(f"Run with ID {run_id} has been deleted.")
|
66
|
+
|
67
|
+
|
68
|
+
@commands.command("restore")
|
69
|
+
@RUN_ID
|
70
|
+
def restore_run(run_id):
|
71
|
+
"""
|
72
|
+
Restore a deleted run.
|
73
|
+
Returns an error if the run is active or has been permanently deleted.
|
74
|
+
"""
|
75
|
+
store = _get_store()
|
76
|
+
store.restore_run(run_id)
|
77
|
+
click.echo(f"Run with id {run_id} has been restored.")
|
78
|
+
|
79
|
+
|
80
|
+
@commands.command("describe")
|
81
|
+
@RUN_ID
|
82
|
+
def describe_run(run_id):
|
83
|
+
"""
|
84
|
+
All of run details will print to the stdout as JSON format.
|
85
|
+
"""
|
86
|
+
store = _get_store()
|
87
|
+
run = store.get_run(run_id)
|
88
|
+
json_run = json.dumps(run.to_dictionary(), indent=4)
|
89
|
+
click.echo(json_run)
|
@@ -0,0 +1,302 @@
|
|
1
|
+
import importlib
|
2
|
+
import importlib.metadata
|
3
|
+
import os
|
4
|
+
import shlex
|
5
|
+
import sys
|
6
|
+
import textwrap
|
7
|
+
import types
|
8
|
+
|
9
|
+
from flask import Flask, Response, send_from_directory
|
10
|
+
from packaging.version import Version
|
11
|
+
|
12
|
+
from mlflow.environment_variables import MLFLOW_FLASK_SERVER_SECRET_KEY
|
13
|
+
from mlflow.exceptions import MlflowException
|
14
|
+
from mlflow.server import handlers
|
15
|
+
from mlflow.server.handlers import (
|
16
|
+
STATIC_PREFIX_ENV_VAR,
|
17
|
+
_add_static_prefix,
|
18
|
+
create_promptlab_run_handler,
|
19
|
+
gateway_proxy_handler,
|
20
|
+
get_artifact_handler,
|
21
|
+
get_logged_model_artifact_handler,
|
22
|
+
get_metric_history_bulk_handler,
|
23
|
+
get_metric_history_bulk_interval_handler,
|
24
|
+
get_model_version_artifact_handler,
|
25
|
+
get_trace_artifact_handler,
|
26
|
+
search_datasets_handler,
|
27
|
+
upload_artifact_handler,
|
28
|
+
)
|
29
|
+
from mlflow.utils.os import is_windows
|
30
|
+
from mlflow.utils.plugins import get_entry_points
|
31
|
+
from mlflow.utils.process import _exec_cmd
|
32
|
+
from mlflow.version import VERSION
|
33
|
+
|
34
|
+
# NB: These are internal environment variables used for communication between
|
35
|
+
# the cli and the forked gunicorn processes.
|
36
|
+
BACKEND_STORE_URI_ENV_VAR = "_MLFLOW_SERVER_FILE_STORE"
|
37
|
+
REGISTRY_STORE_URI_ENV_VAR = "_MLFLOW_SERVER_REGISTRY_STORE"
|
38
|
+
ARTIFACT_ROOT_ENV_VAR = "_MLFLOW_SERVER_ARTIFACT_ROOT"
|
39
|
+
ARTIFACTS_DESTINATION_ENV_VAR = "_MLFLOW_SERVER_ARTIFACT_DESTINATION"
|
40
|
+
PROMETHEUS_EXPORTER_ENV_VAR = "prometheus_multiproc_dir"
|
41
|
+
SERVE_ARTIFACTS_ENV_VAR = "_MLFLOW_SERVER_SERVE_ARTIFACTS"
|
42
|
+
ARTIFACTS_ONLY_ENV_VAR = "_MLFLOW_SERVER_ARTIFACTS_ONLY"
|
43
|
+
|
44
|
+
# Genesis-Flow: UI removed, no static directory needed
|
45
|
+
REL_STATIC_DIR = None
|
46
|
+
|
47
|
+
app = Flask(__name__)
|
48
|
+
IS_FLASK_V1 = Version(importlib.metadata.version("flask")) < Version("2.0")
|
49
|
+
|
50
|
+
|
51
|
+
for http_path, handler, methods in handlers.get_endpoints():
|
52
|
+
app.add_url_rule(http_path, handler.__name__, handler, methods=methods)
|
53
|
+
|
54
|
+
if os.getenv(PROMETHEUS_EXPORTER_ENV_VAR):
|
55
|
+
from mlflow.server.prometheus_exporter import activate_prometheus_exporter
|
56
|
+
|
57
|
+
prometheus_metrics_path = os.getenv(PROMETHEUS_EXPORTER_ENV_VAR)
|
58
|
+
if not os.path.exists(prometheus_metrics_path):
|
59
|
+
os.makedirs(prometheus_metrics_path)
|
60
|
+
activate_prometheus_exporter(app)
|
61
|
+
|
62
|
+
|
63
|
+
# Provide a health check endpoint to ensure the application is responsive
|
64
|
+
@app.route("/health")
|
65
|
+
def health():
|
66
|
+
return "OK", 200
|
67
|
+
|
68
|
+
|
69
|
+
# Provide an endpoint to query the version of mlflow running on the server
|
70
|
+
@app.route("/version")
|
71
|
+
def version():
|
72
|
+
return VERSION, 200
|
73
|
+
|
74
|
+
|
75
|
+
# Serve the "get-artifact" route.
|
76
|
+
@app.route(_add_static_prefix("/get-artifact"))
|
77
|
+
def serve_artifacts():
|
78
|
+
return get_artifact_handler()
|
79
|
+
|
80
|
+
|
81
|
+
# Serve the "model-versions/get-artifact" route.
|
82
|
+
@app.route(_add_static_prefix("/model-versions/get-artifact"))
|
83
|
+
def serve_model_version_artifact():
|
84
|
+
return get_model_version_artifact_handler()
|
85
|
+
|
86
|
+
|
87
|
+
# Serve the "metrics/get-history-bulk" route.
|
88
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/metrics/get-history-bulk"))
|
89
|
+
def serve_get_metric_history_bulk():
|
90
|
+
return get_metric_history_bulk_handler()
|
91
|
+
|
92
|
+
|
93
|
+
# Serve the "metrics/get-history-bulk-interval" route.
|
94
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/metrics/get-history-bulk-interval"))
|
95
|
+
def serve_get_metric_history_bulk_interval():
|
96
|
+
return get_metric_history_bulk_interval_handler()
|
97
|
+
|
98
|
+
|
99
|
+
# Serve the "experiments/search-datasets" route.
|
100
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/experiments/search-datasets"), methods=["POST"])
|
101
|
+
def serve_search_datasets():
|
102
|
+
return search_datasets_handler()
|
103
|
+
|
104
|
+
|
105
|
+
# Serve the "runs/create-promptlab-run" route.
|
106
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/runs/create-promptlab-run"), methods=["POST"])
|
107
|
+
def serve_create_promptlab_run():
|
108
|
+
return create_promptlab_run_handler()
|
109
|
+
|
110
|
+
|
111
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/gateway-proxy"), methods=["POST", "GET"])
|
112
|
+
def serve_gateway_proxy():
|
113
|
+
return gateway_proxy_handler()
|
114
|
+
|
115
|
+
|
116
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/upload-artifact"), methods=["POST"])
|
117
|
+
def serve_upload_artifact():
|
118
|
+
return upload_artifact_handler()
|
119
|
+
|
120
|
+
|
121
|
+
# Serve the "/get-trace-artifact" route to allow frontend to fetch trace artifacts
|
122
|
+
# and render them in the Trace UI. The request body should contain the request_id
|
123
|
+
# of the trace.
|
124
|
+
@app.route(_add_static_prefix("/ajax-api/2.0/mlflow/get-trace-artifact"), methods=["GET"])
|
125
|
+
def serve_get_trace_artifact():
|
126
|
+
return get_trace_artifact_handler()
|
127
|
+
|
128
|
+
|
129
|
+
@app.route(
|
130
|
+
_add_static_prefix("/ajax-api/2.0/mlflow/logged-models/<model_id>/artifacts/files"),
|
131
|
+
methods=["GET"],
|
132
|
+
)
|
133
|
+
def serve_get_logged_model_artifact(model_id: str):
|
134
|
+
return get_logged_model_artifact_handler(model_id)
|
135
|
+
|
136
|
+
|
137
|
+
# Genesis-Flow: No static files to serve (UI removed)
|
138
|
+
@app.route(_add_static_prefix("/static-files/<path:path>"))
|
139
|
+
def serve_static_file(path):
|
140
|
+
return Response("Genesis-Flow: Static files not available (UI removed)", status=404, mimetype="text/plain")
|
141
|
+
|
142
|
+
|
143
|
+
# Genesis-Flow: API-only server, no UI
|
144
|
+
@app.route(_add_static_prefix("/"))
|
145
|
+
def serve():
|
146
|
+
text = textwrap.dedent(
|
147
|
+
"""
|
148
|
+
Genesis-Flow API Server
|
149
|
+
|
150
|
+
This is an API-only MLflow-compatible server without UI components.
|
151
|
+
Access the REST API endpoints at /api/2.0/mlflow/
|
152
|
+
|
153
|
+
Health check: /health
|
154
|
+
Version: /version
|
155
|
+
"""
|
156
|
+
)
|
157
|
+
return Response(text, mimetype="text/plain")
|
158
|
+
|
159
|
+
|
160
|
+
def _find_app(app_name: str) -> str:
|
161
|
+
apps = get_entry_points("mlflow.app")
|
162
|
+
for app in apps:
|
163
|
+
if app.name == app_name:
|
164
|
+
return app.value
|
165
|
+
|
166
|
+
raise MlflowException(
|
167
|
+
f"Failed to find app '{app_name}'. Available apps: {[a.name for a in apps]}"
|
168
|
+
)
|
169
|
+
|
170
|
+
|
171
|
+
def _is_factory(app: str) -> bool:
|
172
|
+
"""
|
173
|
+
Returns True if the given app is a factory function, False otherwise.
|
174
|
+
|
175
|
+
Args:
|
176
|
+
app: The app to check, e.g. "mlflow.server.app:app
|
177
|
+
"""
|
178
|
+
module, obj_name = app.rsplit(":", 1)
|
179
|
+
mod = importlib.import_module(module)
|
180
|
+
obj = getattr(mod, obj_name)
|
181
|
+
return isinstance(obj, types.FunctionType)
|
182
|
+
|
183
|
+
|
184
|
+
def get_app_client(app_name: str, *args, **kwargs):
|
185
|
+
"""
|
186
|
+
Instantiate a client provided by an app.
|
187
|
+
|
188
|
+
Args:
|
189
|
+
app_name: The app name defined in `setup.py`, e.g., "basic-auth".
|
190
|
+
args: Additional arguments passed to the app client constructor.
|
191
|
+
kwargs: Additional keyword arguments passed to the app client constructor.
|
192
|
+
|
193
|
+
Returns:
|
194
|
+
An app client instance.
|
195
|
+
"""
|
196
|
+
clients = get_entry_points("mlflow.app.client")
|
197
|
+
for client in clients:
|
198
|
+
if client.name == app_name:
|
199
|
+
cls = client.load()
|
200
|
+
return cls(*args, **kwargs)
|
201
|
+
|
202
|
+
raise MlflowException(
|
203
|
+
f"Failed to find client for '{app_name}'. Available clients: {[c.name for c in clients]}"
|
204
|
+
)
|
205
|
+
|
206
|
+
|
207
|
+
def _build_waitress_command(waitress_opts, host, port, app_name, is_factory):
|
208
|
+
opts = shlex.split(waitress_opts) if waitress_opts else []
|
209
|
+
return [
|
210
|
+
sys.executable,
|
211
|
+
"-m",
|
212
|
+
"waitress",
|
213
|
+
*opts,
|
214
|
+
f"--host={host}",
|
215
|
+
f"--port={port}",
|
216
|
+
"--ident=mlflow",
|
217
|
+
*(["--call"] if is_factory else []),
|
218
|
+
app_name,
|
219
|
+
]
|
220
|
+
|
221
|
+
|
222
|
+
def _build_gunicorn_command(gunicorn_opts, host, port, workers, app_name):
|
223
|
+
bind_address = f"{host}:{port}"
|
224
|
+
opts = shlex.split(gunicorn_opts) if gunicorn_opts else []
|
225
|
+
return [
|
226
|
+
sys.executable,
|
227
|
+
"-m",
|
228
|
+
"gunicorn",
|
229
|
+
*opts,
|
230
|
+
"-b",
|
231
|
+
bind_address,
|
232
|
+
"-w",
|
233
|
+
str(workers),
|
234
|
+
app_name,
|
235
|
+
]
|
236
|
+
|
237
|
+
|
238
|
+
def _run_server( # noqa: D417
|
239
|
+
file_store_path,
|
240
|
+
registry_store_uri,
|
241
|
+
default_artifact_root,
|
242
|
+
serve_artifacts,
|
243
|
+
artifacts_only,
|
244
|
+
artifacts_destination,
|
245
|
+
host,
|
246
|
+
port,
|
247
|
+
static_prefix=None,
|
248
|
+
workers=None,
|
249
|
+
gunicorn_opts=None,
|
250
|
+
waitress_opts=None,
|
251
|
+
expose_prometheus=None,
|
252
|
+
app_name=None,
|
253
|
+
):
|
254
|
+
"""
|
255
|
+
Run the MLflow server, wrapping it in gunicorn or waitress on windows
|
256
|
+
|
257
|
+
Args:
|
258
|
+
static_prefix: If set, the index.html asset will be served from the path static_prefix.
|
259
|
+
If left None, the index.html asset will be served from the root path.
|
260
|
+
|
261
|
+
Returns:
|
262
|
+
None
|
263
|
+
"""
|
264
|
+
env_map = {}
|
265
|
+
if file_store_path:
|
266
|
+
env_map[BACKEND_STORE_URI_ENV_VAR] = file_store_path
|
267
|
+
if registry_store_uri:
|
268
|
+
env_map[REGISTRY_STORE_URI_ENV_VAR] = registry_store_uri
|
269
|
+
if default_artifact_root:
|
270
|
+
env_map[ARTIFACT_ROOT_ENV_VAR] = default_artifact_root
|
271
|
+
if serve_artifacts:
|
272
|
+
env_map[SERVE_ARTIFACTS_ENV_VAR] = "true"
|
273
|
+
if artifacts_only:
|
274
|
+
env_map[ARTIFACTS_ONLY_ENV_VAR] = "true"
|
275
|
+
if artifacts_destination:
|
276
|
+
env_map[ARTIFACTS_DESTINATION_ENV_VAR] = artifacts_destination
|
277
|
+
if static_prefix:
|
278
|
+
env_map[STATIC_PREFIX_ENV_VAR] = static_prefix
|
279
|
+
|
280
|
+
if expose_prometheus:
|
281
|
+
env_map[PROMETHEUS_EXPORTER_ENV_VAR] = expose_prometheus
|
282
|
+
|
283
|
+
secret_key = MLFLOW_FLASK_SERVER_SECRET_KEY.get()
|
284
|
+
if secret_key:
|
285
|
+
env_map[MLFLOW_FLASK_SERVER_SECRET_KEY.name] = secret_key
|
286
|
+
|
287
|
+
if app_name is None:
|
288
|
+
app = f"{__name__}:app"
|
289
|
+
is_factory = False
|
290
|
+
else:
|
291
|
+
app = _find_app(app_name)
|
292
|
+
is_factory = _is_factory(app)
|
293
|
+
# `waitress` doesn't support `()` syntax for factory functions.
|
294
|
+
# Instead, we need to use the `--call` flag.
|
295
|
+
app = f"{app}()" if (not is_windows() and is_factory) else app
|
296
|
+
|
297
|
+
# TODO: eventually may want waitress on non-win32
|
298
|
+
if sys.platform == "win32":
|
299
|
+
full_command = _build_waitress_command(waitress_opts, host, port, app, is_factory)
|
300
|
+
else:
|
301
|
+
full_command = _build_gunicorn_command(gunicorn_opts, host, port, workers or 4, app)
|
302
|
+
_exec_cmd(full_command, extra_env=env_map, capture_output=False)
|