【tensorrt】——trtexec动态batch支持与batch推理耗时评测

tensorrt, batch

1. trtexec编译

trtexec地址
参考官方的说明,进行项目编译

2. 模型转换

  1. pytorch->onnx的时候,需要在动态尺寸上定义好,例如:
dynamic_axes = {
    'input': {0: 'batch_size'},  # 
}

torch.onnx.export(model,  # model being run
                  x,  # model input (or a tuple for multiple inputs)
                  'save.onnx',
                  export_params=True,
                  opset_version=11,  # the ONNX version to export the model to
                  do_constant_folding=True,
                  input_names=['input'],  # the model's input names
                  dynamic_axes=dynamic_axes)

这里就是定义batch的数值为动态的。

导出成onnx后,可以看一下输入的shape:batch_size×3×480×640
在这里插入图片描述

  1. trtexec模型转换
    直接可以用以下命令进行模型转换
./trtexec --onnx=xxx.onnx --saveEngine=xxx.trt --workspace=1024 --minShapes=inputx:1x3x480x640 --optShapes=inputx:16x3x480x640 --maxShapes=inputx:32x3x480x640 --fp16

说明:

  • onnx: 输入的onnx模型
  • saveEngine:转换好后保存的tensorrt engine
  • workspace:使用的gpu内存,有时候不够,需要手动增大点
  • minShapes:动态尺寸时的最小尺寸,格式为NCHW,需要给定输入node的名字
  • optShapes:推理测试的尺寸,trtexec会执行推理测试,该shape就是测试时的输入shape
  • maxShapes:动态尺寸时的最大尺寸,这里只有batch是动态的,其他维度都是写死的
  • fp16:float16推理

3. batch推理耗时评测

  1. 推理命令
    由上一节的介绍,动态batch推理时,通过改变optShapes的参数就可以实现不同batch的推理。例如:
# batch = 1
./trtexec --onnx=xxx.onnx --saveEngine=xxx.trt --workspace=1024 --minShapes=inputx:1x3x480x640 --optShapes=inputx:1x3x480x640 --maxShapes=inputx:32x3x480x640 --fp16

# batch = 2
./trtexec --onnx=xxx.onnx --saveEngine=xxx.trt --workspace=1024 --minShapes=inputx:1x3x480x640 --optShapes=inputx:2x3x480x640 --maxShapes=inputx:32x3x480x640 --fp16

# batch = 4
./trtexec --onnx=xxx.onnx --saveEngine=xxx.trt --workspace=1024 --minShapes=inputx:1x3x480x640 --optShapes=inputx:4x3x480x640 --maxShapes=inputx:32x3x480x640 --fp16

# batch = 8
./trtexec --onnx=xxx.onnx --saveEngine=xxx.trt --workspace=1024 --minShapes=inputx:1x3x480x640 --optShapes=inputx:8x3x480x640 --maxShapes=inputx:32x3x480x640 --fp16

  1. 耗时情况
    trtexec会打印出很多时间,这里需要对每个时间的含义进行解释,然后大家各取所需,进行评测。总的打印如下:
[09/06/2021-13:50:34] [I] Average on 10 runs - GPU latency: 2.74553 ms - Host latency: 3.74192 ms (end to end 4.93066 ms, enqueue 0.624805 ms)  # 跑了10次,GPU latency: GPU计算耗时, Host latency:GPU输入+计算+输出耗时,end to end:GPU端到端的耗时,eventout - eventin,enqueue:CPU异步耗时
[09/06/2021-13:50:34] [I] Host Latency
[09/06/2021-13:50:34] [I] min: 3.65332 ms (end to end 3.67603 ms)
[09/06/2021-13:50:34] [I] max: 5.95093 ms (end to end 6.88892 ms)
[09/06/2021-13:50:34] [I] mean: 3.71375 ms (end to end 5.30082 ms)
[09/06/2021-13:50:34] [I] median: 3.70032 ms (end to end 5.32935 ms)
[09/06/2021-13:50:34] [I] percentile: 4.10571 ms at 99% (end to end 6.11792 ms at 99%)
[09/06/2021-13:50:34] [I] throughput: 356.786 qps
[09/06/2021-13:50:34] [I] walltime: 3.00741 s
[09/06/2021-13:50:34] [I] Enqueue Time
[09/06/2021-13:50:34] [I] min: 0.248474 ms
[09/06/2021-13:50:34] [I] max: 2.12134 ms
[09/06/2021-13:50:34] [I] median: 0.273987 ms
[09/06/2021-13:50:34] [I] GPU Compute
[09/06/2021-13:50:34] [I] min: 2.69702 ms
[09/06/2021-13:50:34] [I] max: 4.99219 ms
[09/06/2021-13:50:34] [I] mean: 2.73299 ms
[09/06/2021-13:50:34] [I] median: 2.71875 ms
[09/06/2021-13:50:34] [I] percentile: 3.10791 ms at 99%
[09/06/2021-13:50:34] [I] total compute time: 2.93249 s
  • Host Latency gpu: 输入+计算+输出 三部分的耗时
  • Enqueue Time:CPU异步的时间(该时间不具有参考意义,因为GPU的计算可能还没有完成
  • GPU Compute:GPU计算的耗时
    综上,去了Enqueue Time时间都是有意义的

这里附上个人的测试。

设备模型modelbatchgpu 计算耗时/ms
3080pcddrnet23_ocrfp1611.70512
3080pcddrnet23_ocrfp1622.70069
3080pcddrnet23_ocrfp1644.78706
3080pcddrnet23_ocrfp1689.03271
3080pcddrnet23_ocrfp161616.1414

可以看到tensorrt的batch推理有线性增长的问题

TensorRT提供了多种方法来调整引擎参数,以达到最优的推理效果和速度。下面是一些常用的方法: 1. 调整batch size:可以通过修改执行上下文(ExecutionContext)的setBindingDimensions方法来调整batch size。这个方法可以接受一个维度为4的元组,用于指定输入数据的形状,其中第一个维度为batch size。例如,如果原来的输入形状是(1,3,416,416),要将batch size增加到4,可以使用以下代码: ``` input_shape = (4, 3, 416, 416) context.setBindingDimensions(0, input_shape) ``` 2. 调整输入分辨率:可以通过修改输入数据的形状来调整输入分辨率。这个方法同样可以使用setBindingDimensions方法来实现。例如,如果原来的输入分辨率是416x416,要将其调整为640x640,可以使用以下代码: ``` input_shape = (batch_size, 3, 640, 640) context.setBindingDimensions(0, input_shape) ``` 3. 调整推理精度:可以通过修改推理精度(precision)来调整模型的精度和速度之间的权衡。TensorRT支持FP32、FP16和INT8三种精度。可以使用builder的setFp16Mode和setInt8Mode方法来设置模型的精度。例如,要将模型的精度设置为FP16,可以使用以下代码: ``` builder.fp16_mode = True ``` 需要注意的是,不同的精度会对模型的输出结果产生不同的影响。在使用低精度模型时,需要进行量化和校准等额外的操作,以保证模型的准确性和稳定性。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值