oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.9rc1__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.
Files changed (857) hide show
  1. ads/aqua/__init__.py +40 -0
  2. ads/aqua/app.py +506 -0
  3. ads/aqua/cli.py +96 -0
  4. ads/aqua/client/__init__.py +3 -0
  5. ads/aqua/client/client.py +836 -0
  6. ads/aqua/client/openai_client.py +305 -0
  7. ads/aqua/common/__init__.py +5 -0
  8. ads/aqua/common/decorator.py +125 -0
  9. ads/aqua/common/entities.py +269 -0
  10. ads/aqua/common/enums.py +122 -0
  11. ads/aqua/common/errors.py +109 -0
  12. ads/aqua/common/utils.py +1285 -0
  13. ads/aqua/config/__init__.py +4 -0
  14. ads/aqua/config/container_config.py +248 -0
  15. ads/aqua/config/evaluation/__init__.py +4 -0
  16. ads/aqua/config/evaluation/evaluation_service_config.py +147 -0
  17. ads/aqua/config/utils/__init__.py +4 -0
  18. ads/aqua/config/utils/serializer.py +339 -0
  19. ads/aqua/constants.py +116 -0
  20. ads/aqua/data.py +14 -0
  21. ads/aqua/dummy_data/icon.txt +1 -0
  22. ads/aqua/dummy_data/oci_model_deployments.json +56 -0
  23. ads/aqua/dummy_data/oci_models.json +1 -0
  24. ads/aqua/dummy_data/readme.md +26 -0
  25. ads/aqua/evaluation/__init__.py +8 -0
  26. ads/aqua/evaluation/constants.py +53 -0
  27. ads/aqua/evaluation/entities.py +186 -0
  28. ads/aqua/evaluation/errors.py +70 -0
  29. ads/aqua/evaluation/evaluation.py +1814 -0
  30. ads/aqua/extension/__init__.py +42 -0
  31. ads/aqua/extension/aqua_ws_msg_handler.py +76 -0
  32. ads/aqua/extension/base_handler.py +90 -0
  33. ads/aqua/extension/common_handler.py +121 -0
  34. ads/aqua/extension/common_ws_msg_handler.py +36 -0
  35. ads/aqua/extension/deployment_handler.py +298 -0
  36. ads/aqua/extension/deployment_ws_msg_handler.py +54 -0
  37. ads/aqua/extension/errors.py +30 -0
  38. ads/aqua/extension/evaluation_handler.py +129 -0
  39. ads/aqua/extension/evaluation_ws_msg_handler.py +61 -0
  40. ads/aqua/extension/finetune_handler.py +96 -0
  41. ads/aqua/extension/model_handler.py +390 -0
  42. ads/aqua/extension/models/__init__.py +0 -0
  43. ads/aqua/extension/models/ws_models.py +145 -0
  44. ads/aqua/extension/models_ws_msg_handler.py +50 -0
  45. ads/aqua/extension/ui_handler.py +282 -0
  46. ads/aqua/extension/ui_websocket_handler.py +130 -0
  47. ads/aqua/extension/utils.py +133 -0
  48. ads/aqua/finetuning/__init__.py +7 -0
  49. ads/aqua/finetuning/constants.py +23 -0
  50. ads/aqua/finetuning/entities.py +181 -0
  51. ads/aqua/finetuning/finetuning.py +749 -0
  52. ads/aqua/model/__init__.py +8 -0
  53. ads/aqua/model/constants.py +60 -0
  54. ads/aqua/model/entities.py +385 -0
  55. ads/aqua/model/enums.py +32 -0
  56. ads/aqua/model/model.py +2114 -0
  57. ads/aqua/modeldeployment/__init__.py +8 -0
  58. ads/aqua/modeldeployment/constants.py +10 -0
  59. ads/aqua/modeldeployment/deployment.py +1326 -0
  60. ads/aqua/modeldeployment/entities.py +653 -0
  61. ads/aqua/modeldeployment/inference.py +74 -0
  62. ads/aqua/modeldeployment/utils.py +543 -0
  63. ads/aqua/resources/gpu_shapes_index.json +94 -0
  64. ads/aqua/server/__init__.py +4 -0
  65. ads/aqua/server/__main__.py +24 -0
  66. ads/aqua/server/app.py +47 -0
  67. ads/aqua/server/aqua_spec.yml +1291 -0
  68. ads/aqua/training/__init__.py +4 -0
  69. ads/aqua/training/exceptions.py +476 -0
  70. ads/aqua/ui.py +499 -0
  71. ads/automl/__init__.py +9 -0
  72. ads/automl/driver.py +330 -0
  73. ads/automl/provider.py +975 -0
  74. ads/bds/__init__.py +5 -0
  75. ads/bds/auth.py +127 -0
  76. ads/bds/big_data_service.py +255 -0
  77. ads/catalog/__init__.py +19 -0
  78. ads/catalog/model.py +1576 -0
  79. ads/catalog/notebook.py +461 -0
  80. ads/catalog/project.py +468 -0
  81. ads/catalog/summary.py +178 -0
  82. ads/common/__init__.py +11 -0
  83. ads/common/analyzer.py +65 -0
  84. ads/common/artifact/.model-ignore +63 -0
  85. ads/common/artifact/__init__.py +10 -0
  86. ads/common/auth.py +1122 -0
  87. ads/common/card_identifier.py +83 -0
  88. ads/common/config.py +647 -0
  89. ads/common/data.py +165 -0
  90. ads/common/decorator/__init__.py +9 -0
  91. ads/common/decorator/argument_to_case.py +88 -0
  92. ads/common/decorator/deprecate.py +69 -0
  93. ads/common/decorator/require_nonempty_arg.py +65 -0
  94. ads/common/decorator/runtime_dependency.py +178 -0
  95. ads/common/decorator/threaded.py +97 -0
  96. ads/common/decorator/utils.py +35 -0
  97. ads/common/dsc_file_system.py +303 -0
  98. ads/common/error.py +14 -0
  99. ads/common/extended_enum.py +81 -0
  100. ads/common/function/__init__.py +5 -0
  101. ads/common/function/fn_util.py +142 -0
  102. ads/common/function/func_conf.yaml +25 -0
  103. ads/common/ipython.py +76 -0
  104. ads/common/model.py +679 -0
  105. ads/common/model_artifact.py +1759 -0
  106. ads/common/model_artifact_schema.json +107 -0
  107. ads/common/model_export_util.py +664 -0
  108. ads/common/model_metadata.py +24 -0
  109. ads/common/object_storage_details.py +296 -0
  110. ads/common/oci_client.py +175 -0
  111. ads/common/oci_datascience.py +46 -0
  112. ads/common/oci_logging.py +1144 -0
  113. ads/common/oci_mixin.py +957 -0
  114. ads/common/oci_resource.py +136 -0
  115. ads/common/serializer.py +559 -0
  116. ads/common/utils.py +1852 -0
  117. ads/common/word_lists.py +1491 -0
  118. ads/common/work_request.py +189 -0
  119. ads/data_labeling/__init__.py +13 -0
  120. ads/data_labeling/boundingbox.py +253 -0
  121. ads/data_labeling/constants.py +47 -0
  122. ads/data_labeling/data_labeling_service.py +244 -0
  123. ads/data_labeling/interface/__init__.py +5 -0
  124. ads/data_labeling/interface/loader.py +16 -0
  125. ads/data_labeling/interface/parser.py +16 -0
  126. ads/data_labeling/interface/reader.py +23 -0
  127. ads/data_labeling/loader/__init__.py +5 -0
  128. ads/data_labeling/loader/file_loader.py +241 -0
  129. ads/data_labeling/metadata.py +110 -0
  130. ads/data_labeling/mixin/__init__.py +5 -0
  131. ads/data_labeling/mixin/data_labeling.py +232 -0
  132. ads/data_labeling/ner.py +129 -0
  133. ads/data_labeling/parser/__init__.py +5 -0
  134. ads/data_labeling/parser/dls_record_parser.py +388 -0
  135. ads/data_labeling/parser/export_metadata_parser.py +94 -0
  136. ads/data_labeling/parser/export_record_parser.py +473 -0
  137. ads/data_labeling/reader/__init__.py +5 -0
  138. ads/data_labeling/reader/dataset_reader.py +574 -0
  139. ads/data_labeling/reader/dls_record_reader.py +121 -0
  140. ads/data_labeling/reader/export_record_reader.py +62 -0
  141. ads/data_labeling/reader/jsonl_reader.py +75 -0
  142. ads/data_labeling/reader/metadata_reader.py +203 -0
  143. ads/data_labeling/reader/record_reader.py +263 -0
  144. ads/data_labeling/record.py +52 -0
  145. ads/data_labeling/visualizer/__init__.py +5 -0
  146. ads/data_labeling/visualizer/image_visualizer.py +525 -0
  147. ads/data_labeling/visualizer/text_visualizer.py +357 -0
  148. ads/database/__init__.py +5 -0
  149. ads/database/connection.py +338 -0
  150. ads/dataset/__init__.py +10 -0
  151. ads/dataset/capabilities.md +51 -0
  152. ads/dataset/classification_dataset.py +339 -0
  153. ads/dataset/correlation.py +226 -0
  154. ads/dataset/correlation_plot.py +563 -0
  155. ads/dataset/dask_series.py +173 -0
  156. ads/dataset/dataframe_transformer.py +110 -0
  157. ads/dataset/dataset.py +1979 -0
  158. ads/dataset/dataset_browser.py +360 -0
  159. ads/dataset/dataset_with_target.py +995 -0
  160. ads/dataset/exception.py +25 -0
  161. ads/dataset/factory.py +987 -0
  162. ads/dataset/feature_engineering_transformer.py +35 -0
  163. ads/dataset/feature_selection.py +107 -0
  164. ads/dataset/forecasting_dataset.py +26 -0
  165. ads/dataset/helper.py +1450 -0
  166. ads/dataset/label_encoder.py +99 -0
  167. ads/dataset/mixin/__init__.py +5 -0
  168. ads/dataset/mixin/dataset_accessor.py +134 -0
  169. ads/dataset/pipeline.py +58 -0
  170. ads/dataset/plot.py +710 -0
  171. ads/dataset/progress.py +86 -0
  172. ads/dataset/recommendation.py +297 -0
  173. ads/dataset/recommendation_transformer.py +502 -0
  174. ads/dataset/regression_dataset.py +14 -0
  175. ads/dataset/sampled_dataset.py +1050 -0
  176. ads/dataset/target.py +98 -0
  177. ads/dataset/timeseries.py +18 -0
  178. ads/dbmixin/__init__.py +5 -0
  179. ads/dbmixin/db_pandas_accessor.py +153 -0
  180. ads/environment/__init__.py +9 -0
  181. ads/environment/ml_runtime.py +66 -0
  182. ads/evaluations/README.md +14 -0
  183. ads/evaluations/__init__.py +109 -0
  184. ads/evaluations/evaluation_plot.py +983 -0
  185. ads/evaluations/evaluator.py +1334 -0
  186. ads/evaluations/statistical_metrics.py +543 -0
  187. ads/experiments/__init__.py +9 -0
  188. ads/experiments/capabilities.md +0 -0
  189. ads/explanations/__init__.py +21 -0
  190. ads/explanations/base_explainer.py +142 -0
  191. ads/explanations/capabilities.md +83 -0
  192. ads/explanations/explainer.py +190 -0
  193. ads/explanations/mlx_global_explainer.py +1050 -0
  194. ads/explanations/mlx_interface.py +386 -0
  195. ads/explanations/mlx_local_explainer.py +287 -0
  196. ads/explanations/mlx_whatif_explainer.py +201 -0
  197. ads/feature_engineering/__init__.py +20 -0
  198. ads/feature_engineering/accessor/__init__.py +5 -0
  199. ads/feature_engineering/accessor/dataframe_accessor.py +535 -0
  200. ads/feature_engineering/accessor/mixin/__init__.py +5 -0
  201. ads/feature_engineering/accessor/mixin/correlation.py +166 -0
  202. ads/feature_engineering/accessor/mixin/eda_mixin.py +266 -0
  203. ads/feature_engineering/accessor/mixin/eda_mixin_series.py +85 -0
  204. ads/feature_engineering/accessor/mixin/feature_types_mixin.py +211 -0
  205. ads/feature_engineering/accessor/mixin/utils.py +65 -0
  206. ads/feature_engineering/accessor/series_accessor.py +431 -0
  207. ads/feature_engineering/adsimage/__init__.py +5 -0
  208. ads/feature_engineering/adsimage/image.py +192 -0
  209. ads/feature_engineering/adsimage/image_reader.py +170 -0
  210. ads/feature_engineering/adsimage/interface/__init__.py +5 -0
  211. ads/feature_engineering/adsimage/interface/reader.py +19 -0
  212. ads/feature_engineering/adsstring/__init__.py +7 -0
  213. ads/feature_engineering/adsstring/oci_language/__init__.py +8 -0
  214. ads/feature_engineering/adsstring/string/__init__.py +8 -0
  215. ads/feature_engineering/data_schema.json +57 -0
  216. ads/feature_engineering/dataset/__init__.py +5 -0
  217. ads/feature_engineering/dataset/zip_code_data.py +42062 -0
  218. ads/feature_engineering/exceptions.py +40 -0
  219. ads/feature_engineering/feature_type/__init__.py +133 -0
  220. ads/feature_engineering/feature_type/address.py +184 -0
  221. ads/feature_engineering/feature_type/adsstring/__init__.py +5 -0
  222. ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +164 -0
  223. ads/feature_engineering/feature_type/adsstring/oci_language.py +93 -0
  224. ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +5 -0
  225. ads/feature_engineering/feature_type/adsstring/parsers/base.py +47 -0
  226. ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +96 -0
  227. ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +221 -0
  228. ads/feature_engineering/feature_type/adsstring/string.py +258 -0
  229. ads/feature_engineering/feature_type/base.py +58 -0
  230. ads/feature_engineering/feature_type/boolean.py +183 -0
  231. ads/feature_engineering/feature_type/category.py +146 -0
  232. ads/feature_engineering/feature_type/constant.py +137 -0
  233. ads/feature_engineering/feature_type/continuous.py +151 -0
  234. ads/feature_engineering/feature_type/creditcard.py +314 -0
  235. ads/feature_engineering/feature_type/datetime.py +190 -0
  236. ads/feature_engineering/feature_type/discrete.py +134 -0
  237. ads/feature_engineering/feature_type/document.py +43 -0
  238. ads/feature_engineering/feature_type/gis.py +251 -0
  239. ads/feature_engineering/feature_type/handler/__init__.py +5 -0
  240. ads/feature_engineering/feature_type/handler/feature_validator.py +524 -0
  241. ads/feature_engineering/feature_type/handler/feature_warning.py +319 -0
  242. ads/feature_engineering/feature_type/handler/warnings.py +128 -0
  243. ads/feature_engineering/feature_type/integer.py +142 -0
  244. ads/feature_engineering/feature_type/ip_address.py +144 -0
  245. ads/feature_engineering/feature_type/ip_address_v4.py +138 -0
  246. ads/feature_engineering/feature_type/ip_address_v6.py +138 -0
  247. ads/feature_engineering/feature_type/lat_long.py +256 -0
  248. ads/feature_engineering/feature_type/object.py +43 -0
  249. ads/feature_engineering/feature_type/ordinal.py +132 -0
  250. ads/feature_engineering/feature_type/phone_number.py +135 -0
  251. ads/feature_engineering/feature_type/string.py +171 -0
  252. ads/feature_engineering/feature_type/text.py +93 -0
  253. ads/feature_engineering/feature_type/unknown.py +43 -0
  254. ads/feature_engineering/feature_type/zip_code.py +164 -0
  255. ads/feature_engineering/feature_type_manager.py +406 -0
  256. ads/feature_engineering/schema.py +795 -0
  257. ads/feature_engineering/utils.py +245 -0
  258. ads/feature_store/.readthedocs.yaml +19 -0
  259. ads/feature_store/README.md +65 -0
  260. ads/feature_store/__init__.py +9 -0
  261. ads/feature_store/common/__init__.py +0 -0
  262. ads/feature_store/common/enums.py +339 -0
  263. ads/feature_store/common/exceptions.py +18 -0
  264. ads/feature_store/common/spark_session_singleton.py +125 -0
  265. ads/feature_store/common/utils/__init__.py +0 -0
  266. ads/feature_store/common/utils/base64_encoder_decoder.py +72 -0
  267. ads/feature_store/common/utils/feature_schema_mapper.py +283 -0
  268. ads/feature_store/common/utils/transformation_utils.py +82 -0
  269. ads/feature_store/common/utils/utility.py +403 -0
  270. ads/feature_store/data_validation/__init__.py +0 -0
  271. ads/feature_store/data_validation/great_expectation.py +129 -0
  272. ads/feature_store/dataset.py +1230 -0
  273. ads/feature_store/dataset_job.py +530 -0
  274. ads/feature_store/docs/Dockerfile +7 -0
  275. ads/feature_store/docs/Makefile +44 -0
  276. ads/feature_store/docs/conf.py +28 -0
  277. ads/feature_store/docs/requirements.txt +14 -0
  278. ads/feature_store/docs/source/ads.feature_store.query.rst +20 -0
  279. ads/feature_store/docs/source/cicd.rst +137 -0
  280. ads/feature_store/docs/source/conf.py +86 -0
  281. ads/feature_store/docs/source/data_versioning.rst +33 -0
  282. ads/feature_store/docs/source/dataset.rst +388 -0
  283. ads/feature_store/docs/source/dataset_job.rst +27 -0
  284. ads/feature_store/docs/source/demo.rst +70 -0
  285. ads/feature_store/docs/source/entity.rst +78 -0
  286. ads/feature_store/docs/source/feature_group.rst +624 -0
  287. ads/feature_store/docs/source/feature_group_job.rst +29 -0
  288. ads/feature_store/docs/source/feature_store.rst +122 -0
  289. ads/feature_store/docs/source/feature_store_class.rst +123 -0
  290. ads/feature_store/docs/source/feature_validation.rst +66 -0
  291. ads/feature_store/docs/source/figures/cicd.png +0 -0
  292. ads/feature_store/docs/source/figures/data_validation.png +0 -0
  293. ads/feature_store/docs/source/figures/data_versioning.png +0 -0
  294. ads/feature_store/docs/source/figures/dataset.gif +0 -0
  295. ads/feature_store/docs/source/figures/dataset.png +0 -0
  296. ads/feature_store/docs/source/figures/dataset_lineage.png +0 -0
  297. ads/feature_store/docs/source/figures/dataset_statistics.png +0 -0
  298. ads/feature_store/docs/source/figures/dataset_statistics_viz.png +0 -0
  299. ads/feature_store/docs/source/figures/dataset_validation_results.png +0 -0
  300. ads/feature_store/docs/source/figures/dataset_validation_summary.png +0 -0
  301. ads/feature_store/docs/source/figures/drift_monitoring.png +0 -0
  302. ads/feature_store/docs/source/figures/entity.png +0 -0
  303. ads/feature_store/docs/source/figures/feature_group.png +0 -0
  304. ads/feature_store/docs/source/figures/feature_group_lineage.png +0 -0
  305. ads/feature_store/docs/source/figures/feature_group_statistics_viz.png +0 -0
  306. ads/feature_store/docs/source/figures/feature_store_deployment.png +0 -0
  307. ads/feature_store/docs/source/figures/feature_store_overview.png +0 -0
  308. ads/feature_store/docs/source/figures/featuregroup.gif +0 -0
  309. ads/feature_store/docs/source/figures/lineage_d1.png +0 -0
  310. ads/feature_store/docs/source/figures/lineage_d2.png +0 -0
  311. ads/feature_store/docs/source/figures/lineage_fg.png +0 -0
  312. ads/feature_store/docs/source/figures/logo-dark-mode.png +0 -0
  313. ads/feature_store/docs/source/figures/logo-light-mode.png +0 -0
  314. ads/feature_store/docs/source/figures/overview.png +0 -0
  315. ads/feature_store/docs/source/figures/resource_manager.png +0 -0
  316. ads/feature_store/docs/source/figures/resource_manager_feature_store_stack.png +0 -0
  317. ads/feature_store/docs/source/figures/resource_manager_home.png +0 -0
  318. ads/feature_store/docs/source/figures/stats_1.png +0 -0
  319. ads/feature_store/docs/source/figures/stats_2.png +0 -0
  320. ads/feature_store/docs/source/figures/stats_d.png +0 -0
  321. ads/feature_store/docs/source/figures/stats_fg.png +0 -0
  322. ads/feature_store/docs/source/figures/transformation.png +0 -0
  323. ads/feature_store/docs/source/figures/transformations.gif +0 -0
  324. ads/feature_store/docs/source/figures/validation.png +0 -0
  325. ads/feature_store/docs/source/figures/validation_fg.png +0 -0
  326. ads/feature_store/docs/source/figures/validation_results.png +0 -0
  327. ads/feature_store/docs/source/figures/validation_summary.png +0 -0
  328. ads/feature_store/docs/source/index.rst +81 -0
  329. ads/feature_store/docs/source/module.rst +8 -0
  330. ads/feature_store/docs/source/notebook.rst +94 -0
  331. ads/feature_store/docs/source/overview.rst +47 -0
  332. ads/feature_store/docs/source/quickstart.rst +176 -0
  333. ads/feature_store/docs/source/release_notes.rst +194 -0
  334. ads/feature_store/docs/source/setup_feature_store.rst +81 -0
  335. ads/feature_store/docs/source/statistics.rst +58 -0
  336. ads/feature_store/docs/source/transformation.rst +199 -0
  337. ads/feature_store/docs/source/ui.rst +65 -0
  338. ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +66 -0
  339. ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +192 -0
  340. ads/feature_store/docs/source/user_guides.setup.terraform.rst +338 -0
  341. ads/feature_store/entity.py +718 -0
  342. ads/feature_store/execution_strategy/__init__.py +0 -0
  343. ads/feature_store/execution_strategy/delta_lake/__init__.py +0 -0
  344. ads/feature_store/execution_strategy/delta_lake/delta_lake_service.py +375 -0
  345. ads/feature_store/execution_strategy/engine/__init__.py +0 -0
  346. ads/feature_store/execution_strategy/engine/spark_engine.py +316 -0
  347. ads/feature_store/execution_strategy/execution_strategy.py +113 -0
  348. ads/feature_store/execution_strategy/execution_strategy_provider.py +47 -0
  349. ads/feature_store/execution_strategy/spark/__init__.py +0 -0
  350. ads/feature_store/execution_strategy/spark/spark_execution.py +618 -0
  351. ads/feature_store/feature.py +192 -0
  352. ads/feature_store/feature_group.py +1494 -0
  353. ads/feature_store/feature_group_expectation.py +346 -0
  354. ads/feature_store/feature_group_job.py +602 -0
  355. ads/feature_store/feature_lineage/__init__.py +0 -0
  356. ads/feature_store/feature_lineage/graphviz_service.py +180 -0
  357. ads/feature_store/feature_option_details.py +50 -0
  358. ads/feature_store/feature_statistics/__init__.py +0 -0
  359. ads/feature_store/feature_statistics/statistics_service.py +99 -0
  360. ads/feature_store/feature_store.py +699 -0
  361. ads/feature_store/feature_store_registrar.py +518 -0
  362. ads/feature_store/input_feature_detail.py +149 -0
  363. ads/feature_store/mixin/__init__.py +4 -0
  364. ads/feature_store/mixin/oci_feature_store.py +145 -0
  365. ads/feature_store/model_details.py +73 -0
  366. ads/feature_store/query/__init__.py +0 -0
  367. ads/feature_store/query/filter.py +266 -0
  368. ads/feature_store/query/generator/__init__.py +0 -0
  369. ads/feature_store/query/generator/query_generator.py +298 -0
  370. ads/feature_store/query/join.py +161 -0
  371. ads/feature_store/query/query.py +403 -0
  372. ads/feature_store/query/validator/__init__.py +0 -0
  373. ads/feature_store/query/validator/query_validator.py +57 -0
  374. ads/feature_store/response/__init__.py +0 -0
  375. ads/feature_store/response/response_builder.py +68 -0
  376. ads/feature_store/service/__init__.py +0 -0
  377. ads/feature_store/service/oci_dataset.py +139 -0
  378. ads/feature_store/service/oci_dataset_job.py +199 -0
  379. ads/feature_store/service/oci_entity.py +125 -0
  380. ads/feature_store/service/oci_feature_group.py +164 -0
  381. ads/feature_store/service/oci_feature_group_job.py +214 -0
  382. ads/feature_store/service/oci_feature_store.py +182 -0
  383. ads/feature_store/service/oci_lineage.py +87 -0
  384. ads/feature_store/service/oci_transformation.py +104 -0
  385. ads/feature_store/statistics/__init__.py +0 -0
  386. ads/feature_store/statistics/abs_feature_value.py +49 -0
  387. ads/feature_store/statistics/charts/__init__.py +0 -0
  388. ads/feature_store/statistics/charts/abstract_feature_plot.py +37 -0
  389. ads/feature_store/statistics/charts/box_plot.py +148 -0
  390. ads/feature_store/statistics/charts/frequency_distribution.py +65 -0
  391. ads/feature_store/statistics/charts/probability_distribution.py +68 -0
  392. ads/feature_store/statistics/charts/top_k_frequent_elements.py +98 -0
  393. ads/feature_store/statistics/feature_stat.py +126 -0
  394. ads/feature_store/statistics/generic_feature_value.py +33 -0
  395. ads/feature_store/statistics/statistics.py +41 -0
  396. ads/feature_store/statistics_config.py +101 -0
  397. ads/feature_store/templates/feature_store_template.yaml +45 -0
  398. ads/feature_store/transformation.py +499 -0
  399. ads/feature_store/validation_output.py +57 -0
  400. ads/hpo/__init__.py +9 -0
  401. ads/hpo/_imports.py +91 -0
  402. ads/hpo/ads_search_space.py +439 -0
  403. ads/hpo/distributions.py +325 -0
  404. ads/hpo/objective.py +280 -0
  405. ads/hpo/search_cv.py +1657 -0
  406. ads/hpo/stopping_criterion.py +75 -0
  407. ads/hpo/tuner_artifact.py +413 -0
  408. ads/hpo/utils.py +91 -0
  409. ads/hpo/validation.py +140 -0
  410. ads/hpo/visualization/__init__.py +5 -0
  411. ads/hpo/visualization/_contour.py +23 -0
  412. ads/hpo/visualization/_edf.py +20 -0
  413. ads/hpo/visualization/_intermediate_values.py +21 -0
  414. ads/hpo/visualization/_optimization_history.py +25 -0
  415. ads/hpo/visualization/_parallel_coordinate.py +169 -0
  416. ads/hpo/visualization/_param_importances.py +26 -0
  417. ads/jobs/__init__.py +53 -0
  418. ads/jobs/ads_job.py +663 -0
  419. ads/jobs/builders/__init__.py +5 -0
  420. ads/jobs/builders/base.py +156 -0
  421. ads/jobs/builders/infrastructure/__init__.py +6 -0
  422. ads/jobs/builders/infrastructure/base.py +165 -0
  423. ads/jobs/builders/infrastructure/dataflow.py +1252 -0
  424. ads/jobs/builders/infrastructure/dsc_job.py +1894 -0
  425. ads/jobs/builders/infrastructure/dsc_job_runtime.py +1233 -0
  426. ads/jobs/builders/infrastructure/utils.py +65 -0
  427. ads/jobs/builders/runtimes/__init__.py +5 -0
  428. ads/jobs/builders/runtimes/artifact.py +338 -0
  429. ads/jobs/builders/runtimes/base.py +325 -0
  430. ads/jobs/builders/runtimes/container_runtime.py +242 -0
  431. ads/jobs/builders/runtimes/python_runtime.py +1016 -0
  432. ads/jobs/builders/runtimes/pytorch_runtime.py +204 -0
  433. ads/jobs/cli.py +104 -0
  434. ads/jobs/env_var_parser.py +131 -0
  435. ads/jobs/extension.py +160 -0
  436. ads/jobs/schema/__init__.py +5 -0
  437. ads/jobs/schema/infrastructure_schema.json +116 -0
  438. ads/jobs/schema/job_schema.json +42 -0
  439. ads/jobs/schema/runtime_schema.json +183 -0
  440. ads/jobs/schema/validator.py +141 -0
  441. ads/jobs/serializer.py +296 -0
  442. ads/jobs/templates/__init__.py +5 -0
  443. ads/jobs/templates/container.py +6 -0
  444. ads/jobs/templates/driver_notebook.py +177 -0
  445. ads/jobs/templates/driver_oci.py +500 -0
  446. ads/jobs/templates/driver_python.py +48 -0
  447. ads/jobs/templates/driver_pytorch.py +852 -0
  448. ads/jobs/templates/driver_utils.py +615 -0
  449. ads/jobs/templates/hostname_from_env.c +55 -0
  450. ads/jobs/templates/oci_metrics.py +181 -0
  451. ads/jobs/utils.py +104 -0
  452. ads/llm/__init__.py +28 -0
  453. ads/llm/autogen/__init__.py +2 -0
  454. ads/llm/autogen/constants.py +15 -0
  455. ads/llm/autogen/reports/__init__.py +2 -0
  456. ads/llm/autogen/reports/base.py +67 -0
  457. ads/llm/autogen/reports/data.py +103 -0
  458. ads/llm/autogen/reports/session.py +526 -0
  459. ads/llm/autogen/reports/templates/chat_box.html +13 -0
  460. ads/llm/autogen/reports/templates/chat_box_lt.html +5 -0
  461. ads/llm/autogen/reports/templates/chat_box_rt.html +6 -0
  462. ads/llm/autogen/reports/utils.py +56 -0
  463. ads/llm/autogen/v02/__init__.py +4 -0
  464. ads/llm/autogen/v02/client.py +295 -0
  465. ads/llm/autogen/v02/log_handlers/__init__.py +2 -0
  466. ads/llm/autogen/v02/log_handlers/oci_file_handler.py +83 -0
  467. ads/llm/autogen/v02/loggers/__init__.py +6 -0
  468. ads/llm/autogen/v02/loggers/metric_logger.py +320 -0
  469. ads/llm/autogen/v02/loggers/session_logger.py +580 -0
  470. ads/llm/autogen/v02/loggers/utils.py +86 -0
  471. ads/llm/autogen/v02/runtime_logging.py +163 -0
  472. ads/llm/chain.py +268 -0
  473. ads/llm/chat_template.py +31 -0
  474. ads/llm/deploy.py +63 -0
  475. ads/llm/guardrails/__init__.py +5 -0
  476. ads/llm/guardrails/base.py +442 -0
  477. ads/llm/guardrails/huggingface.py +44 -0
  478. ads/llm/langchain/__init__.py +5 -0
  479. ads/llm/langchain/plugins/__init__.py +5 -0
  480. ads/llm/langchain/plugins/chat_models/__init__.py +5 -0
  481. ads/llm/langchain/plugins/chat_models/oci_data_science.py +1027 -0
  482. ads/llm/langchain/plugins/embeddings/__init__.py +4 -0
  483. ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +184 -0
  484. ads/llm/langchain/plugins/llms/__init__.py +5 -0
  485. ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +979 -0
  486. ads/llm/requirements.txt +3 -0
  487. ads/llm/serialize.py +219 -0
  488. ads/llm/serializers/__init__.py +0 -0
  489. ads/llm/serializers/retrieval_qa.py +153 -0
  490. ads/llm/serializers/runnable_parallel.py +27 -0
  491. ads/llm/templates/score_chain.jinja2 +155 -0
  492. ads/llm/templates/tool_chat_template_hermes.jinja +130 -0
  493. ads/llm/templates/tool_chat_template_mistral_parallel.jinja +94 -0
  494. ads/model/__init__.py +52 -0
  495. ads/model/artifact.py +573 -0
  496. ads/model/artifact_downloader.py +254 -0
  497. ads/model/artifact_uploader.py +267 -0
  498. ads/model/base_properties.py +238 -0
  499. ads/model/common/.model-ignore +66 -0
  500. ads/model/common/__init__.py +5 -0
  501. ads/model/common/utils.py +142 -0
  502. ads/model/datascience_model.py +2635 -0
  503. ads/model/deployment/__init__.py +20 -0
  504. ads/model/deployment/common/__init__.py +5 -0
  505. ads/model/deployment/common/utils.py +308 -0
  506. ads/model/deployment/model_deployer.py +466 -0
  507. ads/model/deployment/model_deployment.py +1846 -0
  508. ads/model/deployment/model_deployment_infrastructure.py +671 -0
  509. ads/model/deployment/model_deployment_properties.py +493 -0
  510. ads/model/deployment/model_deployment_runtime.py +838 -0
  511. ads/model/extractor/__init__.py +5 -0
  512. ads/model/extractor/automl_extractor.py +74 -0
  513. ads/model/extractor/embedding_onnx_extractor.py +80 -0
  514. ads/model/extractor/huggingface_extractor.py +88 -0
  515. ads/model/extractor/keras_extractor.py +84 -0
  516. ads/model/extractor/lightgbm_extractor.py +93 -0
  517. ads/model/extractor/model_info_extractor.py +114 -0
  518. ads/model/extractor/model_info_extractor_factory.py +105 -0
  519. ads/model/extractor/pytorch_extractor.py +87 -0
  520. ads/model/extractor/sklearn_extractor.py +112 -0
  521. ads/model/extractor/spark_extractor.py +89 -0
  522. ads/model/extractor/tensorflow_extractor.py +85 -0
  523. ads/model/extractor/xgboost_extractor.py +94 -0
  524. ads/model/framework/__init__.py +5 -0
  525. ads/model/framework/automl_model.py +178 -0
  526. ads/model/framework/embedding_onnx_model.py +438 -0
  527. ads/model/framework/huggingface_model.py +399 -0
  528. ads/model/framework/lightgbm_model.py +266 -0
  529. ads/model/framework/pytorch_model.py +266 -0
  530. ads/model/framework/sklearn_model.py +250 -0
  531. ads/model/framework/spark_model.py +326 -0
  532. ads/model/framework/tensorflow_model.py +254 -0
  533. ads/model/framework/xgboost_model.py +258 -0
  534. ads/model/generic_model.py +3518 -0
  535. ads/model/model_artifact_boilerplate/README.md +381 -0
  536. ads/model/model_artifact_boilerplate/__init__.py +5 -0
  537. ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +5 -0
  538. ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +427 -0
  539. ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +2 -0
  540. ads/model/model_artifact_boilerplate/runtime.yaml +7 -0
  541. ads/model/model_artifact_boilerplate/score.py +61 -0
  542. ads/model/model_file_description_schema.json +68 -0
  543. ads/model/model_introspect.py +331 -0
  544. ads/model/model_metadata.py +1810 -0
  545. ads/model/model_metadata_mixin.py +460 -0
  546. ads/model/model_properties.py +63 -0
  547. ads/model/model_version_set.py +739 -0
  548. ads/model/runtime/__init__.py +5 -0
  549. ads/model/runtime/env_info.py +306 -0
  550. ads/model/runtime/model_deployment_details.py +37 -0
  551. ads/model/runtime/model_provenance_details.py +58 -0
  552. ads/model/runtime/runtime_info.py +81 -0
  553. ads/model/runtime/schemas/inference_env_info_schema.yaml +16 -0
  554. ads/model/runtime/schemas/model_provenance_schema.yaml +36 -0
  555. ads/model/runtime/schemas/training_env_info_schema.yaml +16 -0
  556. ads/model/runtime/utils.py +201 -0
  557. ads/model/serde/__init__.py +5 -0
  558. ads/model/serde/common.py +40 -0
  559. ads/model/serde/model_input.py +547 -0
  560. ads/model/serde/model_serializer.py +1184 -0
  561. ads/model/service/__init__.py +5 -0
  562. ads/model/service/oci_datascience_model.py +1076 -0
  563. ads/model/service/oci_datascience_model_deployment.py +500 -0
  564. ads/model/service/oci_datascience_model_version_set.py +176 -0
  565. ads/model/transformer/__init__.py +5 -0
  566. ads/model/transformer/onnx_transformer.py +324 -0
  567. ads/mysqldb/__init__.py +5 -0
  568. ads/mysqldb/mysql_db.py +227 -0
  569. ads/opctl/__init__.py +18 -0
  570. ads/opctl/anomaly_detection.py +11 -0
  571. ads/opctl/backend/__init__.py +5 -0
  572. ads/opctl/backend/ads_dataflow.py +353 -0
  573. ads/opctl/backend/ads_ml_job.py +710 -0
  574. ads/opctl/backend/ads_ml_pipeline.py +164 -0
  575. ads/opctl/backend/ads_model_deployment.py +209 -0
  576. ads/opctl/backend/base.py +146 -0
  577. ads/opctl/backend/local.py +1053 -0
  578. ads/opctl/backend/marketplace/__init__.py +9 -0
  579. ads/opctl/backend/marketplace/helm_helper.py +173 -0
  580. ads/opctl/backend/marketplace/local_marketplace.py +271 -0
  581. ads/opctl/backend/marketplace/marketplace_backend_runner.py +71 -0
  582. ads/opctl/backend/marketplace/marketplace_operator_interface.py +44 -0
  583. ads/opctl/backend/marketplace/marketplace_operator_runner.py +24 -0
  584. ads/opctl/backend/marketplace/marketplace_utils.py +212 -0
  585. ads/opctl/backend/marketplace/models/__init__.py +5 -0
  586. ads/opctl/backend/marketplace/models/bearer_token.py +94 -0
  587. ads/opctl/backend/marketplace/models/marketplace_type.py +70 -0
  588. ads/opctl/backend/marketplace/models/ocir_details.py +56 -0
  589. ads/opctl/backend/marketplace/prerequisite_checker.py +238 -0
  590. ads/opctl/cli.py +707 -0
  591. ads/opctl/cmds.py +869 -0
  592. ads/opctl/conda/__init__.py +5 -0
  593. ads/opctl/conda/cli.py +193 -0
  594. ads/opctl/conda/cmds.py +749 -0
  595. ads/opctl/conda/config.yaml +34 -0
  596. ads/opctl/conda/manifest_template.yaml +13 -0
  597. ads/opctl/conda/multipart_uploader.py +188 -0
  598. ads/opctl/conda/pack.py +89 -0
  599. ads/opctl/config/__init__.py +5 -0
  600. ads/opctl/config/base.py +57 -0
  601. ads/opctl/config/diagnostics/__init__.py +5 -0
  602. ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +62 -0
  603. ads/opctl/config/merger.py +255 -0
  604. ads/opctl/config/resolver.py +297 -0
  605. ads/opctl/config/utils.py +79 -0
  606. ads/opctl/config/validator.py +17 -0
  607. ads/opctl/config/versioner.py +68 -0
  608. ads/opctl/config/yaml_parsers/__init__.py +7 -0
  609. ads/opctl/config/yaml_parsers/base.py +58 -0
  610. ads/opctl/config/yaml_parsers/distributed/__init__.py +7 -0
  611. ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +201 -0
  612. ads/opctl/constants.py +66 -0
  613. ads/opctl/decorator/__init__.py +5 -0
  614. ads/opctl/decorator/common.py +129 -0
  615. ads/opctl/diagnostics/__init__.py +5 -0
  616. ads/opctl/diagnostics/__main__.py +25 -0
  617. ads/opctl/diagnostics/check_distributed_job_requirements.py +212 -0
  618. ads/opctl/diagnostics/check_requirements.py +144 -0
  619. ads/opctl/diagnostics/requirement_exception.py +9 -0
  620. ads/opctl/distributed/README.md +109 -0
  621. ads/opctl/distributed/__init__.py +5 -0
  622. ads/opctl/distributed/certificates.py +32 -0
  623. ads/opctl/distributed/cli.py +207 -0
  624. ads/opctl/distributed/cmds.py +731 -0
  625. ads/opctl/distributed/common/__init__.py +5 -0
  626. ads/opctl/distributed/common/abstract_cluster_provider.py +449 -0
  627. ads/opctl/distributed/common/abstract_framework_spec_builder.py +88 -0
  628. ads/opctl/distributed/common/cluster_config_helper.py +103 -0
  629. ads/opctl/distributed/common/cluster_provider_factory.py +21 -0
  630. ads/opctl/distributed/common/cluster_runner.py +54 -0
  631. ads/opctl/distributed/common/framework_factory.py +29 -0
  632. ads/opctl/docker/Dockerfile.job +103 -0
  633. ads/opctl/docker/Dockerfile.job.arm +107 -0
  634. ads/opctl/docker/Dockerfile.job.gpu +175 -0
  635. ads/opctl/docker/base-env.yaml +13 -0
  636. ads/opctl/docker/cuda.repo +6 -0
  637. ads/opctl/docker/operator/.dockerignore +0 -0
  638. ads/opctl/docker/operator/Dockerfile +41 -0
  639. ads/opctl/docker/operator/Dockerfile.gpu +85 -0
  640. ads/opctl/docker/operator/cuda.repo +6 -0
  641. ads/opctl/docker/operator/environment.yaml +8 -0
  642. ads/opctl/forecast.py +11 -0
  643. ads/opctl/index.yaml +3 -0
  644. ads/opctl/model/__init__.py +5 -0
  645. ads/opctl/model/cli.py +65 -0
  646. ads/opctl/model/cmds.py +73 -0
  647. ads/opctl/operator/README.md +4 -0
  648. ads/opctl/operator/__init__.py +31 -0
  649. ads/opctl/operator/cli.py +344 -0
  650. ads/opctl/operator/cmd.py +596 -0
  651. ads/opctl/operator/common/__init__.py +5 -0
  652. ads/opctl/operator/common/backend_factory.py +460 -0
  653. ads/opctl/operator/common/const.py +27 -0
  654. ads/opctl/operator/common/data/synthetic.csv +16001 -0
  655. ads/opctl/operator/common/dictionary_merger.py +148 -0
  656. ads/opctl/operator/common/errors.py +42 -0
  657. ads/opctl/operator/common/operator_config.py +99 -0
  658. ads/opctl/operator/common/operator_loader.py +811 -0
  659. ads/opctl/operator/common/operator_schema.yaml +130 -0
  660. ads/opctl/operator/common/operator_yaml_generator.py +152 -0
  661. ads/opctl/operator/common/utils.py +208 -0
  662. ads/opctl/operator/lowcode/__init__.py +5 -0
  663. ads/opctl/operator/lowcode/anomaly/MLoperator +16 -0
  664. ads/opctl/operator/lowcode/anomaly/README.md +207 -0
  665. ads/opctl/operator/lowcode/anomaly/__init__.py +5 -0
  666. ads/opctl/operator/lowcode/anomaly/__main__.py +103 -0
  667. ads/opctl/operator/lowcode/anomaly/cmd.py +35 -0
  668. ads/opctl/operator/lowcode/anomaly/const.py +167 -0
  669. ads/opctl/operator/lowcode/anomaly/environment.yaml +10 -0
  670. ads/opctl/operator/lowcode/anomaly/model/__init__.py +5 -0
  671. ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +146 -0
  672. ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +162 -0
  673. ads/opctl/operator/lowcode/anomaly/model/automlx.py +99 -0
  674. ads/opctl/operator/lowcode/anomaly/model/autots.py +115 -0
  675. ads/opctl/operator/lowcode/anomaly/model/base_model.py +404 -0
  676. ads/opctl/operator/lowcode/anomaly/model/factory.py +110 -0
  677. ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +78 -0
  678. ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +78 -0
  679. ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +120 -0
  680. ads/opctl/operator/lowcode/anomaly/model/tods.py +119 -0
  681. ads/opctl/operator/lowcode/anomaly/operator_config.py +127 -0
  682. ads/opctl/operator/lowcode/anomaly/schema.yaml +401 -0
  683. ads/opctl/operator/lowcode/anomaly/utils.py +88 -0
  684. ads/opctl/operator/lowcode/common/__init__.py +5 -0
  685. ads/opctl/operator/lowcode/common/const.py +10 -0
  686. ads/opctl/operator/lowcode/common/data.py +116 -0
  687. ads/opctl/operator/lowcode/common/errors.py +47 -0
  688. ads/opctl/operator/lowcode/common/transformations.py +296 -0
  689. ads/opctl/operator/lowcode/common/utils.py +384 -0
  690. ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +13 -0
  691. ads/opctl/operator/lowcode/feature_store_marketplace/README.md +30 -0
  692. ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +5 -0
  693. ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +116 -0
  694. ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +85 -0
  695. ads/opctl/operator/lowcode/feature_store_marketplace/const.py +15 -0
  696. ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
  697. ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +4 -0
  698. ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +32 -0
  699. ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +43 -0
  700. ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +120 -0
  701. ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +34 -0
  702. ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +386 -0
  703. ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +160 -0
  704. ads/opctl/operator/lowcode/forecast/MLoperator +25 -0
  705. ads/opctl/operator/lowcode/forecast/README.md +209 -0
  706. ads/opctl/operator/lowcode/forecast/__init__.py +5 -0
  707. ads/opctl/operator/lowcode/forecast/__main__.py +89 -0
  708. ads/opctl/operator/lowcode/forecast/cmd.py +40 -0
  709. ads/opctl/operator/lowcode/forecast/const.py +92 -0
  710. ads/opctl/operator/lowcode/forecast/environment.yaml +20 -0
  711. ads/opctl/operator/lowcode/forecast/errors.py +26 -0
  712. ads/opctl/operator/lowcode/forecast/model/__init__.py +5 -0
  713. ads/opctl/operator/lowcode/forecast/model/arima.py +279 -0
  714. ads/opctl/operator/lowcode/forecast/model/automlx.py +553 -0
  715. ads/opctl/operator/lowcode/forecast/model/autots.py +312 -0
  716. ads/opctl/operator/lowcode/forecast/model/base_model.py +875 -0
  717. ads/opctl/operator/lowcode/forecast/model/factory.py +106 -0
  718. ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +492 -0
  719. ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +243 -0
  720. ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +482 -0
  721. ads/opctl/operator/lowcode/forecast/model/prophet.py +445 -0
  722. ads/opctl/operator/lowcode/forecast/model_evaluator.py +244 -0
  723. ads/opctl/operator/lowcode/forecast/operator_config.py +234 -0
  724. ads/opctl/operator/lowcode/forecast/schema.yaml +506 -0
  725. ads/opctl/operator/lowcode/forecast/utils.py +397 -0
  726. ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +7 -0
  727. ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +285 -0
  728. ads/opctl/operator/lowcode/forecast/whatifserve/score.py +246 -0
  729. ads/opctl/operator/lowcode/pii/MLoperator +17 -0
  730. ads/opctl/operator/lowcode/pii/README.md +208 -0
  731. ads/opctl/operator/lowcode/pii/__init__.py +5 -0
  732. ads/opctl/operator/lowcode/pii/__main__.py +78 -0
  733. ads/opctl/operator/lowcode/pii/cmd.py +39 -0
  734. ads/opctl/operator/lowcode/pii/constant.py +84 -0
  735. ads/opctl/operator/lowcode/pii/environment.yaml +17 -0
  736. ads/opctl/operator/lowcode/pii/errors.py +27 -0
  737. ads/opctl/operator/lowcode/pii/model/__init__.py +5 -0
  738. ads/opctl/operator/lowcode/pii/model/factory.py +82 -0
  739. ads/opctl/operator/lowcode/pii/model/guardrails.py +167 -0
  740. ads/opctl/operator/lowcode/pii/model/pii.py +145 -0
  741. ads/opctl/operator/lowcode/pii/model/processor/__init__.py +34 -0
  742. ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +34 -0
  743. ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +35 -0
  744. ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +225 -0
  745. ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +73 -0
  746. ads/opctl/operator/lowcode/pii/model/processor/remover.py +26 -0
  747. ads/opctl/operator/lowcode/pii/model/report.py +487 -0
  748. ads/opctl/operator/lowcode/pii/operator_config.py +95 -0
  749. ads/opctl/operator/lowcode/pii/schema.yaml +108 -0
  750. ads/opctl/operator/lowcode/pii/utils.py +43 -0
  751. ads/opctl/operator/lowcode/recommender/MLoperator +16 -0
  752. ads/opctl/operator/lowcode/recommender/README.md +206 -0
  753. ads/opctl/operator/lowcode/recommender/__init__.py +5 -0
  754. ads/opctl/operator/lowcode/recommender/__main__.py +82 -0
  755. ads/opctl/operator/lowcode/recommender/cmd.py +33 -0
  756. ads/opctl/operator/lowcode/recommender/constant.py +30 -0
  757. ads/opctl/operator/lowcode/recommender/environment.yaml +11 -0
  758. ads/opctl/operator/lowcode/recommender/model/base_model.py +212 -0
  759. ads/opctl/operator/lowcode/recommender/model/factory.py +56 -0
  760. ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +25 -0
  761. ads/opctl/operator/lowcode/recommender/model/svd.py +106 -0
  762. ads/opctl/operator/lowcode/recommender/operator_config.py +81 -0
  763. ads/opctl/operator/lowcode/recommender/schema.yaml +265 -0
  764. ads/opctl/operator/lowcode/recommender/utils.py +13 -0
  765. ads/opctl/operator/runtime/__init__.py +5 -0
  766. ads/opctl/operator/runtime/const.py +17 -0
  767. ads/opctl/operator/runtime/container_runtime_schema.yaml +50 -0
  768. ads/opctl/operator/runtime/marketplace_runtime.py +50 -0
  769. ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +21 -0
  770. ads/opctl/operator/runtime/python_runtime_schema.yaml +21 -0
  771. ads/opctl/operator/runtime/runtime.py +115 -0
  772. ads/opctl/schema.yaml.yml +36 -0
  773. ads/opctl/script.py +40 -0
  774. ads/opctl/spark/__init__.py +5 -0
  775. ads/opctl/spark/cli.py +43 -0
  776. ads/opctl/spark/cmds.py +147 -0
  777. ads/opctl/templates/diagnostic_report_template.jinja2 +102 -0
  778. ads/opctl/utils.py +344 -0
  779. ads/oracledb/__init__.py +5 -0
  780. ads/oracledb/oracle_db.py +346 -0
  781. ads/pipeline/__init__.py +39 -0
  782. ads/pipeline/ads_pipeline.py +2279 -0
  783. ads/pipeline/ads_pipeline_run.py +772 -0
  784. ads/pipeline/ads_pipeline_step.py +605 -0
  785. ads/pipeline/builders/__init__.py +5 -0
  786. ads/pipeline/builders/infrastructure/__init__.py +5 -0
  787. ads/pipeline/builders/infrastructure/custom_script.py +32 -0
  788. ads/pipeline/cli.py +119 -0
  789. ads/pipeline/extension.py +291 -0
  790. ads/pipeline/schema/__init__.py +5 -0
  791. ads/pipeline/schema/cs_step_schema.json +35 -0
  792. ads/pipeline/schema/ml_step_schema.json +31 -0
  793. ads/pipeline/schema/pipeline_schema.json +71 -0
  794. ads/pipeline/visualizer/__init__.py +5 -0
  795. ads/pipeline/visualizer/base.py +570 -0
  796. ads/pipeline/visualizer/graph_renderer.py +272 -0
  797. ads/pipeline/visualizer/text_renderer.py +84 -0
  798. ads/secrets/__init__.py +11 -0
  799. ads/secrets/adb.py +386 -0
  800. ads/secrets/auth_token.py +86 -0
  801. ads/secrets/big_data_service.py +365 -0
  802. ads/secrets/mysqldb.py +149 -0
  803. ads/secrets/oracledb.py +160 -0
  804. ads/secrets/secrets.py +407 -0
  805. ads/telemetry/__init__.py +7 -0
  806. ads/telemetry/base.py +69 -0
  807. ads/telemetry/client.py +125 -0
  808. ads/telemetry/telemetry.py +257 -0
  809. ads/templates/dataflow_pyspark.jinja2 +13 -0
  810. ads/templates/dataflow_sparksql.jinja2 +22 -0
  811. ads/templates/func.jinja2 +20 -0
  812. ads/templates/schemas/openapi.json +1740 -0
  813. ads/templates/score-pkl.jinja2 +173 -0
  814. ads/templates/score.jinja2 +322 -0
  815. ads/templates/score_embedding_onnx.jinja2 +202 -0
  816. ads/templates/score_generic.jinja2 +165 -0
  817. ads/templates/score_huggingface_pipeline.jinja2 +217 -0
  818. ads/templates/score_lightgbm.jinja2 +185 -0
  819. ads/templates/score_onnx.jinja2 +407 -0
  820. ads/templates/score_onnx_new.jinja2 +473 -0
  821. ads/templates/score_oracle_automl.jinja2 +185 -0
  822. ads/templates/score_pyspark.jinja2 +154 -0
  823. ads/templates/score_pytorch.jinja2 +219 -0
  824. ads/templates/score_scikit-learn.jinja2 +184 -0
  825. ads/templates/score_tensorflow.jinja2 +184 -0
  826. ads/templates/score_xgboost.jinja2 +178 -0
  827. ads/text_dataset/__init__.py +5 -0
  828. ads/text_dataset/backends.py +211 -0
  829. ads/text_dataset/dataset.py +445 -0
  830. ads/text_dataset/extractor.py +207 -0
  831. ads/text_dataset/options.py +53 -0
  832. ads/text_dataset/udfs.py +22 -0
  833. ads/text_dataset/utils.py +49 -0
  834. ads/type_discovery/__init__.py +9 -0
  835. ads/type_discovery/abstract_detector.py +21 -0
  836. ads/type_discovery/constant_detector.py +41 -0
  837. ads/type_discovery/continuous_detector.py +54 -0
  838. ads/type_discovery/credit_card_detector.py +99 -0
  839. ads/type_discovery/datetime_detector.py +92 -0
  840. ads/type_discovery/discrete_detector.py +118 -0
  841. ads/type_discovery/document_detector.py +146 -0
  842. ads/type_discovery/ip_detector.py +68 -0
  843. ads/type_discovery/latlon_detector.py +90 -0
  844. ads/type_discovery/phone_number_detector.py +63 -0
  845. ads/type_discovery/type_discovery_driver.py +87 -0
  846. ads/type_discovery/typed_feature.py +594 -0
  847. ads/type_discovery/unknown_detector.py +41 -0
  848. ads/type_discovery/zipcode_detector.py +48 -0
  849. ads/vault/__init__.py +7 -0
  850. ads/vault/vault.py +237 -0
  851. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/METADATA +150 -150
  852. oracle_ads-2.13.9rc1.dist-info/RECORD +858 -0
  853. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/WHEEL +1 -2
  854. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/entry_points.txt +2 -1
  855. oracle_ads-2.13.9rc0.dist-info/RECORD +0 -9
  856. oracle_ads-2.13.9rc0.dist-info/top_level.txt +0 -1
  857. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,1326 @@
1
+ #!/usr/bin/env python
2
+ # Copyright (c) 2024, 2025 Oracle and/or its affiliates.
3
+ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
4
+
5
+ import json
6
+ import shlex
7
+ from datetime import datetime, timedelta
8
+ from typing import Dict, List, Optional, Union
9
+
10
+ from cachetools import TTLCache, cached
11
+ from oci.data_science.models import ModelDeploymentShapeSummary
12
+ from pydantic import ValidationError
13
+
14
+ from ads.aqua.app import AquaApp, logger
15
+ from ads.aqua.common.entities import (
16
+ AquaMultiModelRef,
17
+ ComputeShapeSummary,
18
+ ContainerPath,
19
+ )
20
+ from ads.aqua.common.enums import InferenceContainerTypeFamily, ModelFormat, Tags
21
+ from ads.aqua.common.errors import AquaRuntimeError, AquaValueError
22
+ from ads.aqua.common.utils import (
23
+ DEFINED_METADATA_TO_FILE_MAP,
24
+ build_params_string,
25
+ build_pydantic_error_message,
26
+ get_combined_params,
27
+ get_container_params_type,
28
+ get_model_by_reference_paths,
29
+ get_ocid_substring,
30
+ get_params_dict,
31
+ get_params_list,
32
+ get_resource_name,
33
+ get_restricted_params_by_container,
34
+ load_gpu_shapes_index,
35
+ validate_cmd_var,
36
+ )
37
+ from ads.aqua.config.container_config import AquaContainerConfig, Usage
38
+ from ads.aqua.constants import (
39
+ AQUA_MODEL_ARTIFACT_FILE,
40
+ AQUA_MODEL_TYPE_CUSTOM,
41
+ AQUA_MODEL_TYPE_MULTI,
42
+ AQUA_MODEL_TYPE_SERVICE,
43
+ AQUA_MULTI_MODEL_CONFIG,
44
+ MODEL_BY_REFERENCE_OSS_PATH_KEY,
45
+ MODEL_NAME_DELIMITER,
46
+ UNKNOWN_DICT,
47
+ )
48
+ from ads.aqua.data import AquaResourceIdentifier
49
+ from ads.aqua.finetuning.finetuning import FineTuneCustomMetadata
50
+ from ads.aqua.model import AquaModelApp
51
+ from ads.aqua.model.constants import AquaModelMetadataKeys, ModelCustomMetadataFields
52
+ from ads.aqua.modeldeployment.entities import (
53
+ AquaDeployment,
54
+ AquaDeploymentConfig,
55
+ AquaDeploymentDetail,
56
+ ConfigurationItem,
57
+ ConfigValidationError,
58
+ CreateModelDeploymentDetails,
59
+ ModelDeploymentConfigSummary,
60
+ )
61
+ from ads.aqua.modeldeployment.utils import MultiModelDeploymentConfigLoader
62
+ from ads.common.object_storage_details import ObjectStorageDetails
63
+ from ads.common.utils import UNKNOWN, get_log_links
64
+ from ads.config import (
65
+ AQUA_DEPLOYMENT_CONTAINER_CMD_VAR_METADATA_NAME,
66
+ AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME,
67
+ AQUA_DEPLOYMENT_CONTAINER_URI_METADATA_NAME,
68
+ COMPARTMENT_OCID,
69
+ PROJECT_OCID,
70
+ )
71
+ from ads.model.datascience_model import DataScienceModel
72
+ from ads.model.deployment import (
73
+ ModelDeployment,
74
+ ModelDeploymentContainerRuntime,
75
+ ModelDeploymentInfrastructure,
76
+ ModelDeploymentMode,
77
+ )
78
+ from ads.model.model_metadata import ModelCustomMetadataItem
79
+ from ads.telemetry import telemetry
80
+
81
+
82
+ class AquaDeploymentApp(AquaApp):
83
+ """Provides a suite of APIs to interact with Aqua model deployments within the Oracle
84
+ Cloud Infrastructure Data Science service, serving as an interface for deploying
85
+ machine learning models.
86
+
87
+
88
+ Methods
89
+ -------
90
+ create(model_id: str, instance_shape: str, display_name: str,...) -> AquaDeployment
91
+ Creates a model deployment for Aqua Model.
92
+ get(model_deployment_id: str) -> AquaDeployment:
93
+ Retrieves details of an Aqua model deployment by its unique identifier.
94
+ list(**kwargs) -> List[AquaModelSummary]:
95
+ Lists all Aqua deployments within a specified compartment and/or project.
96
+ get_deployment_config(self, model_id: str) -> AquaDeploymentConfig:
97
+ Gets the deployment config of given Aqua model.
98
+ get_multimodel_deployment_config(self, model_ids: List[str],...) -> ModelDeploymentConfigSummary:
99
+ Retrieves the deployment configuration for multiple Aqua models and calculates
100
+ the GPU allocations for all compatible shapes.
101
+ list_shapes(self, **kwargs) -> List[Dict]:
102
+ Lists the valid model deployment shapes.
103
+
104
+ Note:
105
+ Use `ads aqua deployment <method_name> --help` to get more details on the parameters available.
106
+ This class is designed to work within the Oracle Cloud Infrastructure
107
+ and requires proper configuration and authentication set up to interact
108
+ with OCI services.
109
+ """
110
+
111
+ @telemetry(entry_point="plugin=deployment&action=create", name="aqua")
112
+ def create(
113
+ self,
114
+ create_deployment_details: Optional[CreateModelDeploymentDetails] = None,
115
+ **kwargs,
116
+ ) -> "AquaDeployment":
117
+ """
118
+ Creates a new Aqua model deployment.\n
119
+ For detailed information about CLI flags see: https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-quick-actions/cli-tips.md#create-model-deployment
120
+
121
+ Args:
122
+ create_deployment_details : CreateModelDeploymentDetails, optional
123
+ An instance of CreateModelDeploymentDetails containing all required and optional
124
+ fields for creating a model deployment via Aqua.
125
+ kwargs:
126
+ instance_shape (str): The instance shape used for deployment.
127
+ display_name (str): The name of the model deployment.
128
+ compartment_id (Optional[str]): The compartment OCID.
129
+ project_id (Optional[str]): The project OCID.
130
+ description (Optional[str]): The description of the deployment.
131
+ model_id (Optional[str]): The model OCID to deploy.
132
+ models (Optional[List[AquaMultiModelRef]]): List of models for multimodel deployment.
133
+ instance_count (int): Number of instances used for deployment.
134
+ log_group_id (Optional[str]): OCI logging group ID for logs.
135
+ access_log_id (Optional[str]): OCID for access logs.
136
+ predict_log_id (Optional[str]): OCID for prediction logs.
137
+ bandwidth_mbps (Optional[int]): Bandwidth limit on the load balancer in Mbps.
138
+ web_concurrency (Optional[int]): Number of worker processes/threads for handling requests.
139
+ server_port (Optional[int]): Server port for the Docker container image.
140
+ health_check_port (Optional[int]): Health check port for the Docker container image.
141
+ env_var (Optional[Dict[str, str]]): Environment variables for deployment.
142
+ container_family (Optional[str]): Image family of the model deployment container runtime.
143
+ memory_in_gbs (Optional[float]): Memory (in GB) for the selected shape.
144
+ ocpus (Optional[float]): OCPU count for the selected shape.
145
+ model_file (Optional[str]): File used for model deployment.
146
+ private_endpoint_id (Optional[str]): Private endpoint ID for model deployment.
147
+ container_image_uri (Optional[str]): Image URI for model deployment container runtime.
148
+ cmd_var (Optional[List[str]]): Command variables for the container runtime.
149
+ freeform_tags (Optional[Dict]): Freeform tags for model deployment.
150
+ defined_tags (Optional[Dict]): Defined tags for model deployment.
151
+
152
+ Returns
153
+ -------
154
+ AquaDeployment
155
+ An Aqua deployment instance.
156
+ """
157
+ # Build deployment details from kwargs if not explicitly provided.
158
+ if create_deployment_details is None:
159
+ try:
160
+ create_deployment_details = CreateModelDeploymentDetails(**kwargs)
161
+ except ValidationError as ex:
162
+ custom_errors = build_pydantic_error_message(ex)
163
+ raise AquaValueError(
164
+ f"Invalid parameters for creating a model deployment. Error details: {custom_errors}."
165
+ ) from ex
166
+
167
+ if not (create_deployment_details.model_id or create_deployment_details.models):
168
+ raise AquaValueError(
169
+ "Invalid parameters for creating a model deployment. Either `model_id` or `models` must be provided."
170
+ )
171
+
172
+ # Set defaults for compartment and project if not provided.
173
+ compartment_id = create_deployment_details.compartment_id or COMPARTMENT_OCID
174
+ project_id = create_deployment_details.project_id or PROJECT_OCID
175
+ freeform_tags = create_deployment_details.freeform_tags
176
+ defined_tags = create_deployment_details.defined_tags
177
+
178
+ # validate instance shape availability in compartment
179
+ available_shapes = [
180
+ shape.name.lower()
181
+ for shape in self.list_shapes(compartment_id=compartment_id)
182
+ ]
183
+
184
+ if create_deployment_details.instance_shape.lower() not in available_shapes:
185
+ raise AquaValueError(
186
+ f"Invalid Instance Shape. The selected shape '{create_deployment_details.instance_shape}' "
187
+ f"is not available in the {self.region} region. Please choose another shape to deploy the model."
188
+ )
189
+
190
+ # Get container config
191
+ container_config = self.get_container_config()
192
+
193
+ # Create an AquaModelApp instance once to perform the deployment creation.
194
+ model_app = AquaModelApp()
195
+ if create_deployment_details.model_id:
196
+ logger.debug(
197
+ f"Single model ({create_deployment_details.model_id}) provided. "
198
+ "Delegating to single model creation method."
199
+ )
200
+ aqua_model = model_app.create(
201
+ model_id=create_deployment_details.model_id,
202
+ compartment_id=compartment_id,
203
+ project_id=project_id,
204
+ freeform_tags=freeform_tags,
205
+ defined_tags=defined_tags,
206
+ )
207
+ return self._create(
208
+ aqua_model=aqua_model,
209
+ create_deployment_details=create_deployment_details,
210
+ container_config=container_config,
211
+ )
212
+ else:
213
+ model_ids = [model.model_id for model in create_deployment_details.models]
214
+ try:
215
+ model_config_summary = self.get_multimodel_deployment_config(
216
+ model_ids=model_ids, compartment_id=compartment_id
217
+ )
218
+ if not model_config_summary.gpu_allocation:
219
+ raise AquaValueError(model_config_summary.error_message)
220
+ create_deployment_details.validate_multimodel_deployment_feasibility(
221
+ models_config_summary=model_config_summary
222
+ )
223
+ except ConfigValidationError as err:
224
+ raise AquaValueError(f"{err}") from err
225
+
226
+ service_inference_containers = container_config.inference.values()
227
+
228
+ supported_container_families = [
229
+ container_config_item.family
230
+ for container_config_item in service_inference_containers
231
+ if any(
232
+ usage.upper() in container_config_item.usages
233
+ for usage in [Usage.MULTI_MODEL, Usage.OTHER]
234
+ )
235
+ ]
236
+
237
+ if not supported_container_families:
238
+ raise AquaValueError(
239
+ "Currently, there are no containers that support multi-model deployment."
240
+ )
241
+
242
+ # Check if provided container family supports multi-model deployment
243
+ if (
244
+ create_deployment_details.container_family
245
+ and create_deployment_details.container_family
246
+ not in supported_container_families
247
+ ):
248
+ raise AquaValueError(
249
+ f"Unsupported deployment container '{create_deployment_details.container_family}'. "
250
+ f"Only {supported_container_families} families are supported for multi-model deployments."
251
+ )
252
+
253
+ # Verify if it matches one of the registered containers and attempt to
254
+ # extract the container family from there.
255
+ # If the container is not recognized, we can only issue a warning that
256
+ # the provided container may not support multi-model deployment.
257
+ if create_deployment_details.container_image_uri:
258
+ selected_container_name = ContainerPath(
259
+ full_path=create_deployment_details.container_image_uri
260
+ ).name
261
+
262
+ container_config_item = next(
263
+ (
264
+ container_config_item
265
+ for container_config_item in service_inference_containers
266
+ if ContainerPath(
267
+ full_path=f"{container_config_item.name}:{container_config_item.version}"
268
+ ).name.upper()
269
+ == selected_container_name.upper()
270
+ ),
271
+ None,
272
+ )
273
+
274
+ if (
275
+ container_config_item
276
+ and container_config_item.family not in supported_container_families
277
+ ):
278
+ raise AquaValueError(
279
+ f"Unsupported deployment container '{create_deployment_details.container_image_uri}'. "
280
+ f"Only {supported_container_families} families are supported for multi-model deployments."
281
+ )
282
+
283
+ if not container_config_item:
284
+ logger.warning(
285
+ f"The provided container `{create_deployment_details.container_image_uri}` may not support multi-model deployment. "
286
+ f"Only the following container families are supported: {supported_container_families}."
287
+ )
288
+
289
+ logger.debug(
290
+ f"Multi models ({model_ids}) provided. Delegating to multi model creation method."
291
+ )
292
+
293
+ aqua_model = model_app.create_multi(
294
+ models=create_deployment_details.models,
295
+ compartment_id=compartment_id,
296
+ project_id=project_id,
297
+ freeform_tags=freeform_tags,
298
+ defined_tags=defined_tags,
299
+ )
300
+ return self._create_multi(
301
+ aqua_model=aqua_model,
302
+ model_config_summary=model_config_summary,
303
+ create_deployment_details=create_deployment_details,
304
+ container_config=container_config,
305
+ )
306
+
307
+ def _create(
308
+ self,
309
+ aqua_model: DataScienceModel,
310
+ create_deployment_details: CreateModelDeploymentDetails,
311
+ container_config: Dict,
312
+ ) -> AquaDeployment:
313
+ """Builds the configurations required by single model deployment and creates the deployment.
314
+
315
+ Parameters
316
+ ----------
317
+ aqua_model : DataScienceModel
318
+ An instance of Aqua data science model.
319
+ create_deployment_details : CreateModelDeploymentDetails
320
+ An instance of CreateModelDeploymentDetails containing all required and optional
321
+ fields for creating a model deployment via Aqua.
322
+ container_config: Dict
323
+ Container config dictionary.
324
+
325
+ Returns
326
+ -------
327
+ AquaDeployment
328
+ An Aqua deployment instance.
329
+ """
330
+ tags = {}
331
+ for tag in [
332
+ Tags.AQUA_SERVICE_MODEL_TAG,
333
+ Tags.AQUA_FINE_TUNED_MODEL_TAG,
334
+ Tags.AQUA_TAG,
335
+ ]:
336
+ if tag in aqua_model.freeform_tags:
337
+ tags[tag] = aqua_model.freeform_tags[tag]
338
+
339
+ tags.update({Tags.AQUA_MODEL_NAME_TAG: aqua_model.display_name})
340
+ tags.update({Tags.TASK: aqua_model.freeform_tags.get(Tags.TASK, UNKNOWN)})
341
+
342
+ # Set up info to get deployment config
343
+ config_source_id = create_deployment_details.model_id
344
+ model_name = aqua_model.display_name
345
+
346
+ is_fine_tuned_model = Tags.AQUA_FINE_TUNED_MODEL_TAG in aqua_model.freeform_tags
347
+
348
+ if is_fine_tuned_model:
349
+ try:
350
+ config_source_id = aqua_model.custom_metadata_list.get(
351
+ FineTuneCustomMetadata.FINE_TUNE_SOURCE
352
+ ).value
353
+ model_name = aqua_model.custom_metadata_list.get(
354
+ FineTuneCustomMetadata.FINE_TUNE_SOURCE_NAME
355
+ ).value
356
+ except ValueError as err:
357
+ raise AquaValueError(
358
+ f"Either {FineTuneCustomMetadata.FINE_TUNE_SOURCE} or {FineTuneCustomMetadata.FINE_TUNE_SOURCE_NAME} is missing "
359
+ f"from custom metadata for the model {config_source_id}"
360
+ ) from err
361
+
362
+ # set up env and cmd var
363
+ env_var = create_deployment_details.env_var or {}
364
+ cmd_var = create_deployment_details.cmd_var or []
365
+
366
+ try:
367
+ model_path_prefix = aqua_model.custom_metadata_list.get(
368
+ MODEL_BY_REFERENCE_OSS_PATH_KEY
369
+ ).value.rstrip("/")
370
+ except ValueError as err:
371
+ raise AquaValueError(
372
+ f"{MODEL_BY_REFERENCE_OSS_PATH_KEY} key is not available in the custom metadata field."
373
+ ) from err
374
+
375
+ if ObjectStorageDetails.is_oci_path(model_path_prefix):
376
+ os_path = ObjectStorageDetails.from_path(model_path_prefix)
377
+ model_path_prefix = os_path.filepath.rstrip("/")
378
+
379
+ env_var.update({"BASE_MODEL": f"{model_path_prefix}"})
380
+
381
+ if is_fine_tuned_model:
382
+ _, fine_tune_output_path = get_model_by_reference_paths(
383
+ aqua_model.model_file_description
384
+ )
385
+
386
+ if not fine_tune_output_path:
387
+ raise AquaValueError(
388
+ "Fine tuned output path is not available in the model artifact."
389
+ )
390
+
391
+ os_path = ObjectStorageDetails.from_path(fine_tune_output_path)
392
+ fine_tune_output_path = os_path.filepath.rstrip("/")
393
+
394
+ env_var.update({"FT_MODEL": f"{fine_tune_output_path}"})
395
+
396
+ container_type_key = self._get_container_type_key(
397
+ model=aqua_model,
398
+ container_family=create_deployment_details.container_family,
399
+ )
400
+
401
+ container_image_uri = (
402
+ create_deployment_details.container_image_uri
403
+ or self.get_container_image(container_type=container_type_key)
404
+ )
405
+ if not container_image_uri:
406
+ try:
407
+ container_image_uri = aqua_model.custom_metadata_list.get(
408
+ AQUA_DEPLOYMENT_CONTAINER_URI_METADATA_NAME
409
+ ).value
410
+ except ValueError as err:
411
+ raise AquaValueError(
412
+ f"{AQUA_DEPLOYMENT_CONTAINER_URI_METADATA_NAME} key is not available in the custom metadata "
413
+ f"field. Either re-register the model with custom container URI, or set container_image_uri "
414
+ f"parameter when creating this deployment."
415
+ ) from err
416
+ logger.info(
417
+ f"Aqua Image used for deploying {aqua_model.id} : {container_image_uri}"
418
+ )
419
+
420
+ try:
421
+ cmd_var_string = aqua_model.custom_metadata_list.get(
422
+ AQUA_DEPLOYMENT_CONTAINER_CMD_VAR_METADATA_NAME
423
+ ).value
424
+ default_cmd_var = shlex.split(cmd_var_string)
425
+ if default_cmd_var:
426
+ cmd_var = validate_cmd_var(default_cmd_var, cmd_var)
427
+ logger.info(f"CMD used for deploying {aqua_model.id} :{cmd_var}")
428
+ except ValueError:
429
+ logger.debug(
430
+ f"CMD will be ignored for this deployment as {AQUA_DEPLOYMENT_CONTAINER_CMD_VAR_METADATA_NAME} "
431
+ f"key is not available in the custom metadata field for this model."
432
+ )
433
+ except Exception as e:
434
+ logger.error(
435
+ f"There was an issue processing CMD arguments. Error: {str(e)}"
436
+ )
437
+
438
+ model_formats_str = aqua_model.freeform_tags.get(
439
+ Tags.MODEL_FORMAT, ModelFormat.SAFETENSORS
440
+ ).upper()
441
+ model_format = model_formats_str.split(",")
442
+
443
+ # Figure out a better way to handle this in future release
444
+ if (
445
+ ModelFormat.GGUF in model_format
446
+ and container_type_key.lower()
447
+ == InferenceContainerTypeFamily.AQUA_LLAMA_CPP_CONTAINER_FAMILY
448
+ ):
449
+ model_file = create_deployment_details.model_file
450
+ if model_file is not None:
451
+ logger.info(
452
+ f"Overriding {model_file} as model_file for model {aqua_model.id}."
453
+ )
454
+ else:
455
+ try:
456
+ model_file = aqua_model.custom_metadata_list.get(
457
+ AQUA_MODEL_ARTIFACT_FILE
458
+ ).value
459
+ except ValueError as err:
460
+ raise AquaValueError(
461
+ f"{AQUA_MODEL_ARTIFACT_FILE} key is not available in the custom metadata field "
462
+ f"for model {aqua_model.id}. Either register the model with a default model_file or pass "
463
+ f"as a parameter when creating a deployment."
464
+ ) from err
465
+
466
+ env_var.update({"BASE_MODEL_FILE": f"{model_file}"})
467
+ tags.update({Tags.MODEL_ARTIFACT_FILE: model_file})
468
+
469
+ # Fetch the startup cli command for the container
470
+ # container_index.json will have "containerSpec" section which will provide the cli params for
471
+ # a given container family
472
+ container_config = self.get_container_config_item(container_type_key)
473
+
474
+ container_spec = container_config.spec if container_config else UNKNOWN
475
+ # these params cannot be overridden for Aqua deployments
476
+ params = container_spec.cli_param if container_spec else UNKNOWN
477
+ server_port = create_deployment_details.server_port or (
478
+ container_spec.server_port if container_spec else None
479
+ )
480
+ # Give precendece to the input parameter
481
+ health_check_port = create_deployment_details.health_check_port or (
482
+ container_spec.health_check_port if container_spec else None
483
+ )
484
+
485
+ deployment_config = self.get_deployment_config(model_id=config_source_id)
486
+
487
+ config_params = deployment_config.configuration.get(
488
+ create_deployment_details.instance_shape, ConfigurationItem()
489
+ ).parameters.get(get_container_params_type(container_type_key), UNKNOWN)
490
+
491
+ # validate user provided params
492
+ user_params = env_var.get("PARAMS", UNKNOWN)
493
+ if user_params:
494
+ # todo: remove this check in the future version, logic to be moved to container_index
495
+ if (
496
+ container_type_key.lower()
497
+ == InferenceContainerTypeFamily.AQUA_LLAMA_CPP_CONTAINER_FAMILY
498
+ ):
499
+ # AQUA_LLAMA_CPP_CONTAINER_FAMILY container uses uvicorn that required model/server params
500
+ # to be set as env vars
501
+ raise AquaValueError(
502
+ f"Currently, parameters cannot be overridden for the container: {container_image_uri}. Please proceed "
503
+ f"with deployment without parameter overrides."
504
+ )
505
+
506
+ restricted_params = self._find_restricted_params(
507
+ params, user_params, container_type_key
508
+ )
509
+ if restricted_params:
510
+ raise AquaValueError(
511
+ f"Parameters {restricted_params} are set by Aqua "
512
+ f"and cannot be overridden or are invalid."
513
+ )
514
+
515
+ deployment_params = get_combined_params(config_params, user_params)
516
+
517
+ params = f"{params} {deployment_params}".strip()
518
+ if params:
519
+ env_var.update({"PARAMS": params})
520
+ env_vars = container_spec.env_vars if container_spec else []
521
+ for env in env_vars:
522
+ if isinstance(env, dict):
523
+ env = {k: v for k, v in env.items() if v}
524
+ for key, _ in env.items():
525
+ if key not in env_var:
526
+ env_var.update(env)
527
+
528
+ logger.info(f"Env vars used for deploying {aqua_model.id} :{env_var}")
529
+
530
+ tags = {**tags, **(create_deployment_details.freeform_tags or {})}
531
+ model_type = (
532
+ AQUA_MODEL_TYPE_CUSTOM if is_fine_tuned_model else AQUA_MODEL_TYPE_SERVICE
533
+ )
534
+
535
+ return self._create_deployment(
536
+ create_deployment_details=create_deployment_details,
537
+ aqua_model_id=aqua_model.id,
538
+ model_name=model_name,
539
+ model_type=model_type,
540
+ container_image_uri=container_image_uri,
541
+ server_port=server_port,
542
+ health_check_port=health_check_port,
543
+ env_var=env_var,
544
+ tags=tags,
545
+ cmd_var=cmd_var,
546
+ )
547
+
548
+ def _create_multi(
549
+ self,
550
+ aqua_model: DataScienceModel,
551
+ model_config_summary: ModelDeploymentConfigSummary,
552
+ create_deployment_details: CreateModelDeploymentDetails,
553
+ container_config: AquaContainerConfig,
554
+ ) -> AquaDeployment:
555
+ """Builds the environment variables required by multi deployment container and creates the deployment.
556
+
557
+ Parameters
558
+ ----------
559
+ model_config_summary : model_config_summary
560
+ Summary Model Deployment configuration for the group of models.
561
+ aqua_model : DataScienceModel
562
+ An instance of Aqua data science model.
563
+ create_deployment_details : CreateModelDeploymentDetails
564
+ An instance of CreateModelDeploymentDetails containing all required and optional
565
+ fields for creating a model deployment via Aqua.
566
+ container_config: Dict
567
+ Container config dictionary.
568
+ Returns
569
+ -------
570
+ AquaDeployment
571
+ An Aqua deployment instance.
572
+ """
573
+ model_config = []
574
+ model_name_list = []
575
+ env_var = {**(create_deployment_details.env_var or UNKNOWN_DICT)}
576
+
577
+ container_type_key = self._get_container_type_key(
578
+ model=aqua_model,
579
+ container_family=create_deployment_details.container_family,
580
+ )
581
+ container_config = self.get_container_config_item(container_type_key)
582
+ container_spec = container_config.spec if container_config else UNKNOWN
583
+
584
+ container_params = container_spec.cli_param if container_spec else UNKNOWN
585
+
586
+ for model in create_deployment_details.models:
587
+ user_params = build_params_string(model.env_var)
588
+ if user_params:
589
+ restricted_params = self._find_restricted_params(
590
+ container_params, user_params, container_type_key
591
+ )
592
+ if restricted_params:
593
+ selected_model = model.model_name or model.model_id
594
+ raise AquaValueError(
595
+ f"Parameters {restricted_params} are set by Aqua "
596
+ f"and cannot be overridden or are invalid."
597
+ f"Select other parameters for model {selected_model}."
598
+ )
599
+
600
+ # replaces `--served-model-name`` with user's model name
601
+ container_params_dict = get_params_dict(container_params)
602
+ container_params_dict.update({"--served-model-name": model.model_name})
603
+ # replaces `--tensor-parallel-size` with model gpu count
604
+ container_params_dict.update({"--tensor-parallel-size": model.gpu_count})
605
+ params = build_params_string(container_params_dict)
606
+
607
+ deployment_config = model_config_summary.deployment_config.get(
608
+ model.model_id, AquaDeploymentConfig()
609
+ ).configuration.get(
610
+ create_deployment_details.instance_shape, ConfigurationItem()
611
+ )
612
+
613
+ # finds the corresponding deployment parameters based on the gpu count
614
+ # and combines them with user's parameters. Existing deployment parameters
615
+ # will be overriden by user's parameters.
616
+ params_found = False
617
+ for item in deployment_config.multi_model_deployment:
618
+ if (
619
+ model.gpu_count
620
+ and item.gpu_count
621
+ and item.gpu_count == model.gpu_count
622
+ ):
623
+ config_parameters = item.parameters.get(
624
+ get_container_params_type(container_type_key), UNKNOWN
625
+ )
626
+ params = f"{params} {get_combined_params(config_parameters, user_params)}".strip()
627
+ params_found = True
628
+ break
629
+
630
+ if not params_found and deployment_config.parameters:
631
+ config_parameters = deployment_config.parameters.get(
632
+ get_container_params_type(container_type_key), UNKNOWN
633
+ )
634
+ params = f"{params} {get_combined_params(config_parameters, user_params)}".strip()
635
+ params_found = True
636
+
637
+ # if no config parameters found, append user parameters directly.
638
+ if not params_found:
639
+ params = f"{params} {user_params}".strip()
640
+
641
+ artifact_path_prefix = model.artifact_location.rstrip("/")
642
+ if ObjectStorageDetails.is_oci_path(artifact_path_prefix):
643
+ os_path = ObjectStorageDetails.from_path(artifact_path_prefix)
644
+ artifact_path_prefix = os_path.filepath.rstrip("/")
645
+
646
+ # override by-default completion/ chat endpoint with other endpoint (embedding)
647
+ config_data = {"params": params, "model_path": artifact_path_prefix}
648
+ if model.model_task:
649
+ config_data["model_task"] = model.model_task
650
+ model_config.append(config_data)
651
+ model_name_list.append(model.model_name)
652
+
653
+ env_var.update({AQUA_MULTI_MODEL_CONFIG: json.dumps({"models": model_config})})
654
+
655
+ env_vars = container_spec.env_vars if container_spec else []
656
+ for env in env_vars:
657
+ if isinstance(env, dict):
658
+ env = {k: v for k, v in env.items() if v}
659
+ for key, _ in env.items():
660
+ if key not in env_var:
661
+ env_var.update(env)
662
+
663
+ logger.info(f"Env vars used for deploying {aqua_model.id} : {env_var}.")
664
+
665
+ container_image_uri = (
666
+ create_deployment_details.container_image_uri
667
+ or self.get_container_image(container_type=container_type_key)
668
+ )
669
+ server_port = create_deployment_details.server_port or (
670
+ container_spec.server_port if container_spec else None
671
+ )
672
+ health_check_port = create_deployment_details.health_check_port or (
673
+ container_spec.health_check_port if container_spec else None
674
+ )
675
+ tags = {
676
+ Tags.AQUA_MODEL_ID_TAG: aqua_model.id,
677
+ Tags.MULTIMODEL_TYPE_TAG: "true",
678
+ Tags.AQUA_TAG: "active",
679
+ **(create_deployment_details.freeform_tags or UNKNOWN_DICT),
680
+ }
681
+
682
+ model_name = f"{MODEL_NAME_DELIMITER} ".join(model_name_list)
683
+
684
+ aqua_deployment = self._create_deployment(
685
+ create_deployment_details=create_deployment_details,
686
+ aqua_model_id=aqua_model.id,
687
+ model_name=model_name,
688
+ model_type=AQUA_MODEL_TYPE_MULTI,
689
+ container_image_uri=container_image_uri,
690
+ server_port=server_port,
691
+ health_check_port=health_check_port,
692
+ env_var=env_var,
693
+ tags=tags,
694
+ )
695
+ aqua_deployment.models = create_deployment_details.models
696
+ return aqua_deployment
697
+
698
+ def _create_deployment(
699
+ self,
700
+ create_deployment_details: CreateModelDeploymentDetails,
701
+ aqua_model_id: str,
702
+ model_name: str,
703
+ model_type: str,
704
+ container_image_uri: str,
705
+ server_port: str,
706
+ health_check_port: str,
707
+ env_var: dict,
708
+ tags: dict,
709
+ cmd_var: Optional[dict] = None,
710
+ ):
711
+ """Creates data science model deployment.
712
+
713
+ Parameters
714
+ ----------
715
+ create_deployment_details : CreateModelDeploymentDetails
716
+ An instance of CreateModelDeploymentDetails containing all required and optional
717
+ fields for creating a model deployment via Aqua.
718
+ aqua_model_id: str
719
+ The id of the aqua model to be deployed.
720
+ model_name: str
721
+ The name of the aqua model to be deployed. If it's multi model deployment, it is a list of model names.
722
+ model_type: str
723
+ The type of aqua model to be deployed. Allowed values are: `custom`, `service` and `multi_model`.
724
+ container_image_uri: str
725
+ The container image uri to deploy the model.
726
+ server_port: str
727
+ The service port of the container image.
728
+ health_check_port: str
729
+ The health check port of the container image.
730
+ env_var: dict
731
+ The environment variables input for the deployment.
732
+ tags: dict
733
+ The tags input for the deployment.
734
+ cmd_var: dict, optional
735
+ The cmd arguments input for the deployment.
736
+
737
+ Returns
738
+ -------
739
+ AquaDeployment
740
+ An Aqua deployment instance.
741
+ """
742
+ # Start model deployment
743
+ # configure model deployment infrastructure
744
+ infrastructure = (
745
+ ModelDeploymentInfrastructure()
746
+ .with_project_id(create_deployment_details.project_id or PROJECT_OCID)
747
+ .with_compartment_id(
748
+ create_deployment_details.compartment_id or COMPARTMENT_OCID
749
+ )
750
+ .with_shape_name(create_deployment_details.instance_shape)
751
+ .with_bandwidth_mbps(create_deployment_details.bandwidth_mbps)
752
+ .with_replica(create_deployment_details.instance_count)
753
+ .with_web_concurrency(create_deployment_details.web_concurrency)
754
+ .with_private_endpoint_id(create_deployment_details.private_endpoint_id)
755
+ .with_access_log(
756
+ log_group_id=create_deployment_details.log_group_id,
757
+ log_id=create_deployment_details.access_log_id,
758
+ )
759
+ .with_predict_log(
760
+ log_group_id=create_deployment_details.log_group_id,
761
+ log_id=create_deployment_details.predict_log_id,
762
+ )
763
+ )
764
+ if (
765
+ create_deployment_details.memory_in_gbs
766
+ and create_deployment_details.ocpus
767
+ and infrastructure.shape_name.endswith("Flex")
768
+ ):
769
+ infrastructure.with_shape_config_details(
770
+ ocpus=create_deployment_details.ocpus,
771
+ memory_in_gbs=create_deployment_details.memory_in_gbs,
772
+ )
773
+ # configure model deployment runtime
774
+ container_runtime = (
775
+ ModelDeploymentContainerRuntime()
776
+ .with_image(container_image_uri)
777
+ .with_server_port(server_port)
778
+ .with_health_check_port(health_check_port)
779
+ .with_env(env_var)
780
+ .with_deployment_mode(ModelDeploymentMode.HTTPS)
781
+ .with_model_uri(aqua_model_id)
782
+ .with_region(self.region)
783
+ .with_overwrite_existing_artifact(True)
784
+ .with_remove_existing_artifact(True)
785
+ )
786
+ if cmd_var:
787
+ container_runtime.with_cmd(cmd_var)
788
+
789
+ # configure model deployment and deploy model on container runtime
790
+ deployment = (
791
+ ModelDeployment()
792
+ .with_display_name(create_deployment_details.display_name)
793
+ .with_description(create_deployment_details.description)
794
+ .with_freeform_tags(**tags)
795
+ .with_defined_tags(**(create_deployment_details.defined_tags or {}))
796
+ .with_infrastructure(infrastructure)
797
+ .with_runtime(container_runtime)
798
+ ).deploy(wait_for_completion=False)
799
+
800
+ deployment_id = deployment.id
801
+ logger.info(
802
+ f"Aqua model deployment {deployment_id} created for model {aqua_model_id}."
803
+ )
804
+
805
+ # we arbitrarily choose last 8 characters of OCID to identify MD in telemetry
806
+ telemetry_kwargs = {"ocid": get_ocid_substring(deployment_id, key_len=8)}
807
+
808
+ # tracks unique deployments that were created in the user compartment
809
+ self.telemetry.record_event_async(
810
+ category=f"aqua/{model_type}/deployment",
811
+ action="create",
812
+ detail=model_name,
813
+ **telemetry_kwargs,
814
+ )
815
+ # tracks the shape used for deploying the custom or service models by name
816
+ self.telemetry.record_event_async(
817
+ category=f"aqua/{model_type}/deployment/create",
818
+ action="shape",
819
+ detail=create_deployment_details.instance_shape,
820
+ value=model_name,
821
+ )
822
+
823
+ return AquaDeployment.from_oci_model_deployment(
824
+ deployment.dsc_model_deployment, self.region
825
+ )
826
+
827
+ @staticmethod
828
+ def _get_container_type_key(model: DataScienceModel, container_family: str) -> str:
829
+ container_type_key = UNKNOWN
830
+ if container_family:
831
+ container_type_key = container_family
832
+ else:
833
+ try:
834
+ container_type_key = model.custom_metadata_list.get(
835
+ AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME
836
+ ).value
837
+ except ValueError as err:
838
+ raise AquaValueError(
839
+ f"{AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME} key is not available in the custom metadata field "
840
+ f"for model {model.id}. For unverified Aqua models, {AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME} should be"
841
+ f"set and value can be one of {', '.join(InferenceContainerTypeFamily.values())}."
842
+ ) from err
843
+
844
+ return container_type_key
845
+
846
+ @telemetry(entry_point="plugin=deployment&action=list", name="aqua")
847
+ def list(self, **kwargs) -> List["AquaDeployment"]:
848
+ """List Aqua model deployments in a given compartment and under certain project.
849
+
850
+ Parameters
851
+ ----------
852
+ kwargs
853
+ Keyword arguments, such as compartment_id and project_id,
854
+ for `list_call_get_all_results <https://docs.oracle.com/en-us/iaas/tools/python/2.118.1/api/pagination.html#oci.pagination.list_call_get_all_results>`_
855
+
856
+ Returns
857
+ -------
858
+ List[AquaDeployment]:
859
+ The list of the Aqua model deployments.
860
+ """
861
+ compartment_id = kwargs.pop("compartment_id", COMPARTMENT_OCID)
862
+
863
+ model_deployments = self.list_resource(
864
+ self.ds_client.list_model_deployments,
865
+ compartment_id=compartment_id,
866
+ **kwargs,
867
+ )
868
+
869
+ results = []
870
+ for model_deployment in model_deployments:
871
+ oci_aqua = (
872
+ (
873
+ Tags.AQUA_TAG in model_deployment.freeform_tags
874
+ or Tags.AQUA_TAG.lower() in model_deployment.freeform_tags
875
+ )
876
+ if model_deployment.freeform_tags
877
+ else False
878
+ )
879
+
880
+ if oci_aqua:
881
+ results.append(
882
+ AquaDeployment.from_oci_model_deployment(
883
+ model_deployment, self.region
884
+ )
885
+ )
886
+
887
+ # log telemetry if MD is in active or failed state
888
+ deployment_id = model_deployment.id
889
+ state = model_deployment.lifecycle_state.upper()
890
+ if state in ["ACTIVE", "FAILED"]:
891
+ # tracks unique deployments that were listed in the user compartment
892
+ # we arbitrarily choose last 8 characters of OCID to identify MD in telemetry
893
+ self.telemetry.record_event_async(
894
+ category="aqua/deployment",
895
+ action="list",
896
+ detail=get_ocid_substring(deployment_id, key_len=8),
897
+ value=state,
898
+ )
899
+
900
+ logger.info(
901
+ f"Fetched {len(results)} model deployments from compartment_id={compartment_id}."
902
+ )
903
+ # tracks number of times deployment listing was called
904
+ self.telemetry.record_event_async(category="aqua/deployment", action="list")
905
+
906
+ return results
907
+
908
+ @telemetry(entry_point="plugin=deployment&action=delete", name="aqua")
909
+ def delete(self, model_deployment_id: str):
910
+ logger.info(f"Deleting model deployment {model_deployment_id}.")
911
+ return self.ds_client.delete_model_deployment(
912
+ model_deployment_id=model_deployment_id
913
+ ).data
914
+
915
+ @telemetry(entry_point="plugin=deployment&action=deactivate", name="aqua")
916
+ def deactivate(self, model_deployment_id: str):
917
+ logger.info(f"Deactivating model deployment {model_deployment_id}.")
918
+ return self.ds_client.deactivate_model_deployment(
919
+ model_deployment_id=model_deployment_id
920
+ ).data
921
+
922
+ @telemetry(entry_point="plugin=deployment&action=activate", name="aqua")
923
+ def activate(self, model_deployment_id: str):
924
+ logger.info(f"Activating model deployment {model_deployment_id}.")
925
+ return self.ds_client.activate_model_deployment(
926
+ model_deployment_id=model_deployment_id
927
+ ).data
928
+
929
+ @telemetry(entry_point="plugin=deployment&action=get", name="aqua")
930
+ def get(self, model_deployment_id: str, **kwargs) -> "AquaDeploymentDetail":
931
+ """Gets the information of Aqua model deployment.
932
+
933
+ Parameters
934
+ ----------
935
+ model_deployment_id: str
936
+ The OCID of the Aqua model deployment.
937
+ kwargs
938
+ Keyword arguments, for `get_model_deployment
939
+ <https://docs.oracle.com/en-us/iaas/tools/python/2.119.1/api/data_science/client/oci.data_science.DataScienceClient.html#oci.data_science.DataScienceClient.get_model_deployment>`_
940
+
941
+ Returns
942
+ -------
943
+ AquaDeploymentDetail:
944
+ The instance of the Aqua model deployment details.
945
+ """
946
+ logger.info(f"Fetching model deployment details for {model_deployment_id}.")
947
+
948
+ model_deployment = self.ds_client.get_model_deployment(
949
+ model_deployment_id=model_deployment_id, **kwargs
950
+ ).data
951
+
952
+ oci_aqua = (
953
+ (
954
+ Tags.AQUA_TAG in model_deployment.freeform_tags
955
+ or Tags.AQUA_TAG.lower() in model_deployment.freeform_tags
956
+ )
957
+ if model_deployment.freeform_tags
958
+ else False
959
+ )
960
+
961
+ if not oci_aqua:
962
+ raise AquaRuntimeError(
963
+ f"Target deployment {model_deployment_id} is not Aqua deployment as it does not contain "
964
+ f"{Tags.AQUA_TAG} tag."
965
+ )
966
+
967
+ log_id = ""
968
+ log_group_id = ""
969
+ log_name = ""
970
+ log_group_name = ""
971
+
972
+ logs = (
973
+ model_deployment.category_log_details.access
974
+ or model_deployment.category_log_details.predict
975
+ )
976
+ if logs:
977
+ log_id = logs.log_id
978
+ log_group_id = logs.log_group_id
979
+ if log_id:
980
+ log_name = get_resource_name(log_id)
981
+ if log_group_id:
982
+ log_group_name = get_resource_name(log_group_id)
983
+
984
+ log_group_url = get_log_links(region=self.region, log_group_id=log_group_id)
985
+ log_url = get_log_links(
986
+ region=self.region,
987
+ log_group_id=log_group_id,
988
+ log_id=log_id,
989
+ compartment_id=model_deployment.compartment_id,
990
+ source_id=model_deployment.id,
991
+ )
992
+
993
+ aqua_deployment = AquaDeployment.from_oci_model_deployment(
994
+ model_deployment, self.region
995
+ )
996
+
997
+ if Tags.MULTIMODEL_TYPE_TAG in model_deployment.freeform_tags:
998
+ aqua_model_id = model_deployment.freeform_tags.get(
999
+ Tags.AQUA_MODEL_ID_TAG, UNKNOWN
1000
+ )
1001
+ if not aqua_model_id:
1002
+ raise AquaRuntimeError(
1003
+ f"Invalid multi model deployment {model_deployment_id}."
1004
+ f"Make sure the {Tags.AQUA_MODEL_ID_TAG} tag is added to the deployment."
1005
+ )
1006
+ aqua_model = DataScienceModel.from_id(aqua_model_id)
1007
+ custom_metadata_list = aqua_model.custom_metadata_list
1008
+ multi_model_metadata_value = custom_metadata_list.get(
1009
+ ModelCustomMetadataFields.MULTIMODEL_METADATA,
1010
+ ModelCustomMetadataItem(
1011
+ key=ModelCustomMetadataFields.MULTIMODEL_METADATA
1012
+ ),
1013
+ ).value
1014
+ if not multi_model_metadata_value:
1015
+ raise AquaRuntimeError(
1016
+ f"Invalid multi-model deployment: {model_deployment_id}. "
1017
+ f"Ensure that the required custom metadata `{ModelCustomMetadataFields.MULTIMODEL_METADATA}` is added to the AQUA multi-model `{aqua_model.display_name}` ({aqua_model.id})."
1018
+ )
1019
+ multi_model_metadata = json.loads(
1020
+ aqua_model.dsc_model.get_custom_metadata_artifact(
1021
+ metadata_key_name=ModelCustomMetadataFields.MULTIMODEL_METADATA
1022
+ ).decode("utf-8")
1023
+ )
1024
+ aqua_deployment.models = [
1025
+ AquaMultiModelRef(**metadata) for metadata in multi_model_metadata
1026
+ ]
1027
+
1028
+ return AquaDeploymentDetail(
1029
+ **vars(aqua_deployment),
1030
+ log_group=AquaResourceIdentifier(
1031
+ log_group_id, log_group_name, log_group_url
1032
+ ),
1033
+ log=AquaResourceIdentifier(log_id, log_name, log_url),
1034
+ )
1035
+
1036
+ @telemetry(
1037
+ entry_point="plugin=deployment&action=get_deployment_config", name="aqua"
1038
+ )
1039
+ def get_deployment_config(self, model_id: str) -> AquaDeploymentConfig:
1040
+ """Gets the deployment config of given Aqua model.
1041
+
1042
+ Parameters
1043
+ ----------
1044
+ model_id: str
1045
+ The OCID of the Aqua model.
1046
+
1047
+ Returns
1048
+ -------
1049
+ AquaDeploymentConfig:
1050
+ An instance of AquaDeploymentConfig.
1051
+ """
1052
+ config = self.get_config_from_metadata(
1053
+ model_id, AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION
1054
+ ).config
1055
+ if config:
1056
+ logger.info(
1057
+ f"Fetched {AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION} from defined metadata for model: {model_id}."
1058
+ )
1059
+ return AquaDeploymentConfig(**(config or UNKNOWN_DICT))
1060
+ config = self.get_config(
1061
+ model_id,
1062
+ DEFINED_METADATA_TO_FILE_MAP.get(
1063
+ AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION.lower()
1064
+ ),
1065
+ ).config
1066
+ if not config:
1067
+ logger.debug(
1068
+ f"Deployment config for custom model: {model_id} is not available. Use defaults."
1069
+ )
1070
+ return AquaDeploymentConfig(**(config or UNKNOWN_DICT))
1071
+
1072
+ @telemetry(
1073
+ entry_point="plugin=deployment&action=get_multimodel_deployment_config",
1074
+ name="aqua",
1075
+ )
1076
+ def get_multimodel_deployment_config(
1077
+ self,
1078
+ model_ids: List[str],
1079
+ primary_model_id: Optional[str] = None,
1080
+ **kwargs: Dict,
1081
+ ) -> ModelDeploymentConfigSummary:
1082
+ """
1083
+ Retrieves the deployment configuration for multiple models and calculates
1084
+ GPU allocations across all compatible shapes.
1085
+
1086
+ More details:
1087
+ https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-quick-actions/multimodel-deployment-tips.md#get_multimodel_deployment_config
1088
+
1089
+ CLI example:
1090
+ ads aqua deployment get_multimodel_deployment_config --model_ids '["md_ocid1","md_ocid2"]'
1091
+
1092
+ If a primary model ID is provided, GPU allocation will prioritize that model
1093
+ when selecting compatible shapes.
1094
+
1095
+ Example:
1096
+ Assume all three models: A, B, and C, support the same shape: "BM.GPU.H100.8" and each supports the following GPU counts for that shape: 1, 2, 4, 8.
1097
+ If `no` primary model is specified, valid allocations could be: [2, 4, 2], [2, 2, 4], or [4, 2, 2]
1098
+ If `B` is set as the primary model, the allocation will be: [2, 4, 2], where B receives the maximum available GPU count
1099
+
1100
+ Parameters
1101
+ ----------
1102
+ model_ids : List[str]
1103
+ A list of OCIDs for the Aqua models.
1104
+ primary_model_id : Optional[str]
1105
+ The OCID of the primary Aqua model. If provided, GPU allocation will prioritize
1106
+ this model. Otherwise, GPUs will be evenly allocated.
1107
+ **kwargs: Dict
1108
+ - compartment_id: str
1109
+ The compartment OCID to retrieve the model deployment shapes.
1110
+
1111
+ Returns
1112
+ -------
1113
+ ModelDeploymentConfigSummary
1114
+ A summary of the model deployment configurations and GPU allocations.
1115
+ """
1116
+ if not model_ids:
1117
+ raise AquaValueError(
1118
+ "Model IDs were not provided. Please provide a valid list of model IDs to retrieve the multi-model deployment configuration."
1119
+ )
1120
+
1121
+ compartment_id = kwargs.pop("compartment_id", COMPARTMENT_OCID)
1122
+
1123
+ # Get the all model deployment available shapes in a given compartment
1124
+ available_shapes = self.list_shapes(compartment_id=compartment_id)
1125
+
1126
+ return MultiModelDeploymentConfigLoader(
1127
+ deployment_app=self,
1128
+ ).load(
1129
+ shapes=available_shapes,
1130
+ model_ids=model_ids,
1131
+ primary_model_id=primary_model_id,
1132
+ )
1133
+
1134
+ def get_deployment_default_params(
1135
+ self,
1136
+ model_id: str,
1137
+ instance_shape: str,
1138
+ gpu_count: int = None,
1139
+ ) -> List[str]:
1140
+ """Gets the default params set in the deployment configs for the given model and instance shape.
1141
+
1142
+ Parameters
1143
+ ----------
1144
+ model_id: str
1145
+ The OCID of the Aqua model.
1146
+
1147
+ instance_shape: (str).
1148
+ The shape of the instance used for deployment.
1149
+
1150
+ gpu_count: (int, optional).
1151
+ The number of GPUs used by the Aqua model. Defaults to None.
1152
+
1153
+ Returns
1154
+ -------
1155
+ List[str]:
1156
+ List of parameters from the loaded from deployment config json file. If not available, then an empty list
1157
+ is returned.
1158
+
1159
+ """
1160
+ default_params = []
1161
+ config_params = {}
1162
+ model = DataScienceModel.from_id(model_id)
1163
+ try:
1164
+ container_type_key = model.custom_metadata_list.get(
1165
+ AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME
1166
+ ).value
1167
+ except ValueError:
1168
+ container_type_key = UNKNOWN
1169
+ logger.debug(
1170
+ f"{AQUA_DEPLOYMENT_CONTAINER_METADATA_NAME} key is not available in the custom metadata field for model {model_id}."
1171
+ )
1172
+
1173
+ if (
1174
+ container_type_key
1175
+ and container_type_key in InferenceContainerTypeFamily.values()
1176
+ ):
1177
+ deployment_config = self.get_deployment_config(model_id)
1178
+
1179
+ instance_shape_config = deployment_config.configuration.get(
1180
+ instance_shape, ConfigurationItem()
1181
+ )
1182
+
1183
+ if instance_shape_config.multi_model_deployment and gpu_count:
1184
+ gpu_params = instance_shape_config.multi_model_deployment
1185
+
1186
+ for gpu_config in gpu_params:
1187
+ if gpu_config.gpu_count == gpu_count:
1188
+ config_params = gpu_config.parameters.get(
1189
+ get_container_params_type(container_type_key), UNKNOWN
1190
+ )
1191
+ break
1192
+
1193
+ else:
1194
+ config_params = instance_shape_config.parameters.get(
1195
+ get_container_params_type(container_type_key), UNKNOWN
1196
+ )
1197
+
1198
+ if config_params:
1199
+ params_list = get_params_list(config_params)
1200
+ restricted_params_set = get_restricted_params_by_container(
1201
+ container_type_key
1202
+ )
1203
+
1204
+ # remove restricted params from the list as user cannot override them during deployment
1205
+ for params in params_list:
1206
+ if params.split()[0] not in restricted_params_set:
1207
+ default_params.append(params)
1208
+
1209
+ return default_params
1210
+
1211
+ def validate_deployment_params(
1212
+ self,
1213
+ model_id: str,
1214
+ params: List[str] = None,
1215
+ container_family: str = None,
1216
+ ) -> Dict:
1217
+ """Validate if the deployment parameters passed by the user can be overridden. Parameter values are not
1218
+ validated, only param keys are validated.
1219
+
1220
+ Parameters
1221
+ ----------
1222
+ model_id: str
1223
+ The OCID of the Aqua model.
1224
+ params : List[str], optional
1225
+ Params passed by the user.
1226
+ container_family: str
1227
+ The image family of model deployment container runtime. Required for unverified Aqua models.
1228
+
1229
+ Returns
1230
+ -------
1231
+ Return a list of restricted params.
1232
+
1233
+ """
1234
+ restricted_params = []
1235
+ if params:
1236
+ model = DataScienceModel.from_id(model_id)
1237
+ container_type_key = self._get_container_type_key(
1238
+ model=model, container_family=container_family
1239
+ )
1240
+
1241
+ container_config = self.get_container_config_item(container_type_key)
1242
+ container_spec = container_config.spec if container_config else UNKNOWN
1243
+ cli_params = container_spec.cli_param if container_spec else UNKNOWN
1244
+
1245
+ restricted_params = self._find_restricted_params(
1246
+ cli_params, params, container_type_key
1247
+ )
1248
+
1249
+ if restricted_params:
1250
+ raise AquaValueError(
1251
+ f"Parameters {restricted_params} are set by Aqua "
1252
+ f"and cannot be overridden or are invalid."
1253
+ )
1254
+ return {"valid": True}
1255
+
1256
+ @staticmethod
1257
+ def _find_restricted_params(
1258
+ default_params: Union[str, List[str]],
1259
+ user_params: Union[str, List[str]],
1260
+ container_family: str,
1261
+ ) -> List[str]:
1262
+ """Returns a list of restricted params that user chooses to override when creating an Aqua deployment.
1263
+ The default parameters coming from the container index json file cannot be overridden.
1264
+
1265
+ Parameters
1266
+ ----------
1267
+ default_params:
1268
+ Inference container parameter string with default values.
1269
+ user_params:
1270
+ Inference container parameter string with user provided values.
1271
+ container_family: str
1272
+ The image family of model deployment container runtime.
1273
+
1274
+ Returns
1275
+ -------
1276
+ A list with params keys common between params1 and params2.
1277
+
1278
+ """
1279
+ restricted_params = []
1280
+ if default_params and user_params:
1281
+ default_params_dict = get_params_dict(default_params)
1282
+ user_params_dict = get_params_dict(user_params)
1283
+
1284
+ restricted_params_set = get_restricted_params_by_container(container_family)
1285
+ for key, _items in user_params_dict.items():
1286
+ if key in default_params_dict or key in restricted_params_set:
1287
+ restricted_params.append(key.lstrip("-"))
1288
+
1289
+ return restricted_params
1290
+
1291
+ @telemetry(entry_point="plugin=deployment&action=list_shapes", name="aqua")
1292
+ @cached(cache=TTLCache(maxsize=1, ttl=timedelta(minutes=5), timer=datetime.now))
1293
+ def list_shapes(self, **kwargs) -> List[ComputeShapeSummary]:
1294
+ """Lists the valid model deployment shapes.
1295
+
1296
+ Parameters
1297
+ ----------
1298
+ kwargs
1299
+ Keyword arguments, such as compartment_id
1300
+ for `list_call_get_all_results <https://docs.oracle.com/en-us/iaas/tools/python/2.118.1/api/pagination.html#oci.pagination.list_call_get_all_results>`_
1301
+
1302
+ Returns
1303
+ -------
1304
+ List[ComputeShapeSummary]:
1305
+ The list of the model deployment shapes.
1306
+ """
1307
+ compartment_id = kwargs.pop("compartment_id", COMPARTMENT_OCID)
1308
+ oci_shapes: list[ModelDeploymentShapeSummary] = self.list_resource(
1309
+ self.ds_client.list_model_deployment_shapes,
1310
+ compartment_id=compartment_id,
1311
+ **kwargs,
1312
+ )
1313
+
1314
+ gpu_specs = load_gpu_shapes_index()
1315
+
1316
+ return [
1317
+ ComputeShapeSummary(
1318
+ core_count=oci_shape.core_count,
1319
+ memory_in_gbs=oci_shape.memory_in_gbs,
1320
+ shape_series=oci_shape.shape_series,
1321
+ name=oci_shape.name,
1322
+ gpu_specs=gpu_specs.shapes.get(oci_shape.name)
1323
+ or gpu_specs.shapes.get(oci_shape.name.upper()),
1324
+ )
1325
+ for oci_shape in oci_shapes
1326
+ ]