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. -
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