mlrun 1.3.3__py3-none-any.whl → 1.4.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.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

Files changed (444) hide show
  1. mlrun/__init__.py +3 -3
  2. mlrun/__main__.py +79 -37
  3. mlrun/api/__init__.py +1 -1
  4. mlrun/api/api/__init__.py +1 -1
  5. mlrun/api/api/api.py +4 -4
  6. mlrun/api/api/deps.py +10 -21
  7. mlrun/api/api/endpoints/__init__.py +1 -1
  8. mlrun/api/api/endpoints/artifacts.py +64 -36
  9. mlrun/api/api/endpoints/auth.py +4 -4
  10. mlrun/api/api/endpoints/background_tasks.py +11 -11
  11. mlrun/api/api/endpoints/client_spec.py +5 -5
  12. mlrun/api/api/endpoints/clusterization_spec.py +6 -4
  13. mlrun/api/api/endpoints/feature_store.py +124 -115
  14. mlrun/api/api/endpoints/files.py +22 -14
  15. mlrun/api/api/endpoints/frontend_spec.py +28 -21
  16. mlrun/api/api/endpoints/functions.py +142 -87
  17. mlrun/api/api/endpoints/grafana_proxy.py +89 -442
  18. mlrun/api/api/endpoints/healthz.py +20 -7
  19. mlrun/api/api/endpoints/hub.py +320 -0
  20. mlrun/api/api/endpoints/internal/__init__.py +1 -1
  21. mlrun/api/api/endpoints/internal/config.py +1 -1
  22. mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
  23. mlrun/api/api/endpoints/logs.py +11 -11
  24. mlrun/api/api/endpoints/model_endpoints.py +74 -70
  25. mlrun/api/api/endpoints/operations.py +13 -9
  26. mlrun/api/api/endpoints/pipelines.py +93 -88
  27. mlrun/api/api/endpoints/projects.py +35 -35
  28. mlrun/api/api/endpoints/runs.py +69 -27
  29. mlrun/api/api/endpoints/runtime_resources.py +28 -28
  30. mlrun/api/api/endpoints/schedules.py +98 -41
  31. mlrun/api/api/endpoints/secrets.py +37 -32
  32. mlrun/api/api/endpoints/submit.py +12 -12
  33. mlrun/api/api/endpoints/tags.py +20 -22
  34. mlrun/api/api/utils.py +251 -42
  35. mlrun/api/constants.py +1 -1
  36. mlrun/api/crud/__init__.py +18 -15
  37. mlrun/api/crud/artifacts.py +10 -10
  38. mlrun/api/crud/client_spec.py +4 -4
  39. mlrun/api/crud/clusterization_spec.py +3 -3
  40. mlrun/api/crud/feature_store.py +54 -46
  41. mlrun/api/crud/functions.py +3 -3
  42. mlrun/api/crud/hub.py +312 -0
  43. mlrun/api/crud/logs.py +11 -9
  44. mlrun/api/crud/model_monitoring/__init__.py +3 -3
  45. mlrun/api/crud/model_monitoring/grafana.py +435 -0
  46. mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
  47. mlrun/api/crud/notifications.py +149 -0
  48. mlrun/api/crud/pipelines.py +67 -52
  49. mlrun/api/crud/projects.py +51 -23
  50. mlrun/api/crud/runs.py +7 -5
  51. mlrun/api/crud/runtime_resources.py +13 -13
  52. mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
  53. mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
  54. mlrun/api/crud/runtimes/nuclio/function.py +505 -0
  55. mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
  56. mlrun/api/crud/secrets.py +88 -46
  57. mlrun/api/crud/tags.py +5 -5
  58. mlrun/api/db/__init__.py +1 -1
  59. mlrun/api/db/base.py +102 -54
  60. mlrun/api/db/init_db.py +2 -3
  61. mlrun/api/db/session.py +4 -12
  62. mlrun/api/db/sqldb/__init__.py +1 -1
  63. mlrun/api/db/sqldb/db.py +439 -196
  64. mlrun/api/db/sqldb/helpers.py +1 -1
  65. mlrun/api/db/sqldb/models/__init__.py +3 -3
  66. mlrun/api/db/sqldb/models/models_mysql.py +82 -64
  67. mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
  68. mlrun/api/db/sqldb/session.py +27 -20
  69. mlrun/api/initial_data.py +82 -24
  70. mlrun/api/launcher.py +196 -0
  71. mlrun/api/main.py +91 -22
  72. mlrun/api/middlewares.py +6 -5
  73. mlrun/api/migrations_mysql/env.py +1 -1
  74. mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
  75. mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
  76. mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
  77. mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
  78. mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
  79. mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
  80. mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
  81. mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
  82. mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
  83. mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
  84. mlrun/api/migrations_sqlite/env.py +1 -1
  85. mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
  86. mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
  87. mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
  88. mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
  89. mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
  90. mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
  91. mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
  92. mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
  93. mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
  94. mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
  95. mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
  96. mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
  97. mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
  98. mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
  99. mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
  100. mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
  101. mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
  102. mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
  103. mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
  104. mlrun/api/schemas/__init__.py +216 -138
  105. mlrun/api/utils/__init__.py +1 -1
  106. mlrun/api/utils/asyncio.py +1 -1
  107. mlrun/api/utils/auth/__init__.py +1 -1
  108. mlrun/api/utils/auth/providers/__init__.py +1 -1
  109. mlrun/api/utils/auth/providers/base.py +7 -7
  110. mlrun/api/utils/auth/providers/nop.py +6 -7
  111. mlrun/api/utils/auth/providers/opa.py +17 -17
  112. mlrun/api/utils/auth/verifier.py +36 -34
  113. mlrun/api/utils/background_tasks.py +24 -24
  114. mlrun/{builder.py → api/utils/builder.py} +216 -123
  115. mlrun/api/utils/clients/__init__.py +1 -1
  116. mlrun/api/utils/clients/chief.py +19 -4
  117. mlrun/api/utils/clients/iguazio.py +106 -60
  118. mlrun/api/utils/clients/log_collector.py +1 -1
  119. mlrun/api/utils/clients/nuclio.py +23 -23
  120. mlrun/api/utils/clients/protocols/grpc.py +2 -2
  121. mlrun/api/utils/db/__init__.py +1 -1
  122. mlrun/api/utils/db/alembic.py +1 -1
  123. mlrun/api/utils/db/backup.py +1 -1
  124. mlrun/api/utils/db/mysql.py +24 -25
  125. mlrun/api/utils/db/sql_collation.py +1 -1
  126. mlrun/api/utils/db/sqlite_migration.py +2 -2
  127. mlrun/api/utils/events/__init__.py +14 -0
  128. mlrun/api/utils/events/base.py +57 -0
  129. mlrun/api/utils/events/events_factory.py +41 -0
  130. mlrun/api/utils/events/iguazio.py +217 -0
  131. mlrun/api/utils/events/nop.py +55 -0
  132. mlrun/api/utils/helpers.py +16 -13
  133. mlrun/api/utils/memory_reports.py +1 -1
  134. mlrun/api/utils/periodic.py +6 -3
  135. mlrun/api/utils/projects/__init__.py +1 -1
  136. mlrun/api/utils/projects/follower.py +33 -33
  137. mlrun/api/utils/projects/leader.py +36 -34
  138. mlrun/api/utils/projects/member.py +27 -27
  139. mlrun/api/utils/projects/remotes/__init__.py +1 -1
  140. mlrun/api/utils/projects/remotes/follower.py +13 -13
  141. mlrun/api/utils/projects/remotes/leader.py +10 -10
  142. mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
  143. mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
  144. mlrun/api/utils/scheduler.py +140 -51
  145. mlrun/api/utils/singletons/__init__.py +1 -1
  146. mlrun/api/utils/singletons/db.py +9 -15
  147. mlrun/api/utils/singletons/k8s.py +677 -5
  148. mlrun/api/utils/singletons/logs_dir.py +1 -1
  149. mlrun/api/utils/singletons/project_member.py +1 -1
  150. mlrun/api/utils/singletons/scheduler.py +1 -1
  151. mlrun/artifacts/__init__.py +2 -2
  152. mlrun/artifacts/base.py +8 -2
  153. mlrun/artifacts/dataset.py +5 -3
  154. mlrun/artifacts/manager.py +7 -1
  155. mlrun/artifacts/model.py +15 -4
  156. mlrun/artifacts/plots.py +1 -1
  157. mlrun/common/__init__.py +1 -1
  158. mlrun/common/constants.py +15 -0
  159. mlrun/common/model_monitoring.py +209 -0
  160. mlrun/common/schemas/__init__.py +167 -0
  161. mlrun/{api → common}/schemas/artifact.py +13 -14
  162. mlrun/{api → common}/schemas/auth.py +10 -8
  163. mlrun/{api → common}/schemas/background_task.py +3 -3
  164. mlrun/{api → common}/schemas/client_spec.py +1 -1
  165. mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
  166. mlrun/{api → common}/schemas/constants.py +21 -8
  167. mlrun/common/schemas/events.py +36 -0
  168. mlrun/{api → common}/schemas/feature_store.py +2 -1
  169. mlrun/{api → common}/schemas/frontend_spec.py +7 -6
  170. mlrun/{api → common}/schemas/function.py +5 -5
  171. mlrun/{api → common}/schemas/http.py +3 -3
  172. mlrun/common/schemas/hub.py +134 -0
  173. mlrun/{api → common}/schemas/k8s.py +3 -3
  174. mlrun/{api → common}/schemas/memory_reports.py +1 -1
  175. mlrun/common/schemas/model_endpoints.py +342 -0
  176. mlrun/common/schemas/notification.py +57 -0
  177. mlrun/{api → common}/schemas/object.py +6 -6
  178. mlrun/{api → common}/schemas/pipeline.py +3 -3
  179. mlrun/{api → common}/schemas/project.py +6 -5
  180. mlrun/common/schemas/regex.py +24 -0
  181. mlrun/common/schemas/runs.py +30 -0
  182. mlrun/{api → common}/schemas/runtime_resource.py +3 -3
  183. mlrun/{api → common}/schemas/schedule.py +19 -7
  184. mlrun/{api → common}/schemas/secret.py +3 -3
  185. mlrun/{api → common}/schemas/tag.py +2 -2
  186. mlrun/common/types.py +25 -0
  187. mlrun/config.py +152 -20
  188. mlrun/data_types/__init__.py +7 -2
  189. mlrun/data_types/data_types.py +4 -2
  190. mlrun/data_types/infer.py +1 -1
  191. mlrun/data_types/spark.py +10 -3
  192. mlrun/datastore/__init__.py +10 -3
  193. mlrun/datastore/azure_blob.py +1 -1
  194. mlrun/datastore/base.py +185 -53
  195. mlrun/datastore/datastore.py +1 -1
  196. mlrun/datastore/filestore.py +1 -1
  197. mlrun/datastore/google_cloud_storage.py +1 -1
  198. mlrun/datastore/inmem.py +4 -1
  199. mlrun/datastore/redis.py +1 -1
  200. mlrun/datastore/s3.py +1 -1
  201. mlrun/datastore/sources.py +192 -70
  202. mlrun/datastore/spark_udf.py +44 -0
  203. mlrun/datastore/store_resources.py +4 -4
  204. mlrun/datastore/targets.py +115 -45
  205. mlrun/datastore/utils.py +127 -5
  206. mlrun/datastore/v3io.py +1 -1
  207. mlrun/datastore/wasbfs/__init__.py +1 -1
  208. mlrun/datastore/wasbfs/fs.py +1 -1
  209. mlrun/db/__init__.py +7 -5
  210. mlrun/db/base.py +112 -68
  211. mlrun/db/httpdb.py +445 -277
  212. mlrun/db/nopdb.py +491 -0
  213. mlrun/db/sqldb.py +112 -65
  214. mlrun/errors.py +6 -1
  215. mlrun/execution.py +44 -22
  216. mlrun/feature_store/__init__.py +1 -1
  217. mlrun/feature_store/api.py +143 -95
  218. mlrun/feature_store/common.py +16 -20
  219. mlrun/feature_store/feature_set.py +42 -12
  220. mlrun/feature_store/feature_vector.py +32 -21
  221. mlrun/feature_store/ingestion.py +9 -12
  222. mlrun/feature_store/retrieval/__init__.py +3 -2
  223. mlrun/feature_store/retrieval/base.py +388 -66
  224. mlrun/feature_store/retrieval/dask_merger.py +63 -151
  225. mlrun/feature_store/retrieval/job.py +30 -12
  226. mlrun/feature_store/retrieval/local_merger.py +40 -133
  227. mlrun/feature_store/retrieval/spark_merger.py +129 -127
  228. mlrun/feature_store/retrieval/storey_merger.py +173 -0
  229. mlrun/feature_store/steps.py +132 -15
  230. mlrun/features.py +8 -3
  231. mlrun/frameworks/__init__.py +1 -1
  232. mlrun/frameworks/_common/__init__.py +1 -1
  233. mlrun/frameworks/_common/artifacts_library.py +1 -1
  234. mlrun/frameworks/_common/mlrun_interface.py +1 -1
  235. mlrun/frameworks/_common/model_handler.py +1 -1
  236. mlrun/frameworks/_common/plan.py +1 -1
  237. mlrun/frameworks/_common/producer.py +1 -1
  238. mlrun/frameworks/_common/utils.py +1 -1
  239. mlrun/frameworks/_dl_common/__init__.py +1 -1
  240. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
  241. mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
  242. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
  243. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
  244. mlrun/frameworks/_dl_common/model_handler.py +1 -1
  245. mlrun/frameworks/_dl_common/utils.py +1 -1
  246. mlrun/frameworks/_ml_common/__init__.py +1 -1
  247. mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
  248. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
  249. mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
  250. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
  251. mlrun/frameworks/_ml_common/model_handler.py +1 -1
  252. mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
  253. mlrun/frameworks/_ml_common/plan.py +1 -1
  254. mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
  255. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
  256. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
  257. mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
  258. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
  259. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
  260. mlrun/frameworks/_ml_common/producer.py +1 -1
  261. mlrun/frameworks/_ml_common/utils.py +1 -1
  262. mlrun/frameworks/auto_mlrun/__init__.py +1 -1
  263. mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
  264. mlrun/frameworks/huggingface/__init__.py +1 -1
  265. mlrun/frameworks/huggingface/model_server.py +1 -1
  266. mlrun/frameworks/lgbm/__init__.py +1 -1
  267. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
  268. mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
  269. mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
  270. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
  271. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
  272. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
  273. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
  274. mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
  275. mlrun/frameworks/lgbm/model_handler.py +1 -1
  276. mlrun/frameworks/lgbm/model_server.py +1 -1
  277. mlrun/frameworks/lgbm/utils.py +1 -1
  278. mlrun/frameworks/onnx/__init__.py +1 -1
  279. mlrun/frameworks/onnx/dataset.py +1 -1
  280. mlrun/frameworks/onnx/mlrun_interface.py +1 -1
  281. mlrun/frameworks/onnx/model_handler.py +1 -1
  282. mlrun/frameworks/onnx/model_server.py +1 -1
  283. mlrun/frameworks/parallel_coordinates.py +1 -1
  284. mlrun/frameworks/pytorch/__init__.py +1 -1
  285. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
  286. mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
  287. mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
  288. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
  289. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
  290. mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
  291. mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
  292. mlrun/frameworks/pytorch/model_handler.py +1 -1
  293. mlrun/frameworks/pytorch/model_server.py +1 -1
  294. mlrun/frameworks/pytorch/utils.py +1 -1
  295. mlrun/frameworks/sklearn/__init__.py +1 -1
  296. mlrun/frameworks/sklearn/estimator.py +1 -1
  297. mlrun/frameworks/sklearn/metric.py +1 -1
  298. mlrun/frameworks/sklearn/metrics_library.py +1 -1
  299. mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
  300. mlrun/frameworks/sklearn/model_handler.py +1 -1
  301. mlrun/frameworks/sklearn/utils.py +1 -1
  302. mlrun/frameworks/tf_keras/__init__.py +1 -1
  303. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
  304. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
  305. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
  306. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
  307. mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
  308. mlrun/frameworks/tf_keras/model_handler.py +1 -1
  309. mlrun/frameworks/tf_keras/model_server.py +1 -1
  310. mlrun/frameworks/tf_keras/utils.py +1 -1
  311. mlrun/frameworks/xgboost/__init__.py +1 -1
  312. mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
  313. mlrun/frameworks/xgboost/model_handler.py +1 -1
  314. mlrun/frameworks/xgboost/utils.py +1 -1
  315. mlrun/k8s_utils.py +14 -765
  316. mlrun/kfpops.py +14 -17
  317. mlrun/launcher/__init__.py +13 -0
  318. mlrun/launcher/base.py +406 -0
  319. mlrun/launcher/client.py +159 -0
  320. mlrun/launcher/factory.py +50 -0
  321. mlrun/launcher/local.py +276 -0
  322. mlrun/launcher/remote.py +178 -0
  323. mlrun/lists.py +10 -2
  324. mlrun/mlutils/__init__.py +1 -1
  325. mlrun/mlutils/data.py +1 -1
  326. mlrun/mlutils/models.py +1 -1
  327. mlrun/mlutils/plots.py +1 -1
  328. mlrun/model.py +252 -14
  329. mlrun/model_monitoring/__init__.py +41 -0
  330. mlrun/model_monitoring/features_drift_table.py +1 -1
  331. mlrun/model_monitoring/helpers.py +123 -38
  332. mlrun/model_monitoring/model_endpoint.py +144 -0
  333. mlrun/model_monitoring/model_monitoring_batch.py +310 -259
  334. mlrun/model_monitoring/stores/__init__.py +106 -0
  335. mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
  336. mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
  337. mlrun/model_monitoring/stores/models/__init__.py +23 -0
  338. mlrun/model_monitoring/stores/models/base.py +18 -0
  339. mlrun/model_monitoring/stores/models/mysql.py +100 -0
  340. mlrun/model_monitoring/stores/models/sqlite.py +98 -0
  341. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
  342. mlrun/model_monitoring/stream_processing_fs.py +239 -271
  343. mlrun/package/__init__.py +163 -0
  344. mlrun/package/context_handler.py +325 -0
  345. mlrun/package/errors.py +47 -0
  346. mlrun/package/packager.py +298 -0
  347. mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
  348. mlrun/package/packagers/default_packager.py +422 -0
  349. mlrun/package/packagers/numpy_packagers.py +612 -0
  350. mlrun/package/packagers/pandas_packagers.py +968 -0
  351. mlrun/package/packagers/python_standard_library_packagers.py +616 -0
  352. mlrun/package/packagers_manager.py +786 -0
  353. mlrun/package/utils/__init__.py +53 -0
  354. mlrun/package/utils/_archiver.py +226 -0
  355. mlrun/package/utils/_formatter.py +211 -0
  356. mlrun/package/utils/_pickler.py +234 -0
  357. mlrun/package/utils/_supported_format.py +71 -0
  358. mlrun/package/utils/log_hint_utils.py +93 -0
  359. mlrun/package/utils/type_hint_utils.py +298 -0
  360. mlrun/platforms/__init__.py +1 -1
  361. mlrun/platforms/iguazio.py +34 -2
  362. mlrun/platforms/other.py +1 -1
  363. mlrun/projects/__init__.py +1 -1
  364. mlrun/projects/operations.py +14 -9
  365. mlrun/projects/pipelines.py +31 -13
  366. mlrun/projects/project.py +762 -238
  367. mlrun/render.py +49 -19
  368. mlrun/run.py +57 -326
  369. mlrun/runtimes/__init__.py +3 -9
  370. mlrun/runtimes/base.py +247 -784
  371. mlrun/runtimes/constants.py +1 -1
  372. mlrun/runtimes/daskjob.py +45 -41
  373. mlrun/runtimes/funcdoc.py +43 -7
  374. mlrun/runtimes/function.py +66 -656
  375. mlrun/runtimes/function_reference.py +1 -1
  376. mlrun/runtimes/generators.py +1 -1
  377. mlrun/runtimes/kubejob.py +99 -116
  378. mlrun/runtimes/local.py +59 -66
  379. mlrun/runtimes/mpijob/__init__.py +1 -1
  380. mlrun/runtimes/mpijob/abstract.py +13 -15
  381. mlrun/runtimes/mpijob/v1.py +3 -1
  382. mlrun/runtimes/mpijob/v1alpha1.py +1 -1
  383. mlrun/runtimes/nuclio.py +1 -1
  384. mlrun/runtimes/pod.py +51 -26
  385. mlrun/runtimes/remotesparkjob.py +3 -1
  386. mlrun/runtimes/serving.py +12 -4
  387. mlrun/runtimes/sparkjob/__init__.py +1 -2
  388. mlrun/runtimes/sparkjob/abstract.py +44 -31
  389. mlrun/runtimes/sparkjob/spark3job.py +11 -9
  390. mlrun/runtimes/utils.py +61 -42
  391. mlrun/secrets.py +16 -18
  392. mlrun/serving/__init__.py +3 -2
  393. mlrun/serving/merger.py +1 -1
  394. mlrun/serving/remote.py +1 -1
  395. mlrun/serving/routers.py +39 -42
  396. mlrun/serving/server.py +23 -13
  397. mlrun/serving/serving_wrapper.py +1 -1
  398. mlrun/serving/states.py +172 -39
  399. mlrun/serving/utils.py +1 -1
  400. mlrun/serving/v1_serving.py +1 -1
  401. mlrun/serving/v2_serving.py +29 -21
  402. mlrun/utils/__init__.py +1 -2
  403. mlrun/utils/async_http.py +8 -1
  404. mlrun/utils/azure_vault.py +1 -1
  405. mlrun/utils/clones.py +2 -2
  406. mlrun/utils/condition_evaluator.py +65 -0
  407. mlrun/utils/db.py +52 -0
  408. mlrun/utils/helpers.py +188 -13
  409. mlrun/utils/http.py +89 -54
  410. mlrun/utils/logger.py +48 -8
  411. mlrun/utils/model_monitoring.py +132 -100
  412. mlrun/utils/notifications/__init__.py +1 -1
  413. mlrun/utils/notifications/notification/__init__.py +8 -6
  414. mlrun/utils/notifications/notification/base.py +20 -14
  415. mlrun/utils/notifications/notification/console.py +7 -4
  416. mlrun/utils/notifications/notification/git.py +36 -19
  417. mlrun/utils/notifications/notification/ipython.py +10 -8
  418. mlrun/utils/notifications/notification/slack.py +18 -13
  419. mlrun/utils/notifications/notification_pusher.py +377 -56
  420. mlrun/utils/regex.py +6 -1
  421. mlrun/utils/singleton.py +1 -1
  422. mlrun/utils/v3io_clients.py +1 -1
  423. mlrun/utils/vault.py +270 -269
  424. mlrun/utils/version/__init__.py +1 -1
  425. mlrun/utils/version/version.json +2 -2
  426. mlrun/utils/version/version.py +1 -1
  427. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
  428. mlrun-1.4.0.dist-info/RECORD +434 -0
  429. mlrun/api/api/endpoints/marketplace.py +0 -257
  430. mlrun/api/crud/marketplace.py +0 -221
  431. mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
  432. mlrun/api/db/filedb/db.py +0 -518
  433. mlrun/api/schemas/marketplace.py +0 -128
  434. mlrun/api/schemas/model_endpoints.py +0 -185
  435. mlrun/db/filedb.py +0 -891
  436. mlrun/feature_store/retrieval/online.py +0 -92
  437. mlrun/model_monitoring/constants.py +0 -67
  438. mlrun/runtimes/package/context_handler.py +0 -711
  439. mlrun/runtimes/sparkjob/spark2job.py +0 -59
  440. mlrun-1.3.3.dist-info/RECORD +0 -381
  441. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
  442. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
  443. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
  444. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,53 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ # flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
