通常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。