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
mlrun/runtimes/utils.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.
@@ -24,17 +24,18 @@ import pandas as pd
24
24
  from kubernetes import client
25
25
 
26
26
  import mlrun
27
- import mlrun.builder
27
+ import mlrun.api.utils.builder
28
+ import mlrun.common.constants
29
+ import mlrun.common.schemas
28
30
  import mlrun.utils.regex
29
31
  from mlrun.api.utils.clients import nuclio
30
- from mlrun.db import get_run_db
31
32
  from mlrun.errors import err_to_str
32
33
  from mlrun.frameworks.parallel_coordinates import gen_pcp_plot
33
- from mlrun.k8s_utils import get_k8s_helper
34
34
  from mlrun.runtimes.constants import MPIJobCRDVersions
35
35
 
36
36
  from ..artifacts import TableArtifact
37
- from ..config import config
37
+ from ..config import config, is_running_as_api
38
+ from ..k8s_utils import is_running_inside_kubernetes_cluster
38
39
  from ..utils import get_in, helpers, logger, verify_field_regex
39
40
  from .generators import selector
40
41
 
@@ -69,19 +70,21 @@ cached_nuclio_version = None
69
70
  # if not specified, try resolving it according to the mpi-operator, otherwise set to default
70
71
  # since this is a heavy operation (sending requests to k8s/API), and it's unlikely that the crd version
71
72
  # will change in any context - cache it
72
- def resolve_mpijob_crd_version(api_context=False):
73
+ def resolve_mpijob_crd_version():
73
74
  global cached_mpijob_crd_version
74
75
  if not cached_mpijob_crd_version:
75
76
 
76
77
  # config override everything
78
+ # on client side, expecting it to get enriched from the API through the client-spec
77
79
  mpijob_crd_version = config.mpijob_crd_version
78
80
 
79
81
  if not mpijob_crd_version:
80
- in_k8s_cluster = get_k8s_helper(
81
- silent=True
82
- ).is_running_inside_kubernetes_cluster()
83
- if in_k8s_cluster:
84
- k8s_helper = get_k8s_helper()
82
+ in_k8s_cluster = is_running_inside_kubernetes_cluster()
83
+
84
+ if in_k8s_cluster and is_running_as_api():
85
+ import mlrun.api.utils.singletons.k8s
86
+
87
+ k8s_helper = mlrun.api.utils.singletons.k8s.get_k8s_helper()
85
88
  namespace = k8s_helper.resolve_namespace()
86
89
 
87
90
  # try resolving according to mpi-operator that's running
@@ -93,13 +96,8 @@ def resolve_mpijob_crd_version(api_context=False):
93
96
  mpijob_crd_version = mpi_operator_pod.metadata.labels.get(
94
97
  "crd-version"
95
98
  )
96
- elif not in_k8s_cluster and not api_context:
97
- # connect will populate the config from the server config
98
- # TODO: something nicer
99
- get_run_db()
100
- mpijob_crd_version = config.mpijob_crd_version
101
99
 
102
- # If resolution failed simply use default
100
+ # backoff to use default if wasn't resolved in API
103
101
  if not mpijob_crd_version:
104
102
  mpijob_crd_version = MPIJobCRDVersions.default()
105
103
 
@@ -182,22 +180,6 @@ def log_std(db, runobj, out, err="", skip=False, show=True, silent=False):
182
180
  raise RunError(err)
183
181
 
184
182
 
185
- class AsyncLogWriter:
186
- def __init__(self, db, runobj):
187
- self.db = db
188
- self.uid = runobj.metadata.uid
189
- self.project = runobj.metadata.project or ""
190
- self.iter = runobj.metadata.iteration
191
-
192
- def write(self, data):
193
- if self.db:
194
- self.db.store_log(self.uid, self.project, data, append=True)
195
-
196
- def flush(self):
197
- # todo: verify writes are large enough, if not cache and use flush
198
- pass
199
-
200
-
201
183
  def add_code_metadata(path=""):
