Clasificación de dígitos escritos a mano de razonamiento TensorRT (3)

Directorio de artículos de la serie

(1) Usar pytorch para construir un modelo y entrenar
(2) Convertir el formato pth al formato onnx
(3) Convertir el formato onxx a un archivo de serialización del motor y realizar inferencia



prefacio

  En la sección anterior, convertimos con éxito el archivo pth al archivo de formato onnx, verificamos el archivo onnx exportado y el resultado no es un problema. En esta sección, comenzamos con el archivo onnx, generamos el archivo del motor paso a paso y usamos tensorrt para la inferencia.


1. ¿Qué es TensorRT?

  NVIDIA TensorRT™ es un SDK para la inferencia de aprendizaje profundo de alto rendimiento. Este SDK incluye un optimizador de inferencia de aprendizaje profundo y un entorno de ejecución que proporciona baja latencia y alto rendimiento para aplicaciones de inferencia de aprendizaje profundo. En términos sencillos, TensorRT es un marco de inferencia desarrollado por NVIDIA para su propia GPU, que utiliza algunos algoritmos y operaciones para optimizar el rendimiento de inferencia de la red y mejorar la velocidad de inferencia de los modelos de aprendizaje profundo en GPU.
inserte la descripción de la imagen aquí
Usamos el marco TensorRT para acelerar la velocidad de inferencia de nuestro modelo de clasificación de dígitos escrito a mano.
También escribí un blog sobre el método de instalación de TensorRT: consulte aquí .

Aquí asumimos que se ha instalado TensorRT y la versión que instalé aquí es TensorRT-8.0.1.6. Antes de generar el archivo del motor, primero introduzca una herramienta útil trtexec . trtexec es una herramienta de línea de comandos que puede ayudarnos a generar motores sin escribir código y muchas otras funciones útiles que los lectores interesados ​​pueden explorar por sí mismos. Aquí solo usamos algunos parámetros de línea de comandos comunes.
Para conocer los parámetros detallados de trtexec, consulte este blog .

2. Cómo generar motor a través de onnx

  Para ordenar, ahora tenemos el archivo onnx y tensorrt instalados, y ahora nuestro objetivo es generar el archivo del motor. Antes del archivo onnx, presentamos qué es, entonces, ¿qué es el archivo del motor?

El archivo del motor en TensorRT es un archivo binario que contiene un modelo de aprendizaje profundo optimizado. Este archivo se puede utilizar para inferencias sin necesidad de recargar ni optimizar el modelo. Cuando use TensorRT para razonar, primero debe convertir el modelo entrenado en un archivo del motor TensorRT y luego usar este archivo para razonar.

En otras palabras, solo necesitamos generar un motor una vez, y este archivo de motor contiene el modelo optimizado (esta optimización la realiza el propio TensoRT). A la hora de razonar en el futuro, solo necesitamos cargar este motor en lugar de empezar desde cero.

Generar motor usando trtexec

TensorRT-8.0.1.6/bin/trtexec --onnx=model.onnx --saveEngine=model.engine --buildOnly

Ingrese esta línea de instrucciones en la línea de comando para ayudarnos a generar model.engine. El comando trtexec tiene muchos otros parámetros, que es interesante que usted mismo comprenda. Aquí solo usamos –onnx, lo que significa que la entrada es un archivo onnx, –saveEngine significa almacenar el archivo del motor, –buildOnly significa solo compilación, sin razonamiento. .

Utilice la interfaz de Python

El código es el siguiente (ejemplo):

import os
import tensorrt as trt

onnx_file = '/home/wjq/wjqHD/pytorch_mnist/model.onnx'
nHeight, nWidth = 28, 28
trtFile = '/home/wjq/wjqHD/pytorch_mnist/model.engine'

# Parse network, rebuild network, and build engine, then save engine
logger = trt.Logger(trt.Logger.VERBOSE)

builder = trt.Builder(logger)

network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
profile = builder.create_optimization_profile()
config = builder.create_builder_config()

parser = trt.OnnxParser(network, logger)

if not os.path.exists(onnx_file):
    print('ONNX file {} not found.'.format(onnx_file))
    exit()
print("Loading ONNX file from path {}...".format(onnx_file))

with open(onnx_file, 'rb') as model:
    if not parser.parse(model.read()):
        print('ERROR: Failed to parse the ONNX file.')
        for error in range(parser.num_errors):
            print(parser.get_error(error))
        exit()
    
    print("Succeed to parse the ONNX file.")

input_tensor = network.get_input(0)
# 这是输入大小
profile.set_shape(input_tensor.name, [1, 1, nHeight, nWidth], [1, 1, nHeight, nWidth], [1, 1, nHeight, nWidth])
config.add_optimization_profile(profile)

engineString = builder.build_serialized_network(network, config)  # 序列化engine文件
if engineString == None:
    print("Failed building engine!")
    exit()
print("Succeeded building engine!")
with open(trtFile, "wb") as f:
    f.write(engineString)

Usando el código Python anterior, finalmente podemos generar un archivo de motor. Para la API en este código, puede ir a Google para encontrar una explicación. Aquí solo muestro una posibilidad. Si tiene alguna pregunta, bienvenido a comunicarse en el área de comentarios.

También podemos usar la herramienta trtexec para verificar que el motor que generamos sea correcto, el comando de línea de comando es:

TensorRT-8.0.1.6/bin/trtexec --loadEngine=model.engine --exportProfile=layerProfile.json --batch=1 --warmUp=1000 --verbose

–loadEngine es la ruta del archivo del motor cargado, –exportProfile este parámetro puede generar el tiempo de ejecución promedio de cada capa en la red y el porcentaje del tiempo total, –verbose es para imprimir el registro, –warmUp es para calentar la tarjeta gráfica por adelantado.

3.Haz inferencias

  Hemos obtenido el archivo model.engine. En el último paso, necesitamos usar la interfaz tensorrt para leer el archivo del motor y el archivo de imagen para inferir y obtener el resultado de clasificación final.
  Dado que el paquete Python de pycuda y cuda no se puede instalar en mi entorno ahora, el último paso de razonamiento se agregará cuando el entorno sea adecuado.

Resumir

  En esta sección, presentamos cómo usar la herramienta trtexec y el código Python para generar un archivo de motor a través de onnx, y cómo usar la interfaz API de tensorrt para llamar al archivo del motor para realizar inferencias. La clasificación de dígitos escritos a mano del razonamiento de TensorRT tiene un total de tres secciones. Generalmente presenta el proceso de implementación de un modelo de aprendizaje profundo. Espero que todos puedan obtener algo. A continuación, si tiene tiempo para prepararse para actualizar otro trabajo: pytorch encuentra un operador no compatible, tensorrt encuentra un operador no compatible y onnx encuentra un operador no compatible.

Supongo que te gusta

Origin blog.csdn.net/qq_41596730/article/details/132403945
Recomendado
Clasificación