最近在看 Stanford MLSys 课程的视频,其中有一集信息量很大,主要内容是来自 Meta 的 Susan Zhang 讲了 Meta AI 如何在 2021 年最后一个季度,由 5 个工程师组成的团队在 3 个月的时间内使用云服务商的大约 1000 块 80G A100 GPU 训练出一个 1750 亿参数的大语言模型。因为这个话题更侧重于实践,所以几乎全部的讨论都集中在模型尺度非常大时遇到的工程挑战和解决问题的工程技巧方面。

根据我个人的理解,整个报告聊到的以下几个方面给我留下了比较深的印象:

  1. 硬件:使用大量 GPU 训练时经常遇到的 GPU 坏掉 和 ECC 错误之类的概率硬件失效问题。
  2. 数据:收集更多更高质量的数据无比重要,如何降低数据中可能存在的 bias 也是一个很重要的问题。
  3. 调参:大量的篇幅都在讨论如何调整学习率:太高可能导致不收敛,调低有助于提升训练的稳定程度但是太低肯定也不行,整个过程大致就是一个面多了加水,水多了加面的过程……
  4. 可重复性:由于经常需要重新从检查点开始重新训练,能够在数值上重现并调试之前遇到导致训练失败的问题非常重要,但是由于大模型自身的复杂性,实现完全的 bitwise determinism 是一件很困难的事情。
  5. 并行:讨论了各种类型的并行,比如 model parallel,tensor parallel,以及 pipeline parallel。
  6. 开放科学:提到了参加 Hugging Face 组织的 BigScience Workshop 获得的信息和灵感,还提到了最后借鉴了 GPT-3 和 Megatron 两个模型的设定,发现在实践中还就是好用…… 最后问题来了,这类研究开放到什么程度才是正确的?

第4点在我自己很多小型问题上都极其痛苦,而且我自己的经验是 PyTorch 比 TensorFlow 在默认情况下的可重复度要高一些,TF 经常升个级换张卡就完全不同的结果。JAX 就是另一个极端,几乎是要求随机数完全可控。