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,422 @@
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 inspect
16
+ from types import MethodType
17
+ from typing import Any, List, Tuple, Type, Union
18
+
19
+ from mlrun.artifacts import Artifact
20
+ from mlrun.datastore import DataItem
21
+ from mlrun.utils import logger
22
+
23
+ from ..errors import MLRunPackagePackingError, MLRunPackageUnpackingError
24
+ from ..packager import Packager
25
+ from ..utils import DEFAULT_PICKLE_MODULE, ArtifactType, Pickler, TypeHintUtils
26
+
27
+
28
+ class DefaultPackager(Packager):
29
+ """
30
+ A default packager that handles all types and pack them as pickle files.
31
+
32
+ The default packager implements all the required methods and have a default logic that should be satisfying most
33
+ use cases. In order to work with this class, you shouldn't override the abstract class methods, but follow the
34
+ guidelines below:
35
+
36
+ * The class variable ``PACKABLE_OBJECT_TYPE``: The type of object this packager can pack and unpack (used in the
37
+ ``is_packable`` method).
38
+ * The class variable ``PACK_SUBCLASSES``: A flag that indicates whether to pack all subclasses of the
39
+ ``PACKABLE_OBJECT_TYPE` (used in the ``is_packable`` method). Default is False.
40
+ * The class variable ``DEFAULT_PACKING_ARTIFACT_TYPE``: The default artifact type to pack as. It is being returned
41
+ from the method ``get_default_packing_artifact_type``
42
+ * The class variable ``DEFAULT_UNPACKING_ARTIFACT_TYPE``: The default artifact type to unpack from. It is being
43
+ returned from the method ``get_default_unpacking_artifact_type``.
44
+ * The abstract class method ``pack``: The method is implemented to get the object and send it to the relevant
45
+ packing method by the artifact type given using the following naming: "pack_<artifact_type>". (if artifact type
46
+ was not provided, the default one will be used). For example: if the artifact type is "object" then the class
47
+ method ``pack_object`` must be implemented. The signature of each pack class method must be::
48
+
49
+ @classmethod
50
+ def pack_x(cls, obj: Any, ...) -> Union[Tuple[Artifact, dict], dict]:
51
+ pass
52
+
53
+ Where 'x' is the artifact type, 'obj' is the object to pack, ... are additional custom log hint configurations and
54
+ the returning values are the packed artifact and the instructions for unpacking it, or in case of result, the
55
+ dictionary of the result with its key and value. The log hint configurations are sent by the user and shouldn't be
56
+ mandatory, meaning they should have a default value (otherwise, the user will have to add them to every log hint).
57
+ * The abstract class method ``unpack``: The method is implemented to get a ``DataItem`` and send it to the relevant
58
+ unpacking method by the artifact type using the following naming: "unpack_<artifact_type>" (if artifact type was
59
+ not provided, the default one will be used). For example: if the artifact type stored within the ``DataItem`` is
60
+ "object" then the class method ``unpack_object`` must be implemented. The signature of each unpack class method
61
+ must be::
62
+
63
+ @classmethod
64
+ def unpack_x(cls, data_item: mlrun.DataItem, ...) -> Any:
65
+ pass
66
+
67
+ Where 'x' is the artifact type, 'data_item' is the artifact's data item to unpack, ... are the instructions that
68
+ were originally returned from ``pack_x`` (Each instruction must be optional (have a default value) to support
69
+ objects from this type that were not packaged but customly logged) and the returning value is the unpacked
70
+ object.
71
+ * The abstract class method ``is_packable``: The method is implemented to validate the object type and artifact type
72
+ automatically by the following rules:
73
+
74
+ * Object type validation: Checking if the object type given match to the variable ``PACKABLE_OBJECT_TYPE`` with
75
+ respect to the ``PACK_SUBCLASSES`` class variable.
76
+ * Artifact type validation: Checking if the artifact type given is in the list returned from
77
+ ``get_supported_artifact_types``.
78
+
79
+ * The abstract class method ``is_unpackable``: The method is left as implemented in ``Packager``.
80
+ * The abstract class method ``get_supported_artifact_types``: The method is implemented to look for all
81
+ pack + unpack class methods implemented to collect the supported artifact types. If ``PackagerX`` has ``pack_y``,
82
+ ``unpack_y`` and ``pack_z``, ``unpack_z`` that means the artifact types supported are 'y' and 'z'.
83
+ * The abstract class method ``get_default_packing_artifact_type``: The method is implemented to return the new class
84
+ variable ``DEFAULT_PACKING_ARTIFACT_TYPE``. You may still override the method if the default artifact type you
85
+ need may change according to the object that's about to be packed.
86
+ * The abstract class method ``get_default_unpacking_artifact_type``: The method is implemented to return the new
87
+ class variable ``DEFAULT_UNPACKING_ARTIFACT_TYPE``. You may still override the method if the default artifact type
88
+ you need may change according to the data item that's about to be unpacked.
89
+
90
+ Important to remember (from the ``Packager`` docstring):
91
+
92
+ * Linking artifacts ("extra data"): In order to link between packages (using the extra data or metrics spec
93
+ attributes of an artifact), you should use the key as if it exists and as value ellipses (...). The manager will
94
+ link all packages once it is done packing.
95
+
96
+ For example, given extra data keys in the log hint as `extra_data`, setting them to an artifact should be::
97
+
98
+ artifact = Artifact(key="my_artifact")
99
+ artifact.spec.extra_data = {key: ... for key in extra_data}
100
+
101
+ * Clearing outputs: Some packagers may produce files and temporary directories that should be deleted once done with
102
+ logging the artifact. The packager can mark paths of files and directories to delete after logging using the class
103
+ method ``future_clear``.
104
+
105
+ For example, in the following packager's ``pack`` method we can write a text file, create an Artifact and then
106
+ mark the text file to be deleted once the artifact is logged::
107
+
108
+ with open("./some_file.txt", "w") as file:
109
+ file.write("Pack me")
110
+ artifact = Artifact(key="my_artifact")
111
+ cls.future_clear(path="./some_file.txt")
112
+ return artifact, None
113
+ """
114
+
115
+ # The type of object this packager can pack and unpack:
116
+ PACKABLE_OBJECT_TYPE: Type = ...
117
+ # A flag for indicating whether to pack all subclasses of the `PACKABLE_OBJECT_TYPE` as well:
118
+ PACK_SUBCLASSES = False
119
+ # The default artifact type to pack as:
120
+ DEFAULT_PACKING_ARTIFACT_TYPE = ArtifactType.OBJECT
121
+ # The default artifact type to unpack from:
122
+ DEFAULT_UNPACKING_ARTIFACT_TYPE = ArtifactType.OBJECT
123
+
124
+ @classmethod
125
+ def get_default_packing_artifact_type(cls, obj: Any) -> str:
126
+ """
127
+ Get the default artifact type for packing an object of this packager.
128
+
129
+ :param obj: The about to be packed object.
130
+
131
+ :return: The default artifact type.
132
+ """
133
+ return cls.DEFAULT_PACKING_ARTIFACT_TYPE
134
+
135
+ @classmethod
136
+ def get_default_unpacking_artifact_type(cls, data_item: DataItem) -> str:
137
+ """
138
+ Get the default artifact type used for unpacking a data item holding an object of this packager. The method will
139
+ be used when a data item is sent for unpacking without it being a package, but a simple url or an old / manually
140
+ logged artifact.
141
+
142
+ :param data_item: The about to be unpacked data item.
143
+
144
+ :return: The default artifact type.
145
+ """
146
+ return cls.DEFAULT_UNPACKING_ARTIFACT_TYPE
147
+
148
+ @classmethod
149
+ def get_supported_artifact_types(cls) -> List[str]:
150
+ """
151
+ Get all the supported artifact types on this packager.
152
+
153
+ :return: A list of all the supported artifact types.
154
+ """
155
+ # We look for pack + unpack method couples so there won't be a scenario where an object can be packed but not
156
+ # unpacked. Result has no unpacking so we add it separately.
157
+ return [
158
+ key[len("pack_") :]
159
+ for key in dir(cls)
160
+ if key.startswith("pack_") and f"unpack_{key[len('pack_'):]}" in dir(cls)
161
+ ] + ["result"]
162
+
163
+ @classmethod
164
+ def pack(
165
+ cls,
166
+ obj: Any,
167
+ artifact_type: str = None,
168
+ configurations: dict = None,
169
+ ) -> Union[Tuple[Artifact, dict], dict]:
170
+ """
171
+ Pack an object as the given artifact type using the provided configurations.
172
+
173
+ :param obj: The object to pack.
174
+ :param artifact_type: Artifact type to log to MLRun. If passing `None`, the default artifact type will be used.
175
+ :param configurations: Log hints configurations to pass to the packing method.
176
+
177
+ :return: If the packed object is an artifact, a tuple of the packed artifact and unpacking instructions
178
+ dictionary. If the packed object is a result, a dictionary containing the result key and value.
179
+ """
180
+ # Get default artifact type in case it was not provided:
181
+ if artifact_type is None:
182
+ artifact_type = cls.get_default_packing_artifact_type(obj=obj)
183
+
184
+ # Set empty dictionary in case no configurations were given:
185
+ configurations = configurations or {}
186
+
187
+ # Get the packing method according to the artifact type:
188
+ pack_method = getattr(cls, f"pack_{artifact_type}")
189
+
190
+ # Validate correct configurations were passed:
191
+ cls._validate_method_arguments(
192
+ method=pack_method,
193
+ arguments=configurations,
194
+ is_packing=True,
195
+ )
196
+
197
+ # Call the packing method and return the package:
198
+ return pack_method(obj, **configurations)
199
+
200
+ @classmethod
201
+ def unpack(
202
+ cls,
203
+ data_item: DataItem,
204
+ artifact_type: str = None,
205
+ instructions: dict = None,
206
+ ) -> Any:
207
+ """
208
+ Unpack the data item's artifact by the provided type using the given instructions.
209
+
210
+ :param data_item: The data input to unpack.
211
+ :param artifact_type: The artifact type to unpack the data item as. If passing `None`, the default artifact type
212
+ will be used.
213
+ :param instructions: Additional instructions noted in the package to pass to the unpacking method.
214
+
215
+ :return: The unpacked data item's object.
216
+
217
+ :raise MLRunPackageUnpackingError: In case the packager could not unpack the data item.
218
+ """
219
+ # Get default artifact type in case it was not provided:
220
+ if artifact_type is None:
221
+ artifact_type = cls.get_default_unpacking_artifact_type(data_item=data_item)
222
+
223
+ # Set empty dictionary in case no instructions were given:
224
+ instructions = instructions or {}
225
+
226
+ # Get the unpacking method according to the artifact type:
227
+ unpack_method = getattr(cls, f"unpack_{artifact_type}")
228
+
229
+ # Validate correct instructions were passed:
230
+ cls._validate_method_arguments(
231
+ method=unpack_method,
232
+ arguments=instructions,
233
+ is_packing=False,
234
+ )
235
+
236
+ # Call the unpacking method and return the object:
237
+ return unpack_method(data_item, **instructions)
238
+
239
+ @classmethod
240
+ def is_packable(cls, obj: Any, artifact_type: str = None) -> bool:
241
+ """
242
+ Check if this packager can pack an object of the provided type as the provided artifact type.
243
+
244
+ The method is implemented to validate the object's type and artifact type by checking if the object type given
245
+ match to the variable ``PACKABLE_OBJECT_TYPE`` with respect to the ``PACK_SUBCLASSES`` class variable. If it
246
+ does, it will check if the artifact type given is in the list returned from ``get_supported_artifact_types``.
247
+
248
+ :param obj: The object to pack.
249
+ :param artifact_type: The artifact type to log the object as.
250
+
251
+ :return: True if packable and False otherwise.
252
+ """
253
+ # Get the object's type:
254
+ object_type = type(obj)
255
+
256
+ # Check type (ellipses means any type):
257
+ if cls.PACKABLE_OBJECT_TYPE is not ...:
258
+ if not TypeHintUtils.is_matching(
259
+ object_type=object_type,
260
+ type_hint=cls.PACKABLE_OBJECT_TYPE,
261
+ include_subclasses=cls.PACK_SUBCLASSES,
262
+ reduce_type_hint=False,
263
+ ):
264
+ return False
265
+
266
+ # Check the artifact type:
267
+ if (
268
+ artifact_type is not None
269
+ and artifact_type not in cls.get_supported_artifact_types()
270
+ ):
271
+ return False
272
+
273
+ # Packable:
274
+ return True
275
+
276
+ @classmethod
277
+ def pack_object(
278
+ cls,
279
+ obj: Any,
280
+ key: str,
281
+ pickle_module_name: str = DEFAULT_PICKLE_MODULE,
282
+ ) -> Tuple[Artifact, dict]:
283
+ """
284
+ Pack a python object, pickling it into a pkl file and store it in an artifact.
285
+
286
+ :param obj: The object to pack and log.
287
+ :param key: The artifact's key.
288
+ :param pickle_module_name: The pickle module name to use for serializing the object.
289
+
290
+ :return: The artifacts and it's pickling instructions.
291
+ """
292
+ # Pickle the object to file:
293
+ pickle_path, instructions = Pickler.pickle(
294
+ obj=obj, pickle_module_name=pickle_module_name
295
+ )
296
+
297
+ # Initialize an artifact to the pkl file:
298
+ artifact = Artifact(key=key, src_path=pickle_path)
299
+
300
+ # Add the pickle path to the clearing list:
301
+ cls.add_future_clearing_path(path=pickle_path)
302
+
303
+ return artifact, instructions
304
+
305
+ @classmethod
306
+ def pack_result(cls, obj: Any, key: str) -> dict:
307
+ """
308
+ Pack an object as a result.
309
+
310
+ :param obj: The object to pack and log.
311
+ :param key: The result's key.
312
+
313
+ :return: The result dictionary.
314
+ """
315
+ return {key: obj}
316
+
317
+ @classmethod
318
+ def unpack_object(
319
+ cls,
320
+ data_item: DataItem,
321
+ pickle_module_name: str = DEFAULT_PICKLE_MODULE,
322
+ object_module_name: str = None,
323
+ python_version: str = None,
324
+ pickle_module_version: str = None,
325
+ object_module_version: str = None,
326
+ ) -> Any:
327
+ """
328
+ Unpack the data item's object, unpickle it using the instructions and return.
329
+
330
+ Warnings of mismatching python and module versions between the original pickling interpreter and this one may be
331
+ raised.
332
+
333
+ :param data_item: The data item holding the pkl file.
334
+ :param pickle_module_name: Module to use for unpickling the object.
335
+ :param object_module_name: The original object's module. Used to verify the current interpreter object module
336
+ version match the pickled object version before unpickling the object.
337
+ :param python_version: The python version in which the original object was pickled. Used to verify the
338
+ current interpreter python version match the pickled object version before
339
+ unpickling the object.
340
+ :param pickle_module_version: The pickle module version. Used to verify the current interpreter module version
341
+ match the one who pickled the object before unpickling it.
342
+ :param object_module_version: The original object's module version to match to the interpreter's module version.
343
+
344
+ :return: The un-pickled python object.
345
+ """
346
+ # Get the pkl file to local directory:
347
+ pickle_path = data_item.local()
348
+
349
+ # Add the pickle path to the clearing list:
350
+ cls.add_future_clearing_path(path=pickle_path)
351
+
352
+ # Unpickle and return:
353
+ return Pickler.unpickle(
354
+ pickle_path=pickle_path,
355
+ pickle_module_name=pickle_module_name,
356
+ object_module_name=object_module_name,
357
+ python_version=python_version,
358
+ pickle_module_version=pickle_module_version,
359
+ object_module_version=object_module_version,
360
+ )
361
+
362
+ @classmethod
363
+ def _validate_method_arguments(
364
+ cls, method: MethodType, arguments: dict, is_packing: bool
365
+ ):
366
+ """
367
+ Validate keyword arguments to pass to a method. Used for validating log hint configurations for packing methods
368
+ and instructions for unpacking methods.
369
+
370
+ :param method: The method to validate the arguments for.
371
+ :param arguments: Keyword arguments to validate.
372
+ :param is_packing: Flag to know if the arguments came from packing or unpacking, to raise the correct exception
373
+ if validation failed.
374
+
375
+ :raise MLRunPackagePackingError: If there are missing configurations in the log hint.
376
+ :raise MLRunPackageUnpackingError: If there are missing instructions in the artifact's spec.
377
+ """
378
+ # Get the possible and mandatory (arguments that has no default value) arguments from the functions:
379
+ possible_arguments = inspect.signature(method).parameters
380
+ mandatory_arguments = [
381
+ name
382
+ for name, parameter in possible_arguments.items()
383
+ # If default value is `empty` it is mandatory:
384
+ if parameter.default is inspect.Parameter.empty
385
+ # Ignore the *args and **kwargs parameters:
386
+ and parameter.kind
387
+ not in [inspect.Parameter.VAR_KEYWORD, inspect.Parameter.VAR_POSITIONAL]
388
+ ]
389
+ mandatory_arguments.remove("obj" if is_packing else "data_item")
390
+
391
+ # Validate there are no missing arguments (only mandatory ones):
392
+ missing_arguments = [
393
+ mandatory_argument
394
+ for mandatory_argument in mandatory_arguments
395
+ if mandatory_argument not in arguments
396
+ ]
397
+ if missing_arguments:
398
+ if is_packing:
399
+ raise MLRunPackagePackingError(
400
+ f"The packager '{cls.__name__}' could not pack the package due to missing configurations: "
401
+ f"{', '.join(missing_arguments)}. Add the missing arguments to the log hint of this object in "
402
+ f"order to pack it. Make sure you pass a dictionary log hint and not a string in order to pass "
403
+ f"configurations in the log hint."
404
+ )
405
+ raise MLRunPackageUnpackingError(
406
+ f"The packager '{cls.__name__}' could not unpack the package due to missing instructions: "
407
+ f"{', '.join(missing_arguments)}. Missing instructions are likely due to an update in the packager's "
408
+ f"code that not support the old implementation. This backward compatibility should not occur. To "
409
+ f"overcome it, try to edit the instructions in the artifact's spec to enable unpacking it again."
410
+ )
411
+
412
+ # Validate all given arguments are correct:
413
+ incorrect_arguments = [
414
+ argument for argument in arguments if argument not in possible_arguments
415
+ ]
416
+ if incorrect_arguments:
417
+ arguments_type = "configurations" if is_packing else "instructions"
418
+ logger.warn(
419
+ f"Unexpected {arguments_type} given for {cls.__name__}: {', '.join(incorrect_arguments)}. "
420
+ f"Possible {arguments_type} are: {', '.join(possible_arguments.keys())}. The packager will try to "
421
+ f"continue by ignoring the incorrect arguments."
422
+ )