TensorRT中的converter.build()有什么用?

问题描述 投票:0回答:1

转换器.build()有什么用?TensorRT的官方文档 列出了两种将TensorFlow SavedModel转换为TensorRT SavedModel的方法:第一种是

from tensorflow.python.compiler.tensorrt import trt_convert as trt
converter = trt.TrtGraphConverterV2(input_saved_model_dir=input_saved_model_dir)
converter.convert()
converter.save(output_saved_model_dir)

二是

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

conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS
conversion_params = conversion_params._replace(
    max_workspace_size_bytes=(1<<32))
conversion_params = conversion_params._replace(precision_mode="FP16")
conversion_params = conversion_params._replace(
    maximum_cached_engiens=100)

converter = trt.TrtGraphConverterV2(
    input_saved_model_dir=input_saved_model_dir,
    conversion_params=conversion_params)
converter.convert()
def my_input_fn():
  for _ in range(num_runs):
    Inp1 = np.random.normal(size=(8, 16, 16, 3)).astype(np.float32)
    inp2 = np.random.normal(size=(8, 16, 16, 3)).astype(np.float32)
    yield inp1, inp2
converter.build(input_fn=my_input_fn)
converter.save(output_saved_model_dir)

saved_model_loaded = tf.saved_model.load(
    output_saved_model_dir, tags=[tag_constants.SERVING])
graph_func = saved_model_loaded.signatures[
    signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
frozen_func = convert_to_constants.convert_variables_to_constants_v2(
    graph_func)
output = frozen_func(input_data)[0].numpy()

去掉所有的导入、推理等模板代码,区别似乎在于调用了 converter.build(). 文档中这样解释这个函数。

"该方法通过构建TensorRT引擎来优化转换后的函数(由convert()返回)。这在用户想在运行前进行优化的情况下很有用。优化是通过使用从参数input_fn接收到的输入数据对转换后的函数运行推理来完成的。这个参数是一个生成函数,它可以将输入数据生成为列表或元组。"

在这种情况下,"运行前 "是什么意思?优化 "是在模型加载时进行,还是在第一次推理时进行,还是在使用转换后的模型进行每一次推理时进行?什么是 "运行前"? 那些优化,甚至?将模型转换为TensorRT本身不就是一种优化吗?

我这样问是因为如果我调用 converter.build() 在花了很多时间(超过两个小时)运行而没有产生任何合理的输出后,转换似乎以不可预知的方式失败了,所以我想知道我不调用它损失了多少,以及是否有更全面的关于使用TensorRT的TF2.x SavedModels的文档。

不管谁能回答,都要提前感谢!

python tensorflow tensorrt
1个回答
0
投票

根据我的理解(读完 TensorFlow的文档) converter.convert() 函数将图转换为 tf-trt,用 TRTEngineOp 替换任何可以替换的节点,但它不会创建推理过程中使用的实际引擎文件。

调用 converter.build() 然而,创建引擎文件,但 为输入_fn所提供的输入大小。的平台. 所以,不打电话的原因 converter.build() 会是你事先不知道输入形状,或者不能在你要运行推理的平台上进行构建。

我很难想象,每一次正向传递都要创建新的引擎文件,但肯定是每一个新的输入形状都要创建。从例子中看不清楚,是否从 input_fn 除了提供有关输入形状的信息外,还可以用其他方式使用,但如果你返回不同形状的输入,应该为每个输入大小创建一个引擎文件。

举个例子,提供下面的输入函数,将为输入大小(112,112,3)产生一个引擎,为(224,224,3)产生一个引擎。

def input_fn():
  input_sizes = [[112, 112], [224, 224]]
  for size in input_sizes:
    inp1 = np.random.normal(size=(1, *size, 3)).astype(np.float32)
    yield [inp1]

至于你的input_fn,你是否有两张图片作为网络的输入?对我来说,有效的方法是像上面的例子一样,在一个列表中返回一个图像(由于某些原因,元组没有工作,尽管文档说它应该)。

希望这对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.