如何减少使用Tensorflow的C API进行推理所需的时间?

时间:2019-05-05 07:35:08

标签: tensorflow deep-learning c-api

我目前正在从事一个需要使用Tensorflow的C API进行深度学习推理的项目。我有训练有素的神经网络(格式:冻结图)可以做到这一点。我们将推论用于计算流体动力学,这使性能成为我的关键方面。例如,一个模拟包括数千个时间步。在每个时间步中,必须对数千套输入数据进行推断。在我目前的情况下,我的计算域包括33400个像元和880个边界补丁。这意味着,对于这数千个时间步中的每一个,我都必须进行推理34280次。我们使用3个输入值和15个输出值。

整个推理过程(从提供输入值到接收输出值)在我的GPU上总共需要91毫秒。实际的推断步骤:TF_SessionRun(...)占了计算时间的98%。

TF_CAPI_EXPORT extern void TF_SessionRun(
TF_Session* session,
// RunOptions
const TF_Buffer* run_options,
// Input tensors
const TF_Output* inputs, TF_Tensor* const* input_values, int ninputs,
// Output tensors
const TF_Output* outputs, TF_Tensor** output_values, int noutputs,
// Target operations
const TF_Operation* const* target_opers, int ntargets,
// RunMetadata
TF_Buffer* run_metadata,
// Output status
TF_Status*);

现在的问题是,我需要在每个时间步中进行推理34280次,这大约需要52分钟。这意味着数千个时间步长,计算时间很长。

令人惊讶的是,如果我将冻结的图转换为uff模型,并使用TensorRT进行推理,则所有34280个输入集只需要90毫秒。这意味着TensorRT相对于C API的加速大约为35000。由于我们要在仅CPU架构上进行推断,因此后来,TensorRT对我来说是没有选择的。

我的问题:您知道一种以某种方式使用Tensorflow C API的方法,这种方法可以大大减少多次推理的计算时间吗?瓶颈肯定是TF_SessionRun(...)命令,但是我看不到仅调用一次命令即可运行34280推论的方法。此外,该命令提供了几个选项(运行选项,运行元数据,目标操作,目标数量-请参见上面的代码),这些选项在我在Internet上找到的单个示例中都没有使用。也许这些可以用来改善性能?

0 个答案:

没有答案