Spec-Zone.ru › TensorFlow

tf.experimental.tensorrt.Converter

Оффлайн-конвертер для преобразования TF-TRT для сохранённых моделей TF 2.0.

tf.experimental.tensorrt.Converter(
    input_saved_model_dir=None,
    input_saved_model_tags=None,
    input_saved_model_signature_key=None,
    use_dynamic_shape=None,
    dynamic_shape_profile_strategy=None,
    max_workspace_size_bytes=DEFAULT_TRT_MAX_WORKSPACE_SIZE_BYTES,
    precision_mode=TrtPrecisionMode.FP32,
    minimum_segment_size=3,
    maximum_cached_engines=1,
    use_calibration=True,
    allow_build_at_runtime=True,
    conversion_params=None
)

Поддержка Windows предоставляется экспериментально. Нет гарантий относительно функциональности или технической поддержки. Используйте на свой страх и риск.

Существует несколько способов выполнения преобразования:

  1. Точность FP32/FP16

    params = tf.experimental.tensorrt.ConversionParams(
        precision_mode='FP16')
    converter = tf.experimental.tensorrt.Converter(
        input_saved_model_dir="my_dir", conversion_params=params)
    converter.convert()
    converter.save(output_saved_model_dir)
    

    В этом случае TRT-движки не будут созданы или сохранены в преобразованной сохранённой модели. Но если данные ввода доступны во время преобразования, мы всё ещё можем создать и сохранить TRT-движки, чтобы снизить затраты во время вывода (см. вариант 2 ниже).

  2. Точность FP32/FP16 с предварительно созданными движками

    params = tf.experimental.tensorrt.ConversionParams(
        precision_mode='FP16',
        # Set this to a large enough number so it can cache all the engines.
        maximum_cached_engines=16)
    converter = tf.experimental.tensorrt.Converter(
        input_saved_model_dir="my_dir", conversion_params=params)
    converter.convert()
    
    # Define a generator function that yields input data, and use it to execute
    # the graph to build TRT engines.
    def my_input_fn():
      for _ in range(num_runs):
        inp1, inp2 = ...
        yield inp1, inp2
    
    converter.build(input_fn=my_input_fn)  # Generate corresponding TRT engines
    converter.save(output_saved_model_dir)  # Generated engines will be saved.
    

    Таким образом, один движок будет создан/сохранён для каждой уникальной формы ввода TRTEngineOp. Это подходит для приложений, которые не могут позволить себе создание движков во время вывода, но имеют доступ к входным данным, похожим на те, которые используются в производстве (например, с одинаковыми формами ввода). Кроме того, сгенерированные TRT-движки зависят от платформы, поэтому нам нужно выполнить build() в среде, аналогичной производственной (например, с тем же типом GPU).

  3. Точность INT8 и калибровка с предварительно созданными движками

    params = tf.experimental.tensorrt.ConversionParams(
        precision_mode='INT8',
        # Currently only one INT8 engine is supported in this mode.
        maximum_cached_engines=1,
        use_calibration=True)
    converter = tf.experimental.tensorrt.Converter(
        input_saved_model_dir="my_dir", conversion_params=params)
    
    # Define a generator function that yields input data, and run INT8
    # calibration with the data. All input data should have the same shape.
    # At the end of convert(), the calibration stats (e.g. range information)
    # will be saved and can be used to generate more TRT engines with different
    # shapes. Also, one TRT engine will be generated (with the same shape as
    # the calibration data) for save later.
    def my_calibration_input_fn():
      for _ in range(num_runs):
        inp1, inp2 = ...
        yield inp1, inp2
    
    converter.convert(calibration_input_fn=my_calibration_input_fn)
    
    # (Optional) Generate more TRT engines offline (same as the previous
    # option), to avoid the cost of generating them during inference.
    def my_input_fn():
      for _ in range(num_runs):
        inp1, inp2 = ...
        yield inp1, inp2
    converter.build(input_fn=my_input_fn)
    
    # Save the TRT engine and the engines.
    converter.save(output_saved_model_dir)
    
  4. Для использования динамической формы нам необходимо вызвать метод build с функцией ввода для генерации профилей. Этот шаг аналогичен шагу калибровки INT8, описанному выше. Конвертер также должен быть создан с use_dynamic_shape=True и одним из следующих стратегий профилей для создания профилей на основе входных данных, полученных от функции ввода:

    • Range: создать один профиль, который работает для входов с значениями размерности в диапазоне [min_dims, max_dims], где min_dims и max_dims получены из предоставленных входов.
    • Optimal: создать один профиль для каждого входа. Профиль работает только для входов с такими же размерностями, как и вход, для которого он создан. Движок GPU будет работать с оптимальной производительностью с такими входами.
    • Range+Optimal: создать профили как для Range, так и для Optimal.
