问题咨询 MFU是如何计算的
Closed this issue · 2 comments
yingjun8 commented
-
在训练任务中项目里给出的所有模型的MFU计算方式都是
MFU = 6 * token-pes-second * params / per-iter-time
比较好奇这个6代表什么 -
另外和其他论文中给出的计算公式也不太一样
例如megatron 和 nanogpt的MFU计算方式
shh2000 commented
MFU的定义为:训练模型必要的计算量/理论计算量。
- 您在issue中的表述有误,此项目给出的计算公式通常为6*token/s*params/单卡理论算力/卡数,而非除以per-iter-time
- 根据MFU的定义,如果每一个token(单位输入数据)对应的必要计算量相同,则MFU的定义可以转化为数据数量*单位数据必要计算量/理论计算量。进一步的,理论计算量=卡数*训练时间*单卡理论算力
- 进一步推导上式,将数据数量/训练时间转化为吞吐,即tokens/s,MFU的定义可以转化为tokens/s*单位数据必要计算量/单卡理论算力/卡数。至此已经与本项目给出的计算公式格式相同。仅剩余一个问题,即单位数据必要计算量=6*params,6的单位为flops/(token*params)
- 根据Transformer模型原理,MLP部分为产生计算的主体部分。在绝大多数LLM包括LLaMA、Aquila中,除MLP外的部分可忽略不计。因此,仅对MLP进行考虑。查阅类似LLaMA的模型公式易知,前向传播每一个token与每一个param产生了一次乘法一次加法,即1MAC=2Flops。反向传播计算量为前向的2倍,因此对于每个token,每有一个param就会产生6flops的计算量
- 综上所述,单位数据必要计算量=6*params。至此推导出本项目所用公式
- 值得注意的是,上述计算存在若干简化,例如对MLP以外的部分忽略不计,将反向传播估计为前向传播的2.0倍,使用7B/70B等量级代替LLaMA2中实际的MLP部分参数量(例如LLaMA2-7B的MLP部分为6.4B,LLaMA2-70B的MLP部分为68B)。但上述简化对计算结果不产生主要影响
如上述推导存在错误请指正,一起交流学习,谢谢!
shh2000 commented
Closing as stale. Please reopen if you'd like to work on this further.