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
@@ -0,0 +1,276 @@
1
+ # Copyright 2023 MLRun Authors
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
+ import os
15
+ import pathlib
16
+ from typing import Callable, Dict, List, Optional, Union
17
+
18
+ import mlrun.common.schemas.schedule
19
+ import mlrun.errors
20
+ import mlrun.launcher.client
21
+ import mlrun.run
22
+ import mlrun.runtimes.generators
23
+ import mlrun.utils.clones
24
+ import mlrun.utils.notifications
25
+ from mlrun.utils import logger
26
+
27
+
28
+ class ClientLocalLauncher(mlrun.launcher.client.ClientBaseLauncher):
29
+ """
30
+ ClientLocalLauncher is a launcher that runs the job locally.
31
+ Either on the user's machine (_is_run_local is True) or on a remote machine (_is_run_local is False).
32
+ """
33
+
34
+ def __init__(self, local: bool):
35
+ """
36
+ Initialize a ClientLocalLauncher.
37
+ :param local: True if the job runs on the user's local machine,
38
+ False if it runs on a remote machine (e.g. a dedicated k8s pod).
39
+ """
40
+ super().__init__()
41
+ self._is_run_local = local
42
+
43
+ def launch(
44
+ self,
45
+ runtime: "mlrun.runtimes.BaseRuntime",
46
+ task: Optional[
47
+ Union["mlrun.run.RunTemplate", "mlrun.run.RunObject", dict]
48
+ ] = None,
49
+ handler: Optional[Union[str, Callable]] = None,
50
+ name: Optional[str] = "",
51
+ project: Optional[str] = "",
52
+ params: Optional[dict] = None,
53
+ inputs: Optional[Dict[str, str]] = None,
54
+ out_path: Optional[str] = "",
55
+ workdir: Optional[str] = "",
56
+ artifact_path: Optional[str] = "",
57
+ watch: Optional[bool] = True,
58
+ schedule: Optional[
59
+ Union[str, mlrun.common.schemas.schedule.ScheduleCronTrigger]
60
+ ] = None,
61
+ hyperparams: Dict[str, list] = None,
62
+ hyper_param_options: Optional[mlrun.model.HyperParamOptions] = None,
63
+ verbose: Optional[bool] = None,
64
+ scrape_metrics: Optional[bool] = None,
65
+ local_code_path: Optional[str] = None,
66
+ auto_build: Optional[bool] = None,
67
+ param_file_secrets: Optional[Dict[str, str]] = None,
68
+ notifications: Optional[List[mlrun.model.Notification]] = None,
69
+ returns: Optional[List[Union[str, Dict[str, str]]]] = None,
70
+ ) -> "mlrun.run.RunObject":
71
+
72
+ # do not allow local function to be scheduled
73
+ if self._is_run_local and schedule is not None:
74
+ raise mlrun.errors.MLRunInvalidArgumentError(
75
+ "local and schedule cannot be used together"
76
+ )
77
+
78
+ self.enrich_runtime(runtime)
79
+ run = self._create_run_object(task)
80
+
81
+ if self._is_run_local:
82
+ runtime = self._create_local_function_for_execution(
83
+ runtime=runtime,
84
+ run=run,
85
+ local_code_path=local_code_path,
86
+ project=project,
87
+ name=name,
88
+ workdir=workdir,
89
+ handler=handler,
90
+ )
91
+
92
+ # sanity check
93
+ elif runtime._is_remote:
94
+ message = "Remote function cannot be executed locally"
95
+ logger.error(
96
+ message,
97
+ is_remote=runtime._is_remote,
98
+ local=self._is_run_local,
99
+ runtime=runtime.to_dict(),
100
+ )
101
+ raise mlrun.errors.MLRunRuntimeError(message)
102
+
103
+ run = self._enrich_run(
104
+ runtime=runtime,
105
+ run=run,
106
+ handler=handler,
107
+ project_name=project,
108
+ name=name,
109
+ params=params,
110
+ inputs=inputs,
111
+ returns=returns,
112
+ hyperparams=hyperparams,
113
+ hyper_param_options=hyper_param_options,
114
+ verbose=verbose,
115
+ scrape_metrics=scrape_metrics,
116
+ out_path=out_path,
117
+ artifact_path=artifact_path,
118
+ workdir=workdir,
119
+ notifications=notifications,
120
+ )
121
+ self._validate_runtime(runtime, run)
122
+ result = self.execute(
123
+ runtime=runtime,
124
+ run=run,
125
+ )
126
+
127
+ return result
128
+
129
+ def execute(
130
+ self,
131
+ runtime: "mlrun.runtimes.BaseRuntime",
132
+ run: Optional[Union["mlrun.run.RunTemplate", "mlrun.run.RunObject"]] = None,
133
+ ):
134
+
135
+ if "V3IO_USERNAME" in os.environ and "v3io_user" not in run.metadata.labels:
136
+ run.metadata.labels["v3io_user"] = os.environ.get("V3IO_USERNAME")
137
+
138
+ # store function object in db unless running from within a run pod
139
+ if not runtime.is_child:
140
+ logger.info(
141
+ "Storing function",
142
+ name=run.metadata.name,
143
+ uid=run.metadata.uid,
144
+ db=runtime.spec.rundb,
145
+ )
146
+ self._store_function(runtime, run)
147
+
148
+ execution = mlrun.run.MLClientCtx.from_dict(
149
+ run.to_dict(),
150
+ runtime._get_db(),
151
+ autocommit=False,
152
+ is_api=False,
153
+ store_run=False,
154
+ )
155
+
156
+ # create task generator (for child runs) from spec
157
+ task_generator = mlrun.runtimes.generators.get_generator(run.spec, execution)
158
+ if task_generator:
159
+ # verify valid task parameters
160
+ tasks = task_generator.generate(run)
161
+ for task in tasks:
162
+ self._validate_run_params(task.spec.parameters)
163
+
164
+ # post verifications, store execution in db and run pre run hooks
165
+ execution.store_run()
166
+ runtime._pre_run(run, execution) # hook for runtime specific prep
167
+
168
+ last_err = None
169
+ # If the runtime is nested, it means the hyper-run will run within a single instance of the run.
170
+ # So while in the API, we consider the hyper-run as a single run, and then in the runtime itself when the
171
+ # runtime is now a local runtime and therefore `self._is_nested == False`, we run each task as a separate run by
172
+ # using the task generator
173
+ # TODO client-server separation might not need the not runtime._is_nested anymore as this executed local func
174
+ if task_generator and not runtime._is_nested:
175
+ # multiple runs (based on hyper params or params file)
176
+ runner = runtime._run_many
177
+ if hasattr(runtime, "_parallel_run_many") and task_generator.use_parallel():
178
+ runner = runtime._parallel_run_many
179
+ results = runner(task_generator, execution, run)
180
+ mlrun.runtimes.utils.results_to_iter(results, run, execution)
181
+ result = execution.to_dict()
182
+ result = runtime._update_run_state(result, task=run)
183
+
184
+ else:
185
+ # single run
186
+ try:
187
+ resp = runtime._run(run, execution)
188
+ result = runtime._update_run_state(resp, task=run)
189
+ except mlrun.runtimes.base.RunError as err:
190
+ last_err = err
191
+ result = runtime._update_run_state(task=run, err=err)
192
+
193
+ self._push_notifications(run, runtime)
194
+
195
+ # run post run hooks
196
+ runtime._post_run(result, execution) # hook for runtime specific cleanup
197
+
198
+ return self._wrap_run_result(runtime, result, run, err=last_err)
199
+
200
+ def _create_local_function_for_execution(
201
+ self,
202
+ runtime: "mlrun.runtimes.BaseRuntime",
203
+ run: "mlrun.run.RunObject",
204
+ local_code_path: Optional[str] = None,
205
+ project: Optional[str] = "",
206
+ name: Optional[str] = "",
207
+ workdir: Optional[str] = "",
208
+ handler: Optional[str] = None,
209
+ ):
210
+
211
+ project = project or runtime.metadata.project
212
+ function_name = name or runtime.metadata.name
213
+ command, args = self._resolve_local_code_path(local_code_path)
214
+ if command:
215
+ function_name = name or pathlib.Path(command).stem
216
+
217
+ meta = mlrun.model.BaseMetadata(function_name, project=project)
218
+
219
+ command, loaded_runtime = mlrun.run.load_func_code(
220
+ command or runtime, workdir, name=name
221
+ )
222
+ # loaded_runtime is loaded from runtime or yaml file, if passed a command it should be None,
223
+ # so we keep the current runtime for enrichment
224
+ runtime = loaded_runtime or runtime
225
+ if loaded_runtime:
226
+ if run:
227
+ handler = handler or run.spec.handler
228
+ handler = handler or runtime.spec.default_handler or ""
229
+ meta = runtime.metadata.copy()
230
+ meta.name = function_name or meta.name
231
+ meta.project = project or meta.project
232
+
233
+ # if the handler has module prefix force "local" (vs "handler") runtime
234
+ kind = "local" if isinstance(handler, str) and "." in handler else ""
235
+ fn = mlrun.new_function(meta.name, command=command, args=args, kind=kind)
236
+ fn.metadata = meta
237
+ setattr(fn, "_is_run_local", True)
238
+ if workdir:
239
+ fn.spec.workdir = str(workdir)
240
+
241
+ fn.spec.allow_empty_resources = runtime.spec.allow_empty_resources
242
+ if runtime:
243
+ # copy the code/base-spec to the local function (for the UI and code logging)
244
+ fn.spec.description = runtime.spec.description
245
+ fn.spec.build = runtime.spec.build
246
+
247
+ run.spec.handler = handler
248
+ return fn
249
+
250
+ @staticmethod
251
+ def _resolve_local_code_path(local_code_path: str) -> (str, List[str]):
252
+ command = None
253
+ args = []
254
+ if local_code_path:
255
+ command = local_code_path
256
+ if command:
257
+ sp = command.split()
258
+ # split command and args
259
+ command = sp[0]
260
+ if len(sp) > 1:
261
+ args = sp[1:]
262
+ return command, args
263
+
264
+ def _push_notifications(
265
+ self, runobj: "mlrun.run.RunObject", runtime: "mlrun.runtimes.BaseRuntime"
266
+ ):
267
+ if not self._run_has_valid_notifications(runobj):
268
+ return
269
+ # TODO: add store_notifications API endpoint so we can store notifications pushed from the
270
+ # SDK for documentation purposes.
271
+ # The run is local, so we can assume that watch=True, therefore this code runs
272
+ # once the run is completed, and we can just push the notifications.
273
+ # Only push from jupyter, not from the CLI.
274
+ # "handler" and "dask" kinds are special cases of local runs which don't set local=True
275
+ if self._is_run_local or runtime.kind in ["handler", "dask"]:
276
+ mlrun.utils.notifications.NotificationPusher([runobj]).push()
@@ -0,0 +1,178 @@
1
+ # Copyright 2023 MLRun Authors
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
+ import os
15
+ from typing import Dict, List, Optional, Union
16
+
17
+ import requests
18
+
19
+ import mlrun.common.schemas.schedule
20
+ import mlrun.db
21
+ import mlrun.errors
22
+ import mlrun.launcher.client
23
+ import mlrun.run
24
+ import mlrun.runtimes
25
+ import mlrun.runtimes.generators
26
+ import mlrun.utils.clones
27
+ import mlrun.utils.notifications
28
+ from mlrun.utils import logger
29
+
30
+
31
+ class ClientRemoteLauncher(mlrun.launcher.client.ClientBaseLauncher):
32
+ def launch(
33
+ self,
34
+ runtime: "mlrun.runtimes.KubejobRuntime",
35
+ task: Optional[
36
+ Union["mlrun.run.RunTemplate", "mlrun.run.RunObject", dict]
37
+ ] = None,
38
+ handler: Optional[str] = None,
39
+ name: Optional[str] = "",
40
+ project: Optional[str] = "",
41
+ params: Optional[dict] = None,
42
+ inputs: Optional[Dict[str, str]] = None,
43
+ out_path: Optional[str] = "",
44
+ workdir: Optional[str] = "",
45
+ artifact_path: Optional[str] = "",
46
+ watch: Optional[bool] = True,
47
+ schedule: Optional[
48
+ Union[str, mlrun.common.schemas.schedule.ScheduleCronTrigger]
49
+ ] = None,
50
+ hyperparams: Dict[str, list] = None,
51
+ hyper_param_options: Optional[mlrun.model.HyperParamOptions] = None,
52
+ verbose: Optional[bool] = None,
53
+ scrape_metrics: Optional[bool] = None,
54
+ local_code_path: Optional[str] = None,
55
+ auto_build: Optional[bool] = None,
56
+ param_file_secrets: Optional[Dict[str, str]] = None,
57
+ notifications: Optional[List[mlrun.model.Notification]] = None,
58
+ returns: Optional[List[Union[str, Dict[str, str]]]] = None,
59
+ ) -> "mlrun.run.RunObject":
60
+ self.enrich_runtime(runtime)
61
+ run = self._create_run_object(task)
62
+
63
+ run = self._enrich_run(
64
+ runtime=runtime,
65
+ run=run,
66
+ handler=handler,
67
+ project_name=project,
68
+ name=name,
69
+ params=params,
70
+ inputs=inputs,
71
+ returns=returns,
72
+ hyperparams=hyperparams,
73
+ hyper_param_options=hyper_param_options,
74
+ verbose=verbose,
75
+ scrape_metrics=scrape_metrics,
76
+ out_path=out_path,
77
+ artifact_path=artifact_path,
78
+ workdir=workdir,
79
+ notifications=notifications,
80
+ )
81
+ self._validate_runtime(runtime, run)
82
+
83
+ if not runtime.is_deployed():
84
+ if runtime.spec.build.auto_build or auto_build:
85
+ logger.info(
86
+ "Function is not deployed and auto_build flag is set, starting deploy..."
87
+ )
88
+ runtime.deploy(skip_deployed=True, show_on_failure=True)
89
+
90
+ else:
91
+ raise mlrun.errors.MLRunRuntimeError(
92
+ "function image is not built/ready, set auto_build=True or use .deploy() method first"
93
+ )
94
+
95
+ if runtime.verbose:
96
+ logger.info(f"runspec:\n{run.to_yaml()}")
97
+
98
+ if "V3IO_USERNAME" in os.environ and "v3io_user" not in run.metadata.labels:
99
+ run.metadata.labels["v3io_user"] = os.environ.get("V3IO_USERNAME")
100
+
101
+ logger.info(
102
+ "Storing function",
103
+ name=run.metadata.name,
104
+ uid=run.metadata.uid,
105
+ db=runtime.spec.rundb,
106
+ )
107
+ self._store_function(runtime, run)
108
+
109
+ return self.submit_job(runtime, run, schedule, watch)
110
+
111
+ def submit_job(
112
+ self,
113
+ runtime: "mlrun.runtimes.KubejobRuntime",
114
+ run: "mlrun.run.RunObject",
115
+ schedule: Optional[mlrun.common.schemas.ScheduleCronTrigger] = None,
116
+ watch: Optional[bool] = None,
117
+ ):
118
+ if runtime._secrets:
119
+ run.spec.secret_sources = runtime._secrets.to_serial()
120
+ try:
121
+ db = runtime._get_db()
122
+ resp = db.submit_job(run, schedule=schedule)
123
+ if schedule:
124
+ action = resp.pop("action", "created")
125
+ logger.info(f"task schedule {action}", **resp)
126
+ return
127
+
128
+ except (requests.HTTPError, Exception) as err:
129
+ logger.error(f"got remote run err, {mlrun.errors.err_to_str(err)}")
130
+
131
+ if isinstance(err, requests.HTTPError):
132
+ runtime._handle_submit_job_http_error(err)
133
+
134
+ result = None
135
+ # if we got a schedule no reason to do post_run stuff (it purposed to update the run status with error,
136
+ # but there's no run in case of schedule)
137
+ if not schedule:
138
+ result = runtime._update_run_state(
139
+ task=run, err=mlrun.errors.err_to_str(err)
140
+ )
141
+ return self._wrap_run_result(
142
+ runtime, result, run, schedule=schedule, err=err
143
+ )
144
+
145
+ if resp:
146
+ txt = mlrun.runtimes.utils.helpers.get_in(resp, "status.status_text")
147
+ if txt:
148
+ logger.info(txt)
149
+
150
+ # watch is None only in scenario where we run from pipeline step, in this case we don't want to watch the run
151
+ # logs too frequently but rather just pull the state of the run from the DB and pull the logs every x seconds
152
+ # which ideally greater than the pull state interval, this reduces unnecessary load on the API server, as
153
+ # running a pipeline is mostly not an interactive process which means the logs pulling doesn't need to be pulled
154
+ # in real time
155
+ if (
156
+ watch is None
157
+ and runtime.kfp
158
+ and mlrun.mlconf.httpdb.logs.pipelines.pull_state.mode == "enabled"
159
+ ):
160
+ state_interval = int(
161
+ mlrun.mlconf.httpdb.logs.pipelines.pull_state.pull_state_interval
162
+ )
163
+ logs_interval = int(
164
+ mlrun.mlconf.httpdb.logs.pipelines.pull_state.pull_logs_interval
165
+ )
166
+ run.wait_for_completion(
167
+ show_logs=True,
168
+ sleep=state_interval,
169
+ logs_interval=logs_interval,
170
+ raise_on_failure=False,
171
+ )
172
+ resp = runtime._get_db_run(run)
173
+
174
+ elif watch or runtime.kfp:
175
+ run.logs(True, runtime._get_db())
176
+ resp = runtime._get_db_run(run)
177
+
178
+ return self._wrap_run_result(runtime, resp, run, schedule=schedule)
mlrun/lists.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -92,7 +92,9 @@ class RunList(list):
92
92
 
