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.
- paddlex/.version +1 -1
- paddlex/__init__.py +17 -34
- paddlex/__main__.py +1 -1
- paddlex/configs/modules/chart_parsing/PP-Chart2Table.yaml +13 -0
- paddlex/configs/modules/doc_vlm/PP-DocBee-2B.yaml +14 -0
- paddlex/configs/modules/doc_vlm/PP-DocBee-7B.yaml +14 -0
- paddlex/configs/modules/doc_vlm/PP-DocBee2-3B.yaml +14 -0
- paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-L.yaml +40 -0
- paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-M.yaml +40 -0
- paddlex/configs/modules/formula_recognition/PP-FormulaNet_plus-S.yaml +40 -0
- paddlex/configs/modules/layout_detection/PP-DocBlockLayout.yaml +40 -0
- paddlex/configs/modules/layout_detection/PP-DocLayout-L.yaml +2 -2
- paddlex/configs/modules/layout_detection/PP-DocLayout-M.yaml +2 -2
- paddlex/configs/modules/layout_detection/PP-DocLayout-S.yaml +2 -2
- paddlex/configs/modules/layout_detection/PP-DocLayout_plus-L.yaml +40 -0
- paddlex/configs/modules/open_vocabulary_detection/YOLO-Worldv2-L.yaml +13 -0
- paddlex/configs/modules/text_detection/PP-OCRv5_mobile_det.yaml +40 -0
- paddlex/configs/modules/text_detection/PP-OCRv5_server_det.yaml +40 -0
- paddlex/configs/modules/text_recognition/PP-OCRv5_mobile_rec.yaml +39 -0
- paddlex/configs/modules/text_recognition/PP-OCRv5_server_rec.yaml +39 -0
- paddlex/configs/modules/textline_orientation/PP-LCNet_x1_0_textline_ori.yaml +41 -0
- paddlex/configs/pipelines/OCR.yaml +7 -6
- paddlex/configs/pipelines/PP-ChatOCRv3-doc.yaml +3 -1
- paddlex/configs/pipelines/PP-ChatOCRv4-doc.yaml +91 -34
- paddlex/configs/pipelines/PP-StructureV3.yaml +72 -72
- paddlex/configs/pipelines/anomaly_detection.yaml +1 -1
- paddlex/configs/pipelines/doc_understanding.yaml +9 -0
- paddlex/configs/pipelines/formula_recognition.yaml +2 -2
- paddlex/configs/pipelines/layout_parsing.yaml +3 -2
- paddlex/configs/pipelines/seal_recognition.yaml +1 -0
- paddlex/configs/pipelines/table_recognition.yaml +2 -1
- paddlex/configs/pipelines/table_recognition_v2.yaml +7 -1
- paddlex/configs/pipelines/ts_anomaly_detection.yaml +1 -1
- paddlex/configs/pipelines/ts_classification.yaml +1 -1
- paddlex/configs/pipelines/ts_forecast.yaml +1 -1
- paddlex/constants.py +17 -0
- paddlex/engine.py +7 -5
- paddlex/hpip_links.html +23 -11
- paddlex/inference/__init__.py +3 -3
- paddlex/inference/common/__init__.py +1 -1
- paddlex/inference/common/batch_sampler/__init__.py +5 -4
- paddlex/inference/common/batch_sampler/audio_batch_sampler.py +5 -6
- paddlex/inference/common/batch_sampler/base_batch_sampler.py +20 -16
- paddlex/inference/common/batch_sampler/det_3d_batch_sampler.py +4 -7
- paddlex/inference/common/batch_sampler/doc_vlm_batch_sampler.py +87 -0
- paddlex/inference/common/batch_sampler/image_batch_sampler.py +45 -60
- paddlex/inference/common/batch_sampler/ts_batch_sampler.py +9 -10
- paddlex/inference/common/batch_sampler/video_batch_sampler.py +2 -22
- paddlex/inference/common/reader/__init__.py +4 -4
- paddlex/inference/common/reader/audio_reader.py +3 -3
- paddlex/inference/common/reader/det_3d_reader.py +7 -5
- paddlex/inference/common/reader/image_reader.py +16 -12
- paddlex/inference/common/reader/ts_reader.py +3 -2
- paddlex/inference/common/reader/video_reader.py +3 -3
- paddlex/inference/common/result/__init__.py +7 -7
- paddlex/inference/common/result/base_cv_result.py +12 -2
- paddlex/inference/common/result/base_result.py +7 -5
- paddlex/inference/common/result/base_ts_result.py +1 -2
- paddlex/inference/common/result/base_video_result.py +2 -2
- paddlex/inference/common/result/mixin.py +31 -25
- paddlex/inference/models/__init__.py +41 -85
- paddlex/inference/models/anomaly_detection/__init__.py +1 -1
- paddlex/inference/models/anomaly_detection/predictor.py +9 -19
- paddlex/inference/models/anomaly_detection/processors.py +9 -2
- paddlex/inference/models/anomaly_detection/result.py +3 -2
- paddlex/inference/models/base/__init__.py +2 -2
- paddlex/inference/models/base/predictor/__init__.py +1 -2
- paddlex/inference/models/base/predictor/base_predictor.py +278 -39
- paddlex/inference/models/common/__init__.py +6 -15
- paddlex/inference/models/common/static_infer.py +724 -251
- paddlex/inference/models/common/tokenizer/__init__.py +7 -3
- paddlex/inference/models/common/tokenizer/bert_tokenizer.py +1 -1
- paddlex/inference/models/common/tokenizer/clip_tokenizer.py +609 -0
- paddlex/inference/models/common/tokenizer/gpt_tokenizer.py +9 -7
- paddlex/inference/models/common/tokenizer/qwen2_5_tokenizer.py +112 -0
- paddlex/inference/models/common/tokenizer/qwen2_tokenizer.py +438 -0
- paddlex/inference/models/common/tokenizer/qwen_tokenizer.py +288 -0
- paddlex/inference/models/common/tokenizer/tokenizer_utils.py +85 -77
- paddlex/inference/models/common/tokenizer/tokenizer_utils_base.py +339 -123
- paddlex/inference/models/common/tokenizer/utils.py +1 -1
- paddlex/inference/models/common/tokenizer/vocab.py +8 -8
- paddlex/inference/models/common/ts/__init__.py +1 -1
- paddlex/inference/models/common/ts/funcs.py +13 -6
- paddlex/inference/models/common/ts/processors.py +14 -5
- paddlex/inference/models/common/vision/__init__.py +3 -3
- paddlex/inference/models/common/vision/funcs.py +17 -12
- paddlex/inference/models/common/vision/processors.py +61 -46
- paddlex/inference/models/common/vlm/__init__.py +13 -0
- paddlex/inference/models/common/vlm/activations.py +189 -0
- paddlex/inference/models/common/vlm/bert_padding.py +127 -0
- paddlex/inference/models/common/vlm/conversion_utils.py +99 -0
- paddlex/inference/models/common/vlm/distributed.py +229 -0
- paddlex/inference/models/common/vlm/flash_attn_utils.py +119 -0
- paddlex/inference/models/common/vlm/fusion_ops.py +205 -0
- paddlex/inference/models/common/vlm/generation/__init__.py +34 -0
- paddlex/inference/models/common/vlm/generation/configuration_utils.py +533 -0
- paddlex/inference/models/common/vlm/generation/logits_process.py +730 -0
- paddlex/inference/models/common/vlm/generation/stopping_criteria.py +106 -0
- paddlex/inference/models/common/vlm/generation/utils.py +2162 -0
- paddlex/inference/models/common/vlm/transformers/__init__.py +16 -0
- paddlex/inference/models/common/vlm/transformers/configuration_utils.py +1037 -0
- paddlex/inference/models/common/vlm/transformers/conversion_utils.py +408 -0
- paddlex/inference/models/common/vlm/transformers/model_outputs.py +1612 -0
- paddlex/inference/models/common/vlm/transformers/model_utils.py +2014 -0
- paddlex/inference/models/common/vlm/transformers/utils.py +178 -0
- paddlex/inference/models/common/vlm/utils.py +109 -0
- paddlex/inference/models/doc_vlm/__init__.py +15 -0
- paddlex/inference/models/doc_vlm/modeling/GOT_ocr_2_0.py +830 -0
- paddlex/inference/models/doc_vlm/modeling/__init__.py +17 -0
- paddlex/inference/models/doc_vlm/modeling/qwen2.py +1606 -0
- paddlex/inference/models/doc_vlm/modeling/qwen2_5_vl.py +3006 -0
- paddlex/inference/models/doc_vlm/modeling/qwen2_vl.py +2495 -0
- paddlex/inference/models/doc_vlm/predictor.py +253 -0
- paddlex/inference/models/doc_vlm/processors/GOT_ocr_2_0.py +97 -0
- paddlex/inference/models/doc_vlm/processors/__init__.py +17 -0
- paddlex/inference/models/doc_vlm/processors/common.py +561 -0
- paddlex/inference/models/doc_vlm/processors/qwen2_5_vl.py +548 -0
- paddlex/inference/models/doc_vlm/processors/qwen2_vl.py +543 -0
- paddlex/inference/models/doc_vlm/result.py +21 -0
- paddlex/inference/models/face_feature/__init__.py +1 -1
- paddlex/inference/models/face_feature/predictor.py +2 -1
- paddlex/inference/models/formula_recognition/__init__.py +1 -1
- paddlex/inference/models/formula_recognition/predictor.py +18 -28
- paddlex/inference/models/formula_recognition/processors.py +126 -97
- paddlex/inference/models/formula_recognition/result.py +43 -35
- paddlex/inference/models/image_classification/__init__.py +1 -1
- paddlex/inference/models/image_classification/predictor.py +9 -19
- paddlex/inference/models/image_classification/processors.py +4 -2
- paddlex/inference/models/image_classification/result.py +4 -3
- paddlex/inference/models/image_feature/__init__.py +1 -1
- paddlex/inference/models/image_feature/predictor.py +9 -19
- paddlex/inference/models/image_feature/processors.py +7 -5
- paddlex/inference/models/image_feature/result.py +2 -3
- paddlex/inference/models/image_multilabel_classification/__init__.py +1 -1
- paddlex/inference/models/image_multilabel_classification/predictor.py +7 -6
- paddlex/inference/models/image_multilabel_classification/processors.py +6 -2
- paddlex/inference/models/image_multilabel_classification/result.py +4 -3
- paddlex/inference/models/image_unwarping/__init__.py +1 -1
- paddlex/inference/models/image_unwarping/predictor.py +8 -16
- paddlex/inference/models/image_unwarping/processors.py +6 -2
- paddlex/inference/models/image_unwarping/result.py +4 -2
- paddlex/inference/models/instance_segmentation/__init__.py +1 -1
- paddlex/inference/models/instance_segmentation/predictor.py +7 -15
- paddlex/inference/models/instance_segmentation/processors.py +4 -7
- paddlex/inference/models/instance_segmentation/result.py +11 -10
- paddlex/inference/models/keypoint_detection/__init__.py +1 -1
- paddlex/inference/models/keypoint_detection/predictor.py +5 -3
- paddlex/inference/models/keypoint_detection/processors.py +11 -3
- paddlex/inference/models/keypoint_detection/result.py +9 -4
- paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/__init__.py +1 -1
- paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/predictor.py +15 -26
- paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/processors.py +26 -14
- paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/result.py +15 -12
- paddlex/inference/models/{3d_bev_detection → m_3d_bev_detection}/visualizer_3d.py +77 -39
- paddlex/inference/models/multilingual_speech_recognition/__init__.py +1 -1
- paddlex/inference/models/multilingual_speech_recognition/predictor.py +11 -15
- paddlex/inference/models/multilingual_speech_recognition/processors.py +45 -53
- paddlex/inference/models/multilingual_speech_recognition/result.py +1 -1
- paddlex/inference/models/object_detection/__init__.py +1 -1
- paddlex/inference/models/object_detection/predictor.py +8 -12
- paddlex/inference/models/object_detection/processors.py +63 -33
- paddlex/inference/models/object_detection/result.py +5 -4
- paddlex/inference/models/object_detection/utils.py +3 -1
- paddlex/inference/models/open_vocabulary_detection/__init__.py +1 -1
- paddlex/inference/models/open_vocabulary_detection/predictor.py +31 -14
- paddlex/inference/models/open_vocabulary_detection/processors/__init__.py +3 -2
- paddlex/inference/models/open_vocabulary_detection/processors/common.py +114 -0
- paddlex/inference/models/open_vocabulary_detection/processors/groundingdino_processors.py +19 -8
- paddlex/inference/models/open_vocabulary_detection/processors/yoloworld_processors.py +209 -0
- paddlex/inference/models/open_vocabulary_segmentation/__init__.py +1 -1
- paddlex/inference/models/open_vocabulary_segmentation/predictor.py +6 -13
- paddlex/inference/models/open_vocabulary_segmentation/processors/__init__.py +1 -1
- paddlex/inference/models/open_vocabulary_segmentation/processors/sam_processer.py +12 -12
- paddlex/inference/models/open_vocabulary_segmentation/results/__init__.py +1 -1
- paddlex/inference/models/open_vocabulary_segmentation/results/sam_result.py +11 -9
- paddlex/inference/models/semantic_segmentation/__init__.py +1 -1
- paddlex/inference/models/semantic_segmentation/predictor.py +9 -18
- paddlex/inference/models/semantic_segmentation/processors.py +11 -8
- paddlex/inference/models/semantic_segmentation/result.py +4 -3
- paddlex/inference/models/table_structure_recognition/__init__.py +1 -1
- paddlex/inference/models/table_structure_recognition/predictor.py +8 -18
- paddlex/inference/models/table_structure_recognition/processors.py +23 -29
- paddlex/inference/models/table_structure_recognition/result.py +8 -15
- paddlex/inference/models/text_detection/__init__.py +1 -1
- paddlex/inference/models/text_detection/predictor.py +24 -24
- paddlex/inference/models/text_detection/processors.py +116 -44
- paddlex/inference/models/text_detection/result.py +8 -13
- paddlex/inference/models/text_recognition/__init__.py +1 -1
- paddlex/inference/models/text_recognition/predictor.py +11 -19
- paddlex/inference/models/text_recognition/processors.py +27 -13
- paddlex/inference/models/text_recognition/result.py +3 -2
- paddlex/inference/models/ts_anomaly_detection/__init__.py +1 -1
- paddlex/inference/models/ts_anomaly_detection/predictor.py +12 -17
- paddlex/inference/models/ts_anomaly_detection/processors.py +6 -2
- paddlex/inference/models/ts_anomaly_detection/result.py +21 -10
- paddlex/inference/models/ts_classification/__init__.py +1 -1
- paddlex/inference/models/ts_classification/predictor.py +14 -27
- paddlex/inference/models/ts_classification/processors.py +7 -2
- paddlex/inference/models/ts_classification/result.py +21 -12
- paddlex/inference/models/ts_forecasting/__init__.py +1 -1
- paddlex/inference/models/ts_forecasting/predictor.py +13 -18
- paddlex/inference/models/ts_forecasting/processors.py +12 -3
- paddlex/inference/models/ts_forecasting/result.py +24 -11
- paddlex/inference/models/video_classification/__init__.py +1 -1
- paddlex/inference/models/video_classification/predictor.py +9 -15
- paddlex/inference/models/video_classification/processors.py +24 -24
- paddlex/inference/models/video_classification/result.py +7 -3
- paddlex/inference/models/video_detection/__init__.py +1 -1
- paddlex/inference/models/video_detection/predictor.py +8 -15
- paddlex/inference/models/video_detection/processors.py +24 -11
- paddlex/inference/models/video_detection/result.py +10 -5
- paddlex/inference/pipelines/__init__.py +48 -37
- paddlex/inference/pipelines/_parallel.py +172 -0
- paddlex/inference/pipelines/anomaly_detection/__init__.py +1 -1
- paddlex/inference/pipelines/anomaly_detection/pipeline.py +29 -9
- paddlex/inference/pipelines/attribute_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/attribute_recognition/pipeline.py +24 -9
- paddlex/inference/pipelines/attribute_recognition/result.py +10 -8
- paddlex/inference/pipelines/base.py +43 -13
- paddlex/inference/pipelines/components/__init__.py +14 -8
- paddlex/inference/pipelines/components/chat_server/__init__.py +1 -1
- paddlex/inference/pipelines/components/chat_server/base.py +2 -2
- paddlex/inference/pipelines/components/chat_server/openai_bot_chat.py +8 -8
- paddlex/inference/pipelines/components/common/__init__.py +5 -4
- paddlex/inference/pipelines/components/common/base_operator.py +2 -1
- paddlex/inference/pipelines/components/common/base_result.py +3 -2
- paddlex/inference/pipelines/components/common/convert_points_and_boxes.py +1 -2
- paddlex/inference/pipelines/components/common/crop_image_regions.py +11 -5
- paddlex/inference/pipelines/components/common/seal_det_warp.py +44 -13
- paddlex/inference/pipelines/components/common/sort_boxes.py +4 -2
- paddlex/inference/pipelines/components/common/warp_image.py +50 -0
- paddlex/inference/pipelines/components/faisser.py +10 -5
- paddlex/inference/pipelines/components/prompt_engineering/__init__.py +2 -2
- paddlex/inference/pipelines/components/prompt_engineering/base.py +2 -2
- paddlex/inference/pipelines/components/prompt_engineering/generate_ensemble_prompt.py +2 -1
- paddlex/inference/pipelines/components/prompt_engineering/generate_kie_prompt.py +2 -2
- paddlex/inference/pipelines/components/retriever/__init__.py +2 -2
- paddlex/inference/pipelines/components/retriever/base.py +18 -16
- paddlex/inference/pipelines/components/retriever/openai_bot_retriever.py +2 -2
- paddlex/inference/pipelines/components/retriever/qianfan_bot_retriever.py +87 -84
- paddlex/inference/pipelines/components/utils/__init__.py +1 -1
- paddlex/inference/pipelines/components/utils/mixin.py +7 -7
- paddlex/inference/pipelines/doc_preprocessor/__init__.py +1 -1
- paddlex/inference/pipelines/doc_preprocessor/pipeline.py +70 -51
- paddlex/inference/pipelines/doc_preprocessor/result.py +5 -10
- paddlex/inference/pipelines/doc_understanding/__init__.py +15 -0
- paddlex/inference/pipelines/doc_understanding/pipeline.py +71 -0
- paddlex/inference/pipelines/face_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/face_recognition/pipeline.py +3 -1
- paddlex/inference/pipelines/face_recognition/result.py +3 -2
- paddlex/inference/pipelines/formula_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/formula_recognition/pipeline.py +137 -93
- paddlex/inference/pipelines/formula_recognition/result.py +20 -29
- paddlex/inference/pipelines/image_classification/__init__.py +1 -1
- paddlex/inference/pipelines/image_classification/pipeline.py +30 -11
- paddlex/inference/pipelines/image_multilabel_classification/__init__.py +1 -1
- paddlex/inference/pipelines/image_multilabel_classification/pipeline.py +31 -12
- paddlex/inference/pipelines/instance_segmentation/__init__.py +1 -1
- paddlex/inference/pipelines/instance_segmentation/pipeline.py +30 -9
- paddlex/inference/pipelines/keypoint_detection/__init__.py +1 -1
- paddlex/inference/pipelines/keypoint_detection/pipeline.py +30 -9
- paddlex/inference/pipelines/layout_parsing/__init__.py +1 -1
- paddlex/inference/pipelines/layout_parsing/pipeline.py +54 -56
- paddlex/inference/pipelines/layout_parsing/pipeline_v2.py +904 -261
- paddlex/inference/pipelines/layout_parsing/result.py +9 -21
- paddlex/inference/pipelines/layout_parsing/result_v2.py +525 -250
- paddlex/inference/pipelines/layout_parsing/setting.py +87 -0
- paddlex/inference/pipelines/layout_parsing/utils.py +570 -2004
- paddlex/inference/pipelines/layout_parsing/xycut_enhanced/__init__.py +16 -0
- paddlex/inference/pipelines/layout_parsing/xycut_enhanced/utils.py +1144 -0
- paddlex/inference/pipelines/layout_parsing/xycut_enhanced/xycuts.py +563 -0
- paddlex/inference/pipelines/{3d_bev_detection → m_3d_bev_detection}/__init__.py +1 -1
- paddlex/inference/pipelines/{3d_bev_detection → m_3d_bev_detection}/pipeline.py +17 -10
- paddlex/inference/pipelines/multilingual_speech_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/multilingual_speech_recognition/pipeline.py +17 -6
- paddlex/inference/pipelines/object_detection/__init__.py +1 -1
- paddlex/inference/pipelines/object_detection/pipeline.py +29 -9
- paddlex/inference/pipelines/ocr/__init__.py +1 -1
- paddlex/inference/pipelines/ocr/pipeline.py +151 -77
- paddlex/inference/pipelines/ocr/result.py +31 -24
- paddlex/inference/pipelines/open_vocabulary_detection/__init__.py +1 -1
- paddlex/inference/pipelines/open_vocabulary_detection/pipeline.py +17 -6
- paddlex/inference/pipelines/open_vocabulary_segmentation/__init__.py +1 -1
- paddlex/inference/pipelines/open_vocabulary_segmentation/pipeline.py +17 -6
- paddlex/inference/pipelines/pp_chatocr/__init__.py +1 -1
- paddlex/inference/pipelines/pp_chatocr/pipeline_base.py +14 -5
- paddlex/inference/pipelines/pp_chatocr/pipeline_v3.py +22 -14
- paddlex/inference/pipelines/pp_chatocr/pipeline_v4.py +34 -16
- paddlex/inference/pipelines/pp_shitu_v2/__init__.py +1 -1
- paddlex/inference/pipelines/pp_shitu_v2/pipeline.py +12 -8
- paddlex/inference/pipelines/pp_shitu_v2/result.py +4 -4
- paddlex/inference/pipelines/rotated_object_detection/__init__.py +1 -1
- paddlex/inference/pipelines/rotated_object_detection/pipeline.py +30 -9
- paddlex/inference/pipelines/seal_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/seal_recognition/pipeline.py +127 -63
- paddlex/inference/pipelines/seal_recognition/result.py +4 -2
- paddlex/inference/pipelines/semantic_segmentation/__init__.py +1 -1
- paddlex/inference/pipelines/semantic_segmentation/pipeline.py +30 -9
- paddlex/inference/pipelines/small_object_detection/__init__.py +1 -1
- paddlex/inference/pipelines/small_object_detection/pipeline.py +30 -9
- paddlex/inference/pipelines/table_recognition/__init__.py +1 -1
- paddlex/inference/pipelines/table_recognition/pipeline.py +61 -37
- paddlex/inference/pipelines/table_recognition/pipeline_v2.py +668 -65
- paddlex/inference/pipelines/table_recognition/result.py +12 -10
- paddlex/inference/pipelines/table_recognition/table_recognition_post_processing.py +12 -8
- paddlex/inference/pipelines/table_recognition/table_recognition_post_processing_v2.py +55 -37
- paddlex/inference/pipelines/table_recognition/utils.py +1 -1
- paddlex/inference/pipelines/ts_anomaly_detection/__init__.py +1 -1
- paddlex/inference/pipelines/ts_anomaly_detection/pipeline.py +16 -6
- paddlex/inference/pipelines/ts_classification/__init__.py +1 -1
- paddlex/inference/pipelines/ts_classification/pipeline.py +16 -6
- paddlex/inference/pipelines/ts_forecasting/__init__.py +1 -1
- paddlex/inference/pipelines/ts_forecasting/pipeline.py +16 -6
- paddlex/inference/pipelines/video_classification/__init__.py +1 -1
- paddlex/inference/pipelines/video_classification/pipeline.py +17 -6
- paddlex/inference/pipelines/video_detection/__init__.py +1 -1
- paddlex/inference/pipelines/video_detection/pipeline.py +20 -7
- paddlex/inference/serving/__init__.py +5 -1
- paddlex/inference/serving/basic_serving/__init__.py +1 -1
- paddlex/inference/serving/basic_serving/_app.py +31 -19
- paddlex/inference/serving/basic_serving/_pipeline_apps/__init__.py +7 -4
- paddlex/inference/serving/basic_serving/_pipeline_apps/_common/__init__.py +1 -1
- paddlex/inference/serving/basic_serving/_pipeline_apps/_common/common.py +12 -4
- paddlex/inference/serving/basic_serving/_pipeline_apps/_common/image_recognition.py +1 -1
- paddlex/inference/serving/basic_serving/_pipeline_apps/_common/ocr.py +7 -2
- paddlex/inference/serving/basic_serving/_pipeline_apps/anomaly_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/doc_preprocessor.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/doc_understanding.py +153 -0
- paddlex/inference/serving/basic_serving/_pipeline_apps/face_recognition.py +16 -13
- paddlex/inference/serving/basic_serving/_pipeline_apps/formula_recognition.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/human_keypoint_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/image_classification.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/image_multilabel_classification.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/instance_segmentation.py +13 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/layout_parsing.py +10 -8
- paddlex/inference/serving/basic_serving/_pipeline_apps/m_3d_bev_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/multilingual_speech_recognition.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/object_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/ocr.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/open_vocabulary_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/open_vocabulary_segmentation.py +13 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/pedestrian_attribute_recognition.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/pp_chatocrv3_doc.py +14 -12
- paddlex/inference/serving/basic_serving/_pipeline_apps/pp_chatocrv4_doc.py +17 -14
- paddlex/inference/serving/basic_serving/_pipeline_apps/pp_shituv2.py +16 -13
- paddlex/inference/serving/basic_serving/_pipeline_apps/pp_structurev3.py +16 -9
- paddlex/inference/serving/basic_serving/_pipeline_apps/rotated_object_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/seal_recognition.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/semantic_segmentation.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/small_object_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/table_recognition.py +11 -12
- paddlex/inference/serving/basic_serving/_pipeline_apps/table_recognition_v2.py +14 -12
- paddlex/inference/serving/basic_serving/_pipeline_apps/ts_anomaly_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/ts_classification.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/ts_forecast.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/vehicle_attribute_recognition.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/video_classification.py +10 -7
- paddlex/inference/serving/basic_serving/_pipeline_apps/video_detection.py +10 -7
- paddlex/inference/serving/basic_serving/_server.py +9 -4
- paddlex/inference/serving/infra/__init__.py +1 -1
- paddlex/inference/serving/infra/config.py +1 -1
- paddlex/inference/serving/infra/models.py +13 -6
- paddlex/inference/serving/infra/storage.py +9 -4
- paddlex/inference/serving/infra/utils.py +54 -28
- paddlex/inference/serving/schemas/__init__.py +1 -1
- paddlex/inference/serving/schemas/anomaly_detection.py +1 -1
- paddlex/inference/serving/schemas/doc_preprocessor.py +1 -1
- paddlex/inference/serving/schemas/doc_understanding.py +78 -0
- paddlex/inference/serving/schemas/face_recognition.py +1 -1
- paddlex/inference/serving/schemas/formula_recognition.py +2 -2
- paddlex/inference/serving/schemas/human_keypoint_detection.py +1 -1
- paddlex/inference/serving/schemas/image_classification.py +1 -1
- paddlex/inference/serving/schemas/image_multilabel_classification.py +1 -1
- paddlex/inference/serving/schemas/instance_segmentation.py +1 -1
- paddlex/inference/serving/schemas/layout_parsing.py +2 -3
- paddlex/inference/serving/schemas/m_3d_bev_detection.py +1 -1
- paddlex/inference/serving/schemas/multilingual_speech_recognition.py +1 -1
- paddlex/inference/serving/schemas/object_detection.py +1 -1
- paddlex/inference/serving/schemas/ocr.py +1 -1
- paddlex/inference/serving/schemas/open_vocabulary_detection.py +1 -1
- paddlex/inference/serving/schemas/open_vocabulary_segmentation.py +1 -1
- paddlex/inference/serving/schemas/pedestrian_attribute_recognition.py +1 -1
- paddlex/inference/serving/schemas/pp_chatocrv3_doc.py +2 -3
- paddlex/inference/serving/schemas/pp_chatocrv4_doc.py +3 -3
- paddlex/inference/serving/schemas/pp_shituv2.py +1 -1
- paddlex/inference/serving/schemas/pp_structurev3.py +11 -7
- paddlex/inference/serving/schemas/rotated_object_detection.py +1 -1
- paddlex/inference/serving/schemas/seal_recognition.py +2 -2
- paddlex/inference/serving/schemas/semantic_segmentation.py +1 -1
- paddlex/inference/serving/schemas/shared/__init__.py +1 -1
- paddlex/inference/serving/schemas/shared/classification.py +1 -1
- paddlex/inference/serving/schemas/shared/image_segmentation.py +1 -1
- paddlex/inference/serving/schemas/shared/object_detection.py +1 -1
- paddlex/inference/serving/schemas/shared/ocr.py +1 -1
- paddlex/inference/serving/schemas/small_object_detection.py +1 -1
- paddlex/inference/serving/schemas/table_recognition.py +3 -7
- paddlex/inference/serving/schemas/table_recognition_v2.py +6 -7
- paddlex/inference/serving/schemas/ts_anomaly_detection.py +1 -1
- paddlex/inference/serving/schemas/ts_classification.py +1 -1
- paddlex/inference/serving/schemas/ts_forecast.py +1 -1
- paddlex/inference/serving/schemas/vehicle_attribute_recognition.py +1 -1
- paddlex/inference/serving/schemas/video_classification.py +1 -1
- paddlex/inference/serving/schemas/video_detection.py +1 -1
- paddlex/inference/utils/__init__.py +1 -1
- paddlex/inference/utils/benchmark.py +332 -179
- paddlex/inference/utils/color_map.py +1 -1
- paddlex/inference/utils/get_pipeline_path.py +1 -1
- paddlex/inference/utils/hpi.py +258 -0
- paddlex/inference/utils/hpi_model_info_collection.json +2331 -0
- paddlex/inference/utils/io/__init__.py +11 -11
- paddlex/inference/utils/io/readers.py +31 -27
- paddlex/inference/utils/io/style.py +21 -14
- paddlex/inference/utils/io/tablepyxl.py +13 -5
- paddlex/inference/utils/io/writers.py +9 -10
- paddlex/inference/utils/mkldnn_blocklist.py +25 -0
- paddlex/inference/utils/model_paths.py +48 -0
- paddlex/inference/utils/{new_ir_blacklist.py → new_ir_blocklist.py} +1 -2
- paddlex/inference/utils/official_models.py +278 -262
- paddlex/inference/utils/pp_option.py +184 -92
- paddlex/inference/utils/trt_blocklist.py +43 -0
- paddlex/inference/utils/trt_config.py +420 -0
- paddlex/model.py +30 -12
- paddlex/modules/__init__.py +57 -80
- paddlex/modules/anomaly_detection/__init__.py +2 -2
- paddlex/modules/anomaly_detection/dataset_checker/__init__.py +2 -3
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/analyse_dataset.py +6 -3
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/check_dataset.py +8 -4
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/convert_dataset.py +7 -4
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/split_dataset.py +2 -2
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/anomaly_detection/dataset_checker/dataset_src/utils/visualizer.py +7 -2
- paddlex/modules/anomaly_detection/evaluator.py +3 -3
- paddlex/modules/anomaly_detection/exportor.py +1 -1
- paddlex/modules/anomaly_detection/model_list.py +1 -1
- paddlex/modules/anomaly_detection/trainer.py +3 -4
- paddlex/modules/base/__init__.py +5 -5
- paddlex/modules/base/build_model.py +1 -2
- paddlex/modules/base/dataset_checker/__init__.py +2 -2
- paddlex/modules/base/dataset_checker/dataset_checker.py +4 -4
- paddlex/modules/base/dataset_checker/utils.py +1 -3
- paddlex/modules/base/evaluator.py +13 -13
- paddlex/modules/base/exportor.py +12 -13
- paddlex/modules/base/trainer.py +21 -11
- paddlex/modules/base/utils/__init__.py +13 -0
- paddlex/modules/base/utils/cinn_setting.py +89 -0
- paddlex/modules/base/utils/coco_eval.py +94 -0
- paddlex/modules/base/utils/topk_eval.py +118 -0
- paddlex/modules/doc_vlm/__init__.py +18 -0
- paddlex/modules/doc_vlm/dataset_checker.py +29 -0
- paddlex/modules/doc_vlm/evaluator.py +29 -0
- paddlex/modules/doc_vlm/exportor.py +29 -0
- paddlex/modules/doc_vlm/model_list.py +16 -0
- paddlex/modules/doc_vlm/trainer.py +41 -0
- paddlex/modules/face_recognition/__init__.py +2 -2
- paddlex/modules/face_recognition/dataset_checker/__init__.py +2 -2
- paddlex/modules/face_recognition/dataset_checker/dataset_src/__init__.py +1 -1
- paddlex/modules/face_recognition/dataset_checker/dataset_src/check_dataset.py +3 -5
- paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/visualizer.py +2 -5
- paddlex/modules/face_recognition/evaluator.py +3 -3
- paddlex/modules/face_recognition/exportor.py +1 -1
- paddlex/modules/face_recognition/model_list.py +1 -1
- paddlex/modules/face_recognition/trainer.py +1 -1
- paddlex/modules/formula_recognition/__init__.py +2 -2
- paddlex/modules/formula_recognition/dataset_checker/__init__.py +3 -3
- paddlex/modules/formula_recognition/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/formula_recognition/dataset_checker/dataset_src/analyse_dataset.py +13 -12
- paddlex/modules/formula_recognition/dataset_checker/dataset_src/check_dataset.py +2 -6
- paddlex/modules/formula_recognition/dataset_checker/dataset_src/convert_dataset.py +11 -10
- paddlex/modules/formula_recognition/dataset_checker/dataset_src/split_dataset.py +1 -2
- paddlex/modules/formula_recognition/evaluator.py +6 -3
- paddlex/modules/formula_recognition/exportor.py +1 -1
- paddlex/modules/formula_recognition/model_list.py +4 -1
- paddlex/modules/formula_recognition/trainer.py +5 -3
- paddlex/modules/general_recognition/__init__.py +2 -2
- paddlex/modules/general_recognition/dataset_checker/__init__.py +2 -2
- paddlex/modules/general_recognition/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/general_recognition/dataset_checker/dataset_src/analyse_dataset.py +7 -9
- paddlex/modules/general_recognition/dataset_checker/dataset_src/check_dataset.py +4 -5
- paddlex/modules/general_recognition/dataset_checker/dataset_src/convert_dataset.py +6 -5
- paddlex/modules/general_recognition/dataset_checker/dataset_src/split_dataset.py +1 -1
- paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/visualizer.py +2 -5
- paddlex/modules/general_recognition/evaluator.py +2 -2
- paddlex/modules/general_recognition/exportor.py +1 -1
- paddlex/modules/general_recognition/model_list.py +1 -1
- paddlex/modules/general_recognition/trainer.py +1 -1
- paddlex/modules/image_classification/__init__.py +2 -2
- paddlex/modules/image_classification/dataset_checker/__init__.py +2 -2
- paddlex/modules/image_classification/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/image_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -9
- paddlex/modules/image_classification/dataset_checker/dataset_src/check_dataset.py +4 -3
- paddlex/modules/image_classification/dataset_checker/dataset_src/convert_dataset.py +4 -4
- paddlex/modules/image_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
- paddlex/modules/image_classification/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/image_classification/dataset_checker/dataset_src/utils/visualizer.py +2 -5
- paddlex/modules/image_classification/evaluator.py +3 -3
- paddlex/modules/image_classification/exportor.py +1 -1
- paddlex/modules/image_classification/model_list.py +2 -1
- paddlex/modules/image_classification/trainer.py +3 -3
- paddlex/modules/image_unwarping/__init__.py +1 -1
- paddlex/modules/image_unwarping/model_list.py +1 -1
- paddlex/modules/instance_segmentation/__init__.py +2 -2
- paddlex/modules/instance_segmentation/dataset_checker/__init__.py +2 -3
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/analyse_dataset.py +9 -5
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/check_dataset.py +8 -5
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/convert_dataset.py +8 -8
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/split_dataset.py +7 -4
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/visualizer.py +10 -8
- paddlex/modules/instance_segmentation/evaluator.py +2 -2
- paddlex/modules/instance_segmentation/exportor.py +1 -1
- paddlex/modules/instance_segmentation/model_list.py +1 -1
- paddlex/modules/instance_segmentation/trainer.py +1 -1
- paddlex/modules/keypoint_detection/__init__.py +2 -2
- paddlex/modules/keypoint_detection/dataset_checker/__init__.py +2 -2
- paddlex/modules/keypoint_detection/dataset_checker/dataset_src/__init__.py +1 -1
- paddlex/modules/keypoint_detection/dataset_checker/dataset_src/check_dataset.py +10 -5
- paddlex/modules/keypoint_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/keypoint_detection/dataset_checker/dataset_src/utils/visualizer.py +8 -3
- paddlex/modules/keypoint_detection/evaluator.py +2 -2
- paddlex/modules/keypoint_detection/exportor.py +1 -1
- paddlex/modules/keypoint_detection/model_list.py +1 -1
- paddlex/modules/keypoint_detection/trainer.py +2 -2
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/__init__.py +2 -2
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/__init__.py +3 -3
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/analyse_dataset.py +8 -8
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/dataset_checker/dataset_src/check_dataset.py +1 -2
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/evaluator.py +3 -3
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/exportor.py +1 -1
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/model_list.py +1 -1
- paddlex/modules/{3d_bev_detection → m_3d_bev_detection}/trainer.py +5 -7
- paddlex/modules/multilabel_classification/__init__.py +2 -2
- paddlex/modules/multilabel_classification/dataset_checker/__init__.py +2 -2
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -9
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/check_dataset.py +4 -3
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/convert_dataset.py +10 -7
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/visualizer.py +1 -5
- paddlex/modules/multilabel_classification/evaluator.py +3 -3
- paddlex/modules/multilabel_classification/exportor.py +1 -1
- paddlex/modules/multilabel_classification/model_list.py +1 -1
- paddlex/modules/multilabel_classification/trainer.py +3 -3
- paddlex/modules/multilingual_speech_recognition/__init__.py +2 -2
- paddlex/modules/multilingual_speech_recognition/dataset_checker.py +3 -3
- paddlex/modules/multilingual_speech_recognition/evaluator.py +3 -3
- paddlex/modules/multilingual_speech_recognition/exportor.py +3 -3
- paddlex/modules/multilingual_speech_recognition/model_list.py +1 -1
- paddlex/modules/multilingual_speech_recognition/trainer.py +7 -5
- paddlex/modules/object_detection/__init__.py +2 -2
- paddlex/modules/object_detection/dataset_checker/__init__.py +2 -11
- paddlex/modules/object_detection/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/object_detection/dataset_checker/dataset_src/analyse_dataset.py +10 -8
- paddlex/modules/object_detection/dataset_checker/dataset_src/check_dataset.py +10 -5
- paddlex/modules/object_detection/dataset_checker/dataset_src/convert_dataset.py +17 -12
- paddlex/modules/object_detection/dataset_checker/dataset_src/split_dataset.py +8 -4
- paddlex/modules/object_detection/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/object_detection/dataset_checker/dataset_src/utils/visualizer.py +9 -8
- paddlex/modules/object_detection/evaluator.py +11 -6
- paddlex/modules/object_detection/exportor.py +1 -1
- paddlex/modules/object_detection/model_list.py +3 -1
- paddlex/modules/object_detection/trainer.py +4 -5
- paddlex/modules/open_vocabulary_detection/__init__.py +2 -2
- paddlex/modules/open_vocabulary_detection/dataset_checker.py +3 -3
- paddlex/modules/open_vocabulary_detection/evaluator.py +3 -3
- paddlex/modules/open_vocabulary_detection/exportor.py +3 -3
- paddlex/modules/open_vocabulary_detection/model_list.py +2 -4
- paddlex/modules/open_vocabulary_detection/trainer.py +7 -5
- paddlex/modules/open_vocabulary_segmentation/__init__.py +2 -2
- paddlex/modules/open_vocabulary_segmentation/dataset_checker.py +3 -3
- paddlex/modules/open_vocabulary_segmentation/evaluator.py +3 -3
- paddlex/modules/open_vocabulary_segmentation/exportor.py +3 -3
- paddlex/modules/open_vocabulary_segmentation/model_list.py +1 -1
- paddlex/modules/open_vocabulary_segmentation/trainer.py +7 -5
- paddlex/modules/semantic_segmentation/__init__.py +2 -2
- paddlex/modules/semantic_segmentation/dataset_checker/__init__.py +2 -3
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/analyse_dataset.py +6 -3
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/check_dataset.py +2 -2
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/convert_dataset.py +7 -4
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/split_dataset.py +2 -2
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/utils/__init__.py +1 -1
- paddlex/modules/semantic_segmentation/dataset_checker/dataset_src/utils/visualizer.py +6 -2
- paddlex/modules/semantic_segmentation/evaluator.py +3 -3
- paddlex/modules/semantic_segmentation/exportor.py +1 -1
- paddlex/modules/semantic_segmentation/model_list.py +1 -1
- paddlex/modules/semantic_segmentation/trainer.py +3 -4
- paddlex/modules/table_recognition/__init__.py +2 -2
- paddlex/modules/table_recognition/dataset_checker/__init__.py +5 -5
- paddlex/modules/table_recognition/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/table_recognition/dataset_checker/dataset_src/analyse_dataset.py +3 -2
- paddlex/modules/table_recognition/dataset_checker/dataset_src/check_dataset.py +8 -7
- paddlex/modules/table_recognition/dataset_checker/dataset_src/split_dataset.py +2 -1
- paddlex/modules/table_recognition/evaluator.py +3 -3
- paddlex/modules/table_recognition/exportor.py +1 -1
- paddlex/modules/table_recognition/model_list.py +1 -1
- paddlex/modules/table_recognition/trainer.py +2 -5
- paddlex/modules/text_detection/__init__.py +2 -2
- paddlex/modules/text_detection/dataset_checker/__init__.py +4 -6
- paddlex/modules/text_detection/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/text_detection/dataset_checker/dataset_src/analyse_dataset.py +12 -9
- paddlex/modules/text_detection/dataset_checker/dataset_src/check_dataset.py +3 -3
- paddlex/modules/text_detection/dataset_checker/dataset_src/split_dataset.py +3 -3
- paddlex/modules/text_detection/evaluator.py +3 -3
- paddlex/modules/text_detection/exportor.py +1 -1
- paddlex/modules/text_detection/model_list.py +3 -1
- paddlex/modules/text_detection/trainer.py +2 -5
- paddlex/modules/text_recognition/__init__.py +2 -2
- paddlex/modules/text_recognition/dataset_checker/__init__.py +4 -5
- paddlex/modules/text_recognition/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/text_recognition/dataset_checker/dataset_src/analyse_dataset.py +13 -12
- paddlex/modules/text_recognition/dataset_checker/dataset_src/check_dataset.py +2 -5
- paddlex/modules/text_recognition/dataset_checker/dataset_src/convert_dataset.py +11 -10
- paddlex/modules/text_recognition/dataset_checker/dataset_src/split_dataset.py +1 -2
- paddlex/modules/text_recognition/evaluator.py +3 -3
- paddlex/modules/text_recognition/exportor.py +1 -1
- paddlex/modules/text_recognition/model_list.py +3 -1
- paddlex/modules/text_recognition/trainer.py +2 -3
- paddlex/modules/ts_anomaly_detection/__init__.py +2 -2
- paddlex/modules/ts_anomaly_detection/dataset_checker/__init__.py +4 -5
- paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/analyse_dataset.py +1 -9
- paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/check_dataset.py +2 -2
- paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/convert_dataset.py +2 -6
- paddlex/modules/ts_anomaly_detection/dataset_checker/dataset_src/split_dataset.py +4 -4
- paddlex/modules/ts_anomaly_detection/evaluator.py +3 -3
- paddlex/modules/ts_anomaly_detection/exportor.py +2 -3
- paddlex/modules/ts_anomaly_detection/model_list.py +1 -1
- paddlex/modules/ts_anomaly_detection/trainer.py +8 -8
- paddlex/modules/ts_classification/__init__.py +2 -2
- paddlex/modules/ts_classification/dataset_checker/__init__.py +4 -5
- paddlex/modules/ts_classification/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/ts_classification/dataset_checker/dataset_src/analyse_dataset.py +8 -5
- paddlex/modules/ts_classification/dataset_checker/dataset_src/check_dataset.py +2 -2
- paddlex/modules/ts_classification/dataset_checker/dataset_src/convert_dataset.py +2 -6
- paddlex/modules/ts_classification/dataset_checker/dataset_src/split_dataset.py +5 -5
- paddlex/modules/ts_classification/evaluator.py +3 -3
- paddlex/modules/ts_classification/exportor.py +2 -3
- paddlex/modules/ts_classification/model_list.py +1 -1
- paddlex/modules/ts_classification/trainer.py +7 -7
- paddlex/modules/ts_forecast/__init__.py +2 -2
- paddlex/modules/ts_forecast/dataset_checker/__init__.py +4 -5
- paddlex/modules/ts_forecast/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/ts_forecast/dataset_checker/dataset_src/analyse_dataset.py +1 -9
- paddlex/modules/ts_forecast/dataset_checker/dataset_src/check_dataset.py +2 -2
- paddlex/modules/ts_forecast/dataset_checker/dataset_src/convert_dataset.py +2 -6
- paddlex/modules/ts_forecast/dataset_checker/dataset_src/split_dataset.py +4 -4
- paddlex/modules/ts_forecast/evaluator.py +3 -3
- paddlex/modules/ts_forecast/exportor.py +2 -3
- paddlex/modules/ts_forecast/model_list.py +1 -1
- paddlex/modules/ts_forecast/trainer.py +7 -7
- paddlex/modules/video_classification/__init__.py +2 -2
- paddlex/modules/video_classification/dataset_checker/__init__.py +2 -2
- paddlex/modules/video_classification/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/video_classification/dataset_checker/dataset_src/analyse_dataset.py +9 -9
- paddlex/modules/video_classification/dataset_checker/dataset_src/check_dataset.py +2 -3
- paddlex/modules/video_classification/dataset_checker/dataset_src/split_dataset.py +1 -1
- paddlex/modules/video_classification/evaluator.py +3 -3
- paddlex/modules/video_classification/exportor.py +1 -1
- paddlex/modules/video_classification/model_list.py +1 -1
- paddlex/modules/video_classification/trainer.py +3 -3
- paddlex/modules/video_detection/__init__.py +2 -2
- paddlex/modules/video_detection/dataset_checker/__init__.py +2 -2
- paddlex/modules/video_detection/dataset_checker/dataset_src/__init__.py +2 -2
- paddlex/modules/video_detection/dataset_checker/dataset_src/analyse_dataset.py +8 -9
- paddlex/modules/video_detection/dataset_checker/dataset_src/check_dataset.py +3 -5
- paddlex/modules/video_detection/evaluator.py +3 -3
- paddlex/modules/video_detection/exportor.py +1 -1
- paddlex/modules/video_detection/model_list.py +1 -1
- paddlex/modules/video_detection/trainer.py +3 -3
- paddlex/ops/__init__.py +7 -4
- paddlex/ops/iou3d_nms/iou3d_cpu.cpp +8 -6
- paddlex/ops/iou3d_nms/iou3d_cpu.h +3 -2
- paddlex/ops/iou3d_nms/iou3d_nms.cpp +8 -6
- paddlex/ops/iou3d_nms/iou3d_nms.h +6 -4
- paddlex/ops/iou3d_nms/iou3d_nms_api.cpp +24 -18
- paddlex/ops/iou3d_nms/iou3d_nms_kernel.cu +9 -7
- paddlex/ops/setup.py +3 -3
- paddlex/ops/voxel/voxelize_op.cc +22 -19
- paddlex/ops/voxel/voxelize_op.cu +25 -25
- paddlex/paddlex_cli.py +104 -87
- paddlex/repo_apis/Paddle3D_api/__init__.py +1 -1
- paddlex/repo_apis/Paddle3D_api/bev_fusion/__init__.py +1 -1
- paddlex/repo_apis/Paddle3D_api/bev_fusion/config.py +1 -1
- paddlex/repo_apis/Paddle3D_api/bev_fusion/model.py +6 -6
- paddlex/repo_apis/Paddle3D_api/bev_fusion/register.py +2 -2
- paddlex/repo_apis/Paddle3D_api/bev_fusion/runner.py +1 -1
- paddlex/repo_apis/Paddle3D_api/pp3d_config.py +3 -2
- paddlex/repo_apis/PaddleClas_api/__init__.py +1 -1
- paddlex/repo_apis/PaddleClas_api/cls/__init__.py +3 -3
- paddlex/repo_apis/PaddleClas_api/cls/config.py +5 -4
- paddlex/repo_apis/PaddleClas_api/cls/model.py +4 -4
- paddlex/repo_apis/PaddleClas_api/cls/register.py +12 -3
- paddlex/repo_apis/PaddleClas_api/cls/runner.py +2 -3
- paddlex/repo_apis/PaddleClas_api/shitu_rec/__init__.py +2 -2
- paddlex/repo_apis/PaddleClas_api/shitu_rec/config.py +2 -2
- paddlex/repo_apis/PaddleClas_api/shitu_rec/model.py +1 -4
- paddlex/repo_apis/PaddleClas_api/shitu_rec/register.py +2 -2
- paddlex/repo_apis/PaddleClas_api/shitu_rec/runner.py +1 -6
- paddlex/repo_apis/PaddleDetection_api/__init__.py +2 -2
- paddlex/repo_apis/PaddleDetection_api/config_helper.py +3 -3
- paddlex/repo_apis/PaddleDetection_api/instance_seg/__init__.py +2 -2
- paddlex/repo_apis/PaddleDetection_api/instance_seg/config.py +2 -3
- paddlex/repo_apis/PaddleDetection_api/instance_seg/model.py +4 -4
- paddlex/repo_apis/PaddleDetection_api/instance_seg/register.py +2 -3
- paddlex/repo_apis/PaddleDetection_api/instance_seg/runner.py +2 -3
- paddlex/repo_apis/PaddleDetection_api/object_det/__init__.py +3 -3
- paddlex/repo_apis/PaddleDetection_api/object_det/config.py +5 -4
- paddlex/repo_apis/PaddleDetection_api/object_det/model.py +6 -7
- paddlex/repo_apis/PaddleDetection_api/object_det/official_categories.py +26 -1
- paddlex/repo_apis/PaddleDetection_api/object_det/register.py +32 -3
- paddlex/repo_apis/PaddleDetection_api/object_det/runner.py +2 -3
- paddlex/repo_apis/PaddleNLP_api/__init__.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/__init__.py +4 -3
- paddlex/repo_apis/PaddleOCR_api/config_utils.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/formula_rec/__init__.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/formula_rec/config.py +7 -6
- paddlex/repo_apis/PaddleOCR_api/formula_rec/model.py +9 -13
- paddlex/repo_apis/PaddleOCR_api/formula_rec/register.py +29 -3
- paddlex/repo_apis/PaddleOCR_api/formula_rec/runner.py +2 -3
- paddlex/repo_apis/PaddleOCR_api/table_rec/__init__.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/table_rec/config.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/table_rec/model.py +4 -4
- paddlex/repo_apis/PaddleOCR_api/table_rec/register.py +2 -3
- paddlex/repo_apis/PaddleOCR_api/table_rec/runner.py +3 -3
- paddlex/repo_apis/PaddleOCR_api/text_det/__init__.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/text_det/config.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/text_det/model.py +4 -4
- paddlex/repo_apis/PaddleOCR_api/text_det/register.py +20 -3
- paddlex/repo_apis/PaddleOCR_api/text_det/runner.py +3 -3
- paddlex/repo_apis/PaddleOCR_api/text_rec/__init__.py +1 -1
- paddlex/repo_apis/PaddleOCR_api/text_rec/config.py +7 -6
- paddlex/repo_apis/PaddleOCR_api/text_rec/model.py +9 -13
- paddlex/repo_apis/PaddleOCR_api/text_rec/register.py +20 -3
- paddlex/repo_apis/PaddleOCR_api/text_rec/runner.py +2 -3
- paddlex/repo_apis/PaddleSeg_api/__init__.py +1 -1
- paddlex/repo_apis/PaddleSeg_api/base_seg_config.py +2 -2
- paddlex/repo_apis/PaddleSeg_api/seg/__init__.py +1 -1
- paddlex/repo_apis/PaddleSeg_api/seg/config.py +3 -6
- paddlex/repo_apis/PaddleSeg_api/seg/model.py +6 -6
- paddlex/repo_apis/PaddleSeg_api/seg/register.py +2 -3
- paddlex/repo_apis/PaddleSeg_api/seg/runner.py +2 -3
- paddlex/repo_apis/PaddleTS_api/__init__.py +4 -3
- paddlex/repo_apis/PaddleTS_api/ts_ad/__init__.py +1 -1
- paddlex/repo_apis/PaddleTS_api/ts_ad/config.py +5 -6
- paddlex/repo_apis/PaddleTS_api/ts_ad/register.py +2 -2
- paddlex/repo_apis/PaddleTS_api/ts_ad/runner.py +2 -2
- paddlex/repo_apis/PaddleTS_api/ts_base/__init__.py +1 -1
- paddlex/repo_apis/PaddleTS_api/ts_base/config.py +2 -4
- paddlex/repo_apis/PaddleTS_api/ts_base/model.py +4 -4
- paddlex/repo_apis/PaddleTS_api/ts_base/runner.py +2 -2
- paddlex/repo_apis/PaddleTS_api/ts_cls/__init__.py +1 -1
- paddlex/repo_apis/PaddleTS_api/ts_cls/config.py +4 -5
- paddlex/repo_apis/PaddleTS_api/ts_cls/register.py +2 -2
- paddlex/repo_apis/PaddleTS_api/ts_cls/runner.py +2 -2
- paddlex/repo_apis/PaddleTS_api/ts_fc/__init__.py +1 -1
- paddlex/repo_apis/PaddleTS_api/ts_fc/config.py +6 -7
- paddlex/repo_apis/PaddleTS_api/ts_fc/register.py +1 -1
- paddlex/repo_apis/PaddleVideo_api/__init__.py +1 -1
- paddlex/repo_apis/PaddleVideo_api/config_utils.py +1 -1
- paddlex/repo_apis/PaddleVideo_api/video_cls/__init__.py +3 -3
- paddlex/repo_apis/PaddleVideo_api/video_cls/config.py +5 -4
- paddlex/repo_apis/PaddleVideo_api/video_cls/model.py +4 -4
- paddlex/repo_apis/PaddleVideo_api/video_cls/register.py +2 -3
- paddlex/repo_apis/PaddleVideo_api/video_cls/runner.py +2 -3
- paddlex/repo_apis/PaddleVideo_api/video_det/__init__.py +3 -3
- paddlex/repo_apis/PaddleVideo_api/video_det/config.py +5 -4
- paddlex/repo_apis/PaddleVideo_api/video_det/model.py +5 -5
- paddlex/repo_apis/PaddleVideo_api/video_det/register.py +2 -3
- paddlex/repo_apis/PaddleVideo_api/video_det/runner.py +2 -3
- paddlex/repo_apis/__init__.py +1 -1
- paddlex/repo_apis/base/__init__.py +4 -5
- paddlex/repo_apis/base/config.py +3 -4
- paddlex/repo_apis/base/model.py +11 -19
- paddlex/repo_apis/base/register.py +1 -1
- paddlex/repo_apis/base/runner.py +11 -12
- paddlex/repo_apis/base/utils/__init__.py +1 -1
- paddlex/repo_apis/base/utils/arg.py +1 -1
- paddlex/repo_apis/base/utils/subprocess.py +1 -1
- paddlex/repo_manager/__init__.py +2 -9
- paddlex/repo_manager/core.py +12 -30
- paddlex/repo_manager/meta.py +41 -31
- paddlex/repo_manager/repo.py +171 -161
- paddlex/repo_manager/utils.py +13 -224
- paddlex/utils/__init__.py +1 -1
- paddlex/utils/cache.py +8 -10
- paddlex/utils/config.py +6 -5
- paddlex/utils/{custom_device_whitelist.py → custom_device_list.py} +53 -199
- paddlex/utils/deps.py +249 -0
- paddlex/utils/device.py +87 -36
- paddlex/utils/download.py +4 -4
- paddlex/utils/env.py +37 -7
- paddlex/utils/errors/__init__.py +1 -1
- paddlex/utils/errors/dataset_checker.py +1 -1
- paddlex/utils/errors/others.py +2 -16
- paddlex/utils/file_interface.py +4 -5
- paddlex/utils/flags.py +17 -12
- paddlex/utils/fonts/__init__.py +36 -5
- paddlex/utils/func_register.py +1 -1
- paddlex/utils/install.py +87 -0
- paddlex/utils/interactive_get_pipeline.py +3 -3
- paddlex/utils/lazy_loader.py +3 -3
- paddlex/utils/logging.py +10 -1
- paddlex/utils/misc.py +6 -6
- paddlex/utils/pipeline_arguments.py +15 -7
- paddlex/utils/result_saver.py +4 -5
- paddlex/utils/subclass_register.py +2 -4
- paddlex/version.py +2 -1
- {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/METADATA +237 -102
- paddlex-3.0.1.dist-info/RECORD +1095 -0
- {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/WHEEL +1 -1
- paddlex/inference/models/base/predictor/basic_predictor.py +0 -139
- paddlex/paddle2onnx_requirements.txt +0 -1
- paddlex/repo_manager/requirements.txt +0 -21
- paddlex/serving_requirements.txt +0 -9
- paddlex-3.0.0rc0.dist-info/RECORD +0 -1015
- {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/entry_points.txt +0 -0
- {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info/licenses}/LICENSE +0 -0
- {paddlex-3.0.0rc0.dist-info → paddlex-3.0.1.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
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
|
-
|
16
|
-
import
|
17
|
-
import
|
15
|
+
import abc
|
16
|
+
import subprocess
|
17
|
+
from os import PathLike
|
18
18
|
from pathlib import Path
|
19
|
-
import
|
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
|
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
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
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
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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,
|
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.
|
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.
|
132
|
-
|
133
|
-
|
134
|
-
def
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
(
|
145
|
-
|
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
|
-
)
|
157
|
-
"paddle.base.libpaddle.PaddleInferPredictor",
|
158
|
-
"paddle.base.libpaddle.PaddleInferTensor",
|
159
|
-
"paddle.base.libpaddle.PaddleInferTensor",
|
160
|
-
]:
|
292
|
+
):
|
161
293
|
"""_create"""
|
162
|
-
|
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
|
165
|
-
|
166
|
-
|
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
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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
|
-
|
219
|
-
if self.
|
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.
|
222
|
-
|
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.
|
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
|
-
|
229
|
-
|
230
|
-
if
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
)
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
config.
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
config.
|
266
|
-
config
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
config.
|
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
|
-
|
282
|
-
|
283
|
-
|
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
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
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.
|
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
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
self.
|
319
|
-
self.
|
320
|
-
|
321
|
-
|
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
|
325
|
-
return
|
326
|
-
|
327
|
-
|
328
|
-
|
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
|