通常 dnn 中的一层由 MatMul、BiasAdd、Relu组成,cuBlas 为 MatMul 提供了 Gemm,我们可以在另一个内核中为 GPU 做 BiasAdd 和 Relu。它们是两个 GPU lanuch 调用,有没有办法将它们融合在一起并使其成为一个?我查看了cuBlas, cudnn,但没有找到任何东西。我认为这并不难,因为 BiasAdd 和 Relu 只是元素方面的操作,而融合使其更高效。
这是背景:
我正在开发一个在线预测服务,它是多 dnn 模型集合。通过分析我的程序,我发现我的 CPU 和 GPU 都没有得到充分利用,而是在 GPU 相关的函数调用(如 lanuchKernel)上请求块。似乎libcuda 中有一个大锁。我正在使用 tensorflow,启用了 XLA,所以我使用 nvprof 和 tensorflow HLO 来可视化 GPU 调用,并且只有点和融合(即biasadd 和 relu)操作。虽然做了内核融合,但还是有太多的 lanuchKernel 调用,GPU 利用率只有 60%。我在一个过程中尝试了多 cuda 上下文,改进是微不足道的。
顺便说一句,我正在使用一个 GPU,Tesla P100。