AndrejKarpathy:大模型有内存限制,这个妙招挺好用|速度|序列|token|karpathy
用微信扫码二维码
分享至好友和朋友圈
AndrejKarpathy用通俗易懂的语言介绍了speculativeexecution。
「如今,LLM(大语言模型)并不是单点突破的——而是需要多个重要组件有效协同工作的系统。Speculativedecoding是帮助我们从系统角度思考的一个很好的例子。」爱丁堡大学博士生符尧表示道。
人形机器人公司1XTechnologies的AI副总裁EricJang评价道:「Karpathy很好的解释了LLM的speculativeexecution。其他自回归模型可能会以类似的方式加速。连续(扩散)模型可能从K步中获益较少(可能在第1步后偏离猜测),但可以将其应用于VQ-latents的离散代码。」
看完上述评价,我们大概也了解了,Karpathy说的「Speculativeexecution」,这是优化技术的一类,采用这个技术的计算机系统会根据现有信息,利用空转时间提前执行一些将来可能用得上,也可能用不上的指令。如果指令执行完成后发现用不上,系统会抛弃计算结果,并回退执行期间造成的副作用(如缓存)。
为了让大家更好的理解Karpathy的内容。我们先介绍一下「Speculativedecoding」方法,对后续理解更加有益,其主要用于加速大模型的推理。据了解,GPT-4泄密报告也提到了OpenAI线上模型推理使用了它(不确定是否100%)。
关于「Speculativedecoding」,已有几篇重要文献可供参考,这也是Karpathy为了写这则推特所参考的论文,包括谷歌今年1月发表的论文《FastInferencefromTransformersviaSpeculativeDecoding》、DeepMind今年2月发表的论文《AcceleratingLargeLanguageModelDecodingwithSpeculativeSampling》,以及谷歌等机构2018年的论文《BlockwiseParallelDecodingforDeepAutoregressiveModels》。
简单来说,「Speculativedecoding」使用两个模型:一个是原始目标模型称为大模型,另一个是比原始模型小得多的近似模型称为小模型。主要思想是先让小模型提前解码多个token进行猜测,并将它们作为单个batch输入到一个大模型中进行审核修正,其效果和直接用大模型解码等价。如果小模型猜测的不准确,那么大型模型会放弃小模型预测的token,继续使用大型模型进行解码。
由于小模型计算量小,从而大大减少了内存访问需求。
介绍完「Speculativedecoding」,我们再回到Karpathy的推特。Karpathy是针对下面内容回复的。
Karpathy表示:对于LLM来说,「Speculativeexecution」是一种极好的推理—时间优化方法。
它取决于以下方面:在单个输入token上分发LLM所花费的时间与在批处理中分发K个输入token所花费的时间一样多。产生这样的原因是因为采样严重受内存限制:模型运行时的大部分工作不是在做计算,而是从VRAM读取transformer的权重到片上缓存进行处理。如果你要做的工作是来读取这些权值,你可以把它们应用到一整批输入向量上。
但是我们不能一次性采样一批K个token,因为每N个token都取决于我们在第N-1步采样的token。由于存在串行依赖性,因此基线实现只是从左到右逐一进行。
这种方法起作用的原因在于,很多「草稿」token都会被接受,因为它们很容易,所以即使是更小的草稿模型也能得到它们。当这些简单的token被接受时,我们会跳过这些部分。大模型不同意的hardtoken会回落到原始速度,但由于一些额外的工作,实际上速度会慢一些。
Karpathy表示,这个奇怪的技巧之所以有效,是因为LLM在推理时受到内存限制,在对单个序列进行采样的batchsize=1设置中,很大一部分本地LLM用例都属于这种情况。因为大多数token都很「简单」。