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,95 @@
1
+ import importlib
2
+ import importlib.metadata
3
+ import re
4
+ from typing import Literal
5
+
6
+ from packaging.version import InvalidVersion, Version
7
+
8
+ from mlflow.ml_package_versions import _ML_PACKAGE_VERSIONS, FLAVOR_TO_MODULE_NAME
9
+ from mlflow.utils.databricks_utils import is_in_databricks_runtime
10
+
11
+
12
+ def _check_version_in_range(ver, min_ver, max_ver):
13
+ return Version(min_ver) <= Version(ver) <= Version(max_ver)
14
+
15
+
16
+ def _check_spark_version_in_range(ver, min_ver, max_ver):
17
+ """
18
+ Utility function for allowing late addition release changes to PySpark minor version increments
19
+ to be accepted, provided that the previous minor version has been previously validated.
20
+ For example, if version 3.2.1 has been validated as functional with MLflow, an upgrade of
21
+ PySpark's minor version to 3.2.2 will still provide a valid version check.
22
+ """
23
+ parsed_ver = Version(ver)
24
+ if parsed_ver > Version(min_ver):
25
+ ver = f"{parsed_ver.major}.{parsed_ver.minor}"
26
+ return _check_version_in_range(ver, min_ver, max_ver)
27
+
28
+
29
+ def _violates_pep_440(ver):
30
+ try:
31
+ Version(ver)
32
+ return False
33
+ except InvalidVersion:
34
+ return True
35
+
36
+
37
+ def _is_pre_or_dev_release(ver):
38
+ v = Version(ver)
39
+ return v.is_devrelease or v.is_prerelease
40
+
41
+
42
+ def _strip_dev_version_suffix(version):
43
+ return re.sub(r"(\.?)dev.*", "", version)
44
+
45
+
46
+ def get_min_max_version_and_pip_release(
47
+ flavor_name: str, category: Literal["autologging", "models"] = "autologging"
48
+ ):
49
+ if flavor_name == "pyspark.ml":
50
+ # pyspark.ml is a special case of spark flavor
51
+ flavor_name = "spark"
52
+
53
+ min_version = _ML_PACKAGE_VERSIONS[flavor_name][category]["minimum"]
54
+ max_version = _ML_PACKAGE_VERSIONS[flavor_name][category]["maximum"]
55
+ pip_release = _ML_PACKAGE_VERSIONS[flavor_name]["package_info"]["pip_release"]
56
+ return min_version, max_version, pip_release
57
+
58
+
59
+ def is_flavor_supported_for_associated_package_versions(flavor_name):
60
+ """
61
+ Returns:
62
+ True if the specified flavor is supported for the currently-installed versions of its
63
+ associated packages.
64
+ """
65
+ module_name = FLAVOR_TO_MODULE_NAME[flavor_name]
66
+
67
+ try:
68
+ actual_version = importlib.import_module(module_name).__version__
69
+ except AttributeError:
70
+ try:
71
+ # NB: Module name is not necessarily the same as the package name. However,
72
+ # we assume they are the same here for simplicity. If they are not the same,
73
+ # this will fail and fallback to 'True', which is not a disaster.
74
+ actual_version = importlib.metadata.version(module_name)
75
+ except importlib.metadata.PackageNotFoundError:
76
+ # Some package (e.g. dspy) do not publish version info in a standard format.
77
+ # For this case, we assume the package version is supported by MLflow.
78
+ return True
79
+
80
+ # In Databricks, treat 'pyspark 3.x.y.dev0' as 'pyspark 3.x.y'
81
+ if module_name == "pyspark" and is_in_databricks_runtime():
82
+ actual_version = _strip_dev_version_suffix(actual_version)
83
+
84
+ if _violates_pep_440(actual_version) or _is_pre_or_dev_release(actual_version):
85
+ return False
86
+ min_version, max_version, _ = get_min_max_version_and_pip_release(flavor_name)
87
+
88
+ if module_name == "pyspark" and is_in_databricks_runtime():
89
+ # MLflow 1.25.0 is known to be compatible with PySpark 3.3.0 on Databricks, despite the
90
+ # fact that PySpark 3.3.0 was not available in PyPI at the time of the MLflow 1.25.0 release
91
+ if Version(max_version) < Version("3.3.0"):
92
+ max_version = "3.3.0"
93
+ return _check_spark_version_in_range(actual_version, min_version, max_version)
94
+ else:
95
+ return _check_version_in_range(actual_version, min_version, max_version)
@@ -0,0 +1,206 @@
1
+ import logging
2
+ import os
3
+ import posixpath
4
+
5
+ import mlflow
6
+ from mlflow.exceptions import MlflowException
7
+ from mlflow.utils.autologging_utils import (
8
+ ExceptionSafeAbstractClass,
9
+ )
10
+ from mlflow.utils.file_utils import TempDir
11
+ from mlflow.utils.mlflow_tags import LATEST_CHECKPOINT_ARTIFACT_TAG_KEY
12
+
13
+ _logger = logging.getLogger(__name__)
14
+
15
+
16
+ _CHECKPOINT_DIR = "checkpoints"
17
+ _CHECKPOINT_METRIC_FILENAME = "checkpoint_metrics.json"
18
+ _CHECKPOINT_MODEL_FILENAME = "checkpoint"
19
+ _LATEST_CHECKPOINT_PREFIX = "latest_"
20
+ _CHECKPOINT_EPOCH_PREFIX = "epoch_"
21
+ _CHECKPOINT_GLOBAL_STEP_PREFIX = "global_step_"
22
+ _WEIGHT_ONLY_CHECKPOINT_SUFFIX = ".weights"
23
+
24
+
25
+ class MlflowModelCheckpointCallbackBase(metaclass=ExceptionSafeAbstractClass):
26
+ """Callback base class for automatic model checkpointing to MLflow.
27
+
28
+ You must implement "save_checkpoint" method to save the model as the checkpoint file.
29
+ and you must call `check_and_save_checkpoint_if_needed` method in relevant
30
+ callback events to trigger automatic checkpointing.
31
+
32
+ Args:
33
+ checkpoint_file_suffix: checkpoint file suffix.
34
+ monitor: In automatic model checkpointing, the metric name to monitor if
35
+ you set `model_checkpoint_save_best_only` to True.
36
+ save_best_only: If True, automatic model checkpointing only saves when
37
+ the model is considered the "best" model according to the quantity
38
+ monitored and previous checkpoint model is overwritten.
39
+ mode: one of {"min", "max"}. In automatic model checkpointing,
40
+ if save_best_only=True, the decision to overwrite the current save file is made
41
+ based on either the maximization or the minimization of the monitored quantity.
42
+ save_weights_only: In automatic model checkpointing, if True, then
43
+ only the model's weights will be saved. Otherwise, the optimizer states,
44
+ lr-scheduler states, etc are added in the checkpoint too.
45
+ save_freq: `"epoch"` or integer. When using `"epoch"`, the callback
46
+ saves the model after each epoch. When using integer, the callback
47
+ saves the model at end of this many batches. Note that if the saving isn't
48
+ aligned to epochs, the monitored metric may potentially be less reliable (it
49
+ could reflect as little as 1 batch, since the metrics get reset
50
+ every epoch). Defaults to `"epoch"`.
51
+ """
52
+
53
+ def __init__(
54
+ self,
55
+ checkpoint_file_suffix,
56
+ monitor,
57
+ mode,
58
+ save_best_only,
59
+ save_weights_only,
60
+ save_freq,
61
+ ):
62
+ self.checkpoint_file_suffix = checkpoint_file_suffix
63
+ self.monitor = monitor
64
+ self.mode = mode
65
+ self.save_best_only = save_best_only
66
+ self.save_weights_only = save_weights_only
67
+ self.save_freq = save_freq
68
+ self.last_monitor_value = None
69
+
70
+ self.mlflow_tracking_uri = mlflow.get_tracking_uri()
71
+
72
+ if self.save_best_only:
73
+ if self.monitor is None:
74
+ raise MlflowException(
75
+ "If checkpoint 'save_best_only' config is set to True, you need to set "
76
+ "'monitor' config as well."
77
+ )
78
+ if self.mode not in ["min", "max"]:
79
+ raise MlflowException(
80
+ "If checkpoint 'save_best_only' config is set to True, you need to set "
81
+ "'mode' config and available modes includes 'min' and 'max', but you set "
82
+ f"'mode' to '{self.mode}'."
83
+ )
84
+
85
+ def _is_new_checkpoint_better(self, new_monitor_value):
86
+ if self.last_monitor_value is None:
87
+ return True
88
+
89
+ if self.mode == "min":
90
+ return new_monitor_value < self.last_monitor_value
91
+
92
+ return new_monitor_value > self.last_monitor_value
93
+
94
+ def save_checkpoint(self, filepath: str):
95
+ raise NotImplementedError()
96
+
97
+ def check_and_save_checkpoint_if_needed(self, current_epoch, global_step, metric_dict):
98
+ # For distributed model training, trainer workers need to use the driver process
99
+ # mlflow_tracking_uri.
100
+ # Note that `self.mlflow_tracking_uri` value is assigned in the driver process
101
+ # then it is pickled to trainer workers.
102
+ mlflow.set_tracking_uri(self.mlflow_tracking_uri)
103
+
104
+ if self.save_best_only:
105
+ if self.monitor not in metric_dict:
106
+ _logger.warning(
107
+ "Checkpoint logging is skipped, because checkpoint 'save_best_only' config is "
108
+ "True, it requires to compare the monitored metric value, but the provided "
109
+ "monitored metric value is not available."
110
+ )
111
+ return
112
+
113
+ new_monitor_value = metric_dict[self.monitor]
114
+ if not self._is_new_checkpoint_better(new_monitor_value):
115
+ # Current checkpoint is worse than last saved checkpoint,
116
+ # so skip checkpointing.
117
+ return
118
+
119
+ self.last_monitor_value = new_monitor_value
120
+
121
+ suffix = self.checkpoint_file_suffix
122
+
123
+ if self.save_best_only:
124
+ if self.save_weights_only:
125
+ checkpoint_model_filename = (
126
+ f"{_LATEST_CHECKPOINT_PREFIX}{_CHECKPOINT_MODEL_FILENAME}"
127
+ f"{_WEIGHT_ONLY_CHECKPOINT_SUFFIX}{suffix}"
128
+ )
129
+ else:
130
+ checkpoint_model_filename = (
131
+ f"{_LATEST_CHECKPOINT_PREFIX}{_CHECKPOINT_MODEL_FILENAME}{suffix}"
132
+ )
133
+ checkpoint_metrics_filename = (
134
+ f"{_LATEST_CHECKPOINT_PREFIX}{_CHECKPOINT_METRIC_FILENAME}"
135
+ )
136
+ checkpoint_artifact_dir = _CHECKPOINT_DIR
137
+ else:
138
+ if self.save_freq == "epoch":
139
+ sub_dir_name = f"{_CHECKPOINT_EPOCH_PREFIX}{current_epoch}"
140
+ else:
141
+ sub_dir_name = f"{_CHECKPOINT_GLOBAL_STEP_PREFIX}{global_step}"
142
+
143
+ if self.save_weights_only:
144
+ checkpoint_model_filename = (
145
+ f"{_CHECKPOINT_MODEL_FILENAME}{_WEIGHT_ONLY_CHECKPOINT_SUFFIX}{suffix}"
146
+ )
147
+ else:
148
+ checkpoint_model_filename = f"{_CHECKPOINT_MODEL_FILENAME}{suffix}"
149
+ checkpoint_metrics_filename = _CHECKPOINT_METRIC_FILENAME
150
+ checkpoint_artifact_dir = f"{_CHECKPOINT_DIR}/{sub_dir_name}"
151
+
152
+ mlflow.set_tag(
153
+ LATEST_CHECKPOINT_ARTIFACT_TAG_KEY,
154
+ f"{checkpoint_artifact_dir}/{checkpoint_model_filename}",
155
+ )
156
+
157
+ mlflow.log_dict(
158
+ {**metric_dict, "epoch": current_epoch, "global_step": global_step},
159
+ f"{checkpoint_artifact_dir}/{checkpoint_metrics_filename}",
160
+ )
161
+
162
+ with TempDir() as tmp_dir:
163
+ tmp_model_save_path = os.path.join(tmp_dir.path(), checkpoint_model_filename)
164
+ self.save_checkpoint(tmp_model_save_path)
165
+ mlflow.log_artifact(tmp_model_save_path, checkpoint_artifact_dir)
166
+
167
+
168
+ def download_checkpoint_artifact(run_id=None, epoch=None, global_step=None, dst_path=None):
169
+ from mlflow.client import MlflowClient
170
+ from mlflow.utils.mlflow_tags import LATEST_CHECKPOINT_ARTIFACT_TAG_KEY
171
+
172
+ client = MlflowClient()
173
+
174
+ if run_id is None:
175
+ run = mlflow.active_run()
176
+ if run is None:
177
+ raise MlflowException(
178
+ "There is no active run, please provide the 'run_id' argument for "
179
+ "'load_checkpoint' invocation."
180
+ )
181
+ run_id = run.info.run_id
182
+ else:
183
+ run = client.get_run(run_id)
184
+
185
+ latest_checkpoint_artifact_path = run.data.tags.get(LATEST_CHECKPOINT_ARTIFACT_TAG_KEY)
186
+ if latest_checkpoint_artifact_path is None:
187
+ raise MlflowException("There is no logged checkpoint artifact in the current run.")
188
+
189
+ checkpoint_filename = posixpath.basename(latest_checkpoint_artifact_path)
190
+
191
+ if epoch is not None and global_step is not None:
192
+ raise MlflowException(
193
+ "Only one of 'epoch' and 'global_step' can be set for 'load_checkpoint'."
194
+ )
195
+ elif global_step is not None:
196
+ checkpoint_artifact_path = (
197
+ f"{_CHECKPOINT_DIR}/{_CHECKPOINT_GLOBAL_STEP_PREFIX}{global_step}/{checkpoint_filename}"
198
+ )
199
+ elif epoch is not None:
200
+ checkpoint_artifact_path = (
201
+ f"{_CHECKPOINT_DIR}/{_CHECKPOINT_EPOCH_PREFIX}{epoch}/{checkpoint_filename}"
202
+ )
203
+ else:
204
+ checkpoint_artifact_path = latest_checkpoint_artifact_path
205
+
206
+ return client.download_artifacts(run_id, checkpoint_artifact_path, dst_path=dst_path)
@@ -0,0 +1,6 @@
1
+ import importlib
2
+
3
+
4
+ def _get_class_from_string(fully_qualified_class_name):
5
+ module, class_name = fully_qualified_class_name.rsplit(".", maxsplit=1)
6
+ return getattr(importlib.import_module(module), class_name)
@@ -0,0 +1,257 @@
1
+ """
2
+ Definitions of click options shared by several CLI commands.
3
+ """
4
+
5
+ import warnings
6
+
7
+ import click
8
+
9
+ from mlflow.environment_variables import MLFLOW_DISABLE_ENV_MANAGER_CONDA_WARNING
10
+ from mlflow.utils import env_manager as _EnvManager
11
+
12
+ MODEL_PATH = click.option(
13
+ "--model-path",
14
+ "-m",
15
+ default=None,
16
+ metavar="PATH",
17
+ required=True,
18
+ help="Path to the model. The path is relative to the run with the given "
19
+ "run-id or local filesystem path without run-id.",
20
+ )
21
+
22
+ _model_uri_help_string = (
23
+ "URI to the model. A local path, a 'runs:/' URI, or a"
24
+ " remote storage URI (e.g., an 's3://' URI). For more information"
25
+ " about supported remote URIs for model artifacts, see"
26
+ " https://mlflow.org/docs/latest/tracking.html#artifact-stores"
27
+ )
28
+
29
+ MODEL_URI_BUILD_DOCKER = click.option(
30
+ "--model-uri",
31
+ "-m",
32
+ metavar="URI",
33
+ default=None,
34
+ required=False,
35
+ help="[Optional] " + _model_uri_help_string,
36
+ )
37
+
38
+ MODEL_URI = click.option(
39
+ "--model-uri",
40
+ "-m",
41
+ metavar="URI",
42
+ required=True,
43
+ help=_model_uri_help_string,
44
+ )
45
+
46
+ MLFLOW_HOME = click.option(
47
+ "--mlflow-home",
48
+ default=None,
49
+ metavar="PATH",
50
+ help="Path to local clone of MLflow project. Use for development only.",
51
+ )
52
+
53
+ RUN_ID = click.option(
54
+ "--run-id",
55
+ "-r",
56
+ default=None,
57
+ required=False,
58
+ metavar="ID",
59
+ help="ID of the MLflow run that generated the referenced content.",
60
+ )
61
+
62
+
63
+ def _resolve_env_manager(_, __, env_manager):
64
+ if env_manager is not None:
65
+ _EnvManager.validate(env_manager)
66
+ if env_manager == _EnvManager.CONDA and not MLFLOW_DISABLE_ENV_MANAGER_CONDA_WARNING.get():
67
+ warnings.warn(
68
+ (
69
+ "Use of conda is discouraged. If you use it, please ensure that your use of "
70
+ "conda complies with Anaconda's terms of service "
71
+ "(https://legal.anaconda.com/policies/en/?name=terms-of-service). "
72
+ "virtualenv is the recommended tool for environment reproducibility. "
73
+ f"To suppress this warning, set the {MLFLOW_DISABLE_ENV_MANAGER_CONDA_WARNING} "
74
+ "environment variable to 'TRUE'."
75
+ ),
76
+ UserWarning,
77
+ stacklevel=2,
78
+ )
79
+ return env_manager
80
+
81
+ return None
82
+
83
+
84
+ def _create_env_manager_option(help_string, default=None):
85
+ return click.option(
86
+ "--env-manager",
87
+ default=default,
88
+ type=click.UNPROCESSED,
89
+ callback=_resolve_env_manager,
90
+ help=help_string,
91
+ )
92
+
93
+
94
+ ENV_MANAGER = _create_env_manager_option(
95
+ default=_EnvManager.VIRTUALENV,
96
+ # '\b' prevents rewrapping text:
97
+ # https://click.palletsprojects.com/en/8.1.x/documentation/#preventing-rewrapping
98
+ help_string="""
99
+ If specified, create an environment for MLmodel using the specified
100
+ environment manager. The following values are supported:
101
+
102
+ \b
103
+ - local: use the local environment
104
+ - virtualenv: use virtualenv (and pyenv for Python version management)
105
+ - conda: use conda
106
+
107
+ If unspecified, default to virtualenv.
108
+ """,
109
+ )
110
+
111
+ ENV_MANAGER_PROJECTS = _create_env_manager_option(
112
+ help_string="""
113
+ If specified, create an environment for MLproject using the specified
114
+ environment manager. The following values are supported:
115
+
116
+ \b
117
+ - local: use the local environment
118
+ - virtualenv: use virtualenv (and pyenv for Python version management)
119
+ - conda: use conda
120
+
121
+ If unspecified, the appropriate environment manager is automatically selected based on
122
+ the project configuration. For example, if `MLproject.yaml` contains a `python_env` key,
123
+ virtualenv is used.
124
+ """,
125
+ )
126
+
127
+ ENV_MANAGER_DOCKERFILE = _create_env_manager_option(
128
+ default=None,
129
+ # '\b' prevents rewrapping text:
130
+ # https://click.palletsprojects.com/en/8.1.x/documentation/#preventing-rewrapping
131
+ help_string="""
132
+ If specified, create an environment for MLmodel using the specified
133
+ environment manager. The following values are supported:
134
+
135
+ \b
136
+ - local: use the local environment
137
+ - virtualenv: use virtualenv (and pyenv for Python version management)
138
+ - conda: use conda
139
+
140
+ If unspecified, default to None, then MLflow will automatically pick the env manager
141
+ based on the model's flavor configuration.
142
+ If model-uri is specified: if python version is specified in the flavor configuration
143
+ and no java installation is required, then we use local environment. Otherwise we use virtualenv.
144
+ If no model-uri is provided, we use virtualenv.
145
+ """,
146
+ )
147
+
148
+
149
+ INSTALL_MLFLOW = click.option(
150
+ "--install-mlflow",
151
+ is_flag=True,
152
+ default=False,
153
+ help="If specified and there is a conda or virtualenv environment to be activated "
154
+ "mlflow will be installed into the environment after it has been "
155
+ "activated. The version of installed mlflow will be the same as "
156
+ "the one used to invoke this command.",
157
+ )
158
+
159
+ HOST = click.option(
160
+ "--host",
161
+ "-h",
162
+ envvar="MLFLOW_HOST",
163
+ metavar="HOST",
164
+ default="127.0.0.1",
165
+ help="The network address to listen on (default: 127.0.0.1). "
166
+ "Use 0.0.0.0 to bind to all addresses if you want to access the tracking "
167
+ "server from other machines.",
168
+ )
169
+
170
+ PORT = click.option(
171
+ "--port",
172
+ "-p",
173
+ envvar="MLFLOW_PORT",
174
+ default=5000,
175
+ help="The port to listen on (default: 5000).",
176
+ )
177
+
178
+ TIMEOUT = click.option(
179
+ "--timeout",
180
+ "-t",
181
+ envvar="MLFLOW_SCORING_SERVER_REQUEST_TIMEOUT",
182
+ default=60,
183
+ help="Timeout in seconds to serve a request (default: 60).",
184
+ )
185
+
186
+ # We use None to disambiguate manually selecting "4"
187
+ WORKERS = click.option(
188
+ "--workers",
189
+ "-w",
190
+ envvar="MLFLOW_WORKERS",
191
+ default=None,
192
+ help="Number of gunicorn worker processes to handle requests (default: 4).",
193
+ )
194
+
195
+ MODELS_WORKERS = click.option(
196
+ "--workers",
197
+ "-w",
198
+ envvar="MLFLOW_MODELS_WORKERS",
199
+ default=None,
200
+ help="Number of uvicorn workers to handle requests when serving mlflow models (default: 1).",
201
+ )
202
+
203
+ ENABLE_MLSERVER = click.option(
204
+ "--enable-mlserver",
205
+ is_flag=True,
206
+ default=False,
207
+ help=(
208
+ "Enable serving with MLServer through the v2 inference protocol. "
209
+ "You can use environment variables to configure MLServer. "
210
+ "(See https://mlserver.readthedocs.io/en/latest/reference/settings.html)"
211
+ ),
212
+ )
213
+
214
+ ARTIFACTS_DESTINATION = click.option(
215
+ "--artifacts-destination",
216
+ envvar="MLFLOW_ARTIFACTS_DESTINATION",
217
+ metavar="URI",
218
+ default="./mlartifacts",
219
+ help=(
220
+ "The base artifact location from which to resolve artifact upload/download/list requests "
221
+ "(e.g. 's3://my-bucket'). Defaults to a local './mlartifacts' directory. This option only "
222
+ "applies when the tracking server is configured to stream artifacts and the experiment's "
223
+ "artifact root location is http or mlflow-artifacts URI."
224
+ ),
225
+ )
226
+
227
+ SERVE_ARTIFACTS = click.option(
228
+ "--serve-artifacts/--no-serve-artifacts",
229
+ envvar="MLFLOW_SERVE_ARTIFACTS",
230
+ is_flag=True,
231
+ default=True,
232
+ help="Enables serving of artifact uploads, downloads, and list requests "
233
+ "by routing these requests to the storage location that is specified by "
234
+ "'--artifacts-destination' directly through a proxy. The default location that "
235
+ "these requests are served from is a local './mlartifacts' directory which can be "
236
+ "overridden via the '--artifacts-destination' argument. To disable artifact serving, "
237
+ "specify `--no-serve-artifacts`. Default: True",
238
+ )
239
+
240
+ NO_CONDA = click.option(
241
+ "--no-conda",
242
+ is_flag=True,
243
+ help="If specified, use local environment.",
244
+ )
245
+
246
+ INSTALL_JAVA = click.option(
247
+ "--install-java",
248
+ is_flag=False,
249
+ flag_value=True,
250
+ default=None,
251
+ type=bool,
252
+ help="Installs Java in the image if needed. Default is None, "
253
+ "allowing MLflow to determine installation. Flavors requiring "
254
+ "Java, such as Spark, enable this automatically. "
255
+ "Note: This option only works with the UBUNTU base image; "
256
+ "Python base images do not support Java installation.",
257
+ )