前言
项目开始于 2024 年 3 月初,当时获得了一台 A100 算力资源。为了充分利用资源并探索大模型训练的工程细节,决定尝试从零训练一个小型号的 LLM。虽然当时已有不少'从零预训练 LLM'的案例,但大多数据量或模型较小,未充分暴露工程问题,且训练细节分享不够清晰。因此,制定计划时设定了两个目标:
- 规模适中:参数量在 B 级别,数据量达到 T 级别。
- 细节透明:详细分享训练过程中的各种细节,帮助无资源的同学了解实践知识,帮助有资源的同学少走弯路。
参考项目训练时间估算,预计可使用 T 级别数据训练 1B 大小的 LLM,耗时约两个月。考虑到算力有限,决定该 LLM 以中文语料为主(80% 中文,20% 英文),定位为中文 LLM。
命名为'Steel'(钢),名称灵感来源于华北平原的优秀乐队'万能青年旅店'。乐队在条件有限的情况下做出了优秀的专辑,我们训练 LLM 的条件同样有限,但也希望能炼出好'钢'。
项目初期曾计划收集读者数据融入模型,但因效果不如微调及数据质量难以保证,后期取消了该功能。项目历时 8 个月,期间遇到算力断供等困难,最终 Steel-LLM 在 C-Eval 取得 38 分,CMMLU 取得 33 分的成绩,表现超过了一些参数更大的早期机构模型。
本文侧重介绍在做各部分内容时遇到的问题、思考以及技术细节。
数据收集与处理
Steel LLM 使用的全部数据均为开源数据。预训练阶段中,多个主流数据集占据了绝大部分比例,总计约 1.1T token。除了这些大数据量的预训练数据外,还在预训练阶段加入了本应在 SFT 阶段加入的对话数据,如 Alpaca 等格式的数据。这些数据遵循如下对话形式,数据的 prompt 部分在训练时也计算 loss:
{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "{问题}"},
{"role": "assistant", "content": "{回答}"}
]
}


