Я пытаюсь выполнить вывод с половинной точностью с моделью, изначально написанной на TensorRT C ++ API (не анализируемой в других средах, например, caffe, tenorflow);
Насколько мне известно, нет публично работающего примера этой проблемы; самая близкая вещь, которую я нашел, это образец кода sampleMLP, выпущенный с TensorRT 4.0.0.3, все же заметки о выпуске скажем нет поддержки fp16;
Пример кода моей игрушки можно найти в это репо. Он содержит реализованную API-архитектуру и подпрограмму вывода, а также скрипт python, который я использую для преобразования своего словаря обученных весов в формат wtd TensorRT.
Моя игрушечная архитектура состоит только из одной свертки; цель состоит в том, чтобы получить аналогичные результаты между fp32 и fp16, за исключением некоторой разумной потери точности; кажется, что код работает с fp32, тогда как в случае вывода fp16 я получаю значения совершенно разных порядков (~ 1e40); похоже, я что-то не так делаю во время конверсии;
Буду признателен за любую помощь в понимании проблемы.
Спасибо,
е
Быстро прочитав ваш код, я вижу, что вы сделали больше, чем необходимо, чтобы получить оптимизированную сеть с половинной точностью. Вы не должны вручную конвертировать загруженные веса из float32
в float16
сам. Вместо этого вы должны создать свою сеть, как обычно, и позвонить nvinfer1::IBuilder::setFp16Mode(true)
с вашим nvinfer1::IBuilder
возражать против того, чтобы TensorRT делал преобразования для вас, где это необходимо.
Других решений пока нет …