Args
input_saved_model_dir каталог для загрузки сохранённой модели, содержащей входной граф для преобразований. Требуется.
input_saved_model_tags список тегов для загрузки сохранённой модели.
input_saved_model_signature_key ключ подписи для оптимизации графа.
use_dynamic_shape включить поддержку динамической формы. None эквивалентно False в текущей реализации.
dynamic_shape_profile_strategy одно из строк в supported_profile_strategies(). None эквивалентно Range в текущей реализации.
max_workspace_size_bytes максимальное временное ОЗУ GPU, которое может использовать TRT-движок во время выполнения. Соответствует параметру 'workspaceSize' nvinfer1::IBuilder::setMaxWorkspaceSize().
precision_mode одно из строк в TrtPrecisionMode.supported_precision_modes().
minimum_segment_size минимальное количество узлов, необходимое для замены подграфа TRTEngineOp.
maximum_cached_engines максимальное количество кэшированных TRT-движков для динамических TRT-операций. Созданные TRT-движки для динамической размерности кэшируются. Если количество кэшированных движков уже достигло максимума, но ни один из них не поддерживает формы ввода, TRTEngineOp вернётся к выполнению исходного TF-подграфа, соответствующего TRTEngineOp.
use_calibration этот аргумент игнорируется, если precision_mode не равен INT8. Если установлено в True, будет создан граф калибровки для калибровки отсутствующих диапазонов. Граф калибровки необходимо преобразовать в граф вывода, запустив калибровку с помощью calibrate(). Если установлено в False, ожидаются узлы квантования для каждого тензора в графе (за исключением тех, которые будут объединены). Если диапазон отсутствует, произойдёт ошибка. Обратите внимание, что точность может быть отрицательно затронута, если есть несоответствие между тензорами, которые TRT квантует, и тензорами, с которыми проводилась тренировка с помощью имитации квантования.
allow_build_at_runtime разрешить ли создание движков TensorRT во время выполнения, если во время выполнения не найдётся предварительно созданный движок TensorRT, который может обработать заданные входы, то новый движок TensorRT создаётся во время выполнения, если allow_build_at_runtime=True, а в противном случае используется стандартный TF.
conversion_params экземпляр TrtConversionParams (устаревший).
Raises
ValueError если комбинация параметров недопустима.

Методы

build

Перейти к исходному коду

build(
    input_fn
)

Выполнить вывод с преобразованным графом, чтобы создать движки TensorRT.

Если преобразование требует калибровки INT8, то ссылка на функцию калибровки хранится во время вызова convert(). Калибровка будет выполнена во время создания движков TensorRT.

Args
input_fn функция-генератор, которая предоставляет данные ввода в виде одного массива, ИЛИ список или кортеж массивов ИЛИ словарь, который будет использоваться для выполнения преобразованной подписи для генерации TRT-движков. Пример 1: `def input_fn(): # Предположим сеть с 1 входным тензором. # Мы генерируем 2 набора фиктивных входных данных: input_shapes = [(1, 16), # 1-я форма (2, 32)] # 2-я форма для форм в input_shapes: # возвращает входной тензор yield np.zeros(shape).astype(np.float32)'

Пример 2: def input_fn(): # Let's assume a network with 2 input tensors. # We generate 3 sets of dummy input data: input_shapes = [[(1, 16), (2, 16)], # 1st input list [(2, 32), (4, 32)], # 2nd list of two tensors [(4, 32), (8, 32)]] # 3rd input list for shapes in input_shapes: # return a list of input tensors yield [np.zeros(x).astype(np.float32) for x in shapes]

Raises
NotImplementedError build() уже был вызван.
RuntimeError input_fx равен None.

convert

Перейти к исходному коду

convert(
    calibration_input_fn=None
)

Преобразовать входную сохранённую модель в формате 2.0.

Args
calibration_input_fn функция-генератор, которая возвращает данные ввода в виде списка, кортежа или словаря, которые будут использованы для выполнения преобразованной подписи для калибровки. Все возвращаемые входные данные должны иметь одинаковую форму. Пример: def input_fn(): yield input1, input2, input3

Если dynamic_shape_mode==False (или если у графа есть статические формы ввода), то мы выполняем калибровку и создаём откалиброванный движок во время преобразования.

Если dynamic_shape_mode==True (и у графа есть неизвестные формы ввода), то ссылка на calibration_input_fn сохраняется, а калибровка фактически выполняется при создании движка (см. build()).

Raises
ValueError если комбинация ввода недопустима.
Returns
Преобразованная TF-TRT функция.

save

Перейти к исходному коду

save(
    output_saved_model_dir, save_gpu_specific_engines=True, options=None
)

Сохранить преобразованную SavedModel.

Args
output_saved_model_dir каталог для сохранения преобразованной SavedModel.
save_gpu_specific_engines сохранить ли созданные TRT-движки. Когда True, все движки сохраняются, а когда False, движки не сохраняются и будут пересозданы во время вывода. Используя save_gpu_specific_engines=False после калибровки INT8, вывод можно выполнить на разных GPU, нежели на том, на котором модель была откалибрована и сохранена.
options объект tf.saved_model.SaveOptions для настройки параметров сохранения.
Raises
RuntimeError если необходимая калибровка не была выполнена.

summary

Перейти к исходному коду

summary(
    line_length=160, detailed=True, print_fn=None
)

Этот метод описывает результаты преобразования TF-TRT.

Он содержит информацию, такую как имя движка, количество узлов на движок, тип данных ввода и вывода, а также форму ввода каждого TRTEngineOp.

Аргументы
line_length Значение длины строки по умолчанию при выводе на консоль. Минимальная длина 160 символов.
detailed Показывать или нет узлы внутри каждого TRTEngineOp.
print_fn Функция вывода. По умолчанию print. Она вызывается для каждой строки сводки. Можно установить пользовательскую функцию для захвата строки сводки.
Исключения
RuntimeError если граф не преобразован.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/experimental/tensorrt/Converter

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API