93
93
  return [list_header] + rows
94
94
 
95
- def to_df(self, flat=False, extend_iterations=False, cache=True):
95
+ def to_df(
96
+ self, flat: bool = False, extend_iterations: bool = False, cache: bool = True
97
+ ) -> pd.DataFrame:
96
98
  """convert the run list to a dataframe"""
97
99
  if hasattr(self, "_df") and cache:
98
100
  return self._df
@@ -179,10 +181,16 @@ class ArtifactList(list):
179
181
  "producer": ["producer", "spec.producer"],
180
182
  "sources": ["sources", "spec.sources"],
181
183
  "labels": ["labels", "metadata.labels"],
184
+ # important: the uri item must be the last one in this dict since there is no artifact.uri, and we fill it
185
+ # in the following for loop as the "last_index" in the dict
186
+ "uri": ["uri", "uri"],
182
187
  }
183
188
  for artifact in self:
184
189
  fields_index = 0 if is_legacy_artifact(artifact) else 1
185
190
  row = [get_in(artifact, v[fields_index], "") for k, v in head.items()]
191
+ artifact_uri = dict_to_artifact(artifact).uri
192
+ last_index = len(row) - 1
193
+ row[last_index] = artifact_uri
186
194
  rows.append(row)
187
195
 
188
196
  return [head.keys()] + rows
mlrun/mlutils/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
mlrun/mlutils/data.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
mlrun/mlutils/models.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
mlrun/mlutils/plots.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.