根据scale law,模型参数和数据量越多,效果越好。但是参数量越多带来的副作用就是大显存占用和很慢的推理速度。
一般来说,如今LLM加速技术分为三大类:模型层面,计算层面,解码过程
模型层面加速:
-
模型剪枝:删除无关紧要的权重
-
模型量化:高精度参数没有必要,换成8bit就行
-
模型蒸馏:在特定领域,只需要LLM的一部分智能,不需要全部,那就把这部分教会给一个小模型
计算层面加速:
-
模型并行:参数太多,分割到多个GPU上
-
数据并行:数据大多,分割到多个GPU上
-
混合精度计算:必要的地方用高精度,不必要的地方用低精度,封装成torch的amp装饰器
解码过程加速:
-
投机解码:用一个小而快的模型生成多个候选答案序列,由LLM评估最合理的序列,然后接着生成
-
KV cache:利用self-attention的计算原理,缓存之前计算过的KV乘积
投机解码
投机解码感觉是从计算机体系结构中得到的灵感,在设计五级流水线CPU的时候就有一个加速技术为分支预测。
投机过程
-
草稿阶段:小模型快速生成前缀序列x1,x2,x3,...,xt
-
验证阶段:LLM将该前缀进行推理,计算该草稿的概率,若符合预期,采样下一个token的xt+1, 得到序列x1,x2,...xt,xt+1。具体而言:
-
对于小模型的生成序列x1...t, LLM计算每个token的概率为p(xt), 而小模型计算每个token的概率为q(xt)
-
如果p(xt)<q(xt) (LLM 绝对这个token不太合理),那就按照1−q(xt)p(xt)的概率拒绝这个token,从新的概率分布p‘(x)=norm(max(0,p(xt)−q(xt)))重新采样该token
等价证明
上面列出了投机过程,看着解释的同,但是真的合理吗?不会降低模型智能吗?通过数学证明可知,投机采样和LLM自回归采样是等价的。
β(xt) 只存在两种情况:
-
LLM验证后觉得合理,也就是p(x)>=q(x), 直接接受得到这个token, 则 β(xt)=q(xt)=min{p(xt),q(xt)}
-
LLM验证后觉得不合理,也就是p(x)<q(x)拒绝并重新采样得到这个token。
-
拒绝其他所有token的概率为1−∑xt‘!=xtmin{p(xt‘),q(xt‘)}
-
LLM再采样,正好采样到这个token的概率:p(xt)
-
则β(xt)=p(xt)×(1−∑xt‘!=xtmin{p(xt‘),q(xt‘)})
故:β(xt)=min{p(xt),q(xt)}+p(xt)×(1−∑xt‘!=xtmin{p(xt‘),q(xt‘)}) , 证明不下去了,数学太菜了,反正大概和p(xt)是属于同一个分布