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.
Files changed (645) hide show
  1. genesis_flow-1.0.0.dist-info/METADATA +822 -0
  2. genesis_flow-1.0.0.dist-info/RECORD +645 -0
  3. genesis_flow-1.0.0.dist-info/WHEEL +5 -0
  4. genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
  5. genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
  6. genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
  7. mlflow/__init__.py +367 -0
  8. mlflow/__main__.py +3 -0
  9. mlflow/ag2/__init__.py +56 -0
  10. mlflow/ag2/ag2_logger.py +294 -0
  11. mlflow/anthropic/__init__.py +40 -0
  12. mlflow/anthropic/autolog.py +129 -0
  13. mlflow/anthropic/chat.py +144 -0
  14. mlflow/artifacts/__init__.py +268 -0
  15. mlflow/autogen/__init__.py +144 -0
  16. mlflow/autogen/chat.py +142 -0
  17. mlflow/azure/__init__.py +26 -0
  18. mlflow/azure/auth_handler.py +257 -0
  19. mlflow/azure/client.py +319 -0
  20. mlflow/azure/config.py +120 -0
  21. mlflow/azure/connection_factory.py +340 -0
  22. mlflow/azure/exceptions.py +27 -0
  23. mlflow/azure/stores.py +327 -0
  24. mlflow/azure/utils.py +183 -0
  25. mlflow/bedrock/__init__.py +45 -0
  26. mlflow/bedrock/_autolog.py +202 -0
  27. mlflow/bedrock/chat.py +122 -0
  28. mlflow/bedrock/stream.py +160 -0
  29. mlflow/bedrock/utils.py +43 -0
  30. mlflow/cli.py +707 -0
  31. mlflow/client.py +12 -0
  32. mlflow/config/__init__.py +56 -0
  33. mlflow/crewai/__init__.py +79 -0
  34. mlflow/crewai/autolog.py +253 -0
  35. mlflow/crewai/chat.py +29 -0
  36. mlflow/data/__init__.py +75 -0
  37. mlflow/data/artifact_dataset_sources.py +170 -0
  38. mlflow/data/code_dataset_source.py +40 -0
  39. mlflow/data/dataset.py +123 -0
  40. mlflow/data/dataset_registry.py +168 -0
  41. mlflow/data/dataset_source.py +110 -0
  42. mlflow/data/dataset_source_registry.py +219 -0
  43. mlflow/data/delta_dataset_source.py +167 -0
  44. mlflow/data/digest_utils.py +108 -0
  45. mlflow/data/evaluation_dataset.py +562 -0
  46. mlflow/data/filesystem_dataset_source.py +81 -0
  47. mlflow/data/http_dataset_source.py +145 -0
  48. mlflow/data/huggingface_dataset.py +258 -0
  49. mlflow/data/huggingface_dataset_source.py +118 -0
  50. mlflow/data/meta_dataset.py +104 -0
  51. mlflow/data/numpy_dataset.py +223 -0
  52. mlflow/data/pandas_dataset.py +231 -0
  53. mlflow/data/polars_dataset.py +352 -0
  54. mlflow/data/pyfunc_dataset_mixin.py +31 -0
  55. mlflow/data/schema.py +76 -0
  56. mlflow/data/sources.py +1 -0
  57. mlflow/data/spark_dataset.py +406 -0
  58. mlflow/data/spark_dataset_source.py +74 -0
  59. mlflow/data/spark_delta_utils.py +118 -0
  60. mlflow/data/tensorflow_dataset.py +350 -0
  61. mlflow/data/uc_volume_dataset_source.py +81 -0
  62. mlflow/db.py +27 -0
  63. mlflow/dspy/__init__.py +17 -0
  64. mlflow/dspy/autolog.py +197 -0
  65. mlflow/dspy/callback.py +398 -0
  66. mlflow/dspy/constant.py +1 -0
  67. mlflow/dspy/load.py +93 -0
  68. mlflow/dspy/save.py +393 -0
  69. mlflow/dspy/util.py +109 -0
  70. mlflow/dspy/wrapper.py +226 -0
  71. mlflow/entities/__init__.py +104 -0
  72. mlflow/entities/_mlflow_object.py +52 -0
  73. mlflow/entities/assessment.py +545 -0
  74. mlflow/entities/assessment_error.py +80 -0
  75. mlflow/entities/assessment_source.py +141 -0
  76. mlflow/entities/dataset.py +92 -0
  77. mlflow/entities/dataset_input.py +51 -0
  78. mlflow/entities/dataset_summary.py +62 -0
  79. mlflow/entities/document.py +48 -0
  80. mlflow/entities/experiment.py +109 -0
  81. mlflow/entities/experiment_tag.py +35 -0
  82. mlflow/entities/file_info.py +45 -0
  83. mlflow/entities/input_tag.py +35 -0
  84. mlflow/entities/lifecycle_stage.py +35 -0
  85. mlflow/entities/logged_model.py +228 -0
  86. mlflow/entities/logged_model_input.py +26 -0
  87. mlflow/entities/logged_model_output.py +32 -0
  88. mlflow/entities/logged_model_parameter.py +46 -0
  89. mlflow/entities/logged_model_status.py +74 -0
  90. mlflow/entities/logged_model_tag.py +33 -0
  91. mlflow/entities/metric.py +200 -0
  92. mlflow/entities/model_registry/__init__.py +29 -0
  93. mlflow/entities/model_registry/_model_registry_entity.py +13 -0
  94. mlflow/entities/model_registry/model_version.py +243 -0
  95. mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
  96. mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
  97. mlflow/entities/model_registry/model_version_search.py +25 -0
  98. mlflow/entities/model_registry/model_version_stages.py +25 -0
  99. mlflow/entities/model_registry/model_version_status.py +35 -0
  100. mlflow/entities/model_registry/model_version_tag.py +35 -0
  101. mlflow/entities/model_registry/prompt.py +73 -0
  102. mlflow/entities/model_registry/prompt_version.py +244 -0
  103. mlflow/entities/model_registry/registered_model.py +175 -0
  104. mlflow/entities/model_registry/registered_model_alias.py +35 -0
  105. mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
  106. mlflow/entities/model_registry/registered_model_search.py +25 -0
  107. mlflow/entities/model_registry/registered_model_tag.py +35 -0
  108. mlflow/entities/multipart_upload.py +74 -0
  109. mlflow/entities/param.py +49 -0
  110. mlflow/entities/run.py +97 -0
  111. mlflow/entities/run_data.py +84 -0
  112. mlflow/entities/run_info.py +188 -0
  113. mlflow/entities/run_inputs.py +59 -0
  114. mlflow/entities/run_outputs.py +43 -0
  115. mlflow/entities/run_status.py +41 -0
  116. mlflow/entities/run_tag.py +36 -0
  117. mlflow/entities/source_type.py +31 -0
  118. mlflow/entities/span.py +774 -0
  119. mlflow/entities/span_event.py +96 -0
  120. mlflow/entities/span_status.py +102 -0
  121. mlflow/entities/trace.py +317 -0
  122. mlflow/entities/trace_data.py +71 -0
  123. mlflow/entities/trace_info.py +220 -0
  124. mlflow/entities/trace_info_v2.py +162 -0
  125. mlflow/entities/trace_location.py +173 -0
  126. mlflow/entities/trace_state.py +39 -0
  127. mlflow/entities/trace_status.py +68 -0
  128. mlflow/entities/view_type.py +51 -0
  129. mlflow/environment_variables.py +866 -0
  130. mlflow/evaluation/__init__.py +16 -0
  131. mlflow/evaluation/assessment.py +369 -0
  132. mlflow/evaluation/evaluation.py +411 -0
  133. mlflow/evaluation/evaluation_tag.py +61 -0
  134. mlflow/evaluation/fluent.py +48 -0
  135. mlflow/evaluation/utils.py +201 -0
  136. mlflow/exceptions.py +213 -0
  137. mlflow/experiments.py +140 -0
  138. mlflow/gemini/__init__.py +81 -0
  139. mlflow/gemini/autolog.py +186 -0
  140. mlflow/gemini/chat.py +261 -0
  141. mlflow/genai/__init__.py +71 -0
  142. mlflow/genai/datasets/__init__.py +67 -0
  143. mlflow/genai/datasets/evaluation_dataset.py +131 -0
  144. mlflow/genai/evaluation/__init__.py +3 -0
  145. mlflow/genai/evaluation/base.py +411 -0
  146. mlflow/genai/evaluation/constant.py +23 -0
  147. mlflow/genai/evaluation/utils.py +244 -0
  148. mlflow/genai/judges/__init__.py +21 -0
  149. mlflow/genai/judges/databricks.py +404 -0
  150. mlflow/genai/label_schemas/__init__.py +153 -0
  151. mlflow/genai/label_schemas/label_schemas.py +209 -0
  152. mlflow/genai/labeling/__init__.py +159 -0
  153. mlflow/genai/labeling/labeling.py +250 -0
  154. mlflow/genai/optimize/__init__.py +13 -0
  155. mlflow/genai/optimize/base.py +198 -0
  156. mlflow/genai/optimize/optimizers/__init__.py +4 -0
  157. mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
  158. mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
  159. mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
  160. mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
  161. mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
  162. mlflow/genai/optimize/types.py +75 -0
  163. mlflow/genai/optimize/util.py +30 -0
  164. mlflow/genai/prompts/__init__.py +206 -0
  165. mlflow/genai/scheduled_scorers.py +431 -0
  166. mlflow/genai/scorers/__init__.py +26 -0
  167. mlflow/genai/scorers/base.py +492 -0
  168. mlflow/genai/scorers/builtin_scorers.py +765 -0
  169. mlflow/genai/scorers/scorer_utils.py +138 -0
  170. mlflow/genai/scorers/validation.py +165 -0
  171. mlflow/genai/utils/data_validation.py +146 -0
  172. mlflow/genai/utils/enum_utils.py +23 -0
  173. mlflow/genai/utils/trace_utils.py +211 -0
  174. mlflow/groq/__init__.py +42 -0
  175. mlflow/groq/_groq_autolog.py +74 -0
  176. mlflow/johnsnowlabs/__init__.py +888 -0
  177. mlflow/langchain/__init__.py +24 -0
  178. mlflow/langchain/api_request_parallel_processor.py +330 -0
  179. mlflow/langchain/autolog.py +147 -0
  180. mlflow/langchain/chat_agent_langgraph.py +340 -0
  181. mlflow/langchain/constant.py +1 -0
  182. mlflow/langchain/constants.py +1 -0
  183. mlflow/langchain/databricks_dependencies.py +444 -0
  184. mlflow/langchain/langchain_tracer.py +597 -0
  185. mlflow/langchain/model.py +919 -0
  186. mlflow/langchain/output_parsers.py +142 -0
  187. mlflow/langchain/retriever_chain.py +153 -0
  188. mlflow/langchain/runnables.py +527 -0
  189. mlflow/langchain/utils/chat.py +402 -0
  190. mlflow/langchain/utils/logging.py +671 -0
  191. mlflow/langchain/utils/serialization.py +36 -0
  192. mlflow/legacy_databricks_cli/__init__.py +0 -0
  193. mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
  194. mlflow/legacy_databricks_cli/configure/provider.py +482 -0
  195. mlflow/litellm/__init__.py +175 -0
  196. mlflow/llama_index/__init__.py +22 -0
  197. mlflow/llama_index/autolog.py +55 -0
  198. mlflow/llama_index/chat.py +43 -0
  199. mlflow/llama_index/constant.py +1 -0
  200. mlflow/llama_index/model.py +577 -0
  201. mlflow/llama_index/pyfunc_wrapper.py +332 -0
  202. mlflow/llama_index/serialize_objects.py +188 -0
  203. mlflow/llama_index/tracer.py +561 -0
  204. mlflow/metrics/__init__.py +479 -0
  205. mlflow/metrics/base.py +39 -0
  206. mlflow/metrics/genai/__init__.py +25 -0
  207. mlflow/metrics/genai/base.py +101 -0
  208. mlflow/metrics/genai/genai_metric.py +771 -0
  209. mlflow/metrics/genai/metric_definitions.py +450 -0
  210. mlflow/metrics/genai/model_utils.py +371 -0
  211. mlflow/metrics/genai/prompt_template.py +68 -0
  212. mlflow/metrics/genai/prompts/__init__.py +0 -0
  213. mlflow/metrics/genai/prompts/v1.py +422 -0
  214. mlflow/metrics/genai/utils.py +6 -0
  215. mlflow/metrics/metric_definitions.py +619 -0
  216. mlflow/mismatch.py +34 -0
  217. mlflow/mistral/__init__.py +34 -0
  218. mlflow/mistral/autolog.py +71 -0
  219. mlflow/mistral/chat.py +135 -0
  220. mlflow/ml_package_versions.py +452 -0
  221. mlflow/models/__init__.py +97 -0
  222. mlflow/models/auth_policy.py +83 -0
  223. mlflow/models/cli.py +354 -0
  224. mlflow/models/container/__init__.py +294 -0
  225. mlflow/models/container/scoring_server/__init__.py +0 -0
  226. mlflow/models/container/scoring_server/nginx.conf +39 -0
  227. mlflow/models/dependencies_schemas.py +287 -0
  228. mlflow/models/display_utils.py +158 -0
  229. mlflow/models/docker_utils.py +211 -0
  230. mlflow/models/evaluation/__init__.py +23 -0
  231. mlflow/models/evaluation/_shap_patch.py +64 -0
  232. mlflow/models/evaluation/artifacts.py +194 -0
  233. mlflow/models/evaluation/base.py +1811 -0
  234. mlflow/models/evaluation/calibration_curve.py +109 -0
  235. mlflow/models/evaluation/default_evaluator.py +996 -0
  236. mlflow/models/evaluation/deprecated.py +23 -0
  237. mlflow/models/evaluation/evaluator_registry.py +80 -0
  238. mlflow/models/evaluation/evaluators/classifier.py +704 -0
  239. mlflow/models/evaluation/evaluators/default.py +233 -0
  240. mlflow/models/evaluation/evaluators/regressor.py +96 -0
  241. mlflow/models/evaluation/evaluators/shap.py +296 -0
  242. mlflow/models/evaluation/lift_curve.py +178 -0
  243. mlflow/models/evaluation/utils/metric.py +123 -0
  244. mlflow/models/evaluation/utils/trace.py +179 -0
  245. mlflow/models/evaluation/validation.py +434 -0
  246. mlflow/models/flavor_backend.py +93 -0
  247. mlflow/models/flavor_backend_registry.py +53 -0
  248. mlflow/models/model.py +1639 -0
  249. mlflow/models/model_config.py +150 -0
  250. mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
  251. mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
  252. mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
  253. mlflow/models/python_api.py +369 -0
  254. mlflow/models/rag_signatures.py +128 -0
  255. mlflow/models/resources.py +321 -0
  256. mlflow/models/signature.py +662 -0
  257. mlflow/models/utils.py +2054 -0
  258. mlflow/models/wheeled_model.py +280 -0
  259. mlflow/openai/__init__.py +57 -0
  260. mlflow/openai/_agent_tracer.py +364 -0
  261. mlflow/openai/api_request_parallel_processor.py +131 -0
  262. mlflow/openai/autolog.py +509 -0
  263. mlflow/openai/constant.py +1 -0
  264. mlflow/openai/model.py +824 -0
  265. mlflow/openai/utils/chat_schema.py +367 -0
  266. mlflow/optuna/__init__.py +3 -0
  267. mlflow/optuna/storage.py +646 -0
  268. mlflow/plugins/__init__.py +72 -0
  269. mlflow/plugins/base.py +358 -0
  270. mlflow/plugins/builtin/__init__.py +24 -0
  271. mlflow/plugins/builtin/pytorch_plugin.py +150 -0
  272. mlflow/plugins/builtin/sklearn_plugin.py +158 -0
  273. mlflow/plugins/builtin/transformers_plugin.py +187 -0
  274. mlflow/plugins/cli.py +321 -0
  275. mlflow/plugins/discovery.py +340 -0
  276. mlflow/plugins/manager.py +465 -0
  277. mlflow/plugins/registry.py +316 -0
  278. mlflow/plugins/templates/framework_plugin_template.py +329 -0
  279. mlflow/prompt/constants.py +20 -0
  280. mlflow/prompt/promptlab_model.py +197 -0
  281. mlflow/prompt/registry_utils.py +248 -0
  282. mlflow/promptflow/__init__.py +495 -0
  283. mlflow/protos/__init__.py +0 -0
  284. mlflow/protos/assessments_pb2.py +174 -0
  285. mlflow/protos/databricks_artifacts_pb2.py +489 -0
  286. mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
  287. mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
  288. mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
  289. mlflow/protos/databricks_pb2.py +267 -0
  290. mlflow/protos/databricks_trace_server_pb2.py +374 -0
  291. mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
  292. mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
  293. mlflow/protos/facet_feature_statistics_pb2.py +296 -0
  294. mlflow/protos/internal_pb2.py +77 -0
  295. mlflow/protos/mlflow_artifacts_pb2.py +336 -0
  296. mlflow/protos/model_registry_pb2.py +1073 -0
  297. mlflow/protos/scalapb/__init__.py +0 -0
  298. mlflow/protos/scalapb/scalapb_pb2.py +104 -0
  299. mlflow/protos/service_pb2.py +2600 -0
  300. mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
  301. mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
  302. mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
  303. mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
  304. mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
  305. mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
  306. mlflow/py.typed +0 -0
  307. mlflow/pydantic_ai/__init__.py +57 -0
  308. mlflow/pydantic_ai/autolog.py +173 -0
  309. mlflow/pyfunc/__init__.py +3844 -0
  310. mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
  311. mlflow/pyfunc/backend.py +523 -0
  312. mlflow/pyfunc/context.py +78 -0
  313. mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
  314. mlflow/pyfunc/loaders/__init__.py +7 -0
  315. mlflow/pyfunc/loaders/chat_agent.py +117 -0
  316. mlflow/pyfunc/loaders/chat_model.py +125 -0
  317. mlflow/pyfunc/loaders/code_model.py +31 -0
  318. mlflow/pyfunc/loaders/responses_agent.py +112 -0
  319. mlflow/pyfunc/mlserver.py +46 -0
  320. mlflow/pyfunc/model.py +1473 -0
  321. mlflow/pyfunc/scoring_server/__init__.py +604 -0
  322. mlflow/pyfunc/scoring_server/app.py +7 -0
  323. mlflow/pyfunc/scoring_server/client.py +146 -0
  324. mlflow/pyfunc/spark_model_cache.py +48 -0
  325. mlflow/pyfunc/stdin_server.py +44 -0
  326. mlflow/pyfunc/utils/__init__.py +3 -0
  327. mlflow/pyfunc/utils/data_validation.py +224 -0
  328. mlflow/pyfunc/utils/environment.py +22 -0
  329. mlflow/pyfunc/utils/input_converter.py +47 -0
  330. mlflow/pyfunc/utils/serving_data_parser.py +11 -0
  331. mlflow/pytorch/__init__.py +1171 -0
  332. mlflow/pytorch/_lightning_autolog.py +580 -0
  333. mlflow/pytorch/_pytorch_autolog.py +50 -0
  334. mlflow/pytorch/pickle_module.py +35 -0
  335. mlflow/rfunc/__init__.py +42 -0
  336. mlflow/rfunc/backend.py +134 -0
  337. mlflow/runs.py +89 -0
  338. mlflow/server/__init__.py +302 -0
  339. mlflow/server/auth/__init__.py +1224 -0
  340. mlflow/server/auth/__main__.py +4 -0
  341. mlflow/server/auth/basic_auth.ini +6 -0
  342. mlflow/server/auth/cli.py +11 -0
  343. mlflow/server/auth/client.py +537 -0
  344. mlflow/server/auth/config.py +34 -0
  345. mlflow/server/auth/db/__init__.py +0 -0
  346. mlflow/server/auth/db/cli.py +18 -0
  347. mlflow/server/auth/db/migrations/__init__.py +0 -0
  348. mlflow/server/auth/db/migrations/alembic.ini +110 -0
  349. mlflow/server/auth/db/migrations/env.py +76 -0
  350. mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
  351. mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
  352. mlflow/server/auth/db/models.py +67 -0
  353. mlflow/server/auth/db/utils.py +37 -0
  354. mlflow/server/auth/entities.py +165 -0
  355. mlflow/server/auth/logo.py +14 -0
  356. mlflow/server/auth/permissions.py +65 -0
  357. mlflow/server/auth/routes.py +18 -0
  358. mlflow/server/auth/sqlalchemy_store.py +263 -0
  359. mlflow/server/graphql/__init__.py +0 -0
  360. mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
  361. mlflow/server/graphql/graphql_custom_scalars.py +24 -0
  362. mlflow/server/graphql/graphql_errors.py +15 -0
  363. mlflow/server/graphql/graphql_no_batching.py +89 -0
  364. mlflow/server/graphql/graphql_schema_extensions.py +74 -0
  365. mlflow/server/handlers.py +3217 -0
  366. mlflow/server/prometheus_exporter.py +17 -0
  367. mlflow/server/validation.py +30 -0
  368. mlflow/shap/__init__.py +691 -0
  369. mlflow/sklearn/__init__.py +1994 -0
  370. mlflow/sklearn/utils.py +1041 -0
  371. mlflow/smolagents/__init__.py +66 -0
  372. mlflow/smolagents/autolog.py +139 -0
  373. mlflow/smolagents/chat.py +29 -0
  374. mlflow/store/__init__.py +10 -0
  375. mlflow/store/_unity_catalog/__init__.py +1 -0
  376. mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
  377. mlflow/store/_unity_catalog/lineage/constants.py +2 -0
  378. mlflow/store/_unity_catalog/registry/__init__.py +6 -0
  379. mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
  380. mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
  381. mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
  382. mlflow/store/_unity_catalog/registry/utils.py +121 -0
  383. mlflow/store/artifact/__init__.py +0 -0
  384. mlflow/store/artifact/artifact_repo.py +472 -0
  385. mlflow/store/artifact/artifact_repository_registry.py +154 -0
  386. mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
  387. mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
  388. mlflow/store/artifact/cli.py +141 -0
  389. mlflow/store/artifact/cloud_artifact_repo.py +332 -0
  390. mlflow/store/artifact/databricks_artifact_repo.py +729 -0
  391. mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
  392. mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
  393. mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
  394. mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
  395. mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
  396. mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
  397. mlflow/store/artifact/ftp_artifact_repo.py +132 -0
  398. mlflow/store/artifact/gcs_artifact_repo.py +296 -0
  399. mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
  400. mlflow/store/artifact/http_artifact_repo.py +218 -0
  401. mlflow/store/artifact/local_artifact_repo.py +142 -0
  402. mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
  403. mlflow/store/artifact/models_artifact_repo.py +259 -0
  404. mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
  405. mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
  406. mlflow/store/artifact/r2_artifact_repo.py +70 -0
  407. mlflow/store/artifact/runs_artifact_repo.py +265 -0
  408. mlflow/store/artifact/s3_artifact_repo.py +330 -0
  409. mlflow/store/artifact/sftp_artifact_repo.py +141 -0
  410. mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
  411. mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
  412. mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
  413. mlflow/store/artifact/utils/__init__.py +0 -0
  414. mlflow/store/artifact/utils/models.py +148 -0
  415. mlflow/store/db/__init__.py +0 -0
  416. mlflow/store/db/base_sql_model.py +3 -0
  417. mlflow/store/db/db_types.py +10 -0
  418. mlflow/store/db/utils.py +314 -0
  419. mlflow/store/db_migrations/__init__.py +0 -0
  420. mlflow/store/db_migrations/alembic.ini +74 -0
  421. mlflow/store/db_migrations/env.py +84 -0
  422. mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
  423. mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
  424. mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
  425. mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
  426. mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
  427. mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
  428. mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
  429. mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
  430. mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
  431. mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
  432. mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
  433. mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
  434. mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
  435. mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
  436. mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
  437. mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
  438. mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
  439. mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
  440. mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
  441. mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
  442. mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
  443. mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
  444. mlflow/store/db_migrations/versions/__init__.py +0 -0
  445. mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
  446. mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
  447. mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
  448. mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
  449. mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
  450. mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
  451. mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
  452. mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
  453. mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
  454. mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
  455. mlflow/store/entities/__init__.py +3 -0
  456. mlflow/store/entities/paged_list.py +18 -0
  457. mlflow/store/model_registry/__init__.py +10 -0
  458. mlflow/store/model_registry/abstract_store.py +1081 -0
  459. mlflow/store/model_registry/base_rest_store.py +44 -0
  460. mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
  461. mlflow/store/model_registry/dbmodels/__init__.py +0 -0
  462. mlflow/store/model_registry/dbmodels/models.py +206 -0
  463. mlflow/store/model_registry/file_store.py +1091 -0
  464. mlflow/store/model_registry/rest_store.py +481 -0
  465. mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
  466. mlflow/store/tracking/__init__.py +23 -0
  467. mlflow/store/tracking/abstract_store.py +816 -0
  468. mlflow/store/tracking/dbmodels/__init__.py +0 -0
  469. mlflow/store/tracking/dbmodels/initial_models.py +243 -0
  470. mlflow/store/tracking/dbmodels/models.py +1073 -0
  471. mlflow/store/tracking/file_store.py +2438 -0
  472. mlflow/store/tracking/postgres_managed_identity.py +146 -0
  473. mlflow/store/tracking/rest_store.py +1131 -0
  474. mlflow/store/tracking/sqlalchemy_store.py +2785 -0
  475. mlflow/system_metrics/__init__.py +61 -0
  476. mlflow/system_metrics/metrics/__init__.py +0 -0
  477. mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
  478. mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
  479. mlflow/system_metrics/metrics/disk_monitor.py +21 -0
  480. mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
  481. mlflow/system_metrics/metrics/network_monitor.py +34 -0
  482. mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
  483. mlflow/system_metrics/system_metrics_monitor.py +198 -0
  484. mlflow/tracing/__init__.py +16 -0
  485. mlflow/tracing/assessment.py +356 -0
  486. mlflow/tracing/client.py +531 -0
  487. mlflow/tracing/config.py +125 -0
  488. mlflow/tracing/constant.py +105 -0
  489. mlflow/tracing/destination.py +81 -0
  490. mlflow/tracing/display/__init__.py +40 -0
  491. mlflow/tracing/display/display_handler.py +196 -0
  492. mlflow/tracing/export/async_export_queue.py +186 -0
  493. mlflow/tracing/export/inference_table.py +138 -0
  494. mlflow/tracing/export/mlflow_v3.py +137 -0
  495. mlflow/tracing/export/utils.py +70 -0
  496. mlflow/tracing/fluent.py +1417 -0
  497. mlflow/tracing/processor/base_mlflow.py +199 -0
  498. mlflow/tracing/processor/inference_table.py +175 -0
  499. mlflow/tracing/processor/mlflow_v3.py +47 -0
  500. mlflow/tracing/processor/otel.py +73 -0
  501. mlflow/tracing/provider.py +487 -0
  502. mlflow/tracing/trace_manager.py +200 -0
  503. mlflow/tracing/utils/__init__.py +616 -0
  504. mlflow/tracing/utils/artifact_utils.py +28 -0
  505. mlflow/tracing/utils/copy.py +55 -0
  506. mlflow/tracing/utils/environment.py +55 -0
  507. mlflow/tracing/utils/exception.py +21 -0
  508. mlflow/tracing/utils/once.py +35 -0
  509. mlflow/tracing/utils/otlp.py +63 -0
  510. mlflow/tracing/utils/processor.py +54 -0
  511. mlflow/tracing/utils/search.py +292 -0
  512. mlflow/tracing/utils/timeout.py +250 -0
  513. mlflow/tracing/utils/token.py +19 -0
  514. mlflow/tracing/utils/truncation.py +124 -0
  515. mlflow/tracing/utils/warning.py +76 -0
  516. mlflow/tracking/__init__.py +39 -0
  517. mlflow/tracking/_model_registry/__init__.py +1 -0
  518. mlflow/tracking/_model_registry/client.py +764 -0
  519. mlflow/tracking/_model_registry/fluent.py +853 -0
  520. mlflow/tracking/_model_registry/registry.py +67 -0
  521. mlflow/tracking/_model_registry/utils.py +251 -0
  522. mlflow/tracking/_tracking_service/__init__.py +0 -0
  523. mlflow/tracking/_tracking_service/client.py +883 -0
  524. mlflow/tracking/_tracking_service/registry.py +56 -0
  525. mlflow/tracking/_tracking_service/utils.py +275 -0
  526. mlflow/tracking/artifact_utils.py +179 -0
  527. mlflow/tracking/client.py +5900 -0
  528. mlflow/tracking/context/__init__.py +0 -0
  529. mlflow/tracking/context/abstract_context.py +35 -0
  530. mlflow/tracking/context/databricks_cluster_context.py +15 -0
  531. mlflow/tracking/context/databricks_command_context.py +15 -0
  532. mlflow/tracking/context/databricks_job_context.py +49 -0
  533. mlflow/tracking/context/databricks_notebook_context.py +41 -0
  534. mlflow/tracking/context/databricks_repo_context.py +43 -0
  535. mlflow/tracking/context/default_context.py +51 -0
  536. mlflow/tracking/context/git_context.py +32 -0
  537. mlflow/tracking/context/registry.py +98 -0
  538. mlflow/tracking/context/system_environment_context.py +15 -0
  539. mlflow/tracking/default_experiment/__init__.py +1 -0
  540. mlflow/tracking/default_experiment/abstract_context.py +43 -0
  541. mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
  542. mlflow/tracking/default_experiment/registry.py +75 -0
  543. mlflow/tracking/fluent.py +3595 -0
  544. mlflow/tracking/metric_value_conversion_utils.py +93 -0
  545. mlflow/tracking/multimedia.py +206 -0
  546. mlflow/tracking/registry.py +86 -0
  547. mlflow/tracking/request_auth/__init__.py +0 -0
  548. mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
  549. mlflow/tracking/request_auth/registry.py +60 -0
  550. mlflow/tracking/request_header/__init__.py +0 -0
  551. mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
  552. mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
  553. mlflow/tracking/request_header/default_request_header_provider.py +17 -0
  554. mlflow/tracking/request_header/registry.py +79 -0
  555. mlflow/transformers/__init__.py +2982 -0
  556. mlflow/transformers/flavor_config.py +258 -0
  557. mlflow/transformers/hub_utils.py +83 -0
  558. mlflow/transformers/llm_inference_utils.py +468 -0
  559. mlflow/transformers/model_io.py +301 -0
  560. mlflow/transformers/peft.py +51 -0
  561. mlflow/transformers/signature.py +183 -0
  562. mlflow/transformers/torch_utils.py +55 -0
  563. mlflow/types/__init__.py +21 -0
  564. mlflow/types/agent.py +270 -0
  565. mlflow/types/chat.py +240 -0
  566. mlflow/types/llm.py +935 -0
  567. mlflow/types/responses.py +139 -0
  568. mlflow/types/responses_helpers.py +416 -0
  569. mlflow/types/schema.py +1505 -0
  570. mlflow/types/type_hints.py +647 -0
  571. mlflow/types/utils.py +753 -0
  572. mlflow/utils/__init__.py +283 -0
  573. mlflow/utils/_capture_modules.py +256 -0
  574. mlflow/utils/_capture_transformers_modules.py +75 -0
  575. mlflow/utils/_spark_utils.py +201 -0
  576. mlflow/utils/_unity_catalog_oss_utils.py +97 -0
  577. mlflow/utils/_unity_catalog_utils.py +479 -0
  578. mlflow/utils/annotations.py +218 -0
  579. mlflow/utils/arguments_utils.py +16 -0
  580. mlflow/utils/async_logging/__init__.py +1 -0
  581. mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
  582. mlflow/utils/async_logging/async_logging_queue.py +366 -0
  583. mlflow/utils/async_logging/run_artifact.py +38 -0
  584. mlflow/utils/async_logging/run_batch.py +58 -0
  585. mlflow/utils/async_logging/run_operations.py +49 -0
  586. mlflow/utils/autologging_utils/__init__.py +737 -0
  587. mlflow/utils/autologging_utils/client.py +432 -0
  588. mlflow/utils/autologging_utils/config.py +33 -0
  589. mlflow/utils/autologging_utils/events.py +294 -0
  590. mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
  591. mlflow/utils/autologging_utils/metrics_queue.py +71 -0
  592. mlflow/utils/autologging_utils/safety.py +1104 -0
  593. mlflow/utils/autologging_utils/versioning.py +95 -0
  594. mlflow/utils/checkpoint_utils.py +206 -0
  595. mlflow/utils/class_utils.py +6 -0
  596. mlflow/utils/cli_args.py +257 -0
  597. mlflow/utils/conda.py +354 -0
  598. mlflow/utils/credentials.py +231 -0
  599. mlflow/utils/data_utils.py +17 -0
  600. mlflow/utils/databricks_utils.py +1436 -0
  601. mlflow/utils/docstring_utils.py +477 -0
  602. mlflow/utils/doctor.py +133 -0
  603. mlflow/utils/download_cloud_file_chunk.py +43 -0
  604. mlflow/utils/env_manager.py +16 -0
  605. mlflow/utils/env_pack.py +131 -0
  606. mlflow/utils/environment.py +1009 -0
  607. mlflow/utils/exception_utils.py +14 -0
  608. mlflow/utils/file_utils.py +978 -0
  609. mlflow/utils/git_utils.py +77 -0
  610. mlflow/utils/gorilla.py +797 -0
  611. mlflow/utils/import_hooks/__init__.py +363 -0
  612. mlflow/utils/lazy_load.py +51 -0
  613. mlflow/utils/logging_utils.py +168 -0
  614. mlflow/utils/mime_type_utils.py +58 -0
  615. mlflow/utils/mlflow_tags.py +103 -0
  616. mlflow/utils/model_utils.py +486 -0
  617. mlflow/utils/name_utils.py +346 -0
  618. mlflow/utils/nfs_on_spark.py +62 -0
  619. mlflow/utils/openai_utils.py +164 -0
  620. mlflow/utils/os.py +12 -0
  621. mlflow/utils/oss_registry_utils.py +29 -0
  622. mlflow/utils/plugins.py +17 -0
  623. mlflow/utils/process.py +182 -0
  624. mlflow/utils/promptlab_utils.py +146 -0
  625. mlflow/utils/proto_json_utils.py +743 -0
  626. mlflow/utils/pydantic_utils.py +54 -0
  627. mlflow/utils/request_utils.py +279 -0
  628. mlflow/utils/requirements_utils.py +704 -0
  629. mlflow/utils/rest_utils.py +673 -0
  630. mlflow/utils/search_logged_model_utils.py +127 -0
  631. mlflow/utils/search_utils.py +2111 -0
  632. mlflow/utils/secure_loading.py +221 -0
  633. mlflow/utils/security_validation.py +384 -0
  634. mlflow/utils/server_cli_utils.py +61 -0
  635. mlflow/utils/spark_utils.py +15 -0
  636. mlflow/utils/string_utils.py +138 -0
  637. mlflow/utils/thread_utils.py +63 -0
  638. mlflow/utils/time.py +54 -0
  639. mlflow/utils/timeout.py +42 -0
  640. mlflow/utils/uri.py +572 -0
  641. mlflow/utils/validation.py +662 -0
  642. mlflow/utils/virtualenv.py +458 -0
  643. mlflow/utils/warnings_utils.py +25 -0
  644. mlflow/utils/yaml_utils.py +179 -0
  645. mlflow/version.py +24 -0
