Как выполнить вывод с половинной точностью в модели TensorRT, написанной с использованием TensorRT C++ API?

Я пытаюсь выполнить вывод с половинной точностью с моделью, изначально написанной на TensorRT C++ API (не разбирается с другими фреймворками, например, caffe, тензорным потоком); Насколько мне известно, нет публично работающего примера этой проблемы; Самым близким, что я нашел, является пример кода примера sampleMLP, выпущенный с TensorRT 4.0.0.3, но в примечаниях к выпуску говорится, что fp16 не поддерживается;

Мой пример кода игрушки можно найти в этом репо. Он содержит реализованную API-архитектуру и подпрограмму вывода, а также скрипт python, который я использую для преобразования своего словаря обученных весов в формат wtd TensorRT.

Моя игрушечная архитектура состоит только из одной свертки; цель состоит в том, чтобы получить аналогичные результаты между fp32 и fp16, за исключением некоторой разумной потери точности; кажется, что код работает с fp32, тогда как в случае вывода fp16 я получаю значения совершенно разных порядков (~1e40); похоже, я что-то не так делаю во время конверсии;

Буду признателен за любую помощь в понимании проблемы.

Спасибо,

е

1 ответ

Быстро прочитав ваш код, я вижу, что вы сделали больше, чем необходимо, чтобы получить оптимизированную сеть с половинной точностью. Вы не должны вручную конвертировать загруженные веса из float32 в float16 сам. Вместо этого вы должны создать свою сеть, как обычно, и позвонить nvinfer1::IBuilder::setFp16Mode(true) с вашим nvinfer1::IBuilder возражать против того, чтобы TensorRT делал преобразования для вас, где это необходимо.

Другие вопросы по тегам