202
184
  if path:
203
185
  if "://" in path:
@@ -227,8 +209,31 @@ def add_code_metadata(path=""):
227
209
  ]
228
210
  if len(remotes) > 0:
229
211
  return f"{remotes[0]}#{repo.head.commit.hexsha}"
230
- except (GitCommandNotFound, InvalidGitRepositoryError, NoSuchPathError, ValueError):
231
- pass
212
+
213
+ except (
214
+ GitCommandNotFound,
215
+ InvalidGitRepositoryError,
216
+ NoSuchPathError,
217
+ ValueError,
218
+ ) as exc:
219
+ logger.warning(
220
+ "Failed to add git metadata, ignore if path is not part of a git repo.",
221
+ path=path,
222
+ error=err_to_str(exc),
223
+ )
224
+ return None
225
+
226
+
227
+ def get_k8s():
228
+ """
229
+ Get the k8s helper object
230
+ :return: k8s helper object or None if not running as API
231
+ """
232
+ if is_running_as_api():
233
+ import mlrun.api.utils.singletons.k8s
234
+
235
+ return mlrun.api.utils.singletons.k8s.get_k8s_helper()
236
+
232
237
  return None
233
238
 
234
239
 
@@ -348,7 +353,11 @@ def generate_function_image_name(project: str, name: str, tag: str) -> str:
348
353
  _, repository = helpers.get_parsed_docker_registry()
349
354
  repository = helpers.get_docker_repository_or_default(repository)
350
355
  return fill_function_image_name_template(
351
- mlrun.builder.IMAGE_NAME_ENRICH_REGISTRY_PREFIX, repository, project, name, tag
356
+ mlrun.common.constants.IMAGE_NAME_ENRICH_REGISTRY_PREFIX,
357
+ repository,
358
+ project,
359
+ name,
360
+ tag,
352
361
  )
353
362
 
354
363
 
@@ -373,7 +382,7 @@ def resolve_function_target_image_registries_to_enforce_prefix():
373
382
  registry, repository = helpers.get_parsed_docker_registry()
374
383
  repository = helpers.get_docker_repository_or_default(repository)
375
384
  return [
376
- f"{mlrun.builder.IMAGE_NAME_ENRICH_REGISTRY_PREFIX}{repository}/",
385
+ f"{mlrun.common.constants.IMAGE_NAME_ENRICH_REGISTRY_PREFIX}{repository}/",
377
386
  f"{registry}/{repository}/",
378
387
  ]
379
388
 