17
+
18
+ from ._archiver import ArchiveSupportedFormat
19
+ from ._formatter import StructFileSupportedFormat
20
+ from ._pickler import Pickler
21
+ from ._supported_format import SupportedFormat
22
+ from .log_hint_utils import LogHintKey, LogHintUtils
23
+ from .type_hint_utils import TypeHintUtils
24
+
25
+ # The default pickle module to use for pickling objects:
26
+ DEFAULT_PICKLE_MODULE = "cloudpickle"
27
+ # The default archive format to use for archiving directories:
28
+ DEFAULT_ARCHIVE_FORMAT = ArchiveSupportedFormat.ZIP
29
+ # The default struct file format to use for savings python struct objects (dictionaries and lists):
30
+ DEFAULT_STRUCT_FILE_FORMAT = StructFileSupportedFormat.JSON
31
+
32
+
33
+ class ArtifactType:
34
+ """
35
+ Possible artifact types to pack objects as and log using a `mlrun.Packager`.
36
+ """
37
+
38
+ OBJECT = "object"
39
+ PATH = "path"
40
+ FILE = "file"
41
+ DATASET = "dataset"
42
+ MODEL = "model"
43
+ PLOT = "plot"
44
+ RESULT = "result"
45
+
46
+
47
+ class DatasetFileFormat:
48
+ """
49
+ All file format for logging objects as `DatasetArtifact`.
50
+ """
51
+
52
+ CSV = "csv"
53
+ PARQUET = "parquet"
@@ -0,0 +1,226 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import os
16
+ import tarfile
17
+ import zipfile
18
+ from abc import ABC, abstractmethod
19
+ from pathlib import Path
20
+
21
+ from ._supported_format import SupportedFormat
22
+
23
+
24
+ class _Archiver(ABC):
25
+ """
26
+ An abstract base class for an archiver - a class to manage archives of multiple files.
27
+ """
28
+
29
+ @classmethod
30
+ @abstractmethod
31
+ def create_archive(cls, directory_path: str, output_path: str) -> str:
32
+ """
33
+ Create an archive of all the contents in the given directory and save it to an archive file named as the
34
+ directory in the provided output path.
35
+
36
+ :param directory_path: The directory with the files to archive.
37
+ :param output_path: The output path to store the created archive file.
38
+
39
+ :return: The created archive path.
40
+ """
41
+ pass
42
+
43
+ @classmethod
44
+ @abstractmethod
45
+ def extract_archive(cls, archive_path: str, output_path: str) -> str:
46
+ """
47
+ Extract the given archive to a directory named as the archive file (without the extension) located in the
48
+ provided output path.
49
+
50
+ :param archive_path: The archive file to extract its contents.
51
+ :param output_path: The output path to extract the directory of the archive to.
52
+
53
+ :return: The extracted contents directory path.
54
+ """
55
+ pass
56
+
57
+
58
+ class _ZipArchiver(_Archiver):
59
+ """
60
+ A static class for managing zip archives.
61
+ """
62
+
63
+ @classmethod
64
+ def create_archive(cls, directory_path: str, output_path: str) -> str:
65
+ """
66
+ Create an archive of all the contents in the given directory and save it to an archive file named as the
67
+ directory in the provided output path.
68
+
69
+ :param directory_path: The directory with the files to archive.
70
+ :param output_path: The output path to store the created archive file.
71
+
72
+ :return: The created archive path.
73
+ """
74
+ # Convert to `pathlib.Path` objects:
75
+ directory_path = Path(directory_path)
76
+ output_path = Path(output_path)
77
+
78
+ # Construct the archive file path:
79
+ archive_path = output_path / f"{directory_path.stem}.zip"
80
+
81
+ # Archive:
82
+ with zipfile.ZipFile(archive_path, "w") as zip_file:
83
+ for path in directory_path.rglob("*"):
84
+ zip_file.write(filename=path, arcname=path.relative_to(directory_path))
85
+
86
+ return str(archive_path)
87
+
88
+ @classmethod
89
+ def extract_archive(cls, archive_path: str, output_path: str) -> str:
90
+ """
91
+ Extract the given archive to a directory named as the archive file (without the extension) located in the
92
+ provided output path.
93
+
94
+ :param archive_path: The archive file to extract its contents.
95
+ :param output_path: The output path to extract the directory of the archive to.
96
+
97
+ :return: The extracted contents directory path.
98
+ """
99
+ # Convert to `pathlib.Path` objects:
100
+ archive_path = Path(archive_path)
101
+ output_path = Path(output_path)
102
+
103
+ # Create the directory path:
104
+ directory_path = output_path / archive_path.stem
105
+ os.makedirs(directory_path)
106
+
107
+ # Extract:
108
+ with zipfile.ZipFile(archive_path, "r") as zip_file:
109
+ zip_file.extractall(directory_path)
110
+
111
+ return str(directory_path)
112
+
113
+
114
+ class _TarArchiver(_Archiver):
115
+ """
116
+ A static class for managing tar archives.
117
+ """
118
+
119
+ # Inner class variable to note how to open a `TarFile` object for reading and writing:
120
+ _MODE_STRING = ""
121
+
122
+ @classmethod
123
+ def create_archive(cls, directory_path: str, output_path: str) -> str:
124
+ """
125
+ Create an archive of all the contents in the given directory and save it to an archive file named as the
126
+ directory in the provided output path.
127
+
128
+ :param directory_path: The directory with the files to archive.
129
+ :param output_path: The output path to store the created archive file.
130
+
131
+ :return: The created archive path.
132
+ """
133
+ # Convert to `pathlib.Path` objects:
134
+ directory_path = Path(directory_path)
135
+ output_path = Path(output_path)
136
+
137
+ # Construct the archive file path:
138
+ archive_file_extension = (
139
+ "tar" if cls._MODE_STRING == "" else f"tar.{cls._MODE_STRING}"
140
+ )
141
+ archive_path = output_path / f"{directory_path.stem}.{archive_file_extension}"
142
+
143
+ # Archive:
144
+ with tarfile.open(archive_path, f"w:{cls._MODE_STRING}") as tar_file:
145
+ for path in directory_path.rglob("*"):
146
+ tar_file.add(name=path, arcname=path.relative_to(directory_path))
147
+
148
+ return str(archive_path)
149
+
150
+ @classmethod
151
+ def extract_archive(cls, archive_path: str, output_path: str) -> str:
152
+ """
153
+ Extract the given archive to a directory named as the archive file (without the extension) located in the
154
+ provided output path.
155
+
156
+ :param archive_path: The archive file to extract its contents.
157
+ :param output_path: The output path to extract the directory of the archive to.
158
+
159
+ :return: The extracted contents directory path.
160
+ """
161
+ # Convert to `pathlib.Path` objects:
162
+ archive_path = Path(archive_path)
163
+ output_path = Path(output_path)
164
+
165
+ # Get the archive file name (can be constructed of multiple extensions like tar.gz so `Path.stem` won't work):
166
+ archive_file_name = archive_path
167
+ while archive_file_name.with_suffix(suffix="") != archive_file_name:
168
+ archive_file_name = archive_file_name.with_suffix(suffix="")
169
+ archive_file_name = archive_file_name.stem
170
+
171
+ # Create the directory path:
172
+ directory_path = output_path / archive_file_name
173
+ os.makedirs(directory_path)
174
+
175
+ # Extract:
176
+ with tarfile.open(archive_path, f"r:{cls._MODE_STRING}") as tar_file:
177
+ tar_file.extractall(directory_path)
178
+
179
+ return str(directory_path)
180
+
181
+
182
+ class _TarGZArchiver(_TarArchiver):
183
+ """
184
+ A static class for managing tar.gz archives.
185
+ """
186
+
187
+ # Inner class variable to note how to open a `TarFile` object for reading and writing:
188
+ _MODE_STRING = "gz"
189
+
190
+
191
+ class _TarBZ2Archiver(_TarArchiver):
192
+ """
193
+ A static class for managing tar.bz2 archives.
194
+ """
195
+
196
+ # Inner class variable to note how to open a `TarFile` object for reading and writing:
197
+ _MODE_STRING = "bz2"
198
+
199
+
200
+ class _TarXZArchiver(_TarArchiver):
201
+ """
202
+ A static class for managing tar.gz archives.
203
+ """
204
+
205
+ # Inner class variable to note how to open a `TarFile` object for reading and writing:
206
+ _MODE_STRING = "xz"
207
+
208
+
209
+ class ArchiveSupportedFormat(SupportedFormat[_Archiver]):
210
+ """
211
+ Library of archive formats (file extensions) supported by some builtin MLRun packagers.
212
+ """
213
+
214
+ ZIP = "zip"
215
+ TAR = "tar"
216
+ TAR_GZ = "tar.gz"
217
+ TAR_BZ2 = "tar.bz2"
218
+ TAR_XZ = "tar.xz"
219
+
220
+ _FORMAT_HANDLERS_MAP = {
221
+ ZIP: _ZipArchiver,
222
+ TAR: _TarArchiver,
223
+ TAR_GZ: _TarGZArchiver,
224
+ TAR_BZ2: _TarBZ2Archiver,
225
+ TAR_XZ: _TarXZArchiver,
226
+ }
@@ -0,0 +1,211 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import ast
16
+ import json
17
+ from abc import ABC, abstractmethod
18
+ from typing import Any, Union
19
+
20
+ import yaml
21
+
22
+ from ._supported_format import SupportedFormat
23
+
24
+
25
+ class _Formatter(ABC):
26
+ """
27
+ An abstract base class for a formatter - a class to format python structures into and from files.
28
+ """
29
+
30
+ @classmethod
31
+ @abstractmethod
32
+ def write(cls, obj: Any, file_path: str, **dump_kwargs: dict):
33
+ """
34
+ Write the object to a file. The object must be serializable according to the used format.
35
+
36
+ :param obj: The object to write.
37
+ :param file_path: The file path to write to.
38
+ :param dump_kwargs: Additional keyword arguments to pass to the dump method of the formatter in use.
39
+ """
40
+ pass
41
+
42
+ @classmethod
43
+ @abstractmethod
44
+ def read(cls, file_path: str) -> Any:
45
+ """
46
+ Read an object from the file given.
47
+
48
+ :param file_path: The file to read the object from.
49
+
50
+ :return: The read object.
51
+ """
52
+ pass
53
+
54
+
55
+ class _JSONFormatter(_Formatter):
56
+ """
57
+ A static class for managing json files.
58
+ """
59
+
60
+ # A set of default configurations to pass to the dump function:
61
+ DEFAULT_DUMP_KWARGS = {"indent": 4}
62
+
63
+ @classmethod
64
+ def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
65
+ """
66
+ Write the object to a json file. The object must be serializable according to the json format.
67
+
68
+ :param obj: The object to write.
69
+ :param file_path: The file path to write to.
70
+ :param dump_kwargs: Additional keyword arguments to pass to the `json.dump` method of the formatter in use.
71
+ """
72
+ dump_kwargs = dump_kwargs or cls.DEFAULT_DUMP_KWARGS
73
+ with open(file_path, "w") as file:
74
+ json.dump(obj, file, **dump_kwargs)
75
+
76
+ @classmethod
77
+ def read(cls, file_path: str) -> Union[list, dict]:
78
+ """
79
+ Read an object from the json file given.
80
+
81
+ :param file_path: The json file to read the object from.
82
+
83
+ :return: The read object.
84
+ """
85
+ with open(file_path, "r") as file:
86
+ obj = json.load(file)
87
+ return obj
88
+
89
+
90
+ class _JSONLFormatter(_Formatter):
91
+ """
92
+ A static class for managing jsonl files.
93
+ """
94
+
95
+ @classmethod
96
+ def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
97
+ """
98
+ Write the object to a jsonl file. The object must be serializable according to the json format.
99
+
100
+ :param obj: The object to write.
101
+ :param file_path: The file path to write to.
102
+ :param dump_kwargs: Additional keyword arguments to pass to the `json.dumps` method of the formatter in use.
103
+ """
104
+ if isinstance(obj, dict):
105
+ obj = [obj]
106
+
107
+ with open(file_path, "w") as file:
108
+ for line in obj:
109
+ file.write(json.dumps(obj=line, **dump_kwargs) + "\n")
110
+
111
+ @classmethod
112
+ def read(cls, file_path: str) -> Union[list, dict]:
113
+ """
114
+ Read an object from the jsonl file given.
115
+
116
+ :param file_path: The jsonl file to read the object from.
117
+
118
+ :return: The read object.
119
+ """
120
+ with open(file_path, "r") as file:
121
+ lines = file.readlines()
122
+
123
+ obj = []
124
+ for line in lines:
125
+ obj.append(json.loads(s=line))
126
+
127
+ return obj[0] if len(obj) == 1 else obj
128
+
129
+
130
+ class _YAMLFormatter(_Formatter):
131
+ """
132
+ A static class for managing yaml files.
133
+ """
134
+
135
+ # A set of default configurations to pass to the dump function:
136
+ DEFAULT_DUMP_KWARGS = {"default_flow_style": False, "indent": 4}
137
+
138
+ @classmethod
139
+ def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
140
+ """
141
+ Write the object to a yaml file. The object must be serializable according to the yaml format.
142
+
143
+ :param obj: The object to write.
144
+ :param file_path: The file path to write to.
145
+ :param dump_kwargs: Additional keyword arguments to pass to the `yaml.dump` method of the formatter in use.
146
+ """
147
+ dump_kwargs = dump_kwargs or cls.DEFAULT_DUMP_KWARGS
148
+ with open(file_path, "w") as file:
149
+ yaml.dump(obj, file, **dump_kwargs)
150
+
151
+ @classmethod
152
+ def read(cls, file_path: str) -> Union[list, dict]:
153
+ """
154
+ Read an object from the yaml file given.
155
+
156
+ :param file_path: The yaml file to read the object from.
157
+
158
+ :return: The read object.
159
+ """
160
+ with open(file_path, "r") as file:
161
+ obj = yaml.safe_load(file)
162
+ return obj
163
+
164
+
165
+ class _TXTFormatter(_Formatter):
166
+ """
167
+ A static class for managing txt files.
168
+ """
169
+
170
+ @classmethod
171
+ def write(cls, obj: Any, file_path: str, **dump_kwargs: dict):
172
+ """
173
+ Write the object to a text file. The object must be serializable according to python's ast module.
174
+
175
+ :param obj: The object to write.
176
+ :param file_path: The file path to write to.
177
+ :param dump_kwargs: Ignored.
178
+ """
179
+ with open(file_path, "w") as file:
180
+ file.write(str(obj))
181
+
182
+ @classmethod
183
+ def read(cls, file_path: str) -> Any:
184
+ """
185
+ Read an object from the yaml file given.
186
+
187
+ :param file_path: The yaml file to read the object from.
188
+
189
+ :return: The read object.
190
+ """
191
+ with open(file_path, "r") as file:
192
+ obj = ast.literal_eval(file.read())
193
+ return obj
194
+
195
+
196
+ class StructFileSupportedFormat(SupportedFormat[_Formatter]):
197
+ """
198
+ Library of struct formats (file extensions) supported by some builtin MLRun packagers.
199
+ """
200
+
201
+ JSON = "json"
202
+ JSONL = "jsonl"
203
+ YAML = "yaml"
204
+ TXT = "txt"
205
+
206
+ _FORMAT_HANDLERS_MAP = {
207
+ JSON: _JSONFormatter,
208
+ JSONL: _JSONLFormatter,
209
+ YAML: _YAMLFormatter,
210
+ TXT: _TXTFormatter,
211
+ }