在本文中,我們將深入探討推理優化過程,以在推理階段提高機器學習模型的性能和效率。我們將討論所采用的技術,例如推理計算圖形簡化、量化和降低精度。我們還展示了場景文本檢測和識別模型的基準測試結果,其中比較了 ONNX 運行時 和 NVIDIA TensorRT 使用 NVIDIA Triton 推理服務器。
最后,我們總結了優化深度學習模型對于推理的重要性,以及使用端到端 NVIDIA 軟件解決方案的優勢,NVIDIA AI Enterprise 用于構建高效可靠的場景文本 OCR 系統。
在本系列的第一篇文章中,強大的場景文本檢測和識別:簡介 討論了穩健場景文本檢測和識別(STDR)在各行各業中的重要性以及所面臨的挑戰。第二篇博文 強大的場景文本檢測和識別:實施 并討論了如何使用先進的深度學習算法和技術(如增量學習和微調)實現 STDR 工作流。
推理優化
推理優化旨在提高推理階段機器學習模型的性能和效率。它有助于減少作出預測所需的時間、計算資源和成本,在某些情況下還可以提高準確性。
我們通過使用推理計算圖形簡化、量化和降低精度等技術來優化推理性能。這些模型最初使用 PyTorch 庫進行訓練,隨后導出為 torchScript 格式,再轉換為ONNX格式,最終轉換為NVIDIA TensorRT引擎。
為了執行 ONNX 到 TensorRT 的轉換,我們使用了 TensorRT 版本 22.07 的 NGC 容器鏡像。轉換過程結束后,我們使用 NVIDIA Triton 推理服務器版本 22.07 部署了推理模型。系統性能在具有 16 GB GPU 顯存的 NVIDIA A5000 筆記本電腦 GPU 上進行了基準測試。

我們稍后將討論場景文本檢測和識別 (STDR) 每個構建塊的優化細節。
場景文本檢測
場景文本檢測是場景文本 OCR 系統的一個重要組件。此組件將場景圖像作為輸入,并輸出圖像中文本字段位置。在本文中,我們將預訓練的 CRAFT 模型用于常規場景文本檢測任務。該模型基于一組不同的圖像進行訓練,能夠處理動態輸入圖像并準確定位文本字段。在我們的部署中,用作輸入的圖像的平均寬度約為 720 點。在此處,我們對兩種圖像輸入大小進行了基準測試:(3720,720) 和 (31200,1200).
我們的基準測試表明,與用于推理的 TorchScript 相比,TensorRT 的速度提高了大約 2.3 倍。

