3
votes

TensorRT et Tensorflow 2

J'essaie d'accélérer l'inférence de yolov3 TF2 avec TensorRT. J'utilise la fonction TrtGraphConverter dans tensorflow 2.

Mon code est essentiellement le suivant:

Traceback (most recent call last):
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/framework/importer.py", line 427, in import_graph_def
    graph._c_graph, serialized, options)  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input 1 of node StatefulPartitionedCall was passed float from conv2d/kernel:0 incompatible with expected resource.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pierre/Documents/GitHub/yolov3-tf2/tensorrt.py", line 23, in <module>
    converter.save(saved_model_dir_trt)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/compiler/tensorrt/trt_convert.py", line 822, in save
    super(TrtGraphConverter, self).save(output_saved_model_dir)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/compiler/tensorrt/trt_convert.py", line 432, in save
    importer.import_graph_def(self._converted_graph_def, name="")
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/framework/importer.py", line 431, in import_graph_def
    raise ValueError(str(e))
ValueError: Input 1 of node StatefulPartitionedCall was passed float from conv2d/kernel:0 incompatible with expected resource.

Et cela génère l'erreur suivante:

from tensorflow.python.compiler.tensorrt import trt_convert as trt

tf.keras.backend.set_learning_phase(0)
converter = trt.TrtGraphConverter(
    input_saved_model_dir="./tmp/yolosaved/",
    precision_mode="FP16",
    is_dynamic_op=True)
converter.convert()


saved_model_dir_trt = "./tmp/yolov3.trt"
converter.save(saved_model_dir_trt)

Cela signifie-t-il que certains de mes nœuds ne peuvent pas être convertis? Dans ce cas, pourquoi mon code erreur-t-il lors de l'étape .save?


2 commentaires

J'ai trouvé un problème de GitHub, où vous dites que cela fonctionne pour vous avec une version nocturne de TF. Pourriez-vous s'il vous plaît poster comme réponse la version exacte d'un package et les étapes supplémentaires (le cas échéant) nécessaires pour le faire fonctionner? Ce serait très utile pour moi car j'ai le même problème et potentiellement pour les autres qui viennent ici de Google.


Essayez precision_mode = "FP32"


3 Réponses :


0
votes

Cela pourrait être un peu difficile, mais quel GPU utilisez-vous? Je sais que precision_mode = "FP16" est juste pris en charge dans certaines architectures, comme Pascal (série tx2) et Turing (série ~ 2080). J'ai eu de bons résultats de portage de TF2 vers trt avec fp16.


0 commentaires

1
votes

Lorsque vous utilisez TensorRT, gardez à l'esprit qu'il peut y avoir des couches non prises en charge dans votre architecture de modèle. Il existe une matrice de prise en charge TensorRT pour ta référence. YOLO se compose de nombreux calques personnalisés non implémentés tels que "yolo layer".

Donc, si vous souhaitez convertir YOLO en modèle optimisé TensorRT, vous devez choisir parmi d'autres méthodes.

  1. Essayez TF-TRT qui optimise et exécute les sous-graphes compatibles, permettant à TensorFlow d'exécuter le graphe restant. Bien que vous puissiez toujours utiliser l'ensemble de fonctionnalités large et flexible de TensorFlow, TensorRT analysera le modèle et appliquera des optimisations aux parties du graphique dans la mesure du possible.
  2. Mettez en œuvre vos calques personnalisés avec Plugin API comme cet exemple .

1 commentaires

Je ne comprends pas ce que tu veux dire. Donc, dans les deux cas, les méthodes TF-TRT et TensorRT appliquent les deux méthodes d'optimisation au sous-graphe, non? Si oui, quelle est la différence entre deux méthodes?



4
votes

J'ai fini par résoudre ce problème avec le code suivant. Je suis également passé de tf 2.0.-beta0 à tf-nightly-gpu-2.0-preview

params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
    precision_mode='FP16',
    is_dynamic_op=True)
    
converter = trt.TrtGraphConverterV2(
    input_saved_model_dir=saved_model_dir,
    conversion_params=params)
converter.convert()
saved_model_dir_trt = "/tmp/model.trt"
converter.save(saved_model_dir_trt)

merci pour votre aide