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?
3 Réponses :
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.
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.
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?
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
Merci! Pourriez-vous mettre à jour la réponse avec la version de TensorFlow que vous utilisez, car dans ce problème a > vous avez dit que vous avez utilisé 2.0.0-beta0 et que le passage à tf-nightly-gpu-2.0-preview a aidé à résoudre ce problème.
Quelle est la version de TensortRT utilisée?
quelle est la différence entre ce convertisseur et votre convertisseur? de tensorflow.contrib.tensorrt en tant que trt trt_graph = trt.create_inference_graph (input_graph_def = Frozen_graph_def, sorties = output_node_name, max_batch_size = batch_size, max_workspace_size_bytes = workspace_size, precision_mode_size = minimum_size_size
Combien de temps faut-il pour terminer la conversion?
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"