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 предоставляется экспериментально. Нет гарантий относительно функциональности или технической поддержки. Используйте на свой страх и риск.
Существует несколько способов выполнения преобразования:
-
Точность 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 ниже).
-
Точность 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). -
Точность 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) -
Для использования динамической формы нам необходимо вызвать метод 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: |
| 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