部署的 CRAFT 模型是具有 FP32 精度的 TensorRT 引擎。以下代碼示例是快速轉換指南。
創建 conda 環境:
$ conda create –n <your_env_name> python = 3.8 $ conda activate <your_env_name> |
克隆 CRAFT 庫并安裝 requirement.txt:
$ git clone https: / / github.com / clovaai / CRAFT - pytorch.git $ cd CRAFT - pytorch $ pip install –r requirement.txt |
加載模型并將其轉換為可呈現動態形狀的 .onnx 格式:
input_tensor_detec = torch.randn(( 1 , 3 , 768 , 768 ), requires_grad = False ) input_tensor_detec = input_tensor_detec.to(device = "cuda”) ?
# Load net net = CRAFT() net.load_state_dict(copyStateDict(torch.load(model_path))) net = net.cuda() net. eval () ?
# Convert the model into ONNX torch.onnx.export(net, input_tensor_detec, output_dir, ?????????????? verbose = False , opset_version = 11 , ?????????????? do_constant_folding = True , ???????????? export_params = True , ?????????????? input_names = [ "input" ], ?????????????? output_names = [ "output" , "output1" ], dynamic_axes = { "input" : { 0 : "batch" , 2 : "height" , 3 : "width" }}) |
簡化 ONNX 計算圖。通過ONNX Simplifier來簡化 ONNX 模型。它能夠推理整個計算圖,并將多余的運算符替換為它們的常量輸出(這一過程也被稱為常量折疊)。以下代碼示例展示了如何使用操作折疊來簡化 CRAFT 模型的計算圖:
$ onnxsim <path to non_simplified onnx model> <path to simplified onnx model> |

在本文中,使用 NVIDIA TensorRT 預配置的 Docker 容器將 ONNX 模型轉換為 TensorRT 序列化計劃文件。以下代碼示例適用于 tensorrt:22.07-py3 NGC 容器:
~$ docker run - it - - gpus all - v <path to onnx model>: / models \ nvcr.io / nvidia / tensorrt: 22.07 - py3 root@ 576df0ec3a49 : / workspace #$ trtexec --onnx=/models/craft.onnx \ - - explicitBatch - - workspace = 5000 - - minShapes = input : 1x3x256x256 \ - - optShapes = input : 1x3x700x700 - - maxShapes = input : 1x3x1200x1200 \ - - buildOnly –saveEngine = / models / craft.engine |
以下代碼示例顯示了場景文本檢測模型的 config.pbtxt 文件:
name: "craft" default_model_filename: "detec_trt.engine" platform: "tensorrt_plan" max_batch_size : 1 input [ ?? { ???? name: "input" ???? data_type: TYPE_FP32 ???? dims: [ 3 , - 1 , - 1 ] ?? } ] output [ ?? { ???? name: "output" ???? data_type: TYPE_FP32 ???? dims: [ - 1 , - 1 , 2 ] ?? }, ?? { ???? name: "output1" ???? data_type: TYPE_FP32 ???? dims: [ 32 , - 1 , - 1 ] ?? } ] |
場景文本識別
場景文本識別是 STDR 流程的一個不可或缺的模塊。我們使用了 PARseq 算法,這是一種先進的技術,可實現高效且可定制的文本識別,以獲得準確的結果。
為了更大限度地提高流程性能,我們將 PARseq TorchScript 模型轉換為 ONNX,然后進一步將其轉換為 TensorRT 引擎,確保文本識別的低延遲,因為每個圖像可能包含多個文本字段。
我們發現,事實證明,為模型使用 3x32x128 的輸入大小是推理時間和準確性之間的最佳平衡。圖 4 顯示了 PARseq 模型的基準測試結果。與 TorchScript 推理相比,我們的基準測試加速約為原來的 3 倍。

我們發現預訓練模型的作者發布的大多數案例都能很好地處理。如果您希望在自定義數據集上獲得更準確的輸出,您也可以對模型進行微調。以下代碼示例展示了進行這些重要轉換步驟的方法。
安裝 PARSeq:
$ git clone https: / / github.com / baudm / parseq.git $ pip install - r requirements.txt $ pip install - e . |
您可以使用自己的微調模型或預訓練模型,從 模型庫 中獲取,并將其轉換為 .onnx 格式。請使用 ONNX 1.12.0 以下的版本。
from strhub.models.utils import load_from_checkpoint ?
# To ONNX device = "cuda" ckpt_path = "..." onnx_path = "..." img = ... ?
parseq = load_from_checkpoint(ckpt_path) parseq.refine_iters = 0 parseq.decode_ar = False parseq = parseq.to(device). eval () ?
parseq.to_onnx(onnx_path, img, do_constant_folding = True , opset_version = 14 )? # opset v14 or newer is required ?
# check onnx_model = onnx.load(onnx_path) onnx.checker.check_model(onnx_model, full_check = True ) = = > pass |
要轉換為 TensorRT 格式,請使用ONNX Simplifier:
$ onnxsim <path to non_simplified onnx model> <path to simplified onnx model> |

在將模型轉換為簡化的 ONNX 格式后,可以使用 trtexec 轉換工具進行進一步處理。此轉換過程可在 TensorRT 容器版本 22.07 中完成。
~$ docker run - it - - gpus all - v <path to onnx model repository>: / models nvcr.io / nvidia / tensorrt: 22.07 - py3 root@ 576df0ec3a49 : / workspace # trtexec --onnx=/models/parseq_simple.onnx --fp16 \ - - workspace = 1024 - - saveEngine = / models / parseq_fp16.trt - - minShapes = input : 1x3x32x128 \ - - optShapes = input : 4x3x32x128 - - maxShapes = input : 16x3x32x128 |
以下代碼示例展示了config.pbtxt
場景文本識別模型的文件:
name: "parseq" max_batch_size: 16 platform: "tensorrt_plan" default_model_filename: "parseq_exp_fp32.trt" ? ?input { ???? name: "input" ???? data_type: TYPE_FP32 ???? dims: [ 3 , 32 , 128 ] } ? ?output { ???? name: "output" ???? data_type: TYPE_FP32 ???? dims: [ 26 , 95 ] } ? ?instance_group [ ???? { ???? count: 1 ???? kind: KIND_GPU ???? } ] |
編排師
編排器模塊是一個用于維護流程并對 STDR 管線執行預處理的Python 后端。為了進行管線基準測試,我們使用了 4 張具有不同圖像尺寸的圖像,以便于perf_analyzer
的使用。
我們創建了兩個版本的工作流,一個使用 ONNX 運行時 CPU/GPU 后端的工作流,另一個使用 TensorRT 計劃,以便工作流可在 GPU 和非 GPU 環境中運行。我們對工作流進行了基準測試,onnx_backend
管道和tensorrt_plan
使用 NVIDIA Triton 推理服務器的 NVIDIA RTX A5000 筆記本電腦 GPU (16 GB) 上的工作流。
基準測試的輸入樣本具有四種不同的圖像,大小為 (3x472x338)、(3x3280x2625)、(3x512x413) 和 (3x1600x1200).

編排器是一個 Python 后端模塊,用于協調場景文本檢測和場景文本識別模型。編排器的配置文件如下所示:
name: "pipeline" backend: "python" max_batch_size: 1 input [ ?? { ???? name: "input" ???? data_type: TYPE_UINT8 ???? dims: [ - 1 , - 1 , 3 ] ?? } ] output [ ?? { ???? name: "output" ???? data_type: TYPE_STRING ???? dims: [ - 1 ] ?? } ] ? ?instance_group [ ???? { ???? count: 1 ???? kind: KIND_GPU ???? } ] |
總結
總而言之,部署場景文本檢測和識別系統需要仔細考慮真實場景,優化深度學習模型以進行推理至關重要。
為確保生產就緒型優化和性能, NVIDIA 提供了端到端軟件解決方案 NVIDIA AI Enterprise,該解決方案由一流的 AI 軟件和工具(包括 TensorRT 和 Triton 推理服務器)組成,可輕松訪問構建企業 AI 應用程序。該解決方案有助于在各種設備上實現低延遲和高性能推理。
通過使用這些技術,您可以為各種應用構建高效可靠的場景文本 OCR 系統。
?