tensorRT还提供了一套可用于engine
生成过程中debug
的工具,包括Polygraphy
、ONNX GraphSurgeon
和PyTorch-Quantization
。这些小工具用处很大,值得花时间进一步研究。
Debug方法示例
polygraphy
Polygraphy是TensorRT官方提供的一系列小工具合集,是一个非常强大的Debug工具。
可以使用Polygraphy检查ONNX或TRT的网络结构,可以debug engine,还可以利用Polygraphy查看ONNX与TRT模型的输出差异等。
例如利用Polygraphy查看ONNX与TRT模型的输出差异
# 使用默认参数
polygraphy run polygraphy_debug.engine --trt
# 加载onnx推理得到的结果,并设置绝对误差
polygraphy run polygraphy_debug.engine --trt --load-outputs onnx_res.json --abs 1e-4
# 使用fp16和cublas策略库生成engine,并与onnx推理得到的结果作比较
polygraphy run net_bs8.onnx --trt --onnxrt --tactic-sources CUBLAS --fp16 --rtol 1e-03 --atol 1e-03
# 保存 data_loader生成的输入和运行得到的结果
polygraphy run net_bs8.onnx --onnxrt --val-range [0,1] --save-inputs net_input.json --save-outputs onnx_res.json
# 对onnx推理得到的结果进行保存,同时运行trt engine,并与onnx推理得到的结果作比较
polygraphy run net_bs8.onnx --onnxrt --load-inputs gpen_input.json --save-outputs onnx_res.json
polygraphy run net_bs8_fp32.engine --model-type engine --trt --load-outputs onnx_res.json --abs 1e-4
--load-inputs net_input.json
# 采用二分策略,使用fp16和cublas策略库按层数迭代生成engine,并加载onnx推理得到的结果作比较,以判断设置fp16时误差出现的层的范围
polygraphy debug precision net_bs8.onnx --fp16 --tactic-sources cublas --check polygraphy run polygraphy_debug.engine --trt --load-outputs onnx_res.json --abs 1e-1
误差在设置范围内时,打印结果如下:
# 使用polygraphy debug precision工具搜索Layer精度设置,判断FP16的engine运行结果与onnx结果的误差是否在误差范围内,不移除运行中生成的engine文件
polygraphy debug precision net_bs8.onnx --fp16 --tactic-sources cublas --check polygraphy run polygraphy_debug.engine --trt --load-inputs net_input.json --load-outputs onnx_res.json --abs 1e-1 --no-remove-intermediate
# POLYGRAPHY_ARRAY_SWAP_THRESHOLD_MB=0表示结果交换到硬盘上,不放在内存中,mark all 表示对比所有节点结果
POLYGRAPHY_ARRAY_SWAP_THRESHOLD_MB=0 polygraphy run net_bs8.onnx --trt --onnxrt --tactic-sources CUBLAS --fp16 --rtol 1e-03 --atol 1e-03 --trt-outputs mark all --onnx-outputs mark all
# 比较单个或者多个Tensor的结果
polygraphy run net_bs8.onnx --onnxrt --trt --tactic-sources CUBLAS --fp16 --rtol 1e-03 --atol 1e-03 --trt-outputs 151 --onnx-outputs 151
polygraphy debug run net_bs8.onnx --onnxrt --check polygraphy run net_bs8.engine --trt --tactic-sources CUBLAS --fp16 --rtol 1e-03 --atol 1e-03 --trt-outputs 153 197 --onnx-outputs 153 197
# 检查模型
polygraphy inspect model net_bs8.engine --mode=basic --display-as=trt
polygraphy inspect model net_bs8.onnx --mode=full --display-as=trt
参考: https://blog.csdn.net/tracelessle/article/details/120656484