FlagOpen/FlagPerf

问题咨询 MFU是如何计算的

Closed this issue · 2 comments

  1. 在训练任务中项目里给出的所有模型的MFU计算方式都是
    MFU = 6 * token-pes-second * params / per-iter-time
    比较好奇这个6代表什么

  2. 另外和其他论文中给出的计算公式也不太一样
    例如megatron 和 nanogpt的MFU计算方式

MFU的定义为:训练模型必要的计算量/理论计算量。

  1. 您在issue中的表述有误,此项目给出的计算公式通常为6*token/s*params/单卡理论算力/卡数,而非除以per-iter-time
  2. 根据MFU的定义,如果每一个token(单位输入数据)对应的必要计算量相同,则MFU的定义可以转化为数据数量*单位数据必要计算量/理论计算量。进一步的,理论计算量=卡数*训练时间*单卡理论算力
  3. 进一步推导上式,将数据数量/训练时间转化为吞吐,即tokens/s,MFU的定义可以转化为tokens/s*单位数据必要计算量/单卡理论算力/卡数。至此已经与本项目给出的计算公式格式相同。仅剩余一个问题,即单位数据必要计算量=6*params,6的单位为flops/(token*params)
  4. 根据Transformer模型原理,MLP部分为产生计算的主体部分。在绝大多数LLM包括LLaMA、Aquila中,除MLP外的部分可忽略不计。因此,仅对MLP进行考虑。查阅类似LLaMA的模型公式易知,前向传播每一个token与每一个param产生了一次乘法一次加法,即1MAC=2Flops。反向传播计算量为前向的2倍,因此对于每个token,每有一个param就会产生6flops的计算量
  5. 综上所述,单位数据必要计算量=6*params。至此推导出本项目所用公式
  6. 值得注意的是,上述计算存在若干简化,例如对MLP以外的部分忽略不计,将反向传播估计为前向传播的2.0倍,使用7B/70B等量级代替LLaMA2中实际的MLP部分参数量(例如LLaMA2-7B的MLP部分为6.4B,LLaMA2-70B的MLP部分为68B)。但上述简化对计算结果不产生主要影响

如上述推导存在错误请指正,一起交流学习,谢谢!

Closing as stale. Please reopen if you'd like to work on this further.