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)
and the second is
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接收到的输入数据运行convert()函数进行优化。该参数是一个生成器函数,以列表或元组的形式生成输入数据。"
在这个上下文中,“在运行之前”是什么意思?这些“优化”是在模型加载时、在第一次推理时还是在每次使用转换后的模型进行推理时执行的?那些“优化”究竟是什么?将模型转换为TensorRT本身不就已经是优化了吗?
我之所以问这个问题,是因为如果我调用converter.build()
,转换似乎会以不可预测的方式失败,并且需要很长时间(超过两个小时)才能运行,而且没有产生任何有意义的输出,所以我想知道如果不调用它,我会失去多少,以及是否有更全面的文档介绍如何在TensorRT中使用TF2.x SavedModels。
感谢事先回答的人!!
Inp1
与inp1
。他们不可能没有注意到这个代码片段的问题。 - couka