Tensorrt utiliza GPU para la aceleración. La GPU natural es adecuada para la computación en paralelo, por lo que aumentar el tamaño de los lotes es una de las formas habituales de optimizar tensorrt
tensorrt por defecto es batchsize = 1, y luego haz algunos experimentos para observar
El modelo se descarga directamente del archivo onnx de este sitio web
Después de obtener el archivo onnx, debemos convertirlo en un archivo de motor tensorrt
/opt/TensorRT-7.1.3.4/bin/trtexec --onnx=ctdet_coco_dlav0_512.onnx --saveEngine=ctdet_coco_dlav0_512_256.trt --best --batch=256 --workspace=4096
El archivo trt se obtendrá directamente si la operación es exitosa
A continuación, pruebe el rendimiento
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=256
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=128
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=64
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=32
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=16
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=8
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=4
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=2
/opt/TensorRT-7.1.3.4/bin/trtexec --loadEngine=ctdet_coco_dlav0_512_256.trt --batch=1
Este artículo solo examina el rendimiento y el tiempo de ejecución, y resume los resultados de la siguiente manera
Calcular Tiempo total de BatchSize (S) Rendimiento (QPS)
. 1 2,94049 364.344
2 725.753 2.93884
. 4 2,77403 1365,88
. 8 1.65327 1,619.66
16 1818.5 0,922257
32 0,479588 1848,01
64 1859,18 0.238533
128 1842,8 0.12173
256 0,0641229 1817,42
visualizado en tiempo de cálculo ( total Tiempo de cálculo )
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv("data.txt",sep="\t")
x =df['batchsize'].values
y1 =df['total compute time(s)'].values
y2 =df['throughput(qps)'].values
plt.plot(x, y1, 'ro--')
#plt.plot(x, y1, 'b--')
plt.xlabel('batchsize')
plt.ylabel('total compute time(s)')
for a, b in zip(x, y1):
plt.text(a+15,b-0.15,'(%d,%.4f)'%(a,b),ha='center', va='bottom',fontdict={'size': 10, 'color': 'g'})
plt.show()
Del mismo modo, visualice el rendimiento
A partir de las dos imágenes anteriores, podemos ver que aumentar el tamaño del lote tiene un gran impacto en el tiempo de cálculo; y aumentar el tamaño del lote puede alcanzar fácilmente la saturación del rendimiento.
Los estudiantes cuidadosos pueden encontrar que al transferir archivos trt desde onnx, se usa --best
Este parámetro es
--best Enable all precisions to achieve the best performance (default = disabled)
Pertenece a precisión mixta, ni fp32 puro, ni fp16, int8
A continuación, compare el impacto de diferentes cuantificaciones en el tiempo de cálculo y el rendimiento.
Se realizaron tres experimentos, best, fp16 e int8
Los resultados se resumen en tres archivos
best.txt
fp16.txt
int8.txt
La visualización es la siguiente:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.tight_layout()
df_int8=pd.read_csv("int8.txt",sep="\t")
df_best=pd.read_csv("best.txt",sep="\t")
df_fp16=pd.read_csv("fp16.txt",sep="\t")
x =df_int8['batchsize'].values
y1_int8 =df_int8['total compute time(s)'].values
y1_best =df_best['total compute time(s)'].values
y1_fp16 =df_fp16['total compute time(s)'].values
plt.plot(x, y1_int8, 'ro--',label='int8')
plt.plot(x, y1_best, 'bo--',label='best')
plt.plot(x, y1_fp16, 'go--',label='fp16')
plt.xlabel('batchsize')
plt.ylabel('total compute time(s)')
plt.legend()
plt.show()