Python TensorRT: ошибка CUDNN_STATUS_MAPPING_ERROR

При запуске алгоритма распознавания лиц с использованием TensorRT Python API (а также PyCUDA) я обнаружил следующую ошибку:

[TensorRT] ERROR: ../rtSafe/safeContext.cpp (133) - Cudnn Error in configure: 7 (CUDNN_STATUS_MAPPING_ERROR)

[TensorRT] ERROR: FAILED_EXECUTION: std::exception

Код по-прежнему компилируется и запускается, но результаты неточны - вывод программы колеблется от 0,999999907141816 до 0, когда ожидается более непрерывный диапазон чисел. Я тестировал это с TF-TRT и Keras, и мой код работает в обоих (с небольшими изменениями, чтобы соответствовать различиям между API TF и ​​Keras).

Я пробовал устанавливать разные версии CUDA (9.0, 10.0 и 10.1) и CuDNN (7.6.3, 7.6.5). Версия TensorRT - 6.0.1.5, а PyCUDA - 2019.1.2. Если это поможет, я запускаю это на Ubuntu 18.04.

Любая помощь будет оценена по достоинству!

Обновление: я думаю, что ошибка вызвана одновременным запуском сеанса TensorFlow. В частности, я использую mtcnn пакет (ссылка), который может мешать работе TensorRT. Когда mtcnn инициализирует сеанс TF, возникает указанная выше ошибка; когда mtcnn не используется, эта ошибка не возникает, и все работает должным образом.


person Ryan Park    schedule 07.11.2019    source источник
comment
Можете ли вы указать используемое оборудование графического процессора?   -  person mibrahimy    schedule 14.11.2019
comment
NVIDIA GeForce RTX 2060   -  person Ryan Park    schedule 15.11.2019


Ответы (1)


Исправлено - похоже, что ошибка была вызвана конфликтом памяти графического процессора между TensorFlow и TensorRT. Поскольку я использую оба одновременно в одной программе, я предполагаю, что были конфликты между тем, как они оба обрабатывали выделение графического процессора. Решением было войти в сеанс TensorFlow с allow_growth=True перед выделением буферов и созданием асинхронного потока с использованием Pycuda и TensorRT.

  1. Войдите в сеанс TensorFlow (должен произойти до шага 2):
tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))).__enter__()
  1. Выделите буферы (после шага 1 из https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_python):
h_input = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(0)), dtype=np.float32)
h_output = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(1)), dtype=np.float32)
# Allocate device memory for inputs and outputs.
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
# Create a stream in which to copy inputs/outputs and run inference.
stream = cuda.Stream()
  1. Вывод (см. https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#perform_inference_python)
person Ryan Park    schedule 01.02.2020