使用TensorRT(TF-TRT)将tensorflow保存的_模型从float32转换为float16时出现问题

使用TensorRT(TF-TRT)将tensorflow保存的_模型从float32转换为float16时出现问题,tensorflow,tensorrt,Tensorflow,Tensorrt,我有一个tensorflow版本1.14 float32 SavedModel,我想将其转换为float16。根据,我可以将FP16传递到precision_模式,以将模型转换为FP16。但在检查张力板后,转换后的模型仍然是fp32:网络参数是DT_FLOAT而不是DT_HALF。转换模型的大小与转换前的模型相似。在这里,我假设,如果转换成功,模型将变为一半大,因为参数被切成两半 import tensorflow as tf from tensorflow.python.compiler.te

我有一个tensorflow版本1.14 float32 SavedModel,我想将其转换为float16。根据,我可以将FP16传递到precision_模式,以将模型转换为FP16。但在检查张力板后,转换后的模型仍然是fp32:网络参数是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)


欢迎您提出任何意见或建议!谢谢

请尝试更改:

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


这应该会起作用,或者给出一个适当的错误日志,因为在当前代码的情况下,precision_mode被设置为FP32。您需要precision_mode=FP16来试用半精度。

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

有几件事需要考虑:

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

TensorRT引擎包含已转换节点的权重副本。在FP16模式下,假设大多数节点都已转换,TensorRT引擎的大小大约为原始模型的一半。这将添加到原始模型大小中,因此保存的_model.pb将是原始模型大小的1.5倍

如果我们在TF2中设置is_dynamic_op=True default,那么TensorRT引擎的创建将延迟到第一次推理调用。如果在运行第一个推断之前保存模型,则只会向模型添加占位符TRTEngineOp,这实际上不会增加模型大小

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


你有错误日志吗?谢谢你的回复@Ibrahim。我在生成模型时设置了-使用了_float16。不过还是谢谢你回答这个问题!谢谢@Tamas Feher!关于is_dynamic_op的快速问题:如果其中一个TRTEngineOp接受可变大小的输入,例如[4,-1,4],其中第二维度每次都会变化。你建议把它改成TRTEngineOp吗?每次为第二维度的不同值创建引擎op的开销会对模型推理性能产生很大影响吗?这取决于您的需求。引擎创建开销可能在几秒钟到几分钟之间,具体取决于模型的复杂性。如果您知道需要什么形状,那么可以在TF2中使用TrtGraphConverterV2的构建方法提前创建必要的引擎。请注意,在动态模式下,您需要增加maximum_cached_engines参数default 1,因为在达到该值后,任何无法使用现有引擎处理的形状都将在本机tensorflow中执行。通过这种方式,我们限制了内存消耗和引擎的构建开销。我们目前正在改进对可变输入大小模型的支持。您的输入大小有多大差异?只是一些不同的尺寸,例如[4,4,4]和[4,8,4],还是处理大量不同的输入?使用TensorRT 6或更高版本,我们可以创建支持一系列输入大小的引擎,我们目前正在努力通过TF-TRT.Hi@TamasFeher公开这一点。我正在使用tf2,我按照下面的文档构建TRT引擎:您说过将有引擎序列化到assets目录,但我没有看到任何引擎。我不确定我的型号是否转换为fp16。我如何检查呢?关于你提到的关于大小的第二点,我观察到的是,无论我使用fp32、fp16、int8,保存的_model.pb文件都比原始文件大1.5倍。我也不明白为什么
tf.flags.DEFINE_bool('use_float16', True, 'Whether we want to quantize it to float16.')