被一根根细线串在了一起,然后变成了一张复杂又有序的大网。
【技能结构识别中……】
【知识片段整理中……】
【推理路径压缩中……】
韩路一猛地睁开眼睛。
等等,让我有点儿仪式感。
“视界,加点!”
【算子适配lv1,已习得】
这下舒服了。
韩路一精神一振。
虽然所有的提示语都是他自己给自己写的插件,但是功能是实打实的。
韩路一打开江松然发过来的适配清单,滚动了一会儿,在里面找到了一个标着三个红色感叹号的条目。
fedattentionbackward,注意力融合反向算子。
这是汤圆的训练框架里最关键的算子之一,前向推理完全用不到,只有在反向传播计算梯度的时候才会触发。
正因为只在训练里出现,赵文渊和江松然他们一直没有去适配它。毕竟优先保了推理路径的流畅性,但是训练效率上的损耗是真实存在的,如果要想做训练,这个算子必须得做。
融合算子是什么?反向算子又是什么?
前向attention(注意力)大家都很熟悉了。
query、key、vae三组张量进来,算出注意力权重,再乘上v,得到输出。
推理的时候,最重要的是前向快。
但训练的时候,真正麻烦的是反向。
你不只要知道输出是什么,还要知道输出变化之后,q、k、v三组值要怎么调整。
要是按照普通的实现,这里可以用很多其他算子替代。
先算dv,再算dp,再还原softax梯度,再一步步算过去。
最后就可以得到一个新值,但每一个算子运算,都要读写一次显存,都要运输一次数据。
而大家公认的是,搬数据,比算数据贵。
聪明的芯片工程师们想出了一个解决办法。
既然这个反向计算每次都要跑,跑法都是固定的,那我们把这些算子融合在一起,直接在显卡核心里一次性跑完,不就不用把数据搬来搬去了吗?
这就是融合算子。
想法是很好,但是也很难。
反向计算本来占的内存就大,融合之后就更大。
这个算子可以说是在考验工程师对硬件理解、内存编排的极限