Spec-Zone.ru › TensorFlow

tf.experimental.tensorrt.Converter

Автономный конвертер для преобразования TF-TRT моделей SavedModel формата 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 не будут созданы или сохранены в преобразованной модели SavedModel. Однако если во время преобразования доступны входные данные, мы всё равно можем создать и сохранить механизмы 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 и одной из следующих стратегий profile_strategies, чтобы создать профили на основе данных, выдаваемых функцией ввода:

    • Range: создать один профиль, подходящий для входных данных со значениями измерений в диапазоне [min_dims, max_dims], где min_dims и max_dims определяются на основе предоставленных входных данных.
    • Optimal: создать по одному профилю для каждого входного набора данных. Профиль подходит только для входных данных с такими же измерениями, что и у набора данных, для которого он создан. При использовании таких входных данных механизм GPU будет работать с оптимальной производительностью.
    • Range+Optimal: создать профили для Range и Optimal.
Аргументы
input_saved_model_dir каталог, из которого загружается SavedModel, содержащая входной граф для преобразования. Обязательный аргумент.
input_saved_model_tags список тегов для загрузки SavedModel.
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, который может обработать заданные входные данные, то при allow_build_at_runtime=True новый механизм TensorRT создаётся во время выполнения, а в противном случае используется собственная реализация TF.
conversion_params экземпляр TrtConversionParams (устаревший аргумент).
Вызывает исключение
ValueError если сочетание параметров недопустимо.

Методы

build

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

build(
    input_fn
)

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

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

Аргументы
input_fn функция-генератор, предоставляющая входные данные в виде одного массива ИЛИ списка или кортежа массивов, ИЛИ словаря, который будет использоваться для выполнения преобразованной сигнатуры и создания механизмов TRT. Пример 1: `def input_fn(): # Let's assume a network with 1 input tensor. # We generate 2 sets of dummy input data: input_shapes = [(1, 16), # 1st shape (2, 32)] # 2nd shape for shapes in input_shapes: # return an input tensor 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]

Вызывает исключение
NotImplementedError метод build() уже вызван.
RuntimeError input_fx имеет значение None.

convert

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

convert(
    calibration_input_fn=None
)

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

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

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

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

Вызывает исключение
ValueError если сочетание входных данных недопустимо.
Возвращает
Функцию TF-TRT, полученную в результате преобразования.

save

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

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

Сохраняет преобразованную модель SavedModel.

Аргументы
output_saved_model_dir каталог для сохранения преобразованной модели SavedModel.
save_gpu_specific_engines нужно ли сохранять созданные механизмы TRT. Если задано значение True, сохраняются все механизмы; если False — механизмы не сохраняются и будут созданы повторно во время вывода. Если после калибровки INT8 задать save_gpu_specific_engines=False, вывод можно выполнять на GPU, отличном от того, на котором модель была откалибрована и сохранена.
options объект tf.saved_model.SaveOptions для настройки параметров сохранения.
Вызывает исключение
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