@@ -0,0 +1,61 @@
1
+ """
2
+ This script should be executed in a fresh python interpreter process using `subprocess`.
3
+ """
4
+
5
+ import argparse
6
+
7
+ from mlflow.pyfunc.scoring_server import _predict
8
+
9
+
10
+ def parse_args():
11
+ parser = argparse.ArgumentParser()
12
+ parser.add_argument("--model-uri", required=True)
13
+ parser.add_argument("--input-path", required=False)
14
+ parser.add_argument("--output-path", required=False)
15
+ parser.add_argument("--content-type", required=True)
16
+ return parser.parse_args()
17
+
18
+
19
+ # Guidance for fixing missing module error
20
+ _MISSING_MODULE_HELP_MSG = (
21
+ "Exception occurred while running inference: {e}"
22
+ "\n\n"
23
+ "\033[93m[Hint] It appears that your MLflow Model doesn't contain the required "
24
+ "dependency '{missing_module}' to run model inference. When logging a model, MLflow "
25
+ "detects dependencies based on the model flavor, but it is possible that some "
26
+ "dependencies are not captured. In this case, you can manually add dependencies "
27
+ "using the `extra_pip_requirements` parameter of `mlflow.pyfunc.log_model`.\033[0m"
28
+ """
29
+
30
+ \033[1mSample code:\033[0m
31
+ ----
32
+ mlflow.pyfunc.log_model(
33
+ artifact_path="model",
34
+ python_model=your_model,
35
+ extra_pip_requirements=["{missing_module}==x.y.z"]
36
+ )
37
+ ----
38
+
39
+ For mode guidance on fixing missing dependencies, please refer to the MLflow docs:
40
+ https://www.mlflow.org/docs/latest/deployment/index.html#how-to-fix-dependency-errors-when-serving-my-model
41
+ """
42
+ )
43
+
44
+
45
+ def main():
46
+ args = parse_args()
47
+
48
+ try:
49
+ _predict(
50
+ model_uri=args.model_uri,
51
+ input_path=args.input_path if args.input_path else None,
52
+ output_path=args.output_path if args.output_path else None,
53
+ content_type=args.content_type,
54
+ )
55
+ except ModuleNotFoundError as e:
56
+ message = _MISSING_MODULE_HELP_MSG.format(e=str(e), missing_module=e.name)
57
+ raise RuntimeError(message) from e
58
+
59
+
60
+ if __name__ == "__main__":
61
+ main()
@@ -0,0 +1,523 @@
1
+ import ctypes
2
+ import json
3
+ import logging
4
+ import os
5
+ import pathlib
6
+ import shlex
7
+ import signal
8
+ import subprocess
9
+ import sys
10
+ import warnings
11
+ from pathlib import Path
12
+
13
+ from mlflow import pyfunc
14
+ from mlflow.exceptions import MlflowException
15
+ from mlflow.models import FlavorBackend, Model, docker_utils
16
+ from mlflow.models.docker_utils import PYTHON_SLIM_BASE_IMAGE, UBUNTU_BASE_IMAGE
17
+ from mlflow.pyfunc import (
18
+ ENV,
19
+ _extract_conda_env,
20
+ _mlflow_pyfunc_backend_predict,
21
+ mlserver,
22
+ scoring_server,
23
+ )
24
+ from mlflow.tracking.artifact_utils import _download_artifact_from_uri
25
+ from mlflow.utils import env_manager as em
26
+ from mlflow.utils.conda import get_conda_bin_executable, get_or_create_conda_env
27
+ from mlflow.utils.environment import Environment, _get_pip_install_mlflow, _PythonEnv
28
+ from mlflow.utils.file_utils import (
29
+ TempDir,
30
+ get_or_create_nfs_tmp_dir,
31
+ get_or_create_tmp_dir,
32
+ path_to_local_file_uri,
33
+ )
34
+ from mlflow.utils.model_utils import _get_all_flavor_configurations
35
+ from mlflow.utils.nfs_on_spark import get_nfs_cache_root_dir
36
+ from mlflow.utils.os import is_windows
37
+ from mlflow.utils.process import ShellCommandException, cache_return_value_per_process
38
+ from mlflow.utils.virtualenv import _get_or_create_virtualenv
39
+ from mlflow.version import VERSION
40
+
41
+ _logger = logging.getLogger(__name__)
42
+
43
+ _STDIN_SERVER_SCRIPT = Path(__file__).parent.joinpath("stdin_server.py")
44
+
45
+ # Flavors that require Java to be installed in the environment
46
+ JAVA_FLAVORS = {"johnsnowlabs", "h2o", "spark"}
47
+
48
+ # Some flavor requires additional packages to be installed in the environment
49
+ FLAVOR_SPECIFIC_APT_PACKAGES = {
50
+ "lightgbm": ["libgomp1"],
51
+ "paddle": ["libgomp1"],
52
+ }
53
+
54
+ # Directory to store loaded model inside the Docker context directory
55
+ _MODEL_DIR_NAME = "model_dir"
56
+ LOCAL_ENV_MANAGER_ERROR_MESSAGE = "We cannot use 'LOCAL' environment manager "
57
+ "for your model configuration. Please specify a virtualenv or conda environment "
58
+ "manager instead with `--env-manager` argument."
59
+
60
+
61
+ def _set_mlflow_config_env(command_env, model_config):
62
+ if model_config:
63
+ command_env[scoring_server.SERVING_MODEL_CONFIG] = json.dumps(model_config)
64
+ return command_env
65
+
66
+
67
+ class PyFuncBackend(FlavorBackend):
68
+ """
69
+ Flavor backend implementation for the generic python models.
70
+ """
71
+
72
+ def __init__( # noqa: D417
73
+ self,
74
+ config,
75
+ env_manager,
76
+ workers=1,
77
+ install_mlflow=False,
78
+ create_env_root_dir=False,
79
+ env_root_dir=None,
80
+ **kwargs,
81
+ ):
82
+ """
83
+ Args:
84
+ env_manager: Environment manager to use for preparing the environment. If None,
85
+ MLflow will automatically pick the env manager based on the model's flavor
86
+ configuration for generate_dockerfile. It can't be None for other methods.
87
+ env_root_dir: Root path for conda env. If None, use Conda's default environments
88
+ directory. Note if this is set, conda package cache path becomes
89
+ "{env_root_dir}/conda_cache_pkgs" instead of the global package cache
90
+ path, and pip package cache path becomes
91
+ "{env_root_dir}/pip_cache_pkgs" instead of the global package cache
92
+ path.
93
+ """
94
+ super().__init__(config=config, **kwargs)
95
+ self._nworkers = workers or 1
96
+ if env_manager == em.CONDA and ENV not in config:
97
+ warnings.warn(
98
+ "Conda environment is not specified in config `env`. Using local environment."
99
+ )
100
+ env_manager = em.LOCAL
101
+ self._env_manager = env_manager
102
+ self._install_mlflow = install_mlflow
103
+ self._env_id = os.environ.get("MLFLOW_HOME", VERSION) if install_mlflow else None
104
+ self._create_env_root_dir = create_env_root_dir
105
+ self._env_root_dir = env_root_dir
106
+ self._environment = None
107
+
108
+ def prepare_env(
109
+ self, model_uri, capture_output=False, pip_requirements_override=None, extra_envs=None
110
+ ):
111
+ if self._environment is not None:
112
+ return self._environment
113
+
114
+ @cache_return_value_per_process
115
+ def _get_or_create_env_root_dir(should_use_nfs):
116
+ if should_use_nfs:
117
+ root_tmp_dir = get_or_create_nfs_tmp_dir()
118
+ else:
119
+ root_tmp_dir = get_or_create_tmp_dir()
120
+
121
+ envs_root_dir = os.path.join(root_tmp_dir, "envs")
122
+ os.makedirs(envs_root_dir, exist_ok=True)
123
+ return envs_root_dir
124
+
125
+ local_path = _download_artifact_from_uri(model_uri)
126
+ if self._create_env_root_dir:
127
+ if self._env_root_dir is not None:
128
+ raise Exception("env_root_dir can not be set when create_env_root_dir=True")
129
+ nfs_root_dir = get_nfs_cache_root_dir()
130
+ env_root_dir = _get_or_create_env_root_dir(nfs_root_dir is not None)
131
+ else:
132
+ env_root_dir = self._env_root_dir
133
+
134
+ if self._env_manager in {em.VIRTUALENV, em.UV}:
135
+ activate_cmd = _get_or_create_virtualenv(
136
+ local_path,
137
+ self._env_id,
138
+ env_root_dir=env_root_dir,
139
+ capture_output=capture_output,
140
+ pip_requirements_override=pip_requirements_override,
141
+ env_manager=self._env_manager,
142
+ )
143
+ self._environment = Environment(activate_cmd, extra_env=extra_envs)
144
+ elif self._env_manager == em.CONDA:
145
+ conda_env_path = os.path.join(local_path, _extract_conda_env(self._config[ENV]))
146
+ self._environment = get_or_create_conda_env(
147
+ conda_env_path,
148
+ env_id=self._env_id,
149
+ capture_output=capture_output,
150
+ env_root_dir=env_root_dir,
151
+ pip_requirements_override=pip_requirements_override,
152
+ extra_envs=extra_envs,
153
+ )
154
+
155
+ elif self._env_manager == em.LOCAL:
156
+ raise Exception("Prepare env should not be called with local env manager!")
157
+ else:
158
+ raise Exception(f"Unexpected env manager value '{self._env_manager}'")
159
+
160
+ if self._install_mlflow:
161
+ self._environment.execute(_get_pip_install_mlflow())
162
+ else:
163
+ self._environment.execute('python -c ""')
164
+
165
+ return self._environment
166
+
167
+ def predict(
168
+ self,
169
+ model_uri,
170
+ input_path,
171
+ output_path,
172
+ content_type,
173
+ pip_requirements_override=None,
174
+ extra_envs=None,
175
+ ):
176
+ """
177
+ Generate predictions using generic python model saved with MLflow. The expected format of
178
+ the input JSON is the MLflow scoring format.
179
+ Return the prediction results as a JSON.
180
+ """
181
+ local_path = _download_artifact_from_uri(model_uri)
182
+ # NB: Absolute windows paths do not work with mlflow apis, use file uri to ensure
183
+ # platform compatibility.
184
+ local_uri = path_to_local_file_uri(local_path)
185
+
186
+ if self._env_manager != em.LOCAL:
187
+ predict_cmd = [
188
+ "python",
189
+ _mlflow_pyfunc_backend_predict.__file__,
190
+ "--model-uri",
191
+ str(local_uri),
192
+ "--content-type",
193
+ shlex.quote(str(content_type)),
194
+ ]
195
+ if input_path:
196
+ predict_cmd += ["--input-path", shlex.quote(str(input_path))]
197
+ if output_path:
198
+ predict_cmd += ["--output-path", shlex.quote(str(output_path))]
199
+
200
+ if pip_requirements_override and self._env_manager == em.CONDA:
201
+ # Conda use = instead of == for version pinning
202
+ pip_requirements_override = [
203
+ pip_req.replace("==", "=") for pip_req in pip_requirements_override
204
+ ]
205
+
206
+ environment = self.prepare_env(
207
+ local_path,
208
+ pip_requirements_override=pip_requirements_override,
209
+ extra_envs=extra_envs,
210
+ )
211
+
212
+ try:
213
+ environment.execute(" ".join(predict_cmd))
214
+ except ShellCommandException as e:
215
+ raise MlflowException(
216
+ f"{e}\n\nAn exception occurred while running model prediction within a "
217
+ f"{self._env_manager} environment. You can find the error message "
218
+ f"from the prediction subprocess by scrolling above."
219
+ ) from None
220
+ else:
221
+ if pip_requirements_override:
222
+ raise MlflowException(
223
+ "`pip_requirements_override` is not supported for local env manager."
224
+ "Please use conda or virtualenv instead."
225
+ )
226
+ scoring_server._predict(local_uri, input_path, output_path, content_type)
227
+
228
+ def serve(
229
+ self,
230
+ model_uri,
231
+ port,
232
+ host,
233
+ timeout,
234
+ enable_mlserver,
235
+ synchronous=True,
236
+ stdout=None,
237
+ stderr=None,
238
+ model_config=None,
239
+ ):
240
+ """
241
+ Serve pyfunc model locally.
242
+ """
243
+ local_path = _download_artifact_from_uri(model_uri)
244
+
245
+ server_implementation = mlserver if enable_mlserver else scoring_server
246
+ command, command_env = server_implementation.get_cmd(
247
+ local_path, port, host, timeout, self._nworkers
248
+ )
249
+ _set_mlflow_config_env(command_env, model_config)
250
+
251
+ if sys.platform.startswith("linux"):
252
+
253
+ def setup_sigterm_on_parent_death():
254
+ """
255
+ Uses prctl to automatically send SIGTERM to the command process when its parent is
256
+ dead.
257
+
258
+ This handles the case when the parent is a PySpark worker process.
259
+ If a user cancels the PySpark job, the worker process gets killed, regardless of
260
+ PySpark daemon and worker reuse settings.
261
+ We use prctl to ensure the command process receives SIGTERM after spark job
262
+ cancellation.
263
+ The command process itself should handle SIGTERM properly.
264
+ This is a no-op on macOS because prctl is not supported.
265
+
266
+ Note:
267
+ When a pyspark job canceled, the UDF python process are killed by signal "SIGKILL",
268
+ This case neither "atexit" nor signal handler can capture SIGKILL signal.
269
+ prctl is the only way to capture SIGKILL signal.
270
+ """
271
+ try:
272
+ libc = ctypes.CDLL("libc.so.6")
273
+ # Set the parent process death signal of the command process to SIGTERM.
274
+ libc.prctl(1, signal.SIGTERM) # PR_SET_PDEATHSIG, see prctl.h
275
+ except OSError as e:
276
+ # TODO: find approach for supporting MacOS/Windows system which does
277
+ # not support prctl.
278
+ warnings.warn(f"Setup libc.prctl PR_SET_PDEATHSIG failed, error {e!r}.")
279
+
280
+ else:
281
+ setup_sigterm_on_parent_death = None
282
+
283
+ if not is_windows():
284
+ # Add "exec" before the starting scoring server command, so that the scoring server
285
+ # process replaces the bash process, otherwise the scoring server process is created
286
+ # as a child process of the bash process.
287
+ # Note we in `mlflow.pyfunc.spark_udf`, use prctl PR_SET_PDEATHSIG to ensure scoring
288
+ # server process being killed when UDF process exit. The PR_SET_PDEATHSIG can only
289
+ # send signal to the bash process, if the scoring server process is created as a
290
+ # child process of the bash process, then it cannot receive the signal sent by prctl.
291
+ # TODO: For Windows, there's no equivalent things of Unix shell's exec. Windows also
292
+ # does not support prctl. We need to find an approach to address it.
293
+ command = "exec " + command
294
+
295
+ if self._env_manager != em.LOCAL:
296
+ return self.prepare_env(local_path).execute(
297
+ command,
298
+ command_env,
299
+ stdout=stdout,
300
+ stderr=stderr,
301
+ preexec_fn=setup_sigterm_on_parent_death,
302
+ synchronous=synchronous,
303
+ )
304
+ else:
305
+ _logger.info("=== Running command '%s'", command)
306
+
307
+ if not is_windows():
308
+ command = ["bash", "-c", command]
309
+
310
+ child_proc = subprocess.Popen(
311
+ command,
312
+ env=command_env,
313
+ preexec_fn=setup_sigterm_on_parent_death,
314
+ stdout=stdout,
315
+ stderr=stderr,
316
+ )
317
+
318
+ if synchronous:
319
+ rc = child_proc.wait()
320
+ if rc != 0:
321
+ raise Exception(
322
+ f"Command '{command}' returned non zero return code. Return code = {rc}"
323
+ )
324
+ return 0
325
+ else:
326
+ return child_proc
327
+
328
+ def serve_stdin(
329
+ self,
330
+ model_uri,
331
+ stdout=None,
332
+ stderr=None,
333
+ model_config=None,
334
+ ):
335
+ local_path = _download_artifact_from_uri(model_uri)
336
+
337
+ command_env = os.environ.copy()
338
+ _set_mlflow_config_env(command_env, model_config)
339
+
340
+ return self.prepare_env(local_path).execute(
341
+ command=f"python {_STDIN_SERVER_SCRIPT} --model-uri {local_path}",
342
+ command_env=command_env,
343
+ stdin=subprocess.PIPE,
344
+ stdout=stdout,
345
+ stderr=stderr,
346
+ synchronous=False,
347
+ )
348
+
349
+ def can_score_model(self):
350
+ if self._env_manager == em.LOCAL:
351
+ # noconda => already in python and dependencies are assumed to be installed.
352
+ return True
353
+ conda_path = get_conda_bin_executable("conda")
354
+ try:
355
+ p = subprocess.Popen(
356
+ [conda_path, "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
357
+ )
358
+ _, _ = p.communicate()
359
+ return p.wait() == 0
360
+ except FileNotFoundError:
361
+ # Can not find conda
362
+ return False
363
+
364
+ def build_image(
365
+ self,
366
+ model_uri,
367
+ image_name,
368
+ install_java=False,
369
+ install_mlflow=False,
370
+ mlflow_home=None,
371
+ enable_mlserver=False,
372
+ base_image=None,
373
+ ):
374
+ with TempDir() as tmp:
375
+ cwd = tmp.path()
376
+ self.generate_dockerfile(
377
+ model_uri=model_uri,
378
+ output_dir=cwd,
379
+ install_java=install_java,
380
+ install_mlflow=install_mlflow,
381
+ mlflow_home=mlflow_home,
382
+ enable_mlserver=enable_mlserver,
383
+ base_image=base_image,
384
+ )
385
+
386
+ _logger.info("Building docker image with name %s", image_name)
387
+ docker_utils.build_image_from_context(context_dir=cwd, image_name=image_name)
388
+
389
+ def generate_dockerfile(
390
+ self,
391
+ model_uri,
392
+ output_dir,
393
+ install_java=False,
394
+ install_mlflow=False,
395
+ mlflow_home=None,
396
+ enable_mlserver=False,
397
+ base_image=None,
398
+ ):
399
+ os.makedirs(output_dir, exist_ok=True)
400
+ _logger.debug("Created all folders in path", extra={"output_directory": output_dir})
401
+
402
+ if model_uri:
403
+ model_cwd = os.path.join(output_dir, _MODEL_DIR_NAME)
404
+ pathlib.Path(model_cwd).mkdir(parents=True, exist_ok=True)
405
+ model_path = _download_artifact_from_uri(model_uri, output_path=model_cwd)
406
+ base_image = base_image or self._get_base_image(model_path, install_java)
407
+ env_manager = self._env_manager or em.LOCAL
408
+
409
+ if base_image.startswith("python"):
410
+ # we can directly use local env for python image
411
+ if env_manager in [em.CONDA, em.VIRTUALENV]:
412
+ # we can directly use ubuntu image for conda and virtualenv
413
+ base_image = UBUNTU_BASE_IMAGE
414
+ elif base_image == UBUNTU_BASE_IMAGE:
415
+ env_manager = self._env_manager or em.VIRTUALENV
416
+ # installing python on ubuntu image is problematic and not recommended officially
417
+ # , so we recommend using conda or virtualenv instead on ubuntu image
418
+ if env_manager == em.LOCAL:
419
+ raise MlflowException.invalid_parameter_value(LOCAL_ENV_MANAGER_ERROR_MESSAGE)
420
+
421
+ copy_src = os.path.relpath(model_path, start=output_dir)
422
+ model_install_steps = self._model_installation_steps(
423
+ copy_src,
424
+ model_path,
425
+ env_manager,
426
+ install_mlflow,
427
+ enable_mlserver,
428
+ )
429
+ entrypoint = f"from mlflow.models import container as C; C._serve('{env_manager}')"
430
+
431
+ # if no model_uri specified, user must use virtualenv or conda env based on ubuntu image
432
+ else:
433
+ base_image = base_image or UBUNTU_BASE_IMAGE
434
+ env_manager = self._env_manager or em.VIRTUALENV
435
+ if env_manager == em.LOCAL:
436
+ raise MlflowException.invalid_parameter_value(LOCAL_ENV_MANAGER_ERROR_MESSAGE)
437
+
438
+ model_install_steps = ""
439
+ # If model_uri is not specified, dependencies are installed at runtime
440
+ entrypoint = (
441
+ self._get_install_pyfunc_deps_cmd(env_manager, install_mlflow, enable_mlserver)
442
+ + f" C._serve('{env_manager}')"
443
+ )
444
+
445
+ dockerfile_text = docker_utils.generate_dockerfile(
446
+ output_dir=output_dir,
447
+ base_image=base_image,
448
+ model_install_steps=model_install_steps,
449
+ entrypoint=entrypoint,
450
+ env_manager=env_manager,
451
+ mlflow_home=mlflow_home,
452
+ enable_mlserver=enable_mlserver,
453
+ # always disable env creation at runtime for pyfunc
454
+ disable_env_creation_at_runtime=True,
455
+ )
456
+ _logger.debug("generated dockerfile at {output_dir}", extra={"dockerfile": dockerfile_text})
457
+
458
+ def _get_base_image(self, model_path: str, install_java: bool) -> str:
459
+ """
460
+ Determine the base image to use for the Dockerfile.
461
+
462
+ We use Python slim base image when all the following conditions are met:
463
+ 1. Model URI is specified by the user
464
+ 2. Model flavor does not require Java
465
+ 3. Python version is specified in the model
466
+
467
+ Returns:
468
+ Either the Ubuntu base image or the Python slim base image.
469
+ """
470
+ # Check if the model requires Java
471
+ if not install_java:
472
+ flavors = _get_all_flavor_configurations(model_path).keys()
473
+ if java_flavors := JAVA_FLAVORS & flavors:
474
+ _logger.info(f"Detected java flavors {java_flavors}, installing Java in the image")
475
+ install_java = True
476
+
477
+ # Use ubuntu base image if Java is required
478
+ if install_java:
479
+ return UBUNTU_BASE_IMAGE
480
+
481
+ # Get Python version from MLmodel
482
+ try:
483
+ env_conf = Model.load(model_path).flavors[pyfunc.FLAVOR_NAME][pyfunc.ENV][em.VIRTUALENV]
484
+ python_env_config_path = os.path.join(model_path, env_conf)
485
+
486
+ python_env = _PythonEnv.from_yaml(python_env_config_path)
487
+ return PYTHON_SLIM_BASE_IMAGE.format(version=python_env.python)
488
+ except Exception as e:
489
+ _logger.warning(
490
+ f"Failed to determine Python version from {model_path}. "
491
+ f"Defaulting to {UBUNTU_BASE_IMAGE}. Error: {e}"
492
+ )
493
+ return UBUNTU_BASE_IMAGE
494
+
495
+ def _model_installation_steps(
496
+ self, copy_src, model_path, env_manager, install_mlflow, enable_mlserver
497
+ ):
498
+ # Copy model to image if model_uri is specified
499
+ steps = (
500
+ "# Copy model to image and install dependencies\n"
501
+ f"COPY {copy_src} /opt/ml/model\nRUN python -c "
502
+ )
503
+ steps += (
504
+ f'"{self._get_install_pyfunc_deps_cmd(env_manager, install_mlflow, enable_mlserver)}"'
505
+ )
506
+
507
+ # Install flavor-specific dependencies if needed
508
+ flavors = _get_all_flavor_configurations(model_path).keys()
509
+ for flavor in flavors:
510
+ if flavor in FLAVOR_SPECIFIC_APT_PACKAGES:
511
+ packages = " ".join(FLAVOR_SPECIFIC_APT_PACKAGES[flavor])
512
+ steps += f"\nRUN apt-get install -y --no-install-recommends {packages}"
513
+
514
+ return steps
515
+
516
+ def _get_install_pyfunc_deps_cmd(
517
+ self, env_manager: str, install_mlflow: bool, enable_mlserver: bool
518
+ ):
519
+ return (
520
+ "from mlflow.models import container as C; "
521
+ f"C._install_pyfunc_deps('/opt/ml/model', install_mlflow={install_mlflow}, "
522
+ f"enable_mlserver={enable_mlserver}, env_manager='{env_manager}');"
523
+ )
@@ -0,0 +1,78 @@
1
+ import contextlib
2
+ from contextvars import ContextVar
3
+ from dataclasses import dataclass
4
+ from typing import Any, Optional
5
+
6
+ # A thread local variable to store the context of the current prediction request.
7
+ # This is particularly used to associate logs/traces with a specific prediction request in the
8
+ # caller side. The context variable is intended to be set by the called before invoking the
9
+ # predict method, using the set_prediction_context context manager.
10
+ _PREDICTION_REQUEST_CTX = ContextVar("mlflow_prediction_request_context", default=None)
11
+
12
+
13
+ @dataclass
14
+ class Context:
15
+ # A unique identifier for the current prediction request.
16
+ request_id: Optional[str] = None
17
+ # Whether the current prediction request is as a part of MLflow model evaluation.
18
+ is_evaluate: bool = False
19
+ # The schema of the dependencies to be added into the tag of trace info.
20
+ dependencies_schemas: Optional[dict[str, Any]] = None
21
+ # The logged model ID associated with the current prediction request
22
+ model_id: Optional[str] = None
23
+ # The model serving endpoint name where the prediction request is made
24
+ endpoint_name: Optional[str] = None
25
+
26
+ def __init__(
27
+ self,
28
+ request_id: Optional[str] = None,
29
+ is_evaluate: bool = False,
30
+ dependencies_schemas: Optional[dict[str, Any]] = None,
31
+ model_id: Optional[str] = None,
32
+ endpoint_name: Optional[str] = None,
33
+ # Accept extra kwargs so we don't need to worry backward compatibility
34
+ # when adding new attributes to the Context class
35
+ **kwargs,
36
+ ):
37
+ self.request_id = request_id
38
+ self.is_evaluate = is_evaluate
39
+ self.dependencies_schemas = dependencies_schemas
40
+ self.model_id = model_id
41
+ self.endpoint_name = endpoint_name
42
+
43
+ def update(self, **kwargs):
44
+ for key, value in kwargs.items():
45
+ if hasattr(self, key):
46
+ setattr(self, key, value)
47
+ else:
48
+ raise AttributeError(f"Context has no attribute named '{key}'")
49
+
50
+
51
+ @contextlib.contextmanager
52
+ def set_prediction_context(context: Optional[Context]):
53
+ """
54
+ Set the context for the current prediction request. The context will be set as a thread-local
55
+ variable and will be accessible globally within the same thread.
56
+
57
+ Args:
58
+ context: The context for the current prediction request.
59
+ """
60
+ if context and not isinstance(context, Context):
61
+ raise TypeError(f"Expected context to be an instance of Context, but got: {context}")
62
+
63
+ token = _PREDICTION_REQUEST_CTX.set(context)
64
+ try:
65
+ yield
66
+ finally:
67
+ _PREDICTION_REQUEST_CTX.reset(token)
68
+
69
+
70
+ def get_prediction_context() -> Optional[Context]:
71
+ """
72
+ Get the context for the current prediction request. The context is thread-local and is set
73
+ using the set_prediction_context context manager.
74
+
75
+ Returns:
76
+ The context for the current prediction request, or None if no context is set.
77
+ """
78
+ return _PREDICTION_REQUEST_CTX.get()