关于投机推理的一点思考
对于decoding阶段,单卡一般请求并发量不会很大,所以一般认为decoding阶段是memory bound;
我们在做大模型推理优化时,一般会考虑投机推理,如Eagle、MTP(感觉从推理角度看mtp和eagle似乎也没什么本质区别);从投机的原理上分析,可以有效的降低单token时延,这点也比较好理解;今天突然发现在一定程度上,不仅可以用于降低时延,还可以提升最大吞吐;
下面从计算和访存角度简单分析一下:
降低时延
假设请求并发量为B=32,那么Attention和FFN计算的token num=32;matmul的计算量=2mkn;
在decoding阶段,matmul计算的左矩阵是上一步计算出来的且不大,所以一般在L2 cache中,在matmul计算中,数据从L2 cache加载到L0/寄存器比较快,可以忽略;右矩阵是模型权重,需要从GPU/NPU的global memory中加载到L0/寄存器中,比较耗时;
matmul计算的M=32,那计算比访存可以约等于M;不同的芯片自身的计算带宽比不一样;
对于H20,算力为148T,内存带宽为4TB,计算带宽比37,可能M=32,matmul算子可以做到算力利用率比较高;
但对于Ascend 910,算力为300T,内存带宽不到2T,计算防存比150,很难在M=32时,发挥算力,严重memory带宽瓶劲;
增大请求并发量B=128,token num=128时,可以发挥算力,但单token时延较高;投机推理就很重要了。
投机推理相当于单次推理多个token(假设为N=4),那并发量还是32时,但token num=128,那么就matmul算子就可以发挥算力,从访存慢走向计算耗时;且在这个阶段,即使token量增加了3倍,但单次forward耗时,基本不会增加太多,所以会有很大的收益;
只要一次token num=128的推理耗时比4次token num=32的推理耗时低,都会有降低时延上的收益;
(以上都忽略接受率的影响,考虑到接受率以及一些其它耗时的影响,并发量*草稿token数量 > 一个特定的值,投机推理会没有收益)
提升吞吐
在token num=128的情况下,对于无投机推理的场景,需要128个请求;对于投机4个token的场景,需要32个请求;
从计算量角度看,同样是128个token,模型的计算量基本是一样的,对于matmul是一样的,有投机的attention core计算量稍微大一点,但也可以忽略;
从访存角度看,模型访存分为模型权重和kv cache;模型权重访存量是一样,但kv cache的防存是不一样的,投机方式kv cache量要小几倍。
从attention core计算访存比上分析,attention core的计算量是BNS1S2D,S2表示kv cache长度,S1表示Q的长度(单个请求Q的token数量),访存量是BN2S2D,N2表示KV head num,attention core的计算访存比为N1/N2*S1,和B是无关的;
所以模型结构在确定以后,增大请求量其实也无法缓解attention core访存的瓶颈;但投机推理,将S1增大,其实更有利于attention core计算发挥算力;
所以attention core理论上,耗时可以降低很多,假设attention core算子计算占比20%,单算子性能提升N倍,理论上相等的token num情况下,单次forward的耗时会更低,吞吐会增大。
(考虑到接受率以及一些其它耗时的影响,草稿token数量 > 一个特定的值,吞吐会降低)