转换器.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的文档。
不管谁能回答,都要提前感谢!
根据我的理解(读完 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,你是否有两张图片作为网络的输入?对我来说,有效的方法是像上面的例子一样,在一个列表中返回一个图像(由于某些原因,元组没有工作,尽管文档说它应该)。
希望这对你有帮助。