Spec-Zone.ru › TensorFlow 2.9

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.
    • ImplicitBatchModeCompatible: создать профили, которые будут генерировать такие же движки GPU, как и implicit_batch_mode.
Аргументы
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 (устарел).
Исключения
ValueError если комбинация параметров недействительна.

Методы

build

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

build(
    input_fn
)

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

Аргументы
input_fn функция-генератор, которая возвращает данные входных данных в виде списка, кортежа или словаря, которые будут использованы для выполнения преобразованной подписи для генерации TRT-движков. Пример: 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]
Исключения
NotImplementedError build() уже вызван.
RuntimeError input_fx равен None.

convert

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

convert(
    calibration_input_fn=None
)

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

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

save

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

save(
    output_saved_model_dir, save_gpu_specific_engines=True
)

Сохранить преобразованную сохранённую модель.

Аргументы
output_saved_model_dir каталог для сохранения преобразованной сохранённой модели.
save_gpu_specific_engines сохранять ли созданные TRT-движки. При True все движки сохраняются, а при False — нет, и движки будут пересозданы во время вывода. Используя save_gpu_specific_engines=False после калибровки INT8, вывод может выполняться на разных GPU, чем на GPU, на котором модель была откалибрована и сохранена.

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/versions/r2.9/api_docs/python/tf/experimental/tensorrt/Converter

Spec-Zone.ru

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