mlrun 1.3.3rc1__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.3rc1.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.3rc1.dist-info/RECORD +0 -381
  441. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
  442. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
  443. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
  444. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,257 +0,0 @@
1
- # Copyright 2018 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
- import mimetypes
17
- from http import HTTPStatus
18
- from typing import List, Optional
19
-
20
- from fastapi import APIRouter, Depends, Query, Response
21
- from fastapi.concurrency import run_in_threadpool
22
- from sqlalchemy.orm import Session
23
-
24
- import mlrun
25
- import mlrun.api.api.deps
26
- import mlrun.api.crud
27
- import mlrun.api.utils.auth.verifier
28
- from mlrun.api.schemas import AuthorizationAction
29
- from mlrun.api.schemas.marketplace import (
30
- IndexedMarketplaceSource,
31
- MarketplaceCatalog,
32
- MarketplaceItem,
33
- )
34
- from mlrun.api.utils.singletons.db import get_db
35
-
36
- router = APIRouter()
37
-
38
-
39
- @router.post(
40
- path="/marketplace/sources",
41
- status_code=HTTPStatus.CREATED.value,
42
- response_model=IndexedMarketplaceSource,
43
- )
44
- async def create_source(
45
- source: IndexedMarketplaceSource,
46
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
47
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
48
- mlrun.api.api.deps.authenticate_request
49
- ),
50
- ):
51
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
52
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
53
- AuthorizationAction.create,
54
- auth_info,
55
- )
56
-
57
- await run_in_threadpool(get_db().create_marketplace_source, db_session, source)
58
- # Handle credentials if they exist
59
- await run_in_threadpool(mlrun.api.crud.Marketplace().add_source, source.source)
60
- return await run_in_threadpool(
61
- get_db().get_marketplace_source, db_session, source.source.metadata.name
62
- )
63
-
64
-
65
- @router.get(
66
- path="/marketplace/sources",
67
- response_model=List[IndexedMarketplaceSource],
68
- )
69
- async def list_sources(
70
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
71
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
72
- mlrun.api.api.deps.authenticate_request
73
- ),
74
- ):
75
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
76
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
77
- AuthorizationAction.read,
78
- auth_info,
79
- )
80
-
81
- return await run_in_threadpool(get_db().list_marketplace_sources, db_session)
82
-
83
-
84
- @router.delete(
85
- path="/marketplace/sources/{source_name}",
86
- status_code=HTTPStatus.NO_CONTENT.value,
87
- )
88
- async def delete_source(
89
- source_name: str,
90
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
91
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
92
- mlrun.api.api.deps.authenticate_request
93
- ),
94
- ):
95
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
96
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
97
- AuthorizationAction.delete,
98
- auth_info,
99
- )
100
-
101
- await run_in_threadpool(get_db().delete_marketplace_source, db_session, source_name)
102
- await run_in_threadpool(mlrun.api.crud.Marketplace().remove_source, source_name)
103
-
104
-
105
- @router.get(
106
- path="/marketplace/sources/{source_name}",
107
- response_model=IndexedMarketplaceSource,
108
- )
109
- async def get_source(
110
- source_name: str,
111
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
112
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
113
- mlrun.api.api.deps.authenticate_request
114
- ),
115
- ):
116
- marketplace_source = await run_in_threadpool(
117
- get_db().get_marketplace_source, db_session, source_name
118
- )
119
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
120
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
121
- AuthorizationAction.read,
122
- auth_info,
123
- )
124
-
125
- return marketplace_source
126
-
127
-
128
- @router.put(
129
- path="/marketplace/sources/{source_name}", response_model=IndexedMarketplaceSource
130
- )
131
- async def store_source(
132
- source_name: str,
133
- source: IndexedMarketplaceSource,
134
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
135
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
136
- mlrun.api.api.deps.authenticate_request
137
- ),
138
- ):
139
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
140
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
141
- AuthorizationAction.store,
142
- auth_info,
143
- )
144
-
145
- await run_in_threadpool(
146
- get_db().store_marketplace_source, db_session, source_name, source
147
- )
148
- # Handle credentials if they exist
149
- await run_in_threadpool(mlrun.api.crud.Marketplace().add_source, source.source)
150
-
151
- return await run_in_threadpool(
152
- get_db().get_marketplace_source, db_session, source_name
153
- )
154
-
155
-
156
- @router.get(
157
- path="/marketplace/sources/{source_name}/items",
158
- response_model=MarketplaceCatalog,
159
- )
160
- async def get_catalog(
161
- source_name: str,
162
- channel: Optional[str] = Query(None),
163
- version: Optional[str] = Query(None),
164
- tag: Optional[str] = Query(None),
165
- force_refresh: Optional[bool] = Query(False, alias="force-refresh"),
166
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
167
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
168
- mlrun.api.api.deps.authenticate_request
169
- ),
170
- ):
171
- ordered_source = await run_in_threadpool(
172
- get_db().get_marketplace_source, db_session, source_name
173
- )
174
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
175
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
176
- AuthorizationAction.read,
177
- auth_info,
178
- )
179
-
180
- return await run_in_threadpool(
181
- mlrun.api.crud.Marketplace().get_source_catalog,
182
- ordered_source.source,
183
- channel,
184
- version,
185
- tag,
186
- force_refresh,
187
- )
188
-
189
-
190
- @router.get(
191
- "/marketplace/sources/{source_name}/items/{item_name}",
192
- response_model=MarketplaceItem,
193
- )
194
- async def get_item(
195
- source_name: str,
196
- item_name: str,
197
- channel: Optional[str] = Query("development"),
198
- version: Optional[str] = Query(None),
199
- tag: Optional[str] = Query("latest"),
200
- force_refresh: Optional[bool] = Query(False, alias="force-refresh"),
201
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
202
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
203
- mlrun.api.api.deps.authenticate_request
204
- ),
205
- ):
206
- ordered_source = await run_in_threadpool(
207
- get_db().get_marketplace_source, db_session, source_name
208
- )
209
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
210
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
211
- AuthorizationAction.read,
212
- auth_info,
213
- )
214
-
215
- return await run_in_threadpool(
216
- mlrun.api.crud.Marketplace().get_item,
217
- ordered_source.source,
218
- item_name,
219
- channel,
220
- version,
221
- tag,
222
- force_refresh,
223
- )
224
-
225
-
226
- @router.get(
227
- "/marketplace/sources/{source_name}/item-object",
228
- )
229
- async def get_object(
230
- source_name: str,
231
- url: str,
232
- db_session: Session = Depends(mlrun.api.api.deps.get_db_session),
233
- auth_info: mlrun.api.schemas.AuthInfo = Depends(
234
- mlrun.api.api.deps.authenticate_request
235
- ),
236
- ):
237
- ordered_source = await run_in_threadpool(
238
- get_db().get_marketplace_source, db_session, source_name
239
- )
240
- object_data = await run_in_threadpool(
241
- mlrun.api.crud.Marketplace().get_item_object_using_source_credentials,
242
- ordered_source.source,
243
- url,
244
- )
245
- await mlrun.api.utils.auth.verifier.AuthVerifier().query_global_resource_permissions(
246
- mlrun.api.schemas.AuthorizationResourceTypes.marketplace_source,
247
- AuthorizationAction.read,
248
- auth_info,
249
- )
250
-
251
- if url.endswith("/"):
252
- return object_data
253
-
254
- ctype, _ = mimetypes.guess_type(url)
255
- if not ctype:
256
- ctype = "application/octet-stream"
257
- return Response(content=object_data, media_type=ctype)
@@ -1,221 +0,0 @@
1
- # Copyright 2018 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 json
16
-
17
- import mlrun.errors
18
- import mlrun.utils.singleton
19
- from mlrun.api.schemas.marketplace import (
20
- MarketplaceCatalog,
21
- MarketplaceItem,
22
- MarketplaceItemMetadata,
23
- MarketplaceItemSpec,
24
- MarketplaceSource,
25
- ObjectStatus,
26
- )
27
- from mlrun.api.utils.singletons.k8s import get_k8s
28
- from mlrun.config import config
29
- from mlrun.datastore import store_manager
30
-
31
- from ..schemas import SecretProviderName
32
- from .secrets import Secrets, SecretsClientType
33
-
34
- # Using a complex separator, as it's less likely someone will use it in a real secret name
35
- secret_name_separator = "-__-"
36
-
37
-
38
- class Marketplace(metaclass=mlrun.utils.singleton.Singleton):
39
- def __init__(self):
40
- self._internal_project_name = config.marketplace.k8s_secrets_project_name
41
- self._catalogs = {}
42
-
43
- @staticmethod
44
- def _in_k8s():
45
- k8s_helper = get_k8s()
46
- return (
47
- k8s_helper is not None and k8s_helper.is_running_inside_kubernetes_cluster()
48
- )
49
-
50
- @staticmethod
51
- def _generate_credentials_secret_key(source, key=""):
52
- full_key = source + secret_name_separator + key
53
- return Secrets().generate_client_project_secret_key(
54
- SecretsClientType.marketplace, full_key
55
- )
56
-
57
- def add_source(self, source: MarketplaceSource):
58
- source_name = source.metadata.name
59
- credentials = source.spec.credentials
60
- if credentials:
61
- self._store_source_credentials(source_name, credentials)
62
-
63
- def remove_source(self, source_name):
64
- self._catalogs.pop(source_name, None)
65
- if not self._in_k8s():
66
- return
67
-
68
- source_credentials = self._get_source_credentials(source_name)
69
- if not source_credentials:
70
- return
71
- secrets_to_delete = [
72
- self._generate_credentials_secret_key(source_name, key)
73
- for key in source_credentials
74
- ]
75
- Secrets().delete_project_secrets(
76
- self._internal_project_name,
77
- SecretProviderName.kubernetes,
78
- secrets_to_delete,
79
- allow_internal_secrets=True,
80
- )
81
-
82
- def _store_source_credentials(self, source_name, credentials: dict):
83
- if not self._in_k8s():
84
- raise mlrun.errors.MLRunInvalidArgumentError(
85
- "MLRun is not configured with k8s, marketplace source credentials cannot be stored securely"
86
- )
87
-
88
- adjusted_credentials = {
89
- self._generate_credentials_secret_key(source_name, key): value
90
- for key, value in credentials.items()
91
- }
92
- Secrets().store_project_secrets(
93
- self._internal_project_name,
94
- mlrun.api.schemas.SecretsData(
95
- provider=SecretProviderName.kubernetes, secrets=adjusted_credentials
96
- ),
97
- allow_internal_secrets=True,
98
- )
99
-
100
- def _get_source_credentials(self, source_name):
101
- if not self._in_k8s():
102
- return {}
103
-
104
- secret_prefix = self._generate_credentials_secret_key(source_name)
105
- secrets = (
106
- Secrets()
107
- .list_project_secrets(
108
- self._internal_project_name,
109
- SecretProviderName.kubernetes,
110
- allow_secrets_from_k8s=True,
111
- allow_internal_secrets=True,
112
- )
113
- .secrets
114
- )
115
-
116
- source_secrets = {}
117
- for key, value in secrets.items():
118
- if key.startswith(secret_prefix):
119
- source_secrets[key[len(secret_prefix) :]] = value
120
-
121
- return source_secrets
122
-
123
- @staticmethod
124
- def _transform_catalog_dict_to_schema(source, catalog_dict):
125
- catalog_dict = catalog_dict.get("functions")
126
- if not catalog_dict:
127
- raise mlrun.errors.MLRunInternalServerError(
128
- "Invalid catalog file - no 'functions' section found."
129
- )
130
-
131
- catalog = MarketplaceCatalog(catalog=[])
132
- # Loop over channels, then per function extract versions.
133
- for channel_name in catalog_dict:
134
- channel_dict = catalog_dict[channel_name]
135
- for function_name in channel_dict:
136
- function_dict = channel_dict[function_name]
137
- for version_tag in function_dict:
138
- version_dict = function_dict[version_tag]
139
- function_details_dict = version_dict.copy()
140
- spec_dict = function_details_dict.pop("spec", None)
141
- metadata = MarketplaceItemMetadata(
142
- channel=channel_name, tag=version_tag, **function_details_dict
143
- )
144
- item_uri = source.get_full_uri(metadata.get_relative_path())
145
- spec = MarketplaceItemSpec(item_uri=item_uri, **spec_dict)
146
- item = MarketplaceItem(
147
- metadata=metadata, spec=spec, status=ObjectStatus()
148
- )
149
- catalog.catalog.append(item)
150
-
151
- return catalog
152
-
153
- def get_source_catalog(
154
- self,
155
- source: MarketplaceSource,
156
- channel=None,
157
- version=None,
158
- tag=None,
159
- force_refresh=False,
160
- ) -> MarketplaceCatalog:
161
- source_name = source.metadata.name
162
- if not self._catalogs.get(source_name) or force_refresh:
163
- url = source.get_catalog_uri()
164
- credentials = self._get_source_credentials(source_name)
165
- catalog_data = mlrun.run.get_object(url=url, secrets=credentials)
166
- catalog_dict = json.loads(catalog_data)
167
- catalog = self._transform_catalog_dict_to_schema(source, catalog_dict)
168
- self._catalogs[source_name] = catalog
169
- else:
170
- catalog = self._catalogs[source_name]
171
-
172
- result_catalog = MarketplaceCatalog(catalog=[])
173
- for item in catalog.catalog:
174
- if (
175
- (channel is None or item.metadata.channel == channel)
176
- and (tag is None or item.metadata.tag == tag)
177
- and (version is None or item.metadata.version == version)
178
- ):
179
- result_catalog.catalog.append(item)
180
-
181
- return result_catalog
182
-
183
- def get_item(
184
- self,
185
- source: MarketplaceSource,
186
- item_name,
187
- channel,
188
- version=None,
189
- tag=None,
190
- force_refresh=False,
191
- ) -> MarketplaceItem:
192
- catalog = self.get_source_catalog(source, channel, version, tag, force_refresh)
193
- items = [item for item in catalog.catalog if item.metadata.name == item_name]
194
- if not items:
195
- raise mlrun.errors.MLRunNotFoundError(
196
- f"Item not found. source={item_name}, channel={channel}, version={version}"
197
- )
198
- if len(items) > 1:
199
- raise mlrun.errors.MLRunInvalidArgumentError(
200
- "Query resulted in more than 1 catalog items. "
201
- + f"source={item_name}, channel={channel}, version={version}, tag={tag}"
202
- )
203
- return items[0]
204
-
205
- def get_item_object_using_source_credentials(self, source: MarketplaceSource, url):
206
- credentials = self._get_source_credentials(source.metadata.name)
207
-
208
- if not url.startswith(source.spec.path):
209
- raise mlrun.errors.MLRunInvalidArgumentError(
210
- "URL to retrieve must be located in the source filesystem tree"
211
- )
212
-
213
- if url.endswith("/"):
214
- obj = store_manager.object(url=url, secrets=credentials)
215
- listdir = obj.listdir()
216
- return {
217
- "listdir": listdir,
218
- }
219
- else:
220
- catalog_data = mlrun.run.get_object(url=url, secrets=credentials)
221
- return catalog_data