TensorRT 教程 | 基于 8.6.1 版本 | 第一部分
2023-07-15 15:54 作者:bleedingfight | 我要投稿

代碼倉庫:
https://github.com/NVIDIA/trt-samples-for-hackathon-cn.git
TensorRT作用:
構(gòu)建期功能:
- 模型解析:解析網(wǎng)絡(luò)模型,可以通過其它模型文件的解析或者是使用tensorrt層重寫網(wǎng)絡(luò)結(jié)構(gòu)。
- 計(jì)算圖優(yōu)化:橫向,縱向融合。(Conv+add+Relu)
- 節(jié)點(diǎn)消除:去除無用節(jié)點(diǎn),節(jié)點(diǎn)變換(Pad、slice,concat,shuffle之類)
- 多精度支持:FP32、FP16、INT8、TF32(可能插入reformat節(jié)點(diǎn))
- 優(yōu)選kernel/format:硬件有關(guān)優(yōu)化
- 導(dǎo)入plugin:實(shí)現(xiàn)自定義操作
- 顯存優(yōu)化:顯存池復(fù)用。
運(yùn)行期:
- 運(yùn)行時環(huán)境:對象生命周期管理,顯存管理,異常處理
- 序列化反序列化:引擎保存為文件或者從文件中加載。
[TensorRT介紹](https://developer.nvidia.com/blog/production-deep-learning-nvidia-gpu-inference-engine/)
Explicit Batch和Implicit Batch的差別:Implicit Batch的所有的Tensor的Batch維度會顯示包含在Tensor形狀中。運(yùn)行期執(zhí)行execute的時候指定。Explicit Batch:網(wǎng)絡(luò)中所有Tensor的Batch應(yīng)該顯式在Tensor維度中表現(xiàn)出來。
Explicit Batch能做Implicit Batch不能做:
- Batch Normalization
- Reshape、Transpose、Reduce Over batch dimension
- Dynamic shape模式
- Loop結(jié)構(gòu)
- Layer的一些高級用法(入ShuffleLayer.set_input)
Dynamic Shape模式:
- 適用于輸入Tensor形狀在推理時決定的網(wǎng)絡(luò)
- 除了Batch維,其它維也可以推理時決定
- 需要Explicit Batch模式
- 需要Optimizeation Profile幫助網(wǎng)絡(luò)優(yōu)化
- 需要context.set_input_shape綁定世紀(jì)輸入數(shù)據(jù)形狀。
FP16模式:
- 開啟fp16模式:config.flag=1<<int(trt.BuilderFlag.FP16)
- 建立engine時間比FP32更長(更多kernel選擇、需要插入reformat節(jié)點(diǎn))
- Timeline中出現(xiàn)nchwTonchw調(diào)用
- 部分層可能精度導(dǎo)致下降導(dǎo)致較大誤差
- 找到誤差較大的層(使用polygraphy)
- 強(qiáng)制該層使用 FP32計(jì)算:
- config.set_flag(trt.BuilderFlag.OBEY_PRECISION_CONSTANTS)
- layer.precision=trt.float32
遇到TensorRT不支持的節(jié)點(diǎn):
- 修改源模型
- 修改onnx計(jì)算圖
- TensorRT中實(shí)現(xiàn)Plugin
- 修改Parser:修改TRT源碼并重新編譯TRT。
標(biāo)簽: