Mxnet utilisation modèle d'accélération TensorRT - l'exemple officiel Mxnet

Des exemples de liens officiels

  Optimisation de l' apprentissage en profondeur des graphiques calcul avec TensorRT
  ce document, la traduction du code de mxnet site officiel, ajoutez votre propre opération. TensorRT de NVIDIA est utilisée pour accélérer la profondeur d'inférence réseau bibliothèque d'étude, Mxnet soutien TensorRT début version pilote 1.3.0, ce qui signifie que les utilisateurs Mxnet peuvent désormais exécuter leurs réseaux en accélérant la bibliothèque efficacement.

Installation TensorRT

  Actuellement Mxnet intégré environnement de soutien pour TensorRT

  • Ubuntu16.04
  • CUDA9.0 ou 9.2
  • architecture graphique Pascal ou mise à jour
  • Téléchargez et installez la bibliothèque TensorRT

  Lorsque ces conditions sont remplies et s'assurer mis à jour pour Mxnet une version compilée TensorRT par l' installation de pépin. commande Installation:
  environnement CUDA9.0
  pip install mxnet-tensorrt-cu90
  CUDA 9.2 environnement
  pip install mxnet-tensorrt-cu92
  système non Ubuntu 16.04 ou en utilisant uniquement l' image docker
  nvidia-docker run -ti mxnet/tensorrt python

chargement et transformation de modèles

import os
import mxnet as mx
from mxnet.gluon.model_zoo import vision
import time

# 转换模型
batch_shape = (1, 3, 224, 224)
resnet18 = vision.resnet18_v2(pretrained=True)
resnet18.hybridize()
resnet18.forward(mx.nd.zeros(batch_shape))
resnet18.export('resnet18_v2')

#加载新模型
sym, arg_params, aux_params = mx.model.load_checkpoint('resnet18_v2', 0)

# Create sample input
input = mx.nd.zeros(batch_shape)

  raisonnement TensorRT est utilisé uniquement pour une bibliothèque, en utilisant Resnet18 officielle en tant que modèle de référence exemple comparatif de TensorRT, Resnet18 est une complexité d'une architecture de réseau de haute informatique, couramment utilisé dans la vision par ordinateur et la profondeur de l' apprentissage des tests de performance de base de données des tâches. Mxnet module du gluons gluons modèle Zoo Télécharger le modèle Resnet18, en raison de la version actuelle de TensorRT seulement modèle de soutien symbolique, de sorte que les besoins du modèle à télécharger le module gluons hybrident, l' exportation, a indiqué le responsable, le suivi pourrait envisager la mise à jour pour accélérer directement le modèle gluons.

modèle de performance directe d'exploitation

# Execute with MXNet
os.environ['MXNET_USE_TENSORRT'] = '0'
executor = sym.simple_bind(ctx=mx.gpu(0), data=batch_shape, grad_req='null', force_rebind=True)
executor.copy_params_from(arg_params, aux_params)

# Warmup
print('Warming up MXNet')
for i in range(0, 10):
    y_gen = executor.forward(is_train=False, data=input)
    y_gen[0].wait_to_read()

# Timing
print('Starting MXNet timed run')
start = time.process_time()
for i in range(0, 10000):
    y_gen = executor.forward(is_train=False, data=input)
    y_gen[0].wait_to_read()
end = time.time()
print(time.process_time() - start)

  Afin d'améliorer la précision du test, le cas de test est exécuté avant un certain nombre de fois raisonnant warm-up de modèle, les opérations paresseux pour faire en sorte que le raisonnement ne pas utiliser en fait avant le test est terminé, la RAN finale sur 33.73s dans le TitanV.

Après le modèle TensorRT accéléré la performance opérationnelle

# Execute with TensorRT
print('Building TensorRT engine')
os.environ['MXNET_USE_TENSORRT'] = '1'
arg_params.update(aux_params)
all_params = dict([(k, v.as_in_context(mx.gpu(0))) for k, v in arg_params.items()])
executor = mx.contrib.tensorrt.tensorrt_bind(sym, ctx=mx.gpu(0), all_params=all_params,
                                             data=batch_shape, grad_req='null', force_rebind=True)

#Warmup
print('Warming up TensorRT')
for i in range(0, 10):
    y_gen = executor.forward(is_train=False, data=input)
    y_gen[0].wait_to_read()

# Timing
print('Starting TensorRT timed run')
start = time.process_time()
for i in range(0, 10000):
    y_gen = executor.forward(is_train=False, data=input)
    y_gen[0].wait_to_read()
end = time.time()
print(time.process_time() - start)

  Le TensorRT courant mxnet encore dans la nature expérimentale, et est donc utilisé dans l'initialisation paramètre Interface contrib tensorrt_bind temps il a été chargé dans conformément au dictionnaire. Suivez TensorRT permettra d' améliorer progressivement, tensorrt_bind et annulera et obtenir et simple_bind même style d'interface.
  Après l'accélération modèle TensorRT temps d'exécution finale de 18.99s, principe d'accélération dans cet exemple est dérivé de l' opérateur Fusion .

Les opérateurs et sous-graphe Fusion

  L'émergence de ces optimisation est l'opérateur d'intégration et sous-graphes en fonction de l'apparition de réseaux de neurones peuvent être considérés comme un groupe de graphe de calcul sous-comptage. Les opérateurs peuvent effectuer divers calculs, mais surtout exécuté sur tenseur mathématique simple ou algèbre linéaire. Ces opérateurs ensemble, utilisés sur une grande CUDA de base est généralement plus efficace.

modèles d'apprentissage en profondeur d'aujourd'hui effectuer des dizaines de milliers d'opérations sur GPU. L'entrée et la sortie de chaque noyau GPU doit être stocké dans la mémoire globale, mais lecture et écriture sur la mémoire globale est beaucoup plus lent que le registre sur puce. Quand quelque chose de particulier les noyaux exécutés en séquence des données part, le rendement et la localisation de la mémoire peut être améliorée par la fusion de ces grains en un seul, plus grand, fonctionnant sur le registre de la puce à la place de la mémoire globale.

sous - graphe de fusion calculée sur un grand noyau CUDA peut être évitez d' utiliser beaucoup de lecture et de l' écriture est trop lent en raison du problème des variables globales.

  mxnet_tensorrt possible de balayer la totalité de la carte de calcul, et de sous-image peuvent être trouvées optimisée TensorRT. Par conséquent, lors de la construction graphique de calcul de mxnet examinera s'il y a des opérateurs de TensorRT de soutien de sous - graphes, en les remplaçant sur peut être pris en charge par le noeud TensorRT pour atteindre ce nœud TensorRT en cours d' exécution propre bibliothèque de TensorRT au moment de l' exécution, ces enfants TensorRT opérateur de lot figure peut être fusionnée à un calcul du noyau CUDA.
  Mxnet responsable de la saisie de données au noeud et obtenir une TensorRT de sortie lors de l' initialisation période de suppression paramètre de pondération en double correspondant, si seulement une partie de la TensorRT de poids lourd.
  la structure figure Resnet TensorRT avant et après optimisation est:

Il y a optimisation
après optimisation

autres questions

  1, l'utilisation d'exemples, pas la différence de temps réel, c'est pas encore la cause, le forum a également demandé un suivi pour voir comment le développement de celui - ci
tensorrt aucune différence avec et sans

  2, messages sur le forum il y a une mention TensorRT à la mémoire occupée par le problème, non encore mis en œuvre à ce point, nous allons regarder en arrière rencontré
int8 grand modèle pour quantifier l' utilisation de la mémoire

  

  

Publié 24 articles originaux · louange won 8 · vues 20000 +

Je suppose que tu aimes

Origine blog.csdn.net/yangjf91/article/details/88680480
conseillé
Classement