vap*_*orK 2 python tensorflow tensorrt
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)
Run Code Online (Sandbox Code Playgroud)
第二个是
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()
Run Code Online (Sandbox Code Playgroud)
去除所有用于导入、推理等的样板代码,区别似乎在于调用converter.build(). 文档解释了这个功能:
“此方法通过构建 TensorRT 引擎来优化转换后的函数(由 convert() 返回)。这在用户想要在运行前执行优化的情况下非常有用。优化是通过使用接收到的输入数据对转换后的函数进行推理来完成的来自参数 input_fn。这个参数是一个生成器函数,它以列表或元组的形式生成输入数据。”
在这种情况下,“运行前”是什么意思?“优化”是在模型加载时、在第一次推理时还是在使用转换后的模型的每次推理时执行?什么是这些优化,即使是?将模型转换为 TensorRT 本身不是一种优化吗?
我问是因为如果我converter.build()在花了很多时间(超过两个小时)运行而没有产生任何合理的输出后,如果我调用转换似乎以不可预测的方式失败,所以我想知道不调用它我会损失多少以及是否有关于将 TF2.x SavedModels 与 TensorRT 结合使用的更全面的文档。
在此先感谢谁能回答!!
根据我的理解(在阅读TensorFlow 的文档后),该converter.convert()函数将图形转换为 tf-trt,用 TRTEngineOp 替换它可以使用的任何节点,但它不会创建推理期间使用的实际引擎文件。
converter.build()然而,调用会创建引擎文件,但对于 input_fn 提供的输入的输入大小,以及正在运行构建的平台。因此,不调用的原因converter.build()是您事先不知道输入形状,或者无法在要运行推理的平台上进行构建。
我发现很难想象为每个前向传递创建新的引擎文件,但肯定是为每个新的输入形状创建的。从示例中不清楚输入 frominput_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]
Run Code Online (Sandbox Code Playgroud)
至于你的 input_fn,你有两张图片作为你的网络的输入吗?对我有用的是在上面的示例中返回一个列表中的单个图像(元组由于某种原因不起作用,即使文档说它应该)。
希望这有帮助。
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |