当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.experimental.tensorrt.Converter用法及代码示例


用于 TF 2.0 SavedModels 的 TF-TRT 转换的离线转换器。

用法

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
)

参数

  • 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 TRT 引擎在执行时可以使用的最大 GPU 临时内存。这对应于 nvinfer1::IBuilder::setMaxWorkspaceSize() 的 'workspaceSize' 参数。
  • precision_mode TrtPrecisionMode.supported_precision_modes() 中的字符串之一。
  • minimum_segment_size 由 TRTEngineOp 替换子图所需的最小节点数。
  • maximum_cached_engines 动态 TRT 操作的最大缓存 TRT 引擎数。为动态维度创建的 TRT 引擎被缓存。如果缓存引擎的数量已经达到最大值,但它们都不支持输入形状,则 TRTEngineOp 将回退到运行与 TRTEngineOp 对应的原始 TF 子图。
  • 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 如果参数组合无效。

目前这在 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)

    在这种情况下,不会在转换后的 SavedModel 中构建或保存任何 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 和以下 profile_strategies 之一创建,以便根据输入函数产生的输入创建配置文件:

    • Range:创建一个适用于维度值在 [min_dims, max_dims] 范围内的输入的配置文件,其中 min_dims 和 max_dims 是从提供的输入派生的。
    • Optimal :为每个输入创建一个配置文件。该配置文件仅适用于与其创建的输入具有相同维度的输入。 GPU 引擎将以此类输入的最佳性能运行。
    • Range+Optimal :为 RangeOptimal 创建配置文件。
    • ImplicitBatchModeCompatible :创建将产生与 implicit_batch_mode 将产生的 GPU 引擎相同的配置文件。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.experimental.tensorrt.Converter。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。