Проблема преобразования тензорного потока save_model из float32 в float16 с использованием TensorRT (TF-TRT) - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть тензор потока (версия 1.14) float32 SavedModel, который я хочу преобразовать в float16. Согласно https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html#usage -примеру , я мог бы передать «FP16» в precision_mode, чтобы преобразовать модель в fp16. Но преобразованная модель после проверки тензорной доски по-прежнему имеет тип fp32: net параметры - DT_FLOAT вместо DT_HALF. И размер конвертированной модели аналогичен модели до конвертации. (Здесь я предполагаю, что при успешном преобразовании модель станет вдвое меньше, поскольку параметры сокращены пополам).

import tensorflow as tf
from tensorflow.python.compiler.tensorrt import trt_convert as trt
import os

FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('saved_model_dir', '', 'Input saved model dir.')
tf.flags.DEFINE_bool('use_float16', False,
                     'Whether we want to quantize it to float16.')
tf.flags.DEFINE_string('output_dir', '', 'Output saved model dir.')


def main(argv):
    del argv  # Unused.
    saved_model_dir = FLAGS.saved_model_dir
    output_dir = FLAGS.output_dir
    use_float16 = FLAGS.use_float16

    precision_mode = "FP16" if use_float16 else "FP32"
    converter = trt.TrtGraphConverter(input_saved_model_dir=saved_model_dir,
                                      precision_mode=precision_mode)
    converter.convert()
    converter.save(output_dir)


if __name__ == '__main__':
    tf.app.run(main)

Любые советы или предложения приветствуются! Спасибо

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вы правильно указываете режим точности для TF-TRT. Но проверка сетевых параметров на TensorBoard не покажет, как механизм TensorRT хранит параметры модели преобразованной модели внутри себя.

Есть несколько вещей, которые следует учитывать:

  • В TF-TRT мы по-прежнему сохраняем исходные веса Tensorflow после преобразования модели в TensorRT. Это сделано для обеспечения возврата к собственному выполнению TensorFlow, если по какой-то причине путь TensorRT потерпит неудачу. Таким образом, файл сохраненного_моделя.pb будет по крайней мере равным размеру исходного файла модели.

  • Механизм TensorRT содержит копию весов преобразованных узлов. В режиме FP16 размер двигателя TensorRT будет примерно вдвое меньше размера оригинальной модели (при условии, что большинство узлов преобразованы). Это добавляется к исходному размеру модели, так что save_model.pb будет в 1,5 раза больше исходного размера

  • Если мы установим is_dynamic_op = True (по умолчанию в TF2), то создание механизма TensorRT будет отложено до первого вызова логического вывода. Если мы сохраним модель до того, как запустим первый вывод, то в модель будет добавлен только заполнитель TRTEngineOp, который на самом деле не увеличит размер модели.

  • В TF2 механизмы TensorRT сериализуются в отдельные файлы в каталоге Assets.

0 голосов
/ 04 марта 2020

Пожалуйста, попробуйте изменить:

tf.flags.DEFINE_bool('use_float16', False, 'Whether we want to quantize it to float16.')

на

tf.flags.DEFINE_bool('use_float16', True, 'Whether we want to quantize it to float16.')

Это должно сработать или выдать соответствующий журнал ошибок, потому что с текущим кодом precision_mode устанавливается значение "FP32" , Вам нужно precision_mode = "FP16", чтобы испытать половину точности.

...