问题
我以SavedModel格式保存了一个(非常)小而快速的模型,可以用以下代码加载和运行该模型:
model = tf.keras.models.load_model("./<SavedModelDir>")
outputs = model(inputs, training=False)预测函数在0.05秒内运行,输入为5次(在Nvidia GPU上)。然而,如果我使用model.predict_on_batch(inputs)或model.predict(inputs),对于一批5秒,性能会显著下降到0.65-0.80秒。这与文档中的声明一致,即对于较小的输入,使用model() (__call__)通常更快。
我遇到的问题是,我试图将我的模型移植到一个C(++)程序。将TF_SessionRun()用于C和model_bundle.GetSession()->Run(),我的性能类似于“慢速”的Python推理方法。
我已经尝试过的
另一个(非常)小模型,小批量,同样的结果。
我尝试用tf.config.optimizer.set_experimental_options({'disable_meta_optimizer': False})禁用优化,以确保这不会对性能产生负面影响,但这会使事情变得更慢。
我还尝试将SavedModel转换为TensorRT SavedModel。这进一步提高了model() (__call__)方法的性能,但所有其他方法都停止在C++和下载的预编译Tensorflow C GPU (2.5.0)中工作,而使用Tensorflow_CC编译的C++ api会出现一个错误,即未找到操作(TensorRT似乎不起作用)。
给出的所有性能数字都是在几次热身运行后运行的。使用Tensorflow分析器和Python的time.time衡量性能
通过检查输出结果,我检查了model() (__call__)是否正确工作。
我的问题
是否有一种使用Tensorflow C(++) API获得++性能的方法?
这个问题似乎存在于批量较大的Tensorflow优化中,从而降低了较小批大小的性能。是否有另一个API允许对小批开箱即用(TensorRT C++ API)进行快速推理?
发布于 2021-05-31 16:34:04
我想我是偶然发现的,我做了下面的一些事情,我正在尝试:
tf.compat.v1.disable_v2_behavior()位于脚本的顶部。得到输出后的print(len(outputs))。这会产生以下错误:TypeError: len is not well defined for symbolic Tensors.。
通过谷歌搜索,我发现符号张量是不直接持有值的张量,因此这些值可能会在稍后填写。
这意味着Model() (__call__)进行异步计算,对函数进行计时会给出一个假值。这可以通过停止打印/使用每个输出之后的时间来“修正”,或者仅仅使用predict()方法来完全避免这种情况。
https://stackoverflow.com/questions/67760450
复制相似问题