【问题标题】:Problem converting tensorflow saved_model from float32 to float16 using TensorRT (TF-TRT)使用 TensorRT (TF-TRT) 将 tensorflow saved_model 从 float32 转换为 float16 的问题
【发布时间】:2020-02-27 06:48:27
【问题描述】:

我有一个要转换为 float16 的 tensorflow(1.14 版)float32 SavedModel。根据https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html#usage-example ,我可以将“FP16”传递给precision_mode 以将模型转换为fp16。但是转换后的模型,在检查了tensorboard之后,仍然是fp32:net参数是DT_FLOAT而不是DT_HALF。并且转换后的模型大小与转换前的模型相似。 (这里我假设,如果转换成功,模型将变成原来的一半,因为参数被减半)。

import tensorflow as tf
from tensorflow.python.compiler.tensorrt import trt_convert as trt
import os

FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('saved_model_dir', '', 'Input saved model dir.')
tf.flags.DEFINE_bool('use_float16', False,
                     'Whether we want to quantize it to float16.')
tf.flags.DEFINE_string('output_dir', '', 'Output saved model dir.')


def main(argv):
    del argv  # Unused.
    saved_model_dir = FLAGS.saved_model_dir
    output_dir = FLAGS.output_dir
    use_float16 = FLAGS.use_float16

    precision_mode = "FP16" if use_float16 else "FP32"
    converter = trt.TrtGraphConverter(input_saved_model_dir=saved_model_dir,
                                      precision_mode=precision_mode)
    converter.convert()
    converter.save(output_dir)


if __name__ == '__main__':
    tf.app.run(main)

非常欢迎任何意见或建议!谢谢

【问题讨论】:

  • 您是否收到任何错误日志?

标签: tensorflow tensorrt


【解决方案1】:

您为 TF-TRT 正确指定了精度模式。但是在 TensorBoard 上检查网络参数并不能揭示 TensorRT 引擎如何在内部存储转换后的模型模型的参数。

有几件事情需要考虑:

  • 在 TF-TRT 中,模型转换为 TensorRT 后,我们仍然保留原始的 Tensorflow 权重。如果由于某种原因 TensorRT 路径失败,这样做是为了提供对原生 TensorFlow 执行的回退。这样,saved_model.pb 文件将至少与原始模型文件一样大。

  • TensorRT 引擎包含已转换节点权重的副本。在 FP16 模式下,TensorRT 引擎大小将大约是原始模型大小的一半(假设大部分节点都进行了转换)。这将添加到原始模型大小,因此 saved_model.pb 将是原始模型大小的 1.5 倍。

  • 如果我们设置 is_dynamic_op=True(TF2 中的默认值),则 TensorRT 引擎的创建会延迟到第一次推理调用。如果我们在运行第一次推理之前保存模型,那么只会在模型中添加一个占位符 TRTEngineOp,这并不会真正增加模型大小。

  • 在 TF2 中,TensorRT 引擎被序列化到 Assets 目录中的单独文件中。

【讨论】:

  • 谢谢@Tamas Feher!关于 is_dynamic_op 的快速问题:如果 TRTEngineOp 之一接受可变大小的输入,例如[4, -1, 4],其中第二维每次都变化。您会建议将其转换为 TRTEngineOp 吗?每次为不同的第二维值创建引擎操作的开销是否会对模型推理性能有很大影响?
  • 这取决于您的要求。引擎创建开销可以是几秒到几分钟之间的任何时间(取决于模型的复杂性)。如果您知道您期望什么形状,那么您可以使用 TrtGraphConverterV2 的 build() 方法(在 TF2 中)提前创建必要的引擎。请注意,在动态模式下,您需要增加 maximum_cached_engines 参数(默认为 1),因为在达到此值后,我们无法使用现有引擎处理的任何形状都将在本机 tensorflow 中执行。通过这种方式,我们限制了引擎的内存消耗和构建开销。
  • 我们目前正在改进对可变输入大小模型的支持。你的输入在大小上有多少变化?只是几个不同的大小(例如 [4, 4, 4] 和 [4,8,4]),还是您处理大量不同的输入?使用 TensorRT 6(或更新版本),我们可以创建支持一系列输入大小的引擎,我们目前正在努力通过 TF-TRT 公开它。
  • 嗨@TamasFeher,我正在使用tf2,我按照此处的文档构建了trt引擎:tensorflow.org/api_docs/python/tf/experimental/tensorrt/…您说会有引擎序列化到资产目录,但我没有看到任何引擎。我不确定我的模型是否转换为 fp16。我该如何检查?
  • 同样对于你提到的关于尺寸的第二点,我观察到无论我使用 fp32、fp16、int8,save_model.pb 文件都比原来的大 1.5 倍。我也不明白为什么
【解决方案2】:

请尝试更改:

tf.flags.DEFINE_bool('use_float16', False, 'Whether we want to quantize it to float16.')

tf.flags.DEFINE_bool('use_float16', True, 'Whether we want to quantize it to float16.')

这应该可以工作或给出适当的错误日志,因为当前代码 precision_mode 被设置为 "FP32"。您需要precision_mode = "FP16" 来试用半精度。

【讨论】:

  • 感谢您的回复@Ibrahim。我在生成模型时确实设置了 --use_float16 。不过还是谢谢你回答这个问题!
猜你喜欢
  • 2020-05-04
  • 2020-09-12
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2023-03-20
  • 2016-06-14
  • 2020-03-09
  • 2018-03-24
相关资源
最近更新 更多