一、参考资料
二、重要说明
1. 模型转换的问题
- TensorRT的部署并不难,难的是模型转化,在这个过程中有太多的操作是TensorRT不支持的,或者pytorch模型转化成的onnx本身就有问题。
- 并不是所有的onnx都能够成功转到trt engine,除非你onnx模型里面所有的op都被支持。
- For INT8 issue, please noticed that INT8 operation requires > 7.x GPU architecture.Nano’s architecture is 5.3 which cannot support INT8 inference.
2. TensorRT是硬件相关的
不同显卡(不同GPU),其核心数量、频率、架构、设计(还有价格…)都不一样,TensorRT需要对特定的硬件进行优化,不同硬件之间的优化是不能共享的。
The generated plan files are not portable across platforms or TensorRT versions. Plans are specific to the exact GPU model they were built on (in addition to platforms and the TensorRT version) and must be re-targeted to the specific GPU in case you want to run them on a different GPU.
3. TensorRT是否开源
TensorRT是半开源的,除了核心部分其余的基本都开源了。
开源的部分基本都在这个仓库里: TensorRT Open Source Software(https://github.com/NVIDIA/TensorRT)
4. TensorRT部署问题
-
集成在Tensorflow中使用,比例TF-TRT,这种操作起来比较便捷,但是加速效果并不是很好;
-
在TensorRT Runtime环境中运行模型,就是直接使用TensorRT;
-
搭配服务框架使用,最配的就是官方的triton-server,完美支持TensorRT,用在生产环境杠杠的!
5. TensorRT支持哪几种权重精度
FP32_FP16_INT8_TF32
支持FP32、FP16、INT8、TF32等,这几种类型都比较常用。
-
FP32:单精度浮点型,没什么好说的,深度学习中最常见的数据格式,训练推理都会用到;
-
FP16:半精度浮点型,相比FP32占用内存减少一半,有相应的指令值,速度比FP32要快很多;
-
TF32:第三代Tensor Core支持的一种数据类型,是一种截短的 Float32 数据格式,将FP32中23个尾数位截短为10bits,而指数位仍为8bits,总长度为19(=1+8 +10)。保持了与FP16同样的精度(尾数位都是 10 位),同时还保持了FP32的动态范围指数位都是8位);
-
INT8:整型,相比FP16占用内存减小一半,有相应的指令集,模型量化后可以利用INT8进行加速。
6. 模型大小与模型复杂度的关系
(抛砖引玉)TensorRT的FP16不得劲?怎么办?在线支招!
- 模型大小只会影响模型占用内存或者显存的大小。
- 模型执行的时间与CPU、GPU、内存等硬件有关,与OP计算量也有关系。
- 模型体积不大(30MB左右),但OP节点很多,用Netron打开模型,会提示“Large model detected.This graph contains a large number of nodes and might take a long time to render.Do you want to continue?”
- 如果模型中的OP节点较多,也较复杂,不像VGG、unet这样一大块一大块卷积相连,有更多一些细小的OP,这会导致TensorRT优化作用不大。
7. 影响TensorRT优化的影响因素
-
TensorRT的版本
-
CUDA的版本
-
构建engine时设置的builder参数:
- workspaceSize
- BatchSize
- 数据精度
- segment size
-
当前系统的性能
- 最高GPU图形时钟速度
- 最大GPU内存时钟速度
- GPU内存总线宽度
- 总GPU内存
- GPU L2缓存大小
- SM处理器数量
- 异步引擎计数
当前系统的性能对TensorRT优化的影响
TensorRT优化和Jetson TX2的性能优化
TENSORRT优化和JETSON TX2的性能优化结论:当我们构建engine时,最大化当前系统的性能能够使engine的inference更快,这种加速有可能达到20%~30%的性能提升。
8. 日志级别
"""
如果设置日志级别为VERBOSE,可以查看更丰富的日志信息。
"""
self.trt_logger = trt.Logger(trt.Logger.INFO)
verbose = False
if verbose:
self.trt_logger.min_severity = trt.Logger.Severity.VERBOSE