paddlex 3.0.0rc0__py3-none-any.whl → 3.0.1__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 (824) hide show
  1. paddlex/.version +1 -1
  2. paddlex/__init__.py +17 -34
  3. paddlex/__main__.py +1 -1
  4. paddlex/configs/modules/chart_parsing/PP-Chart2Table.yaml +13 -0
  5. paddlex/configs/modules/doc_vlm/PP-DocBee-2B.yaml +14 -0
  6. paddlex/configs/modules/doc_vlm/PP-DocBee-7B.yaml +14 -0
  7. paddlex/configs/modules/doc_vlm/PP-DocBee2-3B.yaml +14 -0
  8. paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-L.yaml +40 -0
  9. paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-M.yaml +40 -0
  10. paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-S.yaml +40 -0
  11. paddlex/configs/modules/layout_detection/PP-DocBlockLayout.yaml +40 -0
  12. paddlex/configs/modules/layout_detection/PP-DocLayout-L.yaml +2 -2
  13. paddlex/configs/modules/layout_detection/PP-DocLayout-M.yaml +2 -2
  14. paddlex/configs/modules/layout_detection/PP-DocLayout-S.yaml +2 -2
  15. paddlex/configs/modules/layout_detection/PP-DocLayout_plus-L.yaml +40 -0
  16. paddlex/configs/modules/open_vocabulary_detection/YOLO-Worldv2-L.yaml +13 -0
  17. paddlex/configs/modules/text_detection/PP-OCRv5_mobile_det.yaml +40 -0
  18. paddlex/configs/modules/text_detection/PP-OCRv5_server_det.yaml +40 -0
  19. paddlex/configs/modules/text_recognition/PP-OCRv5_mobile_rec.yaml +39 -0
  20. paddlex/configs/modules/text_recognition/PP-OCRv5_server_rec.yaml +39 -0
  21. paddlex/configs/modules/textline_orientation/PP-LCNet_x1_0_textline_ori.yaml +41 -0
  22. paddlex/configs/pipelines/OCR.yaml +7 -6
  23. paddlex/configs/pipelines/PP-ChatOCRv3-doc.yaml +3 -1
  24. paddlex/configs/pipelines/PP-ChatOCRv4-doc.yaml +91 -34
  25. paddlex/configs/pipelines/PP-StructureV3.yaml +72 -72
  26. paddlex/configs/pipelines/anomaly_detection.yaml +1 -1
  27. paddlex/configs/pipelines/doc_understanding.yaml +9 -0
  28. paddlex/configs/pipelines/formula_recognition.yaml +2 -2
  29. paddlex/configs/pipelines/layout_parsing.yaml +3 -2
  30. paddlex/configs/pipelines/seal_recognition.yaml +1 -0
  31. paddlex/configs/pipelines/table_recognition.yaml +2 -1
  32. paddlex/configs/pipelines/table_recognition_v2.yaml +7 -1
  33. paddlex/configs/pipelines/ts_anomaly_detection.yaml +1 -1
  34. paddlex/configs/pipelines/ts_classification.yaml +1 -1
  35. paddlex/configs/pipelines/ts_forecast.yaml +1 -1
  36. paddlex/constants.py +17 -0
  37. paddlex/engine.py +7 -5
  38. paddlex/hpip_links.html +23 -11
  39. paddlex/inference/__init__.py +3 -3
  40. paddlex/inference/common/__init__.py +1 -1
  41. paddlex/inference/common/batch_sampler/__init__.py +5 -4
  42. paddlex/inference/common/batch_sampler/audio_batch_sampler.py +5 -6
  43. paddlex/inference/common/batch_sampler/base_batch_sampler.py +20 -16
  44. paddlex/inference/common/batch_sampler/det_3d_batch_sampler.py +4 -7
  45. paddlex/inference/common/batch_sampler/doc_vlm_batch_sampler.py +87 -0
  46. paddlex/inference/common/batch_sampler/image_batch_sampler.py +45 -60
  47. paddlex/inference/common/batch_sampler/ts_batch_sampler.py +9 -10
  48. paddlex/inference/common/batch_sampler/video_batch_sampler.py +2 -22
  49. paddlex/inference/common/reader/__init__.py +4 -4
  50. paddlex/inference/common/reader/audio_reader.py +3 -3
  51. paddlex/inference/common/reader/det_3d_reader.py +7 -5
  52. paddlex/inference/common/reader/image_reader.py +16 -12
  53. paddlex/inference/common/reader/ts_reader.py +3 -2
  54. paddlex/inference/common/reader/video_reader.py +3 -3
  55. paddlex/inference/common/result/__init__.py +7 -7
  56. paddlex/inference/common/result/base_cv_result.py +12 -2
  57. paddlex/inference/common/result/base_result.py +7 -5
  58. paddlex/inference/common/result/base_ts_result.py +1 -2
  59. paddlex/inference/common/result/base_video_result.py +2 -2
  60. paddlex/inference/common/result/mixin.py +31 -25
  61. paddlex/inference/models/__init__.py +41 -85
  62. paddlex/inference/models/anomaly_detection/__init__.py +1 -1
  63. paddlex/inference/models/anomaly_detection/predictor.py +9 -19
  64. paddlex/inference/models/anomaly_detection/processors.py +9 -2
  65. paddlex/inference/models/anomaly_detection/result.py +3 -2
  66. paddlex/inference/models/base/__init__.py +2 -2
  67. paddlex/inference/models/base/predictor/__init__.py +1 -2
  68. paddlex/inference/models/base/predictor/base_predictor.py +278 -39
  69. paddlex/inference/models/common/__init__.py +6 -15
  70. paddlex/inference/models/common/static_infer.py +724 -251
  71. paddlex/inference/models/common/tokenizer/__init__.py +7 -3
  72. paddlex/inference/models/common/tokenizer/bert_tokenizer.py +1 -1
  73. paddlex/inference/models/common/tokenizer/clip_tokenizer.py +609 -0
  74. paddlex/inference/models/common/tokenizer/gpt_tokenizer.py +9 -7
  75. paddlex/inference/models/common/tokenizer/qwen2_5_tokenizer.py +112 -0
  76. paddlex/inference/models/common/tokenizer/qwen2_tokenizer.py +438 -0
  77. paddlex/inference/models/common/tokenizer/qwen_tokenizer.py +288 -0
  78. paddlex/inference/models/common/tokenizer/tokenizer_utils.py +85 -77
  79. paddlex/inference/models/common/tokenizer/tokenizer_utils_base.py +339 -123
  80. paddlex/inference/models/common/tokenizer/utils.py +1 -1
  81. paddlex/inference/models/common/tokenizer/vocab.py +8 -8
  82. paddlex/inference/models/common/ts/__init__.py +1 -1
  83. paddlex/inference/models/common/ts/funcs.py +13 -6
  84. paddlex/inference/models/common/ts/processors.py +14 -5
  85. paddlex/inference/models/common/vision/__init__.py +3 -3
  86. paddlex/inference/models/common/vision/funcs.py +17 -12
  87. paddlex/inference/models/common/vision/processors.py +61 -46
  88. paddlex/inference/models/common/vlm/__init__.py +13 -0
  89. paddlex/inference/models/common/vlm/activations.py +189 -0
  90. paddlex/inference/models/common/vlm/bert_padding.py +127 -0
  91. paddlex/inference/models/common/vlm/conversion_utils.py +99 -0
  92. paddlex/inference/models/common/vlm/distributed.py +229 -0
  93. paddlex/inference/models/common/vlm/flash_attn_utils.py +119 -0
  94. paddlex/inference/models/common/vlm/fusion_ops.py +205 -0
  95. paddlex/inference/models/common/vlm/generation/__init__.py +34 -0
  96. paddlex/inference/models/common/vlm/generation/configuration_utils.py +533 -0
  97. paddlex/inference/models/common/vlm/generation/logits_process.py +730 -0
  98. paddlex/inference/models/common/vlm/generation/stopping_criteria.py +106 -0
  99. paddlex/inference/models/common/vlm/generation/utils.py +2162 -0
  100. paddlex/inference/models/common/vlm/transformers/__init__.py +16 -0
  101. paddlex/inference/models/common/vlm/transformers/configuration_utils.py +1037 -0
  102. paddlex/inference/models/common/vlm/transformers/conversion_utils.py +408 -0
  103. paddlex/inference/models/common/vlm/transformers/model_outputs.py +1612 -0
  104. paddlex/inference/models/common/vlm/transformers/model_utils.py +2014 -0
  105. paddlex/inference/models/common/vlm/transformers/utils.py +178 -0
  106. paddlex/inference/models/common/vlm/utils.py +109 -0
  107. paddlex/inference/models/doc_vlm/__init__.py +15 -0
  108. paddlex/inference/models/doc_vlm/modeling/GOT_ocr_2_0.py +830 -0
  109. paddlex/inference/models/doc_vlm/modeling/__init__.py +17 -0
  110. paddlex/inference/models/doc_vlm/modeling/qwen2.py +1606 -0
  111. paddlex/inference/models/doc_vlm/modeling/qwen2_5_vl.py +3006 -0
  112. paddlex/inference/models/doc_vlm/modeling/qwen2_vl.py +2495 -0
  113. paddlex/inference/models/doc_vlm/predictor.py +253 -0
  114. paddlex/inference/models/doc_vlm/processors/GOT_ocr_2_0.py +97 -0
  115. paddlex/inference/models/doc_vlm/processors/__init__.py +17 -0
  116. paddlex/inference/models/doc_vlm/processors/common.py +561 -0
  117. paddlex/inference/models/doc_vlm/processors/qwen2_5_vl.py +548 -0
  118. paddlex/inference/models/doc_vlm/processors/qwen2_vl.py +543 -0
  119. paddlex/inference/models/doc_vlm/result.py +21 -0
  120. paddlex/inference/models/face_feature/__init__.py +1 -1
  121. paddlex/inference/models/face_feature/predictor.py +2 -1
  122. paddlex/inference/models/formula_recognition/__init__.py +1 -1
  123. paddlex/inference/models/formula_recognition/predictor.py +18 -28
  124. paddlex/inference/models/formula_recognition/processors.py +126 -97
  125. paddlex/inference/models/formula_recognition/result.py +43 -35
  126. paddlex/inference/models/image_classification/__init__.py +1 -1
  127. paddlex/inference/models/image_classification/predictor.py +9 -19
  128. paddlex/inference/models/image_classification/processors.py +4 -2
  129. paddlex/inference/models/image_classification/result.py +4 -3
  130. paddlex/inference/models/image_feature/__init__.py +1 -1
  131. paddlex/inference/models/image_feature/predictor.py +9 -19
  132. paddlex/inference/models/image_feature/processors.py +7 -5
  133. paddlex/inference/models/image_feature/result.py +2 -3
  134. paddlex/inference/models/image_multilabel_classification/__init__.py +1 -1
  135. paddlex/inference/models/image_multilabel_classification/predictor.py +7 -6
  136. paddlex/inference/models/image_multilabel_classification/processors.py +6 -2
  137. paddlex/inference/models/image_multilabel_classification/result.py +4 -3
  138. paddlex/inference/models/image_unwarping/__init__.py +1 -1
  139. paddlex/inference/models/image_unwarping/predictor.py +8 -16
  140. paddlex/inference/models/image_unwarping/processors.py +6 -2
  141. paddlex/inference/models/image_unwarping/result.py +4 -2
  142. paddlex/inference/models/instance_segmentation/__init__.py +1 -1
  143. paddlex/inference/models/instance_segmentation/predictor.py +7 -15
  144. paddlex/inference/models/instance_segmentation/processors.py +4 -7
  145. paddlex/inference/models/instance_segmentation/result.py +11 -10
  146. paddlex/inference/models/keypoint_detection/__init__.py +1 -1
  147. paddlex/inference/models/keypoint_detection/predictor.py +5 -3
  148. paddlex/inference/models/keypoint_detection/processors.py +11 -3
  149. paddlex/inference/models/keypoint_detection/result.py +9 -4
  150. paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/__init__.py +1 -1
  151. paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/predictor.py +15 -26
  152. paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/processors.py +26 -14
  153. paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/result.py +15 -12
  154. paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/visualizer_3d.py +77 -39
  155. paddlex/inference/models/multilingual_speech_recognition/__init__.py +1 -1
  156. paddlex/inference/models/multilingual_speech_recognition/predictor.py +11 -15
  157. paddlex/inference/models/multilingual_speech_recognition/processors.py +45 -53
  158. paddlex/inference/models/multilingual_speech_recognition/result.py +1 -1
  159. paddlex/inference/models/object_detection/__init__.py +1 -1
  160. paddlex/inference/models/object_detection/predictor.py +8 -12
  161. paddlex/inference/models/object_detection/processors.py +63 -33
  162. paddlex/inference/models/object_detection/result.py +5 -4
  163. paddlex/inference/models/object_detection/utils.py +3 -1
  164. paddlex/inference/models/open_vocabulary_detection/__init__.py +1 -1
  165. paddlex/inference/models/open_vocabulary_detection/predictor.py +31 -14
  166. paddlex/inference/models/open_vocabulary_detection/processors/__init__.py +3 -2
  167. paddlex/inference/models/open_vocabulary_detection/processors/common.py +114 -0
  168. paddlex/inference/models/open_vocabulary_detection/processors/groundingdino_processors.py +19 -8
  169. paddlex/inference/models/open_vocabulary_detection/processors/yoloworld_processors.py +209 -0
  170. paddlex/inference/models/open_vocabulary_segmentation/__init__.py +1 -1
  171. paddlex/inference/models/open_vocabulary_segmentation/predictor.py +6 -13
  172. paddlex/inference/models/open_vocabulary_segmentation/processors/__init__.py +1 -1
  173. paddlex/inference/models/open_vocabulary_segmentation/processors/sam_processer.py +12 -12
  174. paddlex/inference/models/open_vocabulary_segmentation/results/__init__.py +1 -1
  175. paddlex/inference/models/open_vocabulary_segmentation/results/sam_result.py +11 -9
  176. paddlex/inference/models/semantic_segmentation/__init__.py +1 -1
  177. paddlex/inference/models/semantic_segmentation/predictor.py +9 -18
  178. paddlex/inference/models/semantic_segmentation/processors.py +11 -8
  179. paddlex/inference/models/semantic_segmentation/result.py +4 -3
  180. paddlex/inference/models/table_structure_recognition/__init__.py +1 -1
  181. paddlex/inference/models/table_structure_recognition/predictor.py +8 -18
  182. paddlex/inference/models/table_structure_recognition/processors.py +23 -29
  183. paddlex/inference/models/table_structure_recognition/result.py +8 -15
  184. paddlex/inference/models/text_detection/__init__.py +1 -1
  185. paddlex/inference/models/text_detection/predictor.py +24 -24
  186. paddlex/inference/models/text_detection/processors.py +116 -44
  187. paddlex/inference/models/text_detection/result.py +8 -13
  188. paddlex/inference/models/text_recognition/__init__.py +1 -1
  189. paddlex/inference/models/text_recognition/predictor.py +11 -19
  190. paddlex/inference/models/text_recognition/processors.py +27 -13
  191. paddlex/inference/models/text_recognition/result.py +3 -2
  192. paddlex/inference/models/ts_anomaly_detection/__init__.py +1 -1
  193. paddlex/inference/models/ts_anomaly_detection/predictor.py +12 -17
  194. paddlex/inference/models/ts_anomaly_detection/processors.py +6 -2
  195. paddlex/inference/models/ts_anomaly_detection/result.py +21 -10
  196. paddlex/inference/models/ts_classification/__init__.py +1 -1
  197. paddlex/inference/models/ts_classification/predictor.py +14 -27
  198. paddlex/inference/models/ts_classification/processors.py +7 -2
  199. paddlex/inference/models/ts_classification/result.py +21 -12
  200. paddlex/inference/models/ts_forecasting/__init__.py +1 -1
  201. paddlex/inference/models/ts_forecasting/predictor.py +13 -18
  202. paddlex/inference/models/ts_forecasting/processors.py +12 -3
  203. paddlex/inference/models/ts_forecasting/result.py +24 -11
  204. paddlex/inference/models/video_classification/__init__.py +1 -1
  205. paddlex/inference/models/video_classification/predictor.py +9 -15
  206. paddlex/inference/models/video_classification/processors.py +24 -24
  207. paddlex/inference/models/video_classification/result.py +7 -3
  208. paddlex/inference/models/video_detection/__init__.py +1 -1
  209. paddlex/inference/models/video_detection/predictor.py +8 -15
  210. paddlex/inference/models/video_detection/processors.py +24 -11
  211. paddlex/inference/models/video_detection/result.py +10 -5
  212. paddlex/inference/pipelines/__init__.py +48 -37
  213. paddlex/inference/pipelines/_parallel.py +172 -0
  214. paddlex/inference/pipelines/anomaly_detection/__init__.py +1 -1
  215. paddlex/inference/pipelines/anomaly_detection/pipeline.py +29 -9
  216. paddlex/inference/pipelines/attribute_recognition/__init__.py +1 -1
  217. paddlex/inference/pipelines/attribute_recognition/pipeline.py +24 -9
  218. paddlex/inference/pipelines/attribute_recognition/result.py +10 -8
  219. paddlex/inference/pipelines/base.py +43 -13
  220. paddlex/inference/pipelines/components/__init__.py +14 -8
  221. paddlex/inference/pipelines/components/chat_server/__init__.py +1 -1
  222. paddlex/inference/pipelines/components/chat_server/base.py +2 -2
  223. paddlex/inference/pipelines/components/chat_server/openai_bot_chat.py +8 -8
  224. paddlex/inference/pipelines/components/common/__init__.py +5 -4
  225. paddlex/inference/pipelines/components/common/base_operator.py +2 -1
  226. paddlex/inference/pipelines/components/common/base_result.py +3 -2
  227. paddlex/inference/pipelines/components/common/convert_points_and_boxes.py +1 -2
  228. paddlex/inference/pipelines/components/common/crop_image_regions.py +11 -5
  229. paddlex/inference/pipelines/components/common/seal_det_warp.py +44 -13
  230. paddlex/inference/pipelines/components/common/sort_boxes.py +4 -2
  231. paddlex/inference/pipelines/components/common/warp_image.py +50 -0
  232. paddlex/inference/pipelines/components/faisser.py +10 -5
  233. paddlex/inference/pipelines/components/prompt_engineering/__init__.py +2 -2
  234. paddlex/inference/pipelines/components/prompt_engineering/base.py +2 -2
  235. paddlex/inference/pipelines/components/prompt_engineering/generate_ensemble_prompt.py +2 -1
  236. paddlex/inference/pipelines/components/prompt_engineering/generate_kie_prompt.py +2 -2
  237. paddlex/inference/pipelines/components/retriever/__init__.py +2 -2
  238. paddlex/inference/pipelines/components/retriever/base.py +18 -16
  239. paddlex/inference/pipelines/components/retriever/openai_bot_retriever.py +2 -2
  240. paddlex/inference/pipelines/components/retriever/qianfan_bot_retriever.py +87 -84
  241. paddlex/inference/pipelines/components/utils/__init__.py +1 -1
  242. paddlex/inference/pipelines/components/utils/mixin.py +7 -7
  243. paddlex/inference/pipelines/doc_preprocessor/__init__.py +1 -1
  244. paddlex/inference/pipelines/doc_preprocessor/pipeline.py +70 -51
  245. paddlex/inference/pipelines/doc_preprocessor/result.py +5 -10
  246. paddlex/inference/pipelines/doc_understanding/__init__.py +15 -0
  247. paddlex/inference/pipelines/doc_understanding/pipeline.py +71 -0
  248. paddlex/inference/pipelines/face_recognition/__init__.py +1 -1
  249. paddlex/inference/pipelines/face_recognition/pipeline.py +3 -1
  250. paddlex/inference/pipelines/face_recognition/result.py +3 -2
  251. paddlex/inference/pipelines/formula_recognition/__init__.py +1 -1
  252. paddlex/inference/pipelines/formula_recognition/pipeline.py +137 -93
  253. paddlex/inference/pipelines/formula_recognition/result.py +20 -29
  254. paddlex/inference/pipelines/image_classification/__init__.py +1 -1
  255. paddlex/inference/pipelines/image_classification/pipeline.py +30 -11
  256. paddlex/inference/pipelines/image_multilabel_classification/__init__.py +1 -1
  257. paddlex/inference/pipelines/image_multilabel_classification/pipeline.py +31 -12
  258. paddlex/inference/pipelines/instance_segmentation/__init__.py +1 -1
  259. paddlex/inference/pipelines/instance_segmentation/pipeline.py +30 -9
  260. paddlex/inference/pipelines/keypoint_detection/__init__.py +1 -1
  261. paddlex/inference/pipelines/keypoint_detection/pipeline.py +30 -9
  262. paddlex/inference/pipelines/layout_parsing/__init__.py +1 -1
  263. paddlex/inference/pipelines/layout_parsing/pipeline.py +54 -56
  264. paddlex/inference/pipelines/layout_parsing/pipeline_v2.py +904 -261
  265. paddlex/inference/pipelines/layout_parsing/result.py +9 -21
  266. paddlex/inference/pipelines/layout_parsing/result_v2.py +525 -250
  267. paddlex/inference/pipelines/layout_parsing/setting.py +87 -0
  268. paddlex/inference/pipelines/layout_parsing/utils.py +570 -2004
  269. paddlex/inference/pipelines/layout_parsing/xycut_enhanced/__init__.py +16 -0
  270. paddlex/inference/pipelines/layout_parsing/xycut_enhanced/utils.py +1144 -0
  271. paddlex/inference/pipelines/layout_parsing/xycut_enhanced/xycuts.py +563 -0
  272. paddlex/inference/pipelines/{3d_bev_detection → m_3d_bev_detection}/__init__.py +1 -1
  273. paddlex/inference/pipelines/{3d_bev_detection → m_3d_bev_detection}/pipeline.py +17 -10
  274. paddlex/inference/pipelines/multilingual_speech_recognition/__init__.py +1 -1
  275. paddlex/inference/pipelines/multilingual_speech_recognition/pipeline.py +17 -6
  276. paddlex/inference/pipelines/object_detection/__init__.py +1 -1
  277. paddlex/inference/pipelines/object_detection/pipeline.py +29 -9
  278. paddlex/inference/pipelines/ocr/__init__.py +1 -1
  279. paddlex/inference/pipelines/ocr/pipeline.py +151 -77
  280. paddlex/inference/pipelines/ocr/result.py +31 -24
  281. paddlex/inference/pipelines/open_vocabulary_detection/__init__.py +1 -1
  282. paddlex/inference/pipelines/open_vocabulary_detection/pipeline.py +17 -6
  283. paddlex/inference/pipelines/open_vocabulary_segmentation/__init__.py +1 -1
  284. paddlex/inference/pipelines/open_vocabulary_segmentation/pipeline.py +17 -6
  285. paddlex/inference/pipelines/pp_chatocr/__init__.py +1 -1
  286. paddlex/inference/pipelines/pp_chatocr/pipeline_base.py +14 -5
  287. paddlex/inference/pipelines/pp_chatocr/pipeline_v3.py +22 -14
  288. paddlex/inference/pipelines/pp_chatocr/pipeline_v4.py +34 -16
  289. paddlex/inference/pipelines/pp_shitu_v2/__init__.py +1 -1
  290. paddlex/inference/pipelines/pp_shitu_v2/pipeline.py +12 -8
  291. paddlex/inference/pipelines/pp_shitu_v2/result.py +4 -4
  292. paddlex/inference/pipelines/rotated_object_detection/__init__.py +1 -1
  293. paddlex/inference/pipelines/rotated_object_detection/pipeline.py +30 -9
  294. paddlex/inference/pipelines/seal_recognition/__init__.py +1 -1
  295. paddlex/inference/pipelines/seal_recognition/pipeline.py +127 -63
  296. paddlex/inference/pipelines/seal_recognition/result.py +4 -2
  297. paddlex/inference/pipelines/semantic_segmentation/__init__.py +1 -1
  298. paddlex/inference/pipelines/semantic_segmentation/pipeline.py +30 -9
  299. paddlex/inference/pipelines/small_object_detection/__init__.py +1 -1
  300. paddlex/inference/pipelines/small_object_detection/pipeline.py +30 -9
  301. paddlex/inference/pipelines/table_recognition/__init__.py +1 -1
  302. paddlex/inference/pipelines/table_recognition/pipeline.py +61 -37
  303. paddlex/inference/pipelines/table_recognition/pipeline_v2.py +668 -65
  304. paddlex/inference/pipelines/table_recognition/result.py +12 -10
  305. paddlex/inference/pipelines/table_recognition/table_recognition_post_processing.py +12 -8
  306. paddlex/inference/pipelines/table_recognition/table_recognition_post_processing_v2.py +55 -37
  307. paddlex/inference/pipelines/table_recognition/utils.py +1 -1
  308. paddlex/inference/pipelines/ts_anomaly_detection/__init__.py +1 -1
  309. paddlex/inference/pipelines/ts_anomaly_detection/pipeline.py +16 -6
  310. paddlex/inference/pipelines/ts_classification/__init__.py +1 -1
  311. paddlex/inference/pipelines/ts_classification/pipeline.py +16 -6
  312. paddlex/inference/pipelines/ts_forecasting/__init__.py +1 -1
  313. paddlex/inference/pipelines/ts_forecasting/pipeline.py +16 -6
  314. paddlex/inference/pipelines/video_classification/__init__.py +1 -1
  315. paddlex/inference/pipelines/video_classification/pipeline.py +17 -6
  316. paddlex/inference/pipelines/video_detection/__init__.py +1 -1
  317. paddlex/inference/pipelines/video_detection/pipeline.py +20 -7
  318. paddlex/inference/serving/__init__.py +5 -1
  319. paddlex/inference/serving/basic_serving/__init__.py +1 -1
  320. paddlex/inference/serving/basic_serving/_app.py +31 -19
  321. paddlex/inference/serving/basic_serving/_pipeline_apps/__init__.py +7 -4
  322. paddlex/inference/serving/basic_serving/_pipeline_apps/_common/__init__.py +1 -1
  323. paddlex/inference/serving/basic_serving/_pipeline_apps/_common/common.py +12 -4
  324. paddlex/inference/serving/basic_serving/_pipeline_apps/_common/image_recognition.py +1 -1
  325. paddlex/inference/serving/basic_serving/_pipeline_apps/_common/ocr.py +7 -2
  326. paddlex/inference/serving/basic_serving/_pipeline_apps/anomaly_detection.py +10 -7
  327. paddlex/inference/serving/basic_serving/_pipeline_apps/doc_preprocessor.py +10 -7
  328. paddlex/inference/serving/basic_serving/_pipeline_apps/doc_understanding.py +153 -0
  329. paddlex/inference/serving/basic_serving/_pipeline_apps/face_recognition.py +16 -13
  330. paddlex/inference/serving/basic_serving/_pipeline_apps/formula_recognition.py +10 -7
  331. paddlex/inference/serving/basic_serving/_pipeline_apps/human_keypoint_detection.py +10 -7
  332. paddlex/inference/serving/basic_serving/_pipeline_apps/image_classification.py +10 -7
  333. paddlex/inference/serving/basic_serving/_pipeline_apps/image_multilabel_classification.py +10 -7
  334. paddlex/inference/serving/basic_serving/_pipeline_apps/instance_segmentation.py +13 -7
  335. paddlex/inference/serving/basic_serving/_pipeline_apps/layout_parsing.py +10 -8
  336. paddlex/inference/serving/basic_serving/_pipeline_apps/m_3d_bev_detection.py +10 -7
  337. paddlex/inference/serving/basic_serving/_pipeline_apps/multilingual_speech_recognition.py +10 -7
  338. paddlex/inference/serving/basic_serving/_pipeline_apps/object_detection.py +10 -7
  339. paddlex/inference/serving/basic_serving/_pipeline_apps/ocr.py +10 -7
  340. paddlex/inference/serving/basic_serving/_pipeline_apps/open_vocabulary_detection.py +10 -7
  341. paddlex/inference/serving/basic_serving/_pipeline_apps/open_vocabulary_segmentation.py +13 -7
  342. paddlex/inference/serving/basic_serving/_pipeline_apps/pedestrian_attribute_recognition.py +10 -7
  343. paddlex/inference/serving/basic_serving/_pipeline_apps/pp_chatocrv3_doc.py +14 -12
  344. paddlex/inference/serving/basic_serving/_pipeline_apps/pp_chatocrv4_doc.py +17 -14
  345. paddlex/inference/serving/basic_serving/_pipeline_apps/pp_shituv2.py +16 -13
  346. paddlex/inference/serving/basic_serving/_pipeline_apps/pp_structurev3.py +16 -9
  347. paddlex/inference/serving/basic_serving/_pipeline_apps/rotated_object_detection.py +10 -7
  348. paddlex/inference/serving/basic_serving/_pipeline_apps/seal_recognition.py +10 -7
  349. paddlex/inference/serving/basic_serving/_pipeline_apps/semantic_segmentation.py +10 -7
  350. paddlex/inference/serving/basic_serving/_pipeline_apps/small_object_detection.py +10 -7
  351. paddlex/inference/serving/basic_serving/_pipeline_apps/table_recognition.py +11 -12
  352. paddlex/inference/serving/basic_serving/_pipeline_apps/table_recognition_v2.py +14 -12
  353. paddlex/inference/serving/basic_serving/_pipeline_apps/ts_anomaly_detection.py +10 -7
  354. paddlex/inference/serving/basic_serving/_pipeline_apps/ts_classification.py +10 -7
  355. paddlex/inference/serving/basic_serving/_pipeline_apps/ts_forecast.py +10 -7
  356. paddlex/inference/serving/basic_serving/_pipeline_apps/vehicle_attribute_recognition.py +10 -7
  357. paddlex/inference/serving/basic_serving/_pipeline_apps/video_classification.py +10 -7
  358. paddlex/inference/serving/basic_serving/_pipeline_apps/video_detection.py +10 -7
  359. paddlex/inference/serving/basic_serving/_server.py +9 -4
  360. paddlex/inference/serving/infra/__init__.py +1 -1
  361. paddlex/inference/serving/infra/config.py +1 -1
  362. paddlex/inference/serving/infra/models.py +13 -6
  363. paddlex/inference/serving/infra/storage.py +9 -4
  364. paddlex/inference/serving/infra/utils.py +54 -28
  365. paddlex/inference/serving/schemas/__init__.py +1 -1
  366. paddlex/inference/serving/schemas/anomaly_detection.py +1 -1
  367. paddlex/inference/serving/schemas/doc_preprocessor.py +1 -1
  368. paddlex/inference/serving/schemas/doc_understanding.py +78 -0
  369. paddlex/inference/serving/schemas/face_recognition.py +1 -1
  370. paddlex/inference/serving/schemas/formula_recognition.py +2 -2
  371. paddlex/inference/serving/schemas/human_keypoint_detection.py +1 -1
  372. paddlex/inference/serving/schemas/image_classification.py +1 -1
  373. paddlex/inference/serving/schemas/image_multilabel_classification.py +1 -1
  374. paddlex/inference/serving/schemas/instance_segmentation.py +1 -1
  375. paddlex/inference/serving/schemas/layout_parsing.py +2 -3
  376. paddlex/inference/serving/schemas/m_3d_bev_detection.py +1 -1
  377. paddlex/inference/serving/schemas/multilingual_speech_recognition.py +1 -1
  378. paddlex/inference/serving/schemas/object_detection.py +1 -1
  379. paddlex/inference/serving/schemas/ocr.py +1 -1
  380. paddlex/inference/serving/schemas/open_vocabulary_detection.py +1 -1
  381. paddlex/inference/serving/schemas/open_vocabulary_segmentation.py +1 -1
  382. paddlex/inference/serving/schemas/pedestrian_attribute_recognition.py +1 -1
  383. paddlex/inference/serving/schemas/pp_chatocrv3_doc.py +2 -3
  384. paddlex/inference/serving/schemas/pp_chatocrv4_doc.py +3 -3
  385. paddlex/inference/serving/schemas/pp_shituv2.py +1 -1
  386. paddlex/inference/serving/schemas/pp_structurev3.py +11 -7
  387. paddlex/inference/serving/schemas/rotated_object_detection.py +1 -1
  388. paddlex/inference/serving/schemas/seal_recognition.py +2 -2
  389. paddlex/inference/serving/schemas/semantic_segmentation.py +1 -1
  390. paddlex/inference/serving/schemas/shared/__init__.py +1 -1
  391. paddlex/inference/serving/schemas/shared/classification.py +1 -1
  392. paddlex/inference/serving/schemas/shared/image_segmentation.py +1 -1
  393. paddlex/inference/serving/schemas/shared/object_detection.py +1 -1
  394. paddlex/inference/serving/schemas/shared/ocr.py +1 -1
  395. paddlex/inference/serving/schemas/small_object_detection.py +1 -1
  396. paddlex/inference/serving/schemas/table_recognition.py +3 -7
  397. paddlex/inference/serving/schemas/table_recognition_v2.py +6 -7
  398. paddlex/inference/serving/schemas/ts_anomaly_detection.py +1 -1
  399. paddlex/inference/serving/schemas/ts_classification.py +1 -1
  400. paddlex/inference/serving/schemas/ts_forecast.py +1 -1
  401. paddlex/inference/serving/schemas/vehicle_attribute_recognition.py +1 -1
  402. paddlex/inference/serving/schemas/video_classification.py +1 -1
  403. paddlex/inference/serving/schemas/video_detection.py +1 -1
  404. paddlex/inference/utils/__init__.py +1 -1
  405. paddlex/inference/utils/benchmark.py +332 -179
  406. paddlex/inference/utils/color_map.py +1 -1
  407. paddlex/inference/utils/get_pipeline_path.py +1 -1
  408. paddlex/inference/utils/hpi.py +258 -0
  409. paddlex/inference/utils/hpi_model_info_collection.json +2331 -0
  410. paddlex/inference/utils/io/__init__.py +11 -11
  411. paddlex/inference/utils/io/readers.py +31 -27
  412. paddlex/inference/utils/io/style.py +21 -14
  413. paddlex/inference/utils/io/tablepyxl.py +13 -5
  414. paddlex/inference/utils/io/writers.py +9 -10
  415. paddlex/inference/utils/mkldnn_blocklist.py +25 -0
  416. paddlex/inference/utils/model_paths.py +48 -0
  417. paddlex/inference/utils/{new_ir_blacklist.py → new_ir_blocklist.py} +1 -2
  418. paddlex/inference/utils/official_models.py +278 -262
  419. paddlex/inference/utils/pp_option.py +184 -92
  420. paddlex/inference/utils/trt_blocklist.py +43 -0
  421. paddlex/inference/utils/trt_config.py +420 -0
  422. paddlex/model.py +30 -12
  423. paddlex/modules/__init__.py +57 -80
  424. paddlex/modules/anomaly_detection/__init__.py +2 -2
  425. paddlex/modules/anomaly_detection/dataset_checker/__init__.py +2 -3
  426. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/__init__.py +2 -2
  427. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/analyse_dataset.py +6 -3
  428. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/check_dataset.py +8 -4
  429. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/convert_dataset.py +7 -4
  430. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/split_dataset.py +2 -2
  431. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
  432. paddlex/modules/anomaly_detection/dataset_checker/dataset_src/utils/visualizer.py +7 -2
  433. paddlex/modules/anomaly_detection/evaluator.py +3 -3
  434. paddlex/modules/anomaly_detection/exportor.py +1 -1
  435. paddlex/modules/anomaly_detection/model_list.py +1 -1
  436. paddlex/modules/anomaly_detection/trainer.py +3 -4
  437. paddlex/modules/base/__init__.py +5 -5
  438. paddlex/modules/base/build_model.py +1 -2
  439. paddlex/modules/base/dataset_checker/__init__.py +2 -2
  440. paddlex/modules/base/dataset_checker/dataset_checker.py +4 -4
  441. paddlex/modules/base/dataset_checker/utils.py +1 -3
  442. paddlex/modules/base/evaluator.py +13 -13
  443. paddlex/modules/base/exportor.py +12 -13
  444. paddlex/modules/base/trainer.py +21 -11
  445. paddlex/modules/base/utils/__init__.py +13 -0
  446. paddlex/modules/base/utils/cinn_setting.py +89 -0
  447. paddlex/modules/base/utils/coco_eval.py +94 -0
  448. paddlex/modules/base/utils/topk_eval.py +118 -0
  449. paddlex/modules/doc_vlm/__init__.py +18 -0
  450. paddlex/modules/doc_vlm/dataset_checker.py +29 -0
  451. paddlex/modules/doc_vlm/evaluator.py +29 -0
  452. paddlex/modules/doc_vlm/exportor.py +29 -0
  453. paddlex/modules/doc_vlm/model_list.py +16 -0
  454. paddlex/modules/doc_vlm/trainer.py +41 -0
  455. paddlex/modules/face_recognition/__init__.py +2 -2
  456. paddlex/modules/face_recognition/dataset_checker/__init__.py +2 -2
  457. paddlex/modules/face_recognition/dataset_checker/dataset_src/__init__.py +1 -1
  458. paddlex/modules/face_recognition/dataset_checker/dataset_src/check_dataset.py +3 -5
  459. paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/__init__.py +1 -1
  460. paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/visualizer.py +2 -5
  461. paddlex/modules/face_recognition/evaluator.py +3 -3
  462. paddlex/modules/face_recognition/exportor.py +1 -1
  463. paddlex/modules/face_recognition/model_list.py +1 -1
  464. paddlex/modules/face_recognition/trainer.py +1 -1
  465. paddlex/modules/formula_recognition/__init__.py +2 -2
  466. paddlex/modules/formula_recognition/dataset_checker/__init__.py +3 -3
  467. paddlex/modules/formula_recognition/dataset_checker/dataset_src/__init__.py +2 -2
  468. paddlex/modules/formula_recognition/dataset_checker/dataset_src/analyse_dataset.py +13 -12
  469. paddlex/modules/formula_recognition/dataset_checker/dataset_src/check_dataset.py +2 -6
  470. paddlex/modules/formula_recognition/dataset_checker/dataset_src/convert_dataset.py +11 -10
  471. paddlex/modules/formula_recognition/dataset_checker/dataset_src/split_dataset.py +1 -2
  472. paddlex/modules/formula_recognition/evaluator.py +6 -3
  473. paddlex/modules/formula_recognition/exportor.py +1 -1
  474. paddlex/modules/formula_recognition/model_list.py +4 -1
  475. paddlex/modules/formula_recognition/trainer.py +5 -3
  476. paddlex/modules/general_recognition/__init__.py +2 -2
  477. paddlex/modules/general_recognition/dataset_checker/__init__.py +2 -2
  478. paddlex/modules/general_recognition/dataset_checker/dataset_src/__init__.py +2 -2
  479. paddlex/modules/general_recognition/dataset_checker/dataset_src/analyse_dataset.py +7 -9
  480. paddlex/modules/general_recognition/dataset_checker/dataset_src/check_dataset.py +4 -5
  481. paddlex/modules/general_recognition/dataset_checker/dataset_src/convert_dataset.py +6 -5
  482. paddlex/modules/general_recognition/dataset_checker/dataset_src/split_dataset.py +1 -1
  483. paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/__init__.py +1 -1
  484. paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/visualizer.py +2 -5
  485. paddlex/modules/general_recognition/evaluator.py +2 -2
  486. paddlex/modules/general_recognition/exportor.py +1 -1
  487. paddlex/modules/general_recognition/model_list.py +1 -1
  488. paddlex/modules/general_recognition/trainer.py +1 -1
  489. paddlex/modules/image_classification/__init__.py +2 -2
  490. paddlex/modules/image_classification/dataset_checker/__init__.py +2 -2
  491. paddlex/modules/image_classification/dataset_checker/dataset_src/__init__.py +2 -2
  492. paddlex/modules/image_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -9
  493. paddlex/modules/image_classification/dataset_checker/dataset_src/check_dataset.py +4 -3
  494. paddlex/modules/image_classification/dataset_checker/dataset_src/convert_dataset.py +4 -4
  495. paddlex/modules/image_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
  496. paddlex/modules/image_classification/dataset_checker/dataset_src/utils/__init__.py +1 -1
  497. paddlex/modules/image_classification/dataset_checker/dataset_src/utils/visualizer.py +2 -5
  498. paddlex/modules/image_classification/evaluator.py +3 -3
  499. paddlex/modules/image_classification/exportor.py +1 -1
  500. paddlex/modules/image_classification/model_list.py +2 -1
  501. paddlex/modules/image_classification/trainer.py +3 -3
  502. paddlex/modules/image_unwarping/__init__.py +1 -1
  503. paddlex/modules/image_unwarping/model_list.py +1 -1
  504. paddlex/modules/instance_segmentation/__init__.py +2 -2
  505. paddlex/modules/instance_segmentation/dataset_checker/__init__.py +2 -3
  506. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/__init__.py +2 -2
  507. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/analyse_dataset.py +9 -5
  508. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/check_dataset.py +8 -5
  509. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/convert_dataset.py +8 -8
  510. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/split_dataset.py +7 -4
  511. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/__init__.py +1 -1
  512. paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/visualizer.py +10 -8
  513. paddlex/modules/instance_segmentation/evaluator.py +2 -2
  514. paddlex/modules/instance_segmentation/exportor.py +1 -1
  515. paddlex/modules/instance_segmentation/model_list.py +1 -1
  516. paddlex/modules/instance_segmentation/trainer.py +1 -1
  517. paddlex/modules/keypoint_detection/__init__.py +2 -2
  518. paddlex/modules/keypoint_detection/dataset_checker/__init__.py +2 -2
  519. paddlex/modules/keypoint_detection/dataset_checker/dataset_src/__init__.py +1 -1
  520. paddlex/modules/keypoint_detection/dataset_checker/dataset_src/check_dataset.py +10 -5
  521. paddlex/modules/keypoint_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
  522. paddlex/modules/keypoint_detection/dataset_checker/dataset_src/utils/visualizer.py +8 -3
  523. paddlex/modules/keypoint_detection/evaluator.py +2 -2
  524. paddlex/modules/keypoint_detection/exportor.py +1 -1
  525. paddlex/modules/keypoint_detection/model_list.py +1 -1
  526. paddlex/modules/keypoint_detection/trainer.py +2 -2
  527. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/__init__.py +2 -2
  528. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/__init__.py +3 -3
  529. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/__init__.py +2 -2
  530. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/analyse_dataset.py +8 -8
  531. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/check_dataset.py +1 -2
  532. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/evaluator.py +3 -3
  533. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/exportor.py +1 -1
  534. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/model_list.py +1 -1
  535. paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/trainer.py +5 -7
  536. paddlex/modules/multilabel_classification/__init__.py +2 -2
  537. paddlex/modules/multilabel_classification/dataset_checker/__init__.py +2 -2
  538. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/__init__.py +2 -2
  539. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -9
  540. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/check_dataset.py +4 -3
  541. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/convert_dataset.py +10 -7
  542. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
  543. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/__init__.py +1 -1
  544. paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/visualizer.py +1 -5
  545. paddlex/modules/multilabel_classification/evaluator.py +3 -3
  546. paddlex/modules/multilabel_classification/exportor.py +1 -1
  547. paddlex/modules/multilabel_classification/model_list.py +1 -1
  548. paddlex/modules/multilabel_classification/trainer.py +3 -3
  549. paddlex/modules/multilingual_speech_recognition/__init__.py +2 -2
  550. paddlex/modules/multilingual_speech_recognition/dataset_checker.py +3 -3
  551. paddlex/modules/multilingual_speech_recognition/evaluator.py +3 -3
  552. paddlex/modules/multilingual_speech_recognition/exportor.py +3 -3
  553. paddlex/modules/multilingual_speech_recognition/model_list.py +1 -1
  554. paddlex/modules/multilingual_speech_recognition/trainer.py +7 -5
  555. paddlex/modules/object_detection/__init__.py +2 -2
  556. paddlex/modules/object_detection/dataset_checker/__init__.py +2 -11
  557. paddlex/modules/object_detection/dataset_checker/dataset_src/__init__.py +2 -2
  558. paddlex/modules/object_detection/dataset_checker/dataset_src/analyse_dataset.py +10 -8
  559. paddlex/modules/object_detection/dataset_checker/dataset_src/check_dataset.py +10 -5
  560. paddlex/modules/object_detection/dataset_checker/dataset_src/convert_dataset.py +17 -12
  561. paddlex/modules/object_detection/dataset_checker/dataset_src/split_dataset.py +8 -4
  562. paddlex/modules/object_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
  563. paddlex/modules/object_detection/dataset_checker/dataset_src/utils/visualizer.py +9 -8
  564. paddlex/modules/object_detection/evaluator.py +11 -6
  565. paddlex/modules/object_detection/exportor.py +1 -1
  566. paddlex/modules/object_detection/model_list.py +3 -1
  567. paddlex/modules/object_detection/trainer.py +4 -5
  568. paddlex/modules/open_vocabulary_detection/__init__.py +2 -2
  569. paddlex/modules/open_vocabulary_detection/dataset_checker.py +3 -3
  570. paddlex/modules/open_vocabulary_detection/evaluator.py +3 -3
  571. paddlex/modules/open_vocabulary_detection/exportor.py +3 -3
  572. paddlex/modules/open_vocabulary_detection/model_list.py +2 -4
  573. paddlex/modules/open_vocabulary_detection/trainer.py +7 -5
  574. paddlex/modules/open_vocabulary_segmentation/__init__.py +2 -2
  575. paddlex/modules/open_vocabulary_segmentation/dataset_checker.py +3 -3
  576. paddlex/modules/open_vocabulary_segmentation/evaluator.py +3 -3
  577. paddlex/modules/open_vocabulary_segmentation/exportor.py +3 -3
  578. paddlex/modules/open_vocabulary_segmentation/model_list.py +1 -1
  579. paddlex/modules/open_vocabulary_segmentation/trainer.py +7 -5
  580. paddlex/modules/semantic_segmentation/__init__.py +2 -2
  581. paddlex/modules/semantic_segmentation/dataset_checker/__init__.py +2 -3
  582. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/__init__.py +2 -2
  583. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/analyse_dataset.py +6 -3
  584. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/check_dataset.py +2 -2
  585. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/convert_dataset.py +7 -4
  586. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/split_dataset.py +2 -2
  587. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/utils/__init__.py +1 -1
  588. paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/utils/visualizer.py +6 -2
  589. paddlex/modules/semantic_segmentation/evaluator.py +3 -3
  590. paddlex/modules/semantic_segmentation/exportor.py +1 -1
  591. paddlex/modules/semantic_segmentation/model_list.py +1 -1
  592. paddlex/modules/semantic_segmentation/trainer.py +3 -4
  593. paddlex/modules/table_recognition/__init__.py +2 -2
  594. paddlex/modules/table_recognition/dataset_checker/__init__.py +5 -5
  595. paddlex/modules/table_recognition/dataset_checker/dataset_src/__init__.py +2 -2
  596. paddlex/modules/table_recognition/dataset_checker/dataset_src/analyse_dataset.py +3 -2
  597. paddlex/modules/table_recognition/dataset_checker/dataset_src/check_dataset.py +8 -7
  598. paddlex/modules/table_recognition/dataset_checker/dataset_src/split_dataset.py +2 -1
  599. paddlex/modules/table_recognition/evaluator.py +3 -3
  600. paddlex/modules/table_recognition/exportor.py +1 -1
  601. paddlex/modules/table_recognition/model_list.py +1 -1
  602. paddlex/modules/table_recognition/trainer.py +2 -5
  603. paddlex/modules/text_detection/__init__.py +2 -2
  604. paddlex/modules/text_detection/dataset_checker/__init__.py +4 -6
  605. paddlex/modules/text_detection/dataset_checker/dataset_src/__init__.py +2 -2
  606. paddlex/modules/text_detection/dataset_checker/dataset_src/analyse_dataset.py +12 -9
  607. paddlex/modules/text_detection/dataset_checker/dataset_src/check_dataset.py +3 -3
  608. paddlex/modules/text_detection/dataset_checker/dataset_src/split_dataset.py +3 -3
  609. paddlex/modules/text_detection/evaluator.py +3 -3
  610. paddlex/modules/text_detection/exportor.py +1 -1
  611. paddlex/modules/text_detection/model_list.py +3 -1
  612. paddlex/modules/text_detection/trainer.py +2 -5
  613. paddlex/modules/text_recognition/__init__.py +2 -2
  614. paddlex/modules/text_recognition/dataset_checker/__init__.py +4 -5
  615. paddlex/modules/text_recognition/dataset_checker/dataset_src/__init__.py +2 -2
  616. paddlex/modules/text_recognition/dataset_checker/dataset_src/analyse_dataset.py +13 -12
  617. paddlex/modules/text_recognition/dataset_checker/dataset_src/check_dataset.py +2 -5
  618. paddlex/modules/text_recognition/dataset_checker/dataset_src/convert_dataset.py +11 -10
  619. paddlex/modules/text_recognition/dataset_checker/dataset_src/split_dataset.py +1 -2
  620. paddlex/modules/text_recognition/evaluator.py +3 -3
  621. paddlex/modules/text_recognition/exportor.py +1 -1
  622. paddlex/modules/text_recognition/model_list.py +3 -1
  623. paddlex/modules/text_recognition/trainer.py +2 -3
  624. paddlex/modules/ts_anomaly_detection/__init__.py +2 -2
  625. paddlex/modules/ts_anomaly_detection/dataset_checker/__init__.py +4 -5
  626. paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/__init__.py +2 -2
  627. paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/analyse_dataset.py +1 -9
  628. paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/check_dataset.py +2 -2
  629. paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/convert_dataset.py +2 -6
  630. paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/split_dataset.py +4 -4
  631. paddlex/modules/ts_anomaly_detection/evaluator.py +3 -3
  632. paddlex/modules/ts_anomaly_detection/exportor.py +2 -3
  633. paddlex/modules/ts_anomaly_detection/model_list.py +1 -1
  634. paddlex/modules/ts_anomaly_detection/trainer.py +8 -8
  635. paddlex/modules/ts_classification/__init__.py +2 -2
  636. paddlex/modules/ts_classification/dataset_checker/__init__.py +4 -5
  637. paddlex/modules/ts_classification/dataset_checker/dataset_src/__init__.py +2 -2
  638. paddlex/modules/ts_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -5
  639. paddlex/modules/ts_classification/dataset_checker/dataset_src/check_dataset.py +2 -2
  640. paddlex/modules/ts_classification/dataset_checker/dataset_src/convert_dataset.py +2 -6
  641. paddlex/modules/ts_classification/dataset_checker/dataset_src/split_dataset.py +5 -5
  642. paddlex/modules/ts_classification/evaluator.py +3 -3
  643. paddlex/modules/ts_classification/exportor.py +2 -3
  644. paddlex/modules/ts_classification/model_list.py +1 -1
  645. paddlex/modules/ts_classification/trainer.py +7 -7
  646. paddlex/modules/ts_forecast/__init__.py +2 -2
  647. paddlex/modules/ts_forecast/dataset_checker/__init__.py +4 -5
  648. paddlex/modules/ts_forecast/dataset_checker/dataset_src/__init__.py +2 -2
  649. paddlex/modules/ts_forecast/dataset_checker/dataset_src/analyse_dataset.py +1 -9
  650. paddlex/modules/ts_forecast/dataset_checker/dataset_src/check_dataset.py +2 -2
  651. paddlex/modules/ts_forecast/dataset_checker/dataset_src/convert_dataset.py +2 -6
  652. paddlex/modules/ts_forecast/dataset_checker/dataset_src/split_dataset.py +4 -4
  653. paddlex/modules/ts_forecast/evaluator.py +3 -3
  654. paddlex/modules/ts_forecast/exportor.py +2 -3
  655. paddlex/modules/ts_forecast/model_list.py +1 -1
  656. paddlex/modules/ts_forecast/trainer.py +7 -7
  657. paddlex/modules/video_classification/__init__.py +2 -2
  658. paddlex/modules/video_classification/dataset_checker/__init__.py +2 -2
  659. paddlex/modules/video_classification/dataset_checker/dataset_src/__init__.py +2 -2
  660. paddlex/modules/video_classification/dataset_checker/dataset_src/analyse_dataset.py +9 -9
  661. paddlex/modules/video_classification/dataset_checker/dataset_src/check_dataset.py +2 -3
  662. paddlex/modules/video_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
  663. paddlex/modules/video_classification/evaluator.py +3 -3
  664. paddlex/modules/video_classification/exportor.py +1 -1
  665. paddlex/modules/video_classification/model_list.py +1 -1
  666. paddlex/modules/video_classification/trainer.py +3 -3
  667. paddlex/modules/video_detection/__init__.py +2 -2
  668. paddlex/modules/video_detection/dataset_checker/__init__.py +2 -2
  669. paddlex/modules/video_detection/dataset_checker/dataset_src/__init__.py +2 -2
  670. paddlex/modules/video_detection/dataset_checker/dataset_src/analyse_dataset.py +8 -9
  671. paddlex/modules/video_detection/dataset_checker/dataset_src/check_dataset.py +3 -5
  672. paddlex/modules/video_detection/evaluator.py +3 -3
  673. paddlex/modules/video_detection/exportor.py +1 -1
  674. paddlex/modules/video_detection/model_list.py +1 -1
  675. paddlex/modules/video_detection/trainer.py +3 -3
  676. paddlex/ops/__init__.py +7 -4
  677. paddlex/ops/iou3d_nms/iou3d_cpu.cpp +8 -6
  678. paddlex/ops/iou3d_nms/iou3d_cpu.h +3 -2
  679. paddlex/ops/iou3d_nms/iou3d_nms.cpp +8 -6
  680. paddlex/ops/iou3d_nms/iou3d_nms.h +6 -4
  681. paddlex/ops/iou3d_nms/iou3d_nms_api.cpp +24 -18
  682. paddlex/ops/iou3d_nms/iou3d_nms_kernel.cu +9 -7
  683. paddlex/ops/setup.py +3 -3
  684. paddlex/ops/voxel/voxelize_op.cc +22 -19
  685. paddlex/ops/voxel/voxelize_op.cu +25 -25
  686. paddlex/paddlex_cli.py +104 -87
  687. paddlex/repo_apis/Paddle3D_api/__init__.py +1 -1
  688. paddlex/repo_apis/Paddle3D_api/bev_fusion/__init__.py +1 -1
  689. paddlex/repo_apis/Paddle3D_api/bev_fusion/config.py +1 -1
  690. paddlex/repo_apis/Paddle3D_api/bev_fusion/model.py +6 -6
  691. paddlex/repo_apis/Paddle3D_api/bev_fusion/register.py +2 -2
  692. paddlex/repo_apis/Paddle3D_api/bev_fusion/runner.py +1 -1
  693. paddlex/repo_apis/Paddle3D_api/pp3d_config.py +3 -2
  694. paddlex/repo_apis/PaddleClas_api/__init__.py +1 -1
  695. paddlex/repo_apis/PaddleClas_api/cls/__init__.py +3 -3
  696. paddlex/repo_apis/PaddleClas_api/cls/config.py +5 -4
  697. paddlex/repo_apis/PaddleClas_api/cls/model.py +4 -4
  698. paddlex/repo_apis/PaddleClas_api/cls/register.py +12 -3
  699. paddlex/repo_apis/PaddleClas_api/cls/runner.py +2 -3
  700. paddlex/repo_apis/PaddleClas_api/shitu_rec/__init__.py +2 -2
  701. paddlex/repo_apis/PaddleClas_api/shitu_rec/config.py +2 -2
  702. paddlex/repo_apis/PaddleClas_api/shitu_rec/model.py +1 -4
  703. paddlex/repo_apis/PaddleClas_api/shitu_rec/register.py +2 -2
  704. paddlex/repo_apis/PaddleClas_api/shitu_rec/runner.py +1 -6
  705. paddlex/repo_apis/PaddleDetection_api/__init__.py +2 -2
  706. paddlex/repo_apis/PaddleDetection_api/config_helper.py +3 -3
  707. paddlex/repo_apis/PaddleDetection_api/instance_seg/__init__.py +2 -2
  708. paddlex/repo_apis/PaddleDetection_api/instance_seg/config.py +2 -3
  709. paddlex/repo_apis/PaddleDetection_api/instance_seg/model.py +4 -4
  710. paddlex/repo_apis/PaddleDetection_api/instance_seg/register.py +2 -3
  711. paddlex/repo_apis/PaddleDetection_api/instance_seg/runner.py +2 -3
  712. paddlex/repo_apis/PaddleDetection_api/object_det/__init__.py +3 -3
  713. paddlex/repo_apis/PaddleDetection_api/object_det/config.py +5 -4
  714. paddlex/repo_apis/PaddleDetection_api/object_det/model.py +6 -7
  715. paddlex/repo_apis/PaddleDetection_api/object_det/official_categories.py +26 -1
  716. paddlex/repo_apis/PaddleDetection_api/object_det/register.py +32 -3
  717. paddlex/repo_apis/PaddleDetection_api/object_det/runner.py +2 -3
  718. paddlex/repo_apis/PaddleNLP_api/__init__.py +1 -1
  719. paddlex/repo_apis/PaddleOCR_api/__init__.py +4 -3
  720. paddlex/repo_apis/PaddleOCR_api/config_utils.py +1 -1
  721. paddlex/repo_apis/PaddleOCR_api/formula_rec/__init__.py +1 -1
  722. paddlex/repo_apis/PaddleOCR_api/formula_rec/config.py +7 -6
  723. paddlex/repo_apis/PaddleOCR_api/formula_rec/model.py +9 -13
  724. paddlex/repo_apis/PaddleOCR_api/formula_rec/register.py +29 -3
  725. paddlex/repo_apis/PaddleOCR_api/formula_rec/runner.py +2 -3
  726. paddlex/repo_apis/PaddleOCR_api/table_rec/__init__.py +1 -1
  727. paddlex/repo_apis/PaddleOCR_api/table_rec/config.py +1 -1
  728. paddlex/repo_apis/PaddleOCR_api/table_rec/model.py +4 -4
  729. paddlex/repo_apis/PaddleOCR_api/table_rec/register.py +2 -3
  730. paddlex/repo_apis/PaddleOCR_api/table_rec/runner.py +3 -3
  731. paddlex/repo_apis/PaddleOCR_api/text_det/__init__.py +1 -1
  732. paddlex/repo_apis/PaddleOCR_api/text_det/config.py +1 -1
  733. paddlex/repo_apis/PaddleOCR_api/text_det/model.py +4 -4
  734. paddlex/repo_apis/PaddleOCR_api/text_det/register.py +20 -3
  735. paddlex/repo_apis/PaddleOCR_api/text_det/runner.py +3 -3
  736. paddlex/repo_apis/PaddleOCR_api/text_rec/__init__.py +1 -1
  737. paddlex/repo_apis/PaddleOCR_api/text_rec/config.py +7 -6
  738. paddlex/repo_apis/PaddleOCR_api/text_rec/model.py +9 -13
  739. paddlex/repo_apis/PaddleOCR_api/text_rec/register.py +20 -3
  740. paddlex/repo_apis/PaddleOCR_api/text_rec/runner.py +2 -3
  741. paddlex/repo_apis/PaddleSeg_api/__init__.py +1 -1
  742. paddlex/repo_apis/PaddleSeg_api/base_seg_config.py +2 -2
  743. paddlex/repo_apis/PaddleSeg_api/seg/__init__.py +1 -1
  744. paddlex/repo_apis/PaddleSeg_api/seg/config.py +3 -6
  745. paddlex/repo_apis/PaddleSeg_api/seg/model.py +6 -6
  746. paddlex/repo_apis/PaddleSeg_api/seg/register.py +2 -3
  747. paddlex/repo_apis/PaddleSeg_api/seg/runner.py +2 -3
  748. paddlex/repo_apis/PaddleTS_api/__init__.py +4 -3
  749. paddlex/repo_apis/PaddleTS_api/ts_ad/__init__.py +1 -1
  750. paddlex/repo_apis/PaddleTS_api/ts_ad/config.py +5 -6
  751. paddlex/repo_apis/PaddleTS_api/ts_ad/register.py +2 -2
  752. paddlex/repo_apis/PaddleTS_api/ts_ad/runner.py +2 -2
  753. paddlex/repo_apis/PaddleTS_api/ts_base/__init__.py +1 -1
  754. paddlex/repo_apis/PaddleTS_api/ts_base/config.py +2 -4
  755. paddlex/repo_apis/PaddleTS_api/ts_base/model.py +4 -4
  756. paddlex/repo_apis/PaddleTS_api/ts_base/runner.py +2 -2
  757. paddlex/repo_apis/PaddleTS_api/ts_cls/__init__.py +1 -1
  758. paddlex/repo_apis/PaddleTS_api/ts_cls/config.py +4 -5
  759. paddlex/repo_apis/PaddleTS_api/ts_cls/register.py +2 -2
  760. paddlex/repo_apis/PaddleTS_api/ts_cls/runner.py +2 -2
  761. paddlex/repo_apis/PaddleTS_api/ts_fc/__init__.py +1 -1
  762. paddlex/repo_apis/PaddleTS_api/ts_fc/config.py +6 -7
  763. paddlex/repo_apis/PaddleTS_api/ts_fc/register.py +1 -1
  764. paddlex/repo_apis/PaddleVideo_api/__init__.py +1 -1
  765. paddlex/repo_apis/PaddleVideo_api/config_utils.py +1 -1
  766. paddlex/repo_apis/PaddleVideo_api/video_cls/__init__.py +3 -3
  767. paddlex/repo_apis/PaddleVideo_api/video_cls/config.py +5 -4
  768. paddlex/repo_apis/PaddleVideo_api/video_cls/model.py +4 -4
  769. paddlex/repo_apis/PaddleVideo_api/video_cls/register.py +2 -3
  770. paddlex/repo_apis/PaddleVideo_api/video_cls/runner.py +2 -3
  771. paddlex/repo_apis/PaddleVideo_api/video_det/__init__.py +3 -3
  772. paddlex/repo_apis/PaddleVideo_api/video_det/config.py +5 -4
  773. paddlex/repo_apis/PaddleVideo_api/video_det/model.py +5 -5
  774. paddlex/repo_apis/PaddleVideo_api/video_det/register.py +2 -3
  775. paddlex/repo_apis/PaddleVideo_api/video_det/runner.py +2 -3
  776. paddlex/repo_apis/__init__.py +1 -1
  777. paddlex/repo_apis/base/__init__.py +4 -5
  778. paddlex/repo_apis/base/config.py +3 -4
  779. paddlex/repo_apis/base/model.py +11 -19
  780. paddlex/repo_apis/base/register.py +1 -1
  781. paddlex/repo_apis/base/runner.py +11 -12
  782. paddlex/repo_apis/base/utils/__init__.py +1 -1
  783. paddlex/repo_apis/base/utils/arg.py +1 -1
  784. paddlex/repo_apis/base/utils/subprocess.py +1 -1
  785. paddlex/repo_manager/__init__.py +2 -9
  786. paddlex/repo_manager/core.py +12 -30
  787. paddlex/repo_manager/meta.py +41 -31
  788. paddlex/repo_manager/repo.py +171 -161
  789. paddlex/repo_manager/utils.py +13 -224
  790. paddlex/utils/__init__.py +1 -1
  791. paddlex/utils/cache.py +8 -10
  792. paddlex/utils/config.py +6 -5
  793. paddlex/utils/{custom_device_whitelist.py → custom_device_list.py} +53 -199
  794. paddlex/utils/deps.py +249 -0
  795. paddlex/utils/device.py +87 -36
  796. paddlex/utils/download.py +4 -4
  797. paddlex/utils/env.py +37 -7
  798. paddlex/utils/errors/__init__.py +1 -1
  799. paddlex/utils/errors/dataset_checker.py +1 -1
  800. paddlex/utils/errors/others.py +2 -16
  801. paddlex/utils/file_interface.py +4 -5
  802. paddlex/utils/flags.py +17 -12
  803. paddlex/utils/fonts/__init__.py +36 -5
  804. paddlex/utils/func_register.py +1 -1
  805. paddlex/utils/install.py +87 -0
  806. paddlex/utils/interactive_get_pipeline.py +3 -3
  807. paddlex/utils/lazy_loader.py +3 -3
  808. paddlex/utils/logging.py +10 -1
  809. paddlex/utils/misc.py +6 -6
  810. paddlex/utils/pipeline_arguments.py +15 -7
  811. paddlex/utils/result_saver.py +4 -5
  812. paddlex/utils/subclass_register.py +2 -4
  813. paddlex/version.py +2 -1
  814. {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/METADATA +237 -102
  815. paddlex-3.0.1.dist-info/RECORD +1095 -0
  816. {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/WHEEL +1 -1
  817. paddlex/inference/models/base/predictor/basic_predictor.py +0 -139
  818. paddlex/paddle2onnx_requirements.txt +0 -1
  819. paddlex/repo_manager/requirements.txt +0 -21
  820. paddlex/serving_requirements.txt +0 -9
  821. paddlex-3.0.0rc0.dist-info/RECORD +0 -1015
  822. {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/entry_points.txt +0 -0
  823. {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info/licenses}/LICENSE +0 -0
  824. {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- # copyright (c) 2024 PaddlePaddle Authors. All Rights Reserve.
1
+ # Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,318 +12,791 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Union, Tuple, List, Dict, Any, Iterator
16
- import os
17
- import shutil
15
+ import abc
16
+ import subprocess
17
+ from os import PathLike
18
18
  from pathlib import Path
19
- import lazy_paddle as paddle
19
+ from typing import List, Sequence, Union
20
+
20
21
  import numpy as np
21
22
 
22
- from ....utils.flags import DEBUG, FLAGS_json_format_model, USE_PIR_TRT
23
23
  from ....utils import logging
24
+ from ....utils.deps import class_requires_deps
25
+ from ....utils.flags import DEBUG, USE_PIR_TRT
26
+ from ...utils.benchmark import benchmark, set_inference_operations
27
+ from ...utils.hpi import (
28
+ HPIConfig,
29
+ OMConfig,
30
+ ONNXRuntimeConfig,
31
+ OpenVINOConfig,
32
+ TensorRTConfig,
33
+ suggest_inference_backend_and_config,
34
+ )
35
+ from ...utils.model_paths import get_model_paths
24
36
  from ...utils.pp_option import PaddlePredictorOption
37
+ from ...utils.trt_config import DISABLE_TRT_HALF_OPS_CONFIG
38
+
39
+ CACHE_DIR = ".cache"
40
+
41
+ INFERENCE_OPERATIONS = [
42
+ "PaddleInferChainLegacy",
43
+ "MultiBackendInfer",
44
+ ]
45
+ set_inference_operations(INFERENCE_OPERATIONS)
46
+
47
+
48
+ # XXX: Better use Paddle Inference API to do this
49
+ def _pd_dtype_to_np_dtype(pd_dtype):
50
+ import paddle
51
+
52
+ if pd_dtype == paddle.inference.DataType.FLOAT64:
53
+ return np.float64
54
+ elif pd_dtype == paddle.inference.DataType.FLOAT32:
55
+ return np.float32
56
+ elif pd_dtype == paddle.inference.DataType.INT64:
57
+ return np.int64
58
+ elif pd_dtype == paddle.inference.DataType.INT32:
59
+ return np.int32
60
+ elif pd_dtype == paddle.inference.DataType.UINT8:
61
+ return np.uint8
62
+ elif pd_dtype == paddle.inference.DataType.INT8:
63
+ return np.int8
64
+ else:
65
+ raise TypeError(f"Unsupported data type: {pd_dtype}")
66
+
67
+
68
+ # old trt
69
+ def _collect_trt_shape_range_info(
70
+ model_file,
71
+ model_params,
72
+ gpu_id,
73
+ shape_range_info_path,
74
+ dynamic_shapes,
75
+ dynamic_shape_input_data,
76
+ ):
77
+ import paddle.inference
25
78
 
79
+ dynamic_shape_input_data = dynamic_shape_input_data or {}
26
80
 
27
- def collect_trt_shapes(
28
- model_file, model_params, gpu_id, shape_range_info_path, trt_dynamic_shapes
29
- ):
30
81
  config = paddle.inference.Config(model_file, model_params)
31
82
  config.enable_use_gpu(100, gpu_id)
83
+ config.collect_shape_range_info(shape_range_info_path)
84
+ # TODO: Add other needed options
85
+ config.disable_glog_info()
86
+ predictor = paddle.inference.create_predictor(config)
87
+
88
+ input_names = predictor.get_input_names()
89
+ for name in dynamic_shapes:
90
+ if name not in input_names:
91
+ raise ValueError(
92
+ f"Invalid input name {repr(name)} found in `dynamic_shapes`"
93
+ )
94
+ for name in input_names:
95
+ if name not in dynamic_shapes:
96
+ raise ValueError(f"Input name {repr(name)} not found in `dynamic_shapes`")
97
+ for name in dynamic_shape_input_data:
98
+ if name not in input_names:
99
+ raise ValueError(
100
+ f"Invalid input name {repr(name)} found in `dynamic_shape_input_data`"
101
+ )
102
+ # It would be better to check if the shapes are valid.
103
+
32
104
  min_arrs, opt_arrs, max_arrs = {}, {}, {}
33
- for name, candidate_shapes in trt_dynamic_shapes.items():
105
+ for name, candidate_shapes in dynamic_shapes.items():
106
+ # XXX: Currently we have no way to get the data type of the tensor
107
+ # without creating an input handle.
108
+ handle = predictor.get_input_handle(name)
109
+ dtype = _pd_dtype_to_np_dtype(handle.type())
34
110
  min_shape, opt_shape, max_shape = candidate_shapes
35
- min_arrs[name] = np.ones(min_shape, dtype=np.float32)
36
- opt_arrs[name] = np.ones(opt_shape, dtype=np.float32)
37
- max_arrs[name] = np.ones(max_shape, dtype=np.float32)
111
+ if name in dynamic_shape_input_data:
112
+ min_arrs[name] = np.array(
113
+ dynamic_shape_input_data[name][0], dtype=dtype
114
+ ).reshape(min_shape)
115
+ opt_arrs[name] = np.array(
116
+ dynamic_shape_input_data[name][1], dtype=dtype
117
+ ).reshape(opt_shape)
118
+ max_arrs[name] = np.array(
119
+ dynamic_shape_input_data[name][2], dtype=dtype
120
+ ).reshape(max_shape)
121
+ else:
122
+ min_arrs[name] = np.ones(min_shape, dtype=dtype)
123
+ opt_arrs[name] = np.ones(opt_shape, dtype=dtype)
124
+ max_arrs[name] = np.ones(max_shape, dtype=dtype)
38
125
 
39
- config.collect_shape_range_info(shape_range_info_path)
40
- predictor = paddle.inference.create_predictor(config)
41
- # opt_arrs would be used twice to simulate the most common situations
126
+ # `opt_arrs` is used twice to ensure it is the most frequently used.
42
127
  for arrs in [min_arrs, opt_arrs, opt_arrs, max_arrs]:
43
128
  for name, arr in arrs.items():
44
- input_handler = predictor.get_input_handle(name)
45
- input_handler.reshape(arr.shape)
46
- input_handler.copy_from_cpu(arr)
129
+ handle = predictor.get_input_handle(name)
130
+ handle.reshape(arr.shape)
131
+ handle.copy_from_cpu(arr)
47
132
  predictor.run()
48
133
 
134
+ # HACK: The shape range info will be written to the file only when
135
+ # `predictor` is garbage collected. It works in CPython, but it is
136
+ # definitely a bad idea to count on the implementation-dependent behavior of
137
+ # a garbage collector. Is there a more explicit and deterministic way to
138
+ # handle this?
139
+
140
+ # HACK: Manually delete the predictor to trigger its destructor, ensuring that the shape_range_info file would be saved.
141
+ del predictor
142
+
143
+
144
+ # pir trt
145
+ def _convert_trt(
146
+ trt_cfg_setting,
147
+ pp_model_file,
148
+ pp_params_file,
149
+ trt_save_path,
150
+ device_id,
151
+ dynamic_shapes,
152
+ dynamic_shape_input_data,
153
+ ):
154
+ import paddle.inference
155
+ from paddle.tensorrt.export import Input, TensorRTConfig, convert
156
+
157
+ def _set_trt_config():
158
+ for attr_name in trt_cfg_setting:
159
+ assert hasattr(
160
+ trt_config, attr_name
161
+ ), f"The `{type(trt_config)}` don't have the attribute `{attr_name}`!"
162
+ setattr(trt_config, attr_name, trt_cfg_setting[attr_name])
163
+
164
+ def _get_predictor(model_file, params_file):
165
+ # HACK
166
+ config = paddle.inference.Config(str(model_file), str(params_file))
167
+ config.enable_use_gpu(100, device_id)
168
+ # NOTE: Disable oneDNN to circumvent a bug in Paddle Inference
169
+ config.disable_mkldnn()
170
+ config.disable_glog_info()
171
+ return paddle.inference.create_predictor(config)
172
+
173
+ dynamic_shape_input_data = dynamic_shape_input_data or {}
174
+
175
+ predictor = _get_predictor(pp_model_file, pp_params_file)
176
+ input_names = predictor.get_input_names()
177
+ for name in dynamic_shapes:
178
+ if name not in input_names:
179
+ raise ValueError(
180
+ f"Invalid input name {repr(name)} found in `dynamic_shapes`"
181
+ )
182
+ for name in input_names:
183
+ if name not in dynamic_shapes:
184
+ raise ValueError(f"Input name {repr(name)} not found in `dynamic_shapes`")
185
+ for name in dynamic_shape_input_data:
186
+ if name not in input_names:
187
+ raise ValueError(
188
+ f"Invalid input name {repr(name)} found in `dynamic_shape_input_data`"
189
+ )
49
190
 
50
- def convert_trt(mode, pp_model_path, trt_save_path, trt_dynamic_shapes):
51
- from lazy_paddle.tensorrt.export import (
52
- Input,
53
- TensorRTConfig,
54
- convert,
55
- PrecisionMode,
56
- )
57
-
58
- precision_map = {
59
- "trt_int8": PrecisionMode.INT8,
60
- "trt_fp32": PrecisionMode.FP32,
61
- "trt_fp16": PrecisionMode.FP16,
62
- }
63
191
  trt_inputs = []
64
- for name, candidate_shapes in trt_dynamic_shapes.items():
192
+ for name, candidate_shapes in dynamic_shapes.items():
193
+ # XXX: Currently we have no way to get the data type of the tensor
194
+ # without creating an input handle.
195
+ handle = predictor.get_input_handle(name)
196
+ dtype = _pd_dtype_to_np_dtype(handle.type())
65
197
  min_shape, opt_shape, max_shape = candidate_shapes
66
- trt_input = Input(
67
- min_input_shape=min_shape,
68
- optim_input_shape=opt_shape,
69
- max_input_shape=max_shape,
70
- )
198
+ if name in dynamic_shape_input_data:
199
+ min_arr = np.array(dynamic_shape_input_data[name][0], dtype=dtype).reshape(
200
+ min_shape
201
+ )
202
+ opt_arr = np.array(dynamic_shape_input_data[name][1], dtype=dtype).reshape(
203
+ opt_shape
204
+ )
205
+ max_arr = np.array(dynamic_shape_input_data[name][2], dtype=dtype).reshape(
206
+ max_shape
207
+ )
208
+ else:
209
+ min_arr = np.ones(min_shape, dtype=dtype)
210
+ opt_arr = np.ones(opt_shape, dtype=dtype)
211
+ max_arr = np.ones(max_shape, dtype=dtype)
212
+
213
+ # refer to: https://github.com/PolaKuma/Paddle/blob/3347f225bc09f2ec09802a2090432dd5cb5b6739/test/tensorrt/test_converter_model_resnet50.py
214
+ trt_input = Input((min_arr, opt_arr, max_arr))
71
215
  trt_inputs.append(trt_input)
72
216
 
73
217
  # Create TensorRTConfig
74
218
  trt_config = TensorRTConfig(inputs=trt_inputs)
75
- trt_config.precision_mode = precision_map[mode]
76
- trt_config.save_model_dir = trt_save_path
219
+ _set_trt_config()
220
+ trt_config.save_model_dir = str(trt_save_path)
221
+ pp_model_path = str(pp_model_file.with_suffix(""))
77
222
  convert(pp_model_path, trt_config)
78
223
 
79
224
 
80
- class Copy2GPU:
81
-
82
- def __init__(self, input_handlers):
83
- super().__init__()
84
- self.input_handlers = input_handlers
225
+ def _sort_inputs(inputs, names):
226
+ # NOTE: Adjust input tensors to match the sorted sequence.
227
+ indices = sorted(range(len(names)), key=names.__getitem__)
228
+ inputs = [inputs[indices.index(i)] for i in range(len(inputs))]
229
+ return inputs
85
230
 
86
- def __call__(self, x):
87
- for idx in range(len(x)):
88
- self.input_handlers[idx].reshape(x[idx].shape)
89
- self.input_handlers[idx].copy_from_cpu(x[idx])
90
-
91
-
92
- class Copy2CPU:
93
-
94
- def __init__(self, output_handlers):
95
- super().__init__()
96
- self.output_handlers = output_handlers
97
-
98
- def __call__(self):
99
- output = []
100
- for out_tensor in self.output_handlers:
101
- batch = out_tensor.copy_to_cpu()
102
- output.append(batch)
103
- return output
104
-
105
-
106
- class Infer:
107
231
 
232
+ # FIXME: Name might be misleading
233
+ @benchmark.timeit
234
+ class PaddleInferChainLegacy:
108
235
  def __init__(self, predictor):
109
- super().__init__()
110
236
  self.predictor = predictor
237
+ input_names = self.predictor.get_input_names()
238
+ self.input_handles = []
239
+ self.output_handles = []
240
+ for input_name in input_names:
241
+ input_handle = self.predictor.get_input_handle(input_name)
242
+ self.input_handles.append(input_handle)
243
+ output_names = self.predictor.get_output_names()
244
+ for output_name in output_names:
245
+ output_handle = self.predictor.get_output_handle(output_name)
246
+ self.output_handles.append(output_handle)
111
247
 
112
- def __call__(self):
248
+ def __call__(self, x):
249
+ for input_, input_handle in zip(x, self.input_handles):
250
+ input_handle.reshape(input_.shape)
251
+ input_handle.copy_from_cpu(input_)
113
252
  self.predictor.run()
253
+ outputs = [o.copy_to_cpu() for o in self.output_handles]
254
+ return outputs
255
+
114
256
 
257
+ class StaticInfer(metaclass=abc.ABCMeta):
258
+ @abc.abstractmethod
259
+ def __call__(self, x: Sequence[np.ndarray]) -> List[np.ndarray]:
260
+ raise NotImplementedError
115
261
 
116
- class StaticInfer:
117
- """Predictor based on Paddle Inference"""
118
262
 
263
+ class PaddleInfer(StaticInfer):
119
264
  def __init__(
120
- self, model_dir: str, model_prefix: str, option: PaddlePredictorOption
265
+ self,
266
+ model_dir: Union[str, PathLike],
267
+ model_file_prefix: str,
268
+ option: PaddlePredictorOption,
121
269
  ) -> None:
122
270
  super().__init__()
123
- self.model_dir = model_dir
124
- self.model_prefix = model_prefix
125
- self._update_option(option)
126
-
127
- def _update_option(self, option: PaddlePredictorOption) -> None:
128
- if self.option and option == self.option:
129
- return
271
+ self.model_dir = Path(model_dir)
272
+ self.model_file_prefix = model_file_prefix
130
273
  self._option = option
131
- self._reset()
132
-
133
- @property
134
- def option(self) -> PaddlePredictorOption:
135
- return self._option if hasattr(self, "_option") else None
136
-
137
- @option.setter
138
- def option(self, option: Union[None, PaddlePredictorOption]) -> None:
139
- if option:
140
- self._update_option(option)
141
-
142
- def _reset(self) -> None:
143
- logging.debug(f"Env: {self.option}")
144
- (
145
- predictor,
146
- input_handlers,
147
- output_handlers,
148
- ) = self._create()
149
- self.copy2gpu = Copy2GPU(input_handlers)
150
- self.copy2cpu = Copy2CPU(output_handlers)
151
- self.infer = Infer(predictor)
152
- self.option.changed = False
274
+ self.predictor = self._create()
275
+ self.infer = PaddleInferChainLegacy(self.predictor)
276
+
277
+ def __call__(self, x: Sequence[np.ndarray]) -> List[np.ndarray]:
278
+ names = self.predictor.get_input_names()
279
+ if len(names) != len(x):
280
+ raise ValueError(
281
+ f"The number of inputs does not match the model: {len(names)} vs {len(x)}"
282
+ )
283
+ # TODO:
284
+ # Ensure that input tensors follow the model's input sequence without sorting.
285
+ x = _sort_inputs(x, names)
286
+ x = list(map(np.ascontiguousarray, x))
287
+ pred = self.infer(x)
288
+ return pred
153
289
 
154
290
  def _create(
155
291
  self,
156
- ) -> Tuple[
157
- "paddle.base.libpaddle.PaddleInferPredictor",
158
- "paddle.base.libpaddle.PaddleInferTensor",
159
- "paddle.base.libpaddle.PaddleInferTensor",
160
- ]:
292
+ ):
161
293
  """_create"""
162
- from lazy_paddle.inference import Config, create_predictor
294
+ import paddle
295
+ import paddle.inference
296
+
297
+ model_paths = get_model_paths(self.model_dir, self.model_file_prefix)
298
+ if "paddle" not in model_paths:
299
+ raise RuntimeError("No valid PaddlePaddle model found")
300
+ model_file, params_file = model_paths["paddle"]
301
+
302
+ if (
303
+ self._option.model_name == "LaTeX_OCR_rec"
304
+ and self._option.device_type == "cpu"
305
+ ):
306
+ import cpuinfo
307
+
308
+ if (
309
+ "GenuineIntel" in cpuinfo.get_cpu_info().get("vendor_id_raw", "")
310
+ and self._option.run_mode != "mkldnn"
311
+ ):
312
+ logging.warning(
313
+ "Now, the `LaTeX_OCR_rec` model only support `mkldnn` mode when running on Intel CPU devices. So using `mkldnn` instead."
314
+ )
315
+ self._option.run_mode = "mkldnn"
316
+ logging.debug("`run_mode` updated to 'mkldnn'")
163
317
 
164
- if FLAGS_json_format_model:
165
- model_file = (self.model_dir / f"{self.model_prefix}.json").as_posix()
166
- # when FLAGS_json_format_model is not set, use inference.json if exist, otherwise inference.pdmodel
167
- else:
168
- model_file = self.model_dir / f"{self.model_prefix}.json"
169
- if model_file.exists():
170
- model_file = model_file.as_posix()
171
- # default by `pdmodel` suffix
172
- else:
173
- model_file = (
174
- self.model_dir / f"{self.model_prefix}.pdmodel"
175
- ).as_posix()
176
- params_file = (self.model_dir / f"{self.model_prefix}.pdiparams").as_posix()
318
+ if self._option.device_type == "cpu" and self._option.device_id is not None:
319
+ self._option.device_id = None
320
+ logging.debug("`device_id` has been set to None")
177
321
 
178
- # for TRT
179
- if self.option.run_mode.startswith("trt"):
180
- assert self.option.device == "gpu"
181
- if not USE_PIR_TRT:
182
- if self.option.shape_info_filename is None:
183
- shape_range_info_path = (
184
- self.model_dir / "shape_range_info.pbtxt"
185
- ).as_posix()
186
- else:
187
- shape_range_info_path = self.option.shape_info_filename
188
- if not os.path.exists(shape_range_info_path):
189
- logging.info(
190
- f"Dynamic shape info is collected into: {shape_range_info_path}"
191
- )
192
- collect_trt_shapes(
193
- model_file,
194
- params_file,
195
- self.option.device_id,
196
- shape_range_info_path,
197
- self.option.trt_dynamic_shapes,
198
- )
199
- else:
200
- logging.info(
201
- f"A dynamic shape info file ( {shape_range_info_path} ) already exists. No need to collect again."
202
- )
203
- self.option.shape_info_filename = shape_range_info_path
204
- else:
205
- trt_save_path = (
206
- Path(self.model_dir) / "trt" / self.model_prefix
207
- ).as_posix()
208
- pp_model_path = (Path(self.model_dir) / self.model_prefix).as_posix()
209
- convert_trt(
210
- self.option.run_mode,
211
- pp_model_path,
212
- trt_save_path,
213
- self.option.trt_dynamic_shapes,
214
- )
215
- model_file = trt_save_path + ".json"
216
- params_file = trt_save_path + ".pdiparams"
322
+ if (
323
+ self._option.device_type in ("gpu", "dcu", "npu", "mlu", "gcu", "xpu")
324
+ and self._option.device_id is None
325
+ ):
326
+ self._option.device_id = 0
327
+ logging.debug("`device_id` has been set to 0")
217
328
 
218
- config = Config(model_file, params_file)
219
- if self.option.device == "gpu":
329
+ # for TRT
330
+ if self._option.run_mode.startswith("trt"):
331
+ assert self._option.device_type == "gpu"
332
+ cache_dir = self.model_dir / CACHE_DIR / "paddle"
333
+ config = self._configure_trt(
334
+ model_file,
335
+ params_file,
336
+ cache_dir,
337
+ )
220
338
  config.exp_disable_mixed_precision_ops({"feed", "fetch"})
221
- config.enable_use_gpu(100, self.option.device_id)
222
- if not self.option.run_mode.startswith("trt"):
339
+ config.enable_use_gpu(100, self._option.device_id)
340
+ # for Native Paddle and MKLDNN
341
+ else:
342
+ config = paddle.inference.Config(str(model_file), str(params_file))
343
+ if self._option.device_type == "gpu":
344
+ config.exp_disable_mixed_precision_ops({"feed", "fetch"})
345
+ from paddle.inference import PrecisionType
346
+
347
+ precision = (
348
+ PrecisionType.Half
349
+ if self._option.run_mode == "paddle_fp16"
350
+ else PrecisionType.Float32
351
+ )
352
+ config.disable_mkldnn()
353
+ config.enable_use_gpu(100, self._option.device_id, precision)
223
354
  if hasattr(config, "enable_new_ir"):
224
- config.enable_new_ir(self.option.enable_new_ir)
355
+ config.enable_new_ir(self._option.enable_new_ir)
356
+ if self._option.enable_new_ir and self._option.enable_cinn:
357
+ config.enable_cinn()
225
358
  if hasattr(config, "enable_new_executor"):
226
359
  config.enable_new_executor()
227
360
  config.set_optimization_level(3)
228
- # NOTE: The pptrt settings are not aligned with those of FD.
229
- else:
230
- if not USE_PIR_TRT:
231
- precision_map = {
232
- "trt_int8": Config.Precision.Int8,
233
- "trt_fp32": Config.Precision.Float32,
234
- "trt_fp16": Config.Precision.Half,
235
- }
236
- config.enable_tensorrt_engine(
237
- workspace_size=(1 << 30) * self.option.batch_size,
238
- max_batch_size=self.option.batch_size,
239
- min_subgraph_size=self.option.min_subgraph_size,
240
- precision_mode=precision_map[self.option.run_mode],
241
- use_static=self.option.trt_use_static,
242
- use_calib_mode=self.option.trt_calib_mode,
243
- )
244
- config.enable_tuned_tensorrt_dynamic_shape(
245
- self.option.shape_info_filename, True
246
- )
247
- elif self.option.device == "npu":
248
- config.enable_custom_device("npu")
249
- if hasattr(config, "enable_new_executor"):
250
- config.enable_new_executor()
251
- elif self.option.device == "xpu":
252
- if hasattr(config, "enable_new_executor"):
253
- config.enable_new_executor()
254
- elif self.option.device == "mlu":
255
- config.enable_custom_device("mlu")
256
- if hasattr(config, "enable_new_executor"):
257
- config.enable_new_executor()
258
- elif self.option.device == "dcu":
259
- config.enable_use_gpu(100, self.option.device_id)
260
- if hasattr(config, "enable_new_executor"):
261
- config.enable_new_executor()
262
- # XXX: is_compiled_with_rocm() must be True on dcu platform ?
263
- if paddle.is_compiled_with_rocm():
264
- # Delete unsupported passes in dcu
265
- config.delete_pass("conv2d_add_act_fuse_pass")
266
- config.delete_pass("conv2d_add_fuse_pass")
267
- else:
268
- assert self.option.device == "cpu"
269
- config.disable_gpu()
270
- if "mkldnn" in self.option.run_mode:
271
- try:
272
- config.enable_mkldnn()
273
- if "bf16" in self.option.run_mode:
274
- config.enable_mkldnn_bfloat16()
275
- except Exception as e:
276
- logging.warning(
277
- "MKL-DNN is not available. We will disable MKL-DNN."
278
- )
279
- config.set_mkldnn_cache_capacity(-1)
361
+ elif self._option.device_type == "npu":
362
+ config.enable_custom_device("npu", self._option.device_id)
363
+ if hasattr(config, "enable_new_ir"):
364
+ config.enable_new_ir(self._option.enable_new_ir)
365
+ if hasattr(config, "enable_new_executor"):
366
+ config.enable_new_executor()
367
+ elif self._option.device_type == "xpu":
368
+ config.enable_xpu()
369
+ config.set_xpu_device_id(self._option.device_id)
370
+ if hasattr(config, "enable_new_ir"):
371
+ config.enable_new_ir(self._option.enable_new_ir)
372
+ if hasattr(config, "enable_new_executor"):
373
+ config.enable_new_executor()
374
+ config.delete_pass("conv2d_bn_xpu_fuse_pass")
375
+ config.delete_pass("transfer_layout_pass")
376
+ elif self._option.device_type == "mlu":
377
+ config.enable_custom_device("mlu", self._option.device_id)
378
+ if hasattr(config, "enable_new_ir"):
379
+ config.enable_new_ir(self._option.enable_new_ir)
380
+ if hasattr(config, "enable_new_executor"):
381
+ config.enable_new_executor()
382
+ elif self._option.device_type == "gcu":
383
+ from paddle_custom_device.gcu import passes as gcu_passes
384
+
385
+ gcu_passes.setUp()
386
+ config.enable_custom_device("gcu", self._option.device_id)
387
+ if hasattr(config, "enable_new_ir"):
388
+ config.enable_new_ir()
389
+ if hasattr(config, "enable_new_executor"):
390
+ config.enable_new_executor()
391
+ else:
392
+ pass_builder = config.pass_builder()
393
+ name = "PaddleX_" + self._option.model_name
394
+ gcu_passes.append_passes_for_legacy_ir(pass_builder, name)
395
+ elif self._option.device_type == "dcu":
396
+ if hasattr(config, "enable_new_ir"):
397
+ config.enable_new_ir(self._option.enable_new_ir)
398
+ config.enable_use_gpu(100, self._option.device_id)
399
+ if hasattr(config, "enable_new_executor"):
400
+ config.enable_new_executor()
401
+ # XXX: is_compiled_with_rocm() must be True on dcu platform ?
402
+ if paddle.is_compiled_with_rocm():
403
+ # Delete unsupported passes in dcu
404
+ config.delete_pass("conv2d_add_act_fuse_pass")
405
+ config.delete_pass("conv2d_add_fuse_pass")
280
406
  else:
281
- if hasattr(config, "disable_mkldnn"):
282
- config.disable_mkldnn()
283
- config.set_cpu_math_library_num_threads(self.option.cpu_threads)
407
+ assert self._option.device_type == "cpu"
408
+ config.disable_gpu()
409
+ if "mkldnn" in self._option.run_mode:
410
+ try:
411
+ config.enable_mkldnn()
412
+ if "bf16" in self._option.run_mode:
413
+ config.enable_mkldnn_bfloat16()
414
+ except Exception:
415
+ logging.warning(
416
+ "MKL-DNN is not available. We will disable MKL-DNN."
417
+ )
418
+ config.set_mkldnn_cache_capacity(-1)
419
+ else:
420
+ if hasattr(config, "disable_mkldnn"):
421
+ config.disable_mkldnn()
422
+ config.set_cpu_math_library_num_threads(self._option.cpu_threads)
284
423
 
285
- if hasattr(config, "enable_new_ir"):
286
- config.enable_new_ir(self.option.enable_new_ir)
287
- if hasattr(config, "enable_new_executor"):
288
- config.enable_new_executor()
289
- config.set_optimization_level(3)
424
+ if hasattr(config, "enable_new_ir"):
425
+ config.enable_new_ir(self._option.enable_new_ir)
426
+ if hasattr(config, "enable_new_executor"):
427
+ config.enable_new_executor()
428
+ config.set_optimization_level(3)
290
429
 
291
430
  config.enable_memory_optim()
292
- for del_p in self.option.delete_pass:
431
+ for del_p in self._option.delete_pass:
293
432
  config.delete_pass(del_p)
294
433
 
295
434
  # Disable paddle inference logging
296
435
  if not DEBUG:
297
436
  config.disable_glog_info()
298
437
 
299
- predictor = create_predictor(config)
438
+ predictor = paddle.inference.create_predictor(config)
439
+
440
+ return predictor
441
+
442
+ def _configure_trt(self, model_file, params_file, cache_dir):
443
+ # TODO: Support calibration
444
+ import paddle.inference
445
+
446
+ if USE_PIR_TRT:
447
+ if self._option.trt_dynamic_shapes is None:
448
+ raise RuntimeError("No dynamic shape information provided")
449
+ trt_save_path = cache_dir / "trt" / self.model_file_prefix
450
+ trt_model_file = trt_save_path.with_suffix(".json")
451
+ trt_params_file = trt_save_path.with_suffix(".pdiparams")
452
+ if not trt_model_file.exists() or not trt_params_file.exists():
453
+ _convert_trt(
454
+ self._option.trt_cfg_setting,
455
+ model_file,
456
+ params_file,
457
+ trt_save_path,
458
+ self._option.device_id,
459
+ self._option.trt_dynamic_shapes,
460
+ self._option.trt_dynamic_shape_input_data,
461
+ )
462
+ else:
463
+ logging.debug(
464
+ f"Use TRT cache files(`{trt_model_file}` and `{trt_params_file}`)."
465
+ )
466
+ config = paddle.inference.Config(str(trt_model_file), str(trt_params_file))
467
+ else:
468
+ config = paddle.inference.Config(str(model_file), str(params_file))
469
+ config.set_optim_cache_dir(str(cache_dir / "optim_cache"))
470
+ # call enable_use_gpu() first to use TensorRT engine
471
+ config.enable_use_gpu(100, self._option.device_id)
472
+ for func_name in self._option.trt_cfg_setting:
473
+ assert hasattr(
474
+ config, func_name
475
+ ), f"The `{type(config)}` don't have function `{func_name}`!"
476
+ args = self._option.trt_cfg_setting[func_name]
477
+ if isinstance(args, list):
478
+ getattr(config, func_name)(*args)
479
+ else:
480
+ getattr(config, func_name)(**args)
481
+
482
+ if self._option.trt_use_dynamic_shapes:
483
+ if self._option.trt_dynamic_shapes is None:
484
+ raise RuntimeError("No dynamic shape information provided")
485
+ if self._option.trt_collect_shape_range_info:
486
+ # NOTE: We always use a shape range info file.
487
+ if self._option.trt_shape_range_info_path is not None:
488
+ trt_shape_range_info_path = Path(
489
+ self._option.trt_shape_range_info_path
490
+ )
491
+ else:
492
+ trt_shape_range_info_path = cache_dir / "shape_range_info.pbtxt"
493
+ should_collect_shape_range_info = True
494
+ if not trt_shape_range_info_path.exists():
495
+ trt_shape_range_info_path.parent.mkdir(
496
+ parents=True, exist_ok=True
497
+ )
498
+ logging.info(
499
+ f"Shape range info will be collected into {trt_shape_range_info_path}"
500
+ )
501
+ elif self._option.trt_discard_cached_shape_range_info:
502
+ trt_shape_range_info_path.unlink()
503
+ logging.info(
504
+ f"The shape range info file ({trt_shape_range_info_path}) has been removed, and the shape range info will be re-collected."
505
+ )
506
+ else:
507
+ logging.info(
508
+ f"A shape range info file ({trt_shape_range_info_path}) already exists. There is no need to collect the info again."
509
+ )
510
+ should_collect_shape_range_info = False
511
+ if should_collect_shape_range_info:
512
+ _collect_trt_shape_range_info(
513
+ str(model_file),
514
+ str(params_file),
515
+ self._option.device_id,
516
+ str(trt_shape_range_info_path),
517
+ self._option.trt_dynamic_shapes,
518
+ self._option.trt_dynamic_shape_input_data,
519
+ )
520
+ if (
521
+ self._option.model_name in DISABLE_TRT_HALF_OPS_CONFIG
522
+ and self._option.run_mode == "trt_fp16"
523
+ ):
524
+ paddle.inference.InternalUtils.disable_tensorrt_half_ops(
525
+ config, DISABLE_TRT_HALF_OPS_CONFIG[self._option.model_name]
526
+ )
527
+ config.enable_tuned_tensorrt_dynamic_shape(
528
+ str(trt_shape_range_info_path),
529
+ self._option.trt_allow_rebuild_at_runtime,
530
+ )
531
+ else:
532
+ min_shapes, opt_shapes, max_shapes = {}, {}, {}
533
+ for (
534
+ key,
535
+ shapes,
536
+ ) in self._option.trt_dynamic_shapes.items():
537
+ min_shapes[key] = shapes[0]
538
+ opt_shapes[key] = shapes[1]
539
+ max_shapes[key] = shapes[2]
540
+ config.set_trt_dynamic_shape_info(
541
+ min_shapes, max_shapes, opt_shapes
542
+ )
543
+
544
+ return config
545
+
546
+
547
+ # FIXME: Name might be misleading
548
+ @benchmark.timeit
549
+ @class_requires_deps("ultra-infer")
550
+ class MultiBackendInfer(object):
551
+ def __init__(self, ui_runtime):
552
+ super().__init__()
553
+ self.ui_runtime = ui_runtime
300
554
 
301
- # Get input and output handlers
302
- input_names = predictor.get_input_names()
303
- input_names.sort()
304
- input_handlers = []
305
- output_handlers = []
306
- for input_name in input_names:
307
- input_handler = predictor.get_input_handle(input_name)
308
- input_handlers.append(input_handler)
309
- output_names = predictor.get_output_names()
310
- for output_name in output_names:
311
- output_handler = predictor.get_output_handle(output_name)
312
- output_handlers.append(output_handler)
313
- return predictor, input_handlers, output_handlers
314
-
315
- def __call__(self, x) -> List[Any]:
316
- if self.option.changed:
317
- self._reset()
318
- self.copy2gpu(x)
319
- self.infer()
320
- pred = self.copy2cpu()
321
- return pred
555
+ # The time consumed by the wrapper code will also be taken into account.
556
+ def __call__(self, x):
557
+ outputs = self.ui_runtime.infer(x)
558
+ return outputs
559
+
560
+
561
+ # TODO: It would be better to refactor the code to make `HPInfer` a higher-level
562
+ # class that uses `PaddleInfer`.
563
+ @class_requires_deps("ultra-infer")
564
+ class HPInfer(StaticInfer):
565
+ def __init__(
566
+ self,
567
+ model_dir: Union[str, PathLike],
568
+ model_file_prefix: str,
569
+ config: HPIConfig,
570
+ ) -> None:
571
+ super().__init__()
572
+ self._model_dir = Path(model_dir)
573
+ self._model_file_prefix = model_file_prefix
574
+ self._config = config
575
+ backend, backend_config = self._determine_backend_and_config()
576
+ if backend == "paddle":
577
+ self._use_paddle = True
578
+ self._paddle_infer = self._build_paddle_infer(backend_config)
579
+ else:
580
+ self._use_paddle = False
581
+ ui_runtime = self._build_ui_runtime(backend, backend_config)
582
+ self._multi_backend_infer = MultiBackendInfer(ui_runtime)
583
+ num_inputs = ui_runtime.num_inputs()
584
+ self._input_names = [
585
+ ui_runtime.get_input_info(i).name for i in range(num_inputs)
586
+ ]
587
+
588
+ @property
589
+ def model_dir(self) -> Path:
590
+ return self._model_dir
591
+
592
+ @property
593
+ def model_file_prefix(self) -> str:
594
+ return self._model_file_prefix
322
595
 
323
596
  @property
324
- def benchmark(self):
325
- return {
326
- "Copy2GPU": self.copy2gpu,
327
- "Infer": self.infer,
328
- "Copy2CPU": self.copy2cpu,
597
+ def config(self) -> HPIConfig:
598
+ return self._config
599
+
600
+ def __call__(self, x: Sequence[np.ndarray]) -> List[np.ndarray]:
601
+ if self._use_paddle:
602
+ return self._call_paddle_infer(x)
603
+ else:
604
+ return self._call_multi_backend_infer(x)
605
+
606
+ def _call_paddle_infer(self, x):
607
+ return self._paddle_infer(x)
608
+
609
+ def _call_multi_backend_infer(self, x):
610
+ num_inputs = len(self._input_names)
611
+ if len(x) != num_inputs:
612
+ raise ValueError(f"Expected {num_inputs} inputs but got {len(x)} instead")
613
+ x = _sort_inputs(x, self._input_names)
614
+ inputs = {}
615
+ for name, input_ in zip(self._input_names, x):
616
+ inputs[name] = np.ascontiguousarray(input_)
617
+ return self._multi_backend_infer(inputs)
618
+
619
+ def _determine_backend_and_config(self):
620
+ if self._config.auto_config:
621
+ # Should we use the strategy pattern here to allow extensible
622
+ # strategies?
623
+ model_paths = get_model_paths(self._model_dir, self._model_file_prefix)
624
+ ret = suggest_inference_backend_and_config(
625
+ self._config,
626
+ model_paths,
627
+ )
628
+ if ret[0] is None:
629
+ # Should I use a custom exception?
630
+ raise RuntimeError(
631
+ f"No inference backend and configuration could be suggested. Reason: {ret[1]}"
632
+ )
633
+ backend, backend_config = ret
634
+ else:
635
+ backend = self._config.backend
636
+ if backend is None:
637
+ raise RuntimeError(
638
+ "When automatic configuration is not used, the inference backend must be specified manually."
639
+ )
640
+ backend_config = self._config.backend_config or {}
641
+
642
+ if backend == "paddle" and not backend_config:
643
+ logging.warning(
644
+ "The Paddle Inference backend is selected with the default configuration. This may not provide optimal performance."
645
+ )
646
+
647
+ return backend, backend_config
648
+
649
+ def _build_paddle_infer(self, backend_config):
650
+ kwargs = {
651
+ "device_type": self._config.device_type,
652
+ "device_id": self._config.device_id,
653
+ **backend_config,
329
654
  }
655
+ # TODO: This is probably redundant. Can we reuse the code in the
656
+ # predictor class?
657
+ paddle_info = None
658
+ if self._config.hpi_info:
659
+ hpi_info = self._config.hpi_info
660
+ if hpi_info.backend_configs:
661
+ paddle_info = hpi_info.backend_configs.paddle_infer
662
+ if paddle_info is not None:
663
+ if (
664
+ kwargs.get("trt_dynamic_shapes") is None
665
+ and paddle_info.trt_dynamic_shapes is not None
666
+ ):
667
+ trt_dynamic_shapes = paddle_info.trt_dynamic_shapes
668
+ logging.debug("TensorRT dynamic shapes set to %s", trt_dynamic_shapes)
669
+ kwargs["trt_dynamic_shapes"] = trt_dynamic_shapes
670
+ if (
671
+ kwargs.get("trt_dynamic_shape_input_data") is None
672
+ and paddle_info.trt_dynamic_shape_input_data is not None
673
+ ):
674
+ trt_dynamic_shape_input_data = paddle_info.trt_dynamic_shape_input_data
675
+ logging.debug(
676
+ "TensorRT dynamic shape input data set to %s",
677
+ trt_dynamic_shape_input_data,
678
+ )
679
+ kwargs["trt_dynamic_shape_input_data"] = trt_dynamic_shape_input_data
680
+ pp_option = PaddlePredictorOption(self._config.pdx_model_name, **kwargs)
681
+ logging.info("Using Paddle Inference backend")
682
+ logging.info("Paddle predictor option: %s", pp_option)
683
+ return PaddleInfer(self._model_dir, self._model_file_prefix, option=pp_option)
684
+
685
+ def _build_ui_runtime(self, backend, backend_config, ui_option=None):
686
+ from ultra_infer import ModelFormat, Runtime, RuntimeOption
687
+
688
+ if ui_option is None:
689
+ ui_option = RuntimeOption()
690
+
691
+ if self._config.device_type == "cpu":
692
+ pass
693
+ elif self._config.device_type == "gpu":
694
+ ui_option.use_gpu(self._config.device_id or 0)
695
+ elif self._config.device_type == "npu":
696
+ ui_option.use_ascend(self._config.device_id or 0)
697
+ else:
698
+ raise RuntimeError(
699
+ f"Unsupported device type {repr(self._config.device_type)}"
700
+ )
701
+
702
+ model_paths = get_model_paths(self._model_dir, self.model_file_prefix)
703
+ if backend in ("openvino", "onnxruntime", "tensorrt"):
704
+ # XXX: This introduces side effects.
705
+ if "onnx" not in model_paths:
706
+ if self._config.auto_paddle2onnx:
707
+ if "paddle" not in model_paths:
708
+ raise RuntimeError("PaddlePaddle model required")
709
+ # The CLI is used here since there is currently no API.
710
+ logging.info(
711
+ "Automatically converting PaddlePaddle model to ONNX format"
712
+ )
713
+ try:
714
+ subprocess.run(
715
+ [
716
+ "paddlex",
717
+ "--paddle2onnx",
718
+ "--paddle_model_dir",
719
+ str(self._model_dir),
720
+ "--onnx_model_dir",
721
+ str(self._model_dir),
722
+ ],
723
+ capture_output=True,
724
+ check=True,
725
+ text=True,
726
+ )
727
+ except subprocess.CalledProcessError as e:
728
+ raise RuntimeError(
729
+ f"PaddlePaddle-to-ONNX conversion failed:\n{e.stderr}"
730
+ ) from e
731
+ model_paths = get_model_paths(
732
+ self._model_dir, self.model_file_prefix
733
+ )
734
+ assert "onnx" in model_paths
735
+ else:
736
+ raise RuntimeError("ONNX model required")
737
+ ui_option.set_model_path(str(model_paths["onnx"]), "", ModelFormat.ONNX)
738
+ elif backend == "om":
739
+ if "om" not in model_paths:
740
+ raise RuntimeError("OM model required")
741
+ ui_option.set_model_path(str(model_paths["om"]), "", ModelFormat.OM)
742
+ else:
743
+ raise ValueError(f"Unsupported inference backend {repr(backend)}")
744
+
745
+ if backend == "openvino":
746
+ backend_config = OpenVINOConfig.model_validate(backend_config)
747
+ ui_option.use_openvino_backend()
748
+ ui_option.set_cpu_thread_num(backend_config.cpu_num_threads)
749
+ elif backend == "onnxruntime":
750
+ backend_config = ONNXRuntimeConfig.model_validate(backend_config)
751
+ ui_option.use_ort_backend()
752
+ ui_option.set_cpu_thread_num(backend_config.cpu_num_threads)
753
+ elif backend == "tensorrt":
754
+ if (
755
+ backend_config.get("use_dynamic_shapes", True)
756
+ and backend_config.get("dynamic_shapes") is None
757
+ ):
758
+ trt_info = None
759
+ if self._config.hpi_info:
760
+ hpi_info = self._config.hpi_info
761
+ if hpi_info.backend_configs:
762
+ trt_info = hpi_info.backend_configs.tensorrt
763
+ if trt_info is not None and trt_info.dynamic_shapes is not None:
764
+ trt_dynamic_shapes = trt_info.dynamic_shapes
765
+ logging.debug(
766
+ "TensorRT dynamic shapes set to %s", trt_dynamic_shapes
767
+ )
768
+ backend_config = {
769
+ **backend_config,
770
+ "dynamic_shapes": trt_dynamic_shapes,
771
+ }
772
+ backend_config = TensorRTConfig.model_validate(backend_config)
773
+ ui_option.use_trt_backend()
774
+ cache_dir = self._model_dir / CACHE_DIR / "tensorrt"
775
+ cache_dir.mkdir(parents=True, exist_ok=True)
776
+ ui_option.trt_option.serialize_file = str(cache_dir / "trt_serialized.trt")
777
+ if backend_config.precision == "fp16":
778
+ ui_option.trt_option.enable_fp16 = True
779
+ if not backend_config.use_dynamic_shapes:
780
+ raise RuntimeError(
781
+ "TensorRT static shape inference is currently not supported"
782
+ )
783
+ if backend_config.dynamic_shapes is not None:
784
+ if not Path(ui_option.trt_option.serialize_file).exists():
785
+ for name, shapes in backend_config.dynamic_shapes.items():
786
+ ui_option.trt_option.set_shape(name, *shapes)
787
+ else:
788
+ logging.info(
789
+ "TensorRT dynamic shapes will be loaded from the file."
790
+ )
791
+ elif backend == "om":
792
+ backend_config = OMConfig.model_validate(backend_config)
793
+ ui_option.use_om_backend()
794
+ else:
795
+ raise ValueError(f"Unsupported inference backend {repr(backend)}")
796
+
797
+ logging.info("Inference backend: %s", backend)
798
+ logging.info("Inference backend config: %s", backend_config)
799
+
800
+ ui_runtime = Runtime(ui_option)
801
+
802
+ return ui_runtime