Как выполнить вывод с половинной точностью в модели 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 делал преобразования для вас, где это необходимо.