@@ -476,20 +485,26 @@ def verify_limits(
476
485
  verify_field_regex(
477
486
  f"function.spec.{resources_field_name}.limits.memory",
478
487
  mem,
479
- mlrun.utils.regex.k8s_resource_quantity_regex,
488
+ mlrun.utils.regex.k8s_resource_quantity_regex
489
+ + mlrun.utils.regex.pipeline_param,
490
+ mode=mlrun.common.schemas.RegexMatchModes.any,
480
491
  )
481
492
  if cpu:
482
493
  verify_field_regex(
483
494
  f"function.spec.{resources_field_name}.limits.cpu",
484
495
  cpu,
485
- mlrun.utils.regex.k8s_resource_quantity_regex,
496
+ mlrun.utils.regex.k8s_resource_quantity_regex
497
+ + mlrun.utils.regex.pipeline_param,
498
+ mode=mlrun.common.schemas.RegexMatchModes.any,
486
499
  )
487
500
  # https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/
488
501
  if gpus:
489
502
  verify_field_regex(
490
503
  f"function.spec.{resources_field_name}.limits.gpus",
491
504
  gpus,
492
- mlrun.utils.regex.k8s_resource_quantity_regex,
505
+ mlrun.utils.regex.k8s_resource_quantity_regex
506
+ + mlrun.utils.regex.pipeline_param,
507
+ mode=mlrun.common.schemas.RegexMatchModes.any,
493
508
  )
494
509
  return generate_resources(mem=mem, cpu=cpu, gpus=gpus, gpu_type=gpu_type)
495
510
 
@@ -503,13 +518,17 @@ def verify_requests(
503
518
  verify_field_regex(
504
519
  f"function.spec.{resources_field_name}.requests.memory",
505
520
  mem,
506
- mlrun.utils.regex.k8s_resource_quantity_regex,
521
+ mlrun.utils.regex.k8s_resource_quantity_regex
522
+ + mlrun.utils.regex.pipeline_param,
523
+ mode=mlrun.common.schemas.RegexMatchModes.any,
507
524
  )
508
525
  if cpu:
509
526
  verify_field_regex(
510
527
  f"function.spec.{resources_field_name}.requests.cpu",
511
528
  cpu,
512
- mlrun.utils.regex.k8s_resource_quantity_regex,
529
+ mlrun.utils.regex.k8s_resource_quantity_regex
530
+ + mlrun.utils.regex.pipeline_param,
531
+ mode=mlrun.common.schemas.RegexMatchModes.any,
513
532
  )
514
533
  return generate_resources(mem=mem, cpu=cpu)
515
534
 
mlrun/secrets.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.
@@ -16,7 +16,7 @@ from ast import literal_eval
16
16
  from os import environ, getenv
17
17
  from typing import Callable, Dict, Optional, Union
18
18
 
19
- from .utils import AzureVaultStore, VaultStore, list2dict
19
+ from .utils import AzureVaultStore, list2dict
20
20
 
21
21
 
22
22
  class SecretsStore:
@@ -26,7 +26,6 @@ class SecretsStore:
26
26
  # for example from Vault, and when adding their source they will be retrieved from the external source.
27
27
  self._hidden_sources = []
28
28
  self._hidden_secrets = {}
29
- self.vault = VaultStore()
30
29
 
31
30
  @classmethod
32
31
  def from_list(cls, src_list: list):
@@ -60,21 +59,20 @@ class SecretsStore:
60
59
  for key in source.split(","):
61
60
  k = key.strip()
62
61
  self._secrets[prefix + k] = environ.get(k)
63
-
64
- elif kind == "vault":
65
- if isinstance(source, str):
66
- source = literal_eval(source)
67
- if not isinstance(source, dict):
68
- raise ValueError("vault secrets must be of type dict")
69
-
70
- for key, value in self.vault.get_secrets(
71
- source["secrets"],
72
- user=source.get("user"),
73
- project=source.get("project"),
74
- ).items():
75
- self._hidden_secrets[prefix + key] = value
76
- self._hidden_sources.append({"kind": kind, "source": source})
77
-
62
+ # TODO: Vault: uncomment when vault returns to be relevant
63
+ # elif kind == "vault":
64
+ # if isinstance(source, str):
65
+ # source = literal_eval(source)
66
+ # if not isinstance(source, dict):
67
+ # raise ValueError("vault secrets must be of type dict")
68
+ #
69
+ # for key, value in self.vault.get_secrets(
70
+ # source["secrets"],
71
+ # user=source.get("user"),
72
+ # project=source.get("project"),
73
+ # ).items():
74
+ # self._hidden_secrets[prefix + key] = value
75
+ # self._hidden_sources.append({"kind": kind, "source": source})
78
76
  elif kind == "azure_vault":
79
77
  if isinstance(source, str):
80
78
  source = literal_eval(source)
mlrun/serving/__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.
@@ -21,10 +21,11 @@ __all__ = [
21
21
  "TaskStep",
22
22
  "RouterStep",
23
23
  "QueueStep",
24
+ "ErrorStep",
24
25
  ]
25
26
 
26
27
  from .routers import ModelRouter, VotingEnsemble # noqa
27
28
  from .server import GraphContext, GraphServer, create_graph_server # noqa
28
- from .states import QueueStep, RouterStep, TaskStep # noqa
29
+ from .states import ErrorStep, QueueStep, RouterStep, TaskStep # noqa
29
30
  from .v1_serving import MLModelServer, new_v1_model_server # noqa
30
31
  from .v2_serving import V2ModelServer # noqa
mlrun/serving/merger.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/serving/remote.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/serving/routers.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.
@@ -24,18 +24,12 @@ import numpy
24
24
  import numpy as np
25
25
 
26
26
  import mlrun
27
+ import mlrun.common.model_monitoring
28
+ import mlrun.common.schemas
27
29
  import mlrun.utils.model_monitoring
28
30
  from mlrun.utils import logger, now_date, parse_versioned_object_uri
29
31
 
30
- from ..api.schemas import (
31
- ModelEndpoint,
32
- ModelEndpointMetadata,
33
- ModelEndpointSpec,
34
- ModelEndpointStatus,
35
- ModelMonitoringMode,
36
- )
37
32
  from ..config import config
38
- from ..utils.model_monitoring import EndpointType
39
33
  from .server import GraphServer
40
34
  from .utils import RouterToDict, _extract_input_data, _update_result_body
41
35
  from .v2_serving import _ModelLogPusher
@@ -402,12 +396,14 @@ class ParallelRun(BaseModelRouter):
402
396
  step._parent = None
403
397
  if step._object:
404
398
  step._object.context = None
399
+ if hasattr(step._object, "_kwargs"):
400
+ step._object._kwargs["graph_step"] = None
405
401
  routes[key] = step
406
402
  executor_class = concurrent.futures.ProcessPoolExecutor
407
403
  self._pool = executor_class(
408
404
  max_workers=len(self.routes),
409
405
  initializer=ParallelRun.init_pool,
410
- initargs=(server, routes, id(self)),
406
+ initargs=(server, routes),
411
407
  )
412
408
  elif self.executor_type == ParallelRunnerModes.thread:
413
409
  executor_class = concurrent.futures.ThreadPoolExecutor
@@ -422,7 +418,7 @@ class ParallelRun(BaseModelRouter):
422
418
  if self._pool is not None:
423
419
  if self.executor_type == ParallelRunnerModes.process:
424
420
  global local_routes
425
- local_routes.pop(id(self))
421
+ del local_routes
426
422
  self._pool.shutdown()
427
423
  self._pool = None
428
424
 
@@ -446,7 +442,7 @@ class ParallelRun(BaseModelRouter):
446
442
  for route in self.routes.keys():
447
443
  if self.executor_type == ParallelRunnerModes.process:
448
444
  future = executor.submit(
449
- ParallelRun._wrap_step, route, id(self), copy.copy(event)
445
+ ParallelRun._wrap_step, route, copy.copy(event)
450
446
  )
451
447
  elif self.executor_type == ParallelRunnerModes.thread:
452
448
  step = self.routes[route]
@@ -470,25 +466,22 @@ class ParallelRun(BaseModelRouter):
470
466
  return results
471
467
 
472
468
  @staticmethod
473
- def init_pool(server_spec, routes, object_id):
469
+ def init_pool(server_spec, routes):
474
470
  server = mlrun.serving.GraphServer.from_dict(server_spec)
475
471
  server.init_states(None, None)
476
472
  global local_routes
477
- if object_id in local_routes:
478
- return
479
473
  for route in routes.values():
480
474
  route.context = server.context
481
475
  if route._object:
482
476
  route._object.context = server.context
483
- local_routes[object_id] = routes
477
+ local_routes = routes
484
478
 
485
479
  @staticmethod
486
- def _wrap_step(route, object_id, event):
480
+ def _wrap_step(route, event):
487
481
  global local_routes
488
- routes = local_routes.get(object_id, None).copy()
489
- if routes is None:
482
+ if local_routes is None:
490
483
  return None, None
491
- return route, routes[route].run(event)
484
+ return route, local_routes[route].run(event)
492
485
 
493
486
  @staticmethod
494
487
  def _wrap_method(route, handler, event):
@@ -1043,7 +1036,7 @@ def _init_endpoint_record(
1043
1036
  versioned_model_name = f"{voting_ensemble.name}:latest"
1044
1037
 
1045
1038
  # Generating model endpoint ID based on function uri and model version
1046
- endpoint_uid = mlrun.utils.model_monitoring.create_model_endpoint_id(
1039
+ endpoint_uid = mlrun.common.model_monitoring.create_model_endpoint_uid(
1047
1040
  function_uri=graph_server.function_uri, versioned_model=versioned_model_name
1048
1041
  ).uid
1049
1042
 
@@ -1061,33 +1054,35 @@ def _init_endpoint_record(
1061
1054
  if hasattr(c, "endpoint_uid"):
1062
1055
  children_uids.append(c.endpoint_uid)
1063
1056
 
1064
- model_endpoint = ModelEndpoint(
1065
- metadata=ModelEndpointMetadata(project=project, uid=endpoint_uid),
1066
- spec=ModelEndpointSpec(
1067
- function_uri=graph_server.function_uri,
1068
- model=versioned_model_name,
1069
- model_class=voting_ensemble.__class__.__name__,
1070
- stream_path=config.model_endpoint_monitoring.store_prefixes.default.format(
1071
- project=project, kind="stream"
1072
- ),
1073
- active=True,
1074
- monitoring_mode=ModelMonitoringMode.enabled
1075
- if voting_ensemble.context.server.track_models
1076
- else ModelMonitoringMode.disabled,
1077
- ),
1078
- status=ModelEndpointStatus(
1079
- children=list(voting_ensemble.routes.keys()),
1080
- endpoint_type=EndpointType.ROUTER,
1081
- children_uids=children_uids,
1057
+ model_endpoint = mlrun.common.schemas.ModelEndpoint(
1058
+ metadata=mlrun.common.schemas.ModelEndpointMetadata(
1059
+ project=project, uid=endpoint_uid
1060
+ ),
1061
+ spec=mlrun.common.schemas.ModelEndpointSpec(
1062
+ function_uri=graph_server.function_uri,
1063
+ model=versioned_model_name,
1064
+ model_class=voting_ensemble.__class__.__name__,
1065
+ stream_path=config.model_endpoint_monitoring.store_prefixes.default.format(
1066
+ project=project, kind="stream"
1082
1067
  ),
1083
- )
1068
+ active=True,
1069
+ monitoring_mode=mlrun.common.model_monitoring.ModelMonitoringMode.enabled
1070
+ if voting_ensemble.context.server.track_models
1071
+ else mlrun.common.model_monitoring.ModelMonitoringMode.disabled,
1072
+ ),
1073
+ status=mlrun.common.schemas.ModelEndpointStatus(
1074
+ children=list(voting_ensemble.routes.keys()),
1075
+ endpoint_type=mlrun.common.model_monitoring.EndpointType.ROUTER,
1076
+ children_uids=children_uids,
1077
+ ),
1078
+ )
1084
1079
 
1085
1080
  db = mlrun.get_run_db()
1086
1081
 
1087
1082
  db.create_model_endpoint(
1088
1083
  project=project,
1089
1084
  endpoint_id=model_endpoint.metadata.uid,
1090
- model_endpoint=model_endpoint,
1085
+ model_endpoint=model_endpoint.dict(),
1091
1086
  )
1092
1087
 
1093
1088
  # Update model endpoint children type
@@ -1095,7 +1090,9 @@ def _init_endpoint_record(
1095
1090
  current_endpoint = db.get_model_endpoint(
1096
1091
  project=project, endpoint_id=model_endpoint
1097
1092
  )
1098
- current_endpoint.status.endpoint_type = EndpointType.LEAF_EP
1093
+ current_endpoint.status.endpoint_type = (
1094
+ mlrun.common.model_monitoring.EndpointType.LEAF_EP
1095
+ )
1099
1096
  db.create_model_endpoint(
1100
1097
  project=project,
1101
1098
  endpoint_id=model_endpoint,
mlrun/serving/server.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.
@@ -18,12 +18,13 @@ import asyncio
18
18
  import json
19
19
  import os
20
20
  import socket
21
- import sys
22
21
  import traceback
23
22
  import uuid
24
23
  from typing import Optional, Union
25
24
 
26
25
  import mlrun
26
+ import mlrun.utils.model_monitoring
27
+ from mlrun.common.model_monitoring import FileTargetKind
27
28
  from mlrun.config import config
28
29
  from mlrun.errors import err_to_str
29
30
  from mlrun.secrets import SecretsStore
@@ -32,7 +33,7 @@ from ..datastore import get_stream_pusher
32
33
  from ..datastore.store_resources import ResourceCache
33
34
  from ..errors import MLRunInvalidArgumentError
34
35
  from ..model import ModelObj
35
- from ..utils import create_logger, get_caller_globals, parse_versioned_object_uri
36
+ from ..utils import get_caller_globals, parse_versioned_object_uri
36
37
  from .states import RootFlowStep, RouterStep, get_function, graph_root_setter
37
38
  from .utils import (
38
39
  event_id_key,
@@ -43,32 +44,41 @@ from .utils import (
43
44
 
44
45
 
45
46
  class _StreamContext:
46
- def __init__(self, enabled, parameters, function_uri):
47
+ """Handles the stream context for the events stream process. Includes the configuration for the output stream
48
+ that will be used for pushing the events from the nuclio model serving function"""
49
+
50
+ def __init__(self, enabled: bool, parameters: dict, function_uri: str):
51
+
52
+ """
53
+ Initialize _StreamContext object.
54
+ :param enabled: A boolean indication for applying the stream context
55
+ :param parameters: Dictionary of optional parameters, such as `log_stream` and `stream_args`. Note that these
56
+ parameters might be relevant to the output source such as `kafka_bootstrap_servers` if
57
+ the output source is from type Kafka.
58
+ :param function_uri: Full value of the function uri, usually it's <project-name>/<function-name>
59
+ """
60
+
47
61
  self.enabled = False
48
62
  self.hostname = socket.gethostname()
49
63
  self.function_uri = function_uri
50
64
  self.output_stream = None
51
65
  self.stream_uri = None
66
+ log_stream = parameters.get(FileTargetKind.LOG_STREAM, "")
52
67
 
53
- log_stream = parameters.get("log_stream", "")
54
- stream_uri = config.model_endpoint_monitoring.store_prefixes.default
55
-
56
- if ((enabled and stream_uri) or log_stream) and function_uri:
68
+ if (enabled or log_stream) and function_uri:
57
69
  self.enabled = True
58
-
59
70
  project, _, _, _ = parse_versioned_object_uri(
60
71
  function_uri, config.default_project
61
72
  )
62
73
 
63
- stream_uri = stream_uri.format(project=project, kind="stream")
74
+ stream_uri = mlrun.utils.model_monitoring.get_stream_path(project=project)
64
75
 
65
76
  if log_stream:
77
+ # Update the stream path to the log stream value
66
78
  stream_uri = log_stream.format(project=project)
67
79
 
68
80
  stream_args = parameters.get("stream_args", {})
69
81
 
70
- self.stream_uri = stream_uri
71
-
72
82
  self.output_stream = get_stream_pusher(stream_uri, **stream_args)
73
83
 
74
84
 
@@ -458,7 +468,7 @@ class GraphContext:
458
468
  self.Response = nuclio_context.Response
459
469
  self.worker_id = nuclio_context.worker_id
460
470
  elif not logger:
461
- self.logger = create_logger(level, "human", "flow", sys.stdout)
471
+ self.logger = mlrun.utils.helpers.logger
462
472
 
463
473
  self._server = server
464
474
  self.current_function = None
@@ -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.