从大模型爆发到现在,我就一直好奇为什么output token比input token要贵,而且有的会贵好几倍!今天就这个话题和大家聊一聊。
对于输入和输出相同数量的token,模型的浮点运算次数(FLOPs)大致相同,这个计算量是由模型的前向传播决定的,无论是处理输入还是输出。
输入 token 的QKV是并行计算,输出token的QKV是KV Cache 的形式。从内存的角度来讲,输出时需缓存此时token前的KV矩阵,经过一系列的优化手段,输出所占显存比输入大的并不多。
如果GPU计算速度超过数据读取速度,GPU的流处理器就会处于等待状态,那通信就是瓶颈;反之,如果计算速度慢于数据读取速度,通信就需要等待,那就是计算瓶颈。而大模型训练在多数情况下,都是算的快读的慢,即通信是瓶颈。
经过长时间的优化,整体的 MFU (Model FLOPs utilization) 很难打满,目前大模型的训练 MFU 在50-60% 就已经很厉害了。
在计算量时写过,对于输入token来说,模型可以利用并行只需执行一个 forward 计算,整个计算过程的利用率能接近训练的最高水平。
然而对于输出token来说,必须是一个token一个token的生成,对于D个输出token来说,需要执行 D 次 forward 操作。而通信本来就是瓶颈,现在 D 次 forward 的额外通信更是雪上加霜。虽然现在也有batch 与动态填充等等优化,但是 GPU 利用率上来说,输出是远低于输入的。
以上原因,导致了output token比input token更贵一些。
文章来自于微信公众号“AI有温度”,作者“安泰Rolling”