Tensorflow 有没有办法在dnn中的gpu上融合全连接层(gemm)和激活层(relu/sigmoid)?

Tensorflow 有没有办法在dnn中的gpu上融合全连接层(gemm)和激活层(relu/sigmoid)?,tensorflow,gpu,cudnn,tensorflow-xla,Tensorflow,Gpu,Cudnn,Tensorflow Xla,通常dnn中的一层由MatMul、BiasAdd、Relu组成,cuBlas为MatMul提供Gemm,我们可以在另一个内核中为GPU提供BiasAdd和Relu。它们是两个GPU lanuch调用,有没有办法将它们融合在一起,使它们成为一个?我查看了库布拉斯,但没有发现任何东西。我认为这并不困难,因为Biasad和Relu只是元素操作,而融合使其更有效 背景如下: 我正在从事在线预测服务,这是多dnn模型集成。通过分析我的程序,我发现我的CPU和GPU都没有得到充分利用,而是请求与GPU相关的

通常dnn中的一层由MatMul、BiasAdd、Relu组成,cuBlas为MatMul提供Gemm,我们可以在另一个内核中为GPU提供BiasAdd和Relu。它们是两个GPU lanuch调用,有没有办法将它们融合在一起,使它们成为一个?我查看了库布拉斯,但没有发现任何东西。我认为这并不困难,因为Biasad和Relu只是元素操作,而融合使其更有效

背景如下:

我正在从事在线预测服务,这是多dnn模型集成。通过分析我的程序,我发现我的CPU和GPU都没有得到充分利用,而是请求与GPU相关的函数调用上的块(比如lanuchKernel)。似乎libcuda中有一个很大的锁。我使用的是TySoFLoad,启用了XLA,所以我使用NVPROF和TunSoFiel-HLO来可视化GPU调用,并且只有<强> dot<强>和<强>融合(即BiasDad和Relu)< /强>操作。虽然内核融合已经完成,但是仍然有太多的内核调用,GPU的利用率只有60%。我在一个过程中尝试了多cuda上下文,改进很小


顺便说一句,我使用的是一个单一的GPU,Tesla P100。

如果不编写自己的定制内核,我不知道如何处理它,它将gemm与您需要执行的任何元素操作结合起来。编写一个性能良好的gemm内核是一个非常重要的练习Libcuda实际上是一个黑盒子,我不知道应该如何处理它。我认为内核融合可能是一种选择,但我不会尝试,因为对于手工编写CUDAXD来说太复杂了。也许还有其他的解决方案。当然,有很多方法可以通过流、并发执行、异步memcopies、成批矩阵乘法等来优化CUDA。但是你无法控制源代码,那么你希望做什么呢?比如流、并发执行、异步memcopies,批量矩阵乘法已在使用中。我不知道下一步如何避免cuda驱动程序级互斥争用。即使我不知道为什么会有互斥,也许无锁队列会更好。也许基于现有高性能版本定制gemm内核是一个合理的选择。