PEARL 论文阅读
之前读 EAGLE 的时候就看到这位老哥在底下附上这篇 paper,最近要看 PD 分离有关的文字,正好看看这篇,记录一下
Core Idea
传统的 SD 基于这样的原则:在完成一个序列的 Draft token的输出之后才进行一次验证,也就是说验证和推理天然存在一个逻辑上的先后关系,验证的同时是没有推理的进行的,推理的同时也无法进行验证
为了能够让这两个过程并行起来,PEARL提出了两种验证的策略来帮助
Core Concept
两种验证策略,pre-verify和post-verify:
pre:这个策略的目标就是为了打破验证要在完整推测之后发生的限制,对prefix,在第一个 Draft Token出现的同时就进行验证,如果第一个就不接受,后面的都不会接受;同时这个做法也没有打破逻辑上的先后关系,感觉所有的推理中其实都可以使用这种利用资源的办法
post:这个 verify 旨在打破 vanilla SD 中 draft 的生成要等待 verify 结束来提供一个prefix,将多次 draft generation 之间的间隔合并;换句话说,假如一次的 draft token 生成中全对,那么就能继续接着生成,draft model 还有没发挥完的潜力,所以不需要 verify 生成的 prefix 去“打扰”现在健康的生成;而当错误的验证发生的时候,就要重回到 pre 的验证阶段
Thinking
这个方法看起来挺nature的,但是就像pipeline里的分支预测那样,依赖于预测方向的可能性,也就是 draft 的接受率,
推导了一个计算公式,假设
- tggenerate time
- tvverify time
- γ一次draft生成的最大长度
- α每个token的接受率
- t1一个section的时间
从一次推理的开始出发,也就是从一次pre-verify出发,一共有两种可能:verify 成功 / 失败
失败的情况下,
tf=max(γtg,tv)
nt=1
而成功的情况下,有可能连续进行多次的post-verity,概率为
P(accept=aγ+b)=αaγ+b(1−α)
ts=(a+1)tf
进行一下加权的计算,得到
E[n]E[t]E[stoken]=(1−α)⋅1+αk=1∑∞k⋅αk(1−α)=1−α+1−αα2,=(1−α)ts+αa=0∑∞(a+1)ts⋅αaγ(1−α)=(1−α)ts+(1−αγ)2α(1−α)ts,=E[t]E[n]=(1−α)ts+(1−αγ)2α(1−α)ts1−α+1−αα2,
而 vanilla SD的平均收益
U=ktg+tvαk
简单取tv=10tg,γ= 4,得到了如下的图像,可以看到接受率高的时候是有显著的收益的
而且随着接受序列的边长,接受率是会下降的,也就是说真实的情况下不是等比数列,效果还要差一点