Classificação de dígitos manuscritos de raciocínio TensorRT (3)

Diretório de artigos da série

(1) Use pytorch para construir um modelo e treinar
(2) Converter o formato pth para o formato onnx
(3) Converter o formato onxx para o arquivo de serialização do mecanismo e realizar inferência



prefácio

  Na seção anterior, convertemos com sucesso o arquivo pth para o arquivo no formato onnx e verificamos o arquivo onnx exportado e o resultado não é problema. Nesta seção, começamos com o arquivo onnx, geramos o arquivo do mecanismo passo a passo e usamos o tensorrt para inferência.


1. O que é TensorRT?

  NVIDIA TensorRT™ é um SDK para inferência de aprendizagem profunda de alto desempenho. Este SDK inclui um otimizador de inferência de aprendizagem profunda e um ambiente de tempo de execução que fornece baixa latência e alto rendimento para aplicativos de inferência de aprendizagem profunda. Em termos leigos, TensorRT é uma estrutura de inferência desenvolvida pela NVIDIA para sua própria GPU, que usa alguns algoritmos e operações para otimizar o desempenho de inferência de rede e melhorar a velocidade de inferência de modelos de aprendizado profundo na GPU.
insira a descrição da imagem aqui
Usamos a estrutura TensorRT para acelerar a velocidade de inferência de nosso modelo de classificação de dígitos manuscritos.
Também escrevi um blog sobre o método de instalação do TensorRT: consulte aqui .

Aqui assumimos que o TensorRT foi instalado e a versão que instalei aqui é TensorRT-8.0.1.6. Antes de gerar o arquivo do mecanismo, primeiro apresente uma ferramenta útil trtexec . trtexec é uma ferramenta de linha de comando, pode nos ajudar a gerar o mecanismo sem escrever código, e muitas outras funções úteis, os leitores interessados ​​​​podem explorar por si mesmos, aqui usamos apenas vários parâmetros comuns de linha de comando.
Para parâmetros detalhados do trtexec, consulte este blog .

2. Como gerar motor através do onnx

  Para arrumar, agora temos o arquivo onnx e o tensorrt instalados, e agora nosso objetivo é gerar o arquivo do motor. Antes do arquivo onnx, apresentamos o que é, então qual é o arquivo do mecanismo?

O arquivo do mecanismo no TensorRT é um arquivo binário que contém um modelo de aprendizado profundo otimizado. Este arquivo pode ser usado para inferência sem recarregar e otimizar o modelo. Ao usar o TensorRT para raciocínio, primeiro você precisa converter o modelo treinado em um arquivo de mecanismo TensorRT e, em seguida, usar esse arquivo para raciocínio.

Em outras palavras, só precisamos gerar um motor uma vez, e esse arquivo do motor contém o modelo otimizado (essa otimização é feita pelo próprio TensoRT). Ao raciocinar no futuro, só precisamos carregar esse mecanismo em vez de começar do zero.

Gerar mecanismo usando trtexec

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

Insira esta linha de instruções na linha de comando para nos ajudar a gerar model.engine. O comando trtexec possui muitos outros parâmetros, que são interessantes de entender por si mesmo. Aqui usamos apenas –onnx, o que significa que a entrada é um arquivo onnx, –saveEngine significa armazenar o arquivo do motor, –buildOnly significa apenas construir, sem raciocínio .

Use a interface python

O código é o seguinte (exemplo):

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 o código python acima, podemos finalmente gerar um arquivo de mecanismo. Para a API neste código, você pode ir ao Google para encontrar uma explicação, apenas mostro uma possibilidade aqui. Se você tiver alguma dúvida, entre em contato na área de comentários.

Também podemos usar a ferramenta trtexec para verificar se o mecanismo que geramos está correto. O comando da linha de comando é:

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

–loadEngine é o caminho do arquivo do mecanismo carregado, –exportProfile este parâmetro pode gerar o tempo médio de execução de cada camada na rede e a porcentagem do tempo total, –verbose é para imprimir o log, –warmUp é para aquecer a placa gráfica antecipadamente.

3. Faça inferências

  Obtivemos o arquivo model.engine, na última etapa precisamos utilizar a interface tensorrt para ler o arquivo do motor e o arquivo de imagem para inferência para obter o resultado final da classificação.
  Como o pacote python de pycuda e cuda não pode ser instalado em meu ambiente agora, a última etapa de raciocínio será adicionada quando o ambiente for adequado.

Resumir

  Nesta seção, apresentamos como usar a ferramenta trtexec e o código python para gerar um arquivo de mecanismo por meio de onnx e usar a interface API do tensorrt para chamar o arquivo de mecanismo para inferência. A classificação de dígitos manuscritos do raciocínio TensorRT tem um total de três seções. Geralmente apresenta o processo de implantação de um modelo de aprendizado profundo. Espero que todos possam ganhar alguma coisa. A seguir, se você tiver tempo para se preparar para atualizar outro trabalho: pytorch encontra um operador não suportado, tensorrt encontra um operador não suportado e onnx encontra um operador não suportado.

Acho que você gosta

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