![[从零训练一个500B大语言模型] 10/25:怎样让已有模型帮我们编写训练教材?](/_next/image?url=%2Fblog%2Ftraining-500b-part-10-cover-refresh-v2.webp&w=3840&q=75&dpl=dpl_HKDZtjNTn1U2zk8pGrYRnYGkyGR9)
[从零训练一个 500B大语言模型] 10/25:怎样让已有模型帮我们编写训练教材?
材料已经能顺着上一回的流水线送进训练。我又翻了几篇正文,发现清洗和切分都做对了,教材却还缺一种东西:过程。
有的文章直接给结论,有的程序只有几行,读者要自己补上中间的联系。我们要训练的500B模型,也需要学习这些联系。我想先补一批解释清楚的材料,看看同样的训练时间,能否让它学得更好。
我先拿一段很短的文字试这件事:“第一天读了2页,第二天读了3页,第三天读了4页。三天累计读了9页。”结果写在最后一句,计算的过程却略过去了。
把中间过程展开,文字变成:“第一天累计2页;第二天把3页加进去,累计5页;第三天再加4页,累计9页。”两段说的是同一件事,后一段却把2怎样变成5、5怎样变成9接了起来。这正是补充教材要增加的东西。
逐篇补写会花很多工时,我让已经训练好的模型先写候选。它负责供稿,叫作教师;正在从零训练的500B模型负责学习,叫作学生。原文交给教师,解释写回来,再核对、入库。最后留一场新题测试,在相同训练预算下看学生有没有进步。
教师写出的材料,叫合成数据。学生通过训练学习教师提供的内容,是蒸馏的一种方式。自然语言、数学和代码都能这样补材料。我先沿着刚才的累计页数,做出一份从原文到训练记录都能看清的教材。
合成数据:由模型等工具生成的训练材料。本文用已有模型帮助编写解释,再检查这些解释。
蒸馏:利用教师提供的输出等学习信号训练学生。本文采用核验后的教师文本。
为什么这份教材里也会有代码?
继续往下看那三个读书页数。每天读了多少页是一串数:2、3、4。逐日累计的结果是另一串数:2、5、9。记录延长到一年,每次从头相加就很麻烦。我把这个操作写成一个小程序:记住已经读了多少,每来一个新数字就加进去,再保存当前累计值。
这样,普通语言里的操作就变成了程序。它依然是文字,只是表达规则更严格。我们希望通用模型既能解释一段普通文字,也能读懂别人写的程序、帮助写程序。因此,训练材料里除了中英文文章,还安排了代码和相关文档。分词器会把它们都变成模型能读取的token。
代码可以写得很短,过程却值得解释。教师这次的工作就明确了:把适合讲解的程序展开,让学生同时看到程序、执行过程与结果。
这样的教材已经进入实际预训练配方。2026年10月20日发布的Domyn Edge数据说明介绍,他们为大部分Python、Java和C++文档加入了推理过程,再用于预训练。它把“代码旁边补过程”做成了数据生产工作。我们可以借鉴这个做法,按自己的任务检查效果;这部分增强代码仍待完成来源标注后公开。
第七篇已经介绍合成数据与蒸馏,并在10T训练配方里为这类讲解预留10B token,占总量0.1%。它计入代码材料的总配额,原生代码与文档另外按经过验收的库存安排。第八篇讲怎样清洗材料,第九篇讲怎样把材料做成训练输入。现在就把这一小份配额变成真正能够生产的教材。
Token:文字被分词器切成的小单位。普通句子和程序都会被切分,再变成模型读取的编号。
教师怎样把一个结果讲成一份教材?
供稿任务从程序用途开始写清。它接收一串数字,返回截至每个位置的累计和。对于2、3、4,结果就是2、5、9;如果一个数字都没有,结果也是空的。读书页数只是帮助我们理解这个操作的例子,程序也能处理其他需要累计的数字。
我把这三件事写进下面的函数:记住累计值、加上新数字、保存新累计值。展开能看到完整程序,顺着后面的数字变化也能读懂它。
看看这段累计求和程序
def running_totals(numbers):
total = 0
result = []
for number in numbers:
total += number
result.append(total)
return result
程序准备好,再把供稿要求写给教师:
请把这段程序写成一份简短教材。先解释它解决什么问题,再用输入2、3、4逐步展示累计值和结果怎样变化,最后解释没有输入数字时会发生什么。保留原程序,让解释中的每一步都能与程序执行对应。
教师需要写出的内容已经具体到每一步:把程序省略的过程展开,用能核对的数字说明。教材的文字部分可以这样组织:
累计求和
给出一列数字,返回截至当前位置(包括当前数字)的累计和。例如,每天分别读了2、3、4页,逐日累计就是2、5、9页。
开始时,累计值是0,结果列表为空。
读到2,把2加进累计值,得到2。保存以后,结果是[2]。
读到3,把3加进刚才的2,得到5。保存以后,结果是[2, 5]。
读到4,把4加进刚才的5,得到9。保存以后,结果是[2, 5, 9]。
每一步保存的都是到当前位置为止的累计值。没有输入数字时,循环一次也不执行,返回空列表。
完整教材在“例如,每天分别读了2、3、4页”这一段之后插入上面折叠框里的原始程序,再接着写“开始时,累计值是0”。原始程序、输入、解释与结论放在同一篇正文里,教师究竟补了什么,也就能逐项对照。扩大生产时,沿用第七篇选定、可用于目标训练的教师与获取方式,从获准使用的代码和文档里选材,再逐类提出讲解要求。
教材写出来以后,我先让程序实际运行,核对输出是否为2、5、9,再逐步对照解释里的累计值。空输入也要实际运行。随着材料扩大,可以增加负数、零、重复数字等输入,检查程序是否仍然满足累计求和的规律:相邻两个累计值之差,应当等于当前位置新加入的数字。
程序过了测试,解释还得单独读一遍。“当前数字”和“累计值”只要混淆一次,讲解就会把学生带偏。数字可以用程序核对,文字是否准确、清楚、遗漏条件,则需要抽查和审阅。只有两边都对得上,教材才进入合格库存。
这个“生成以后接着检查”的过程,也适用于普通语言材料。NVIDIA与AI4Bharat在2026年10月19日发布的研究,把筛选后的英文文档翻译成印度语言,评估翻译质量,修复低质量内容,并保留源文档记录。他们发布的合成语料约有2.83T token,覆盖22种印度语言;这是语料库的规模。研究再从中选取材料,与自然文本混合做继续预训练,用对照实验检验价值。代码检查执行过程,翻译检查原意是否保留,各自有不同的检查方法。
通过检查以后,生产还有一个陷阱:只替换2、3、4,很快就能堆出一大批相似教材。我把扩量的方向改为不同程序、不同难度与不同解释角度。第八篇的去重和来源追踪继续使用,同一来源衍生出的材料也要放在一起管理。
学生最后读到的是什么?
教材通过检查,轮到把它装进数据集。学生最后读到的仍然是一篇文档。标题是“累计求和”,正文包含任务、程序、逐步解释和结论。数据团队还会附上一张管理标签,记下原材料来自哪里、哪个教师版本写的、经过什么检查。
我把正文和管理标签分开保存,避免把审核记录也送去训练。在下面的数据记录里,text装完整教材;metadata装管理标签。训练时,读取器只取正文交给分词器。程序和自然语言解释都会被模型读到,来源编号和审核记录则留在数据系统里。
查看一条完整的数据记录
下面用JSON展示字段和内容,正文中的换行写成\n。示例编号说明字段用途,实际生产时填写对应记录。
{
"text": "累计求和\n\n给出一列数字,返回截至当前位置(包括当前数字)的累计和。例如,每天分别读了2、3、4页,逐日累计就是2、5、9页。\n\n程序:\ndef running_totals(numbers):\n total = 0\n result = []\n for number in numbers:\n total += number\n result.append(total)\n return result\n\n开始时,累计值是0,结果列表为空。\n\n读到2,把2加进累计值,得到2。保存以后,结果是[2]。\n\n读到3,把3加进刚才的2,得到5。保存以后,结果是[2, 5]。\n\n读到4,把4加进刚才的5,得到9。保存以后,结果是[2, 5, 9]。\n\n每一步保存的都是到当前位置为止的累计值。没有输入数字时,循环一次也不执行,返回空列表。",
"metadata": {
"record_id": "example-001",
"source_id": "self-authored-running-totals-example",
"teacher_version": "illustrative-output",
"review_record": "illustrative-review-record",
"family_id": "running-totals-example",
"split": "train"
}
}
Metadata:附在正文旁边的管理信息,例如来源、教师版本和审核记录。它帮助数据团队管理教材。
JSON:保存结构化数据的文本格式。上面一条记录分别保存正文和管理信息。
记录格式确定,再用学生的分词器给正文计数,加入库存。教师生成了多少文字,用于算生产花费;学生最终读了多少合格token,用于算训练量。被淘汰的材料仍然花过生产成本,因此这两笔记录都要保留。
库存表里的10B,此时终于能换成生产任务。若合格教材平均每篇2,000个学生token,10B对应500万篇:10,000,000,000除以2,000。500万篇意味着一条持续生产的流水线。能留下多少,要看每批长度、通过率和去重结果;先做小批量,算出一百万合格token的成本,再决定怎样扩量。
第九篇的混合配方负责安排学生什么时候读它们。按预留比例,每读取10B训练token,其中1,000万来自教师讲解。累计走完10T计划,教师讲解对应10B,它已经包含在总量里。教师讲解包含在代码材料的总配额内;教师生产教材所用的算力另外计算。
读到这篇教材,模型怎样学习?
供稿和入库都接上了,我再沿着累计求和这篇教材走进学生的训练。人读到的是“累计值从2变成5”,模型则把这篇文字切成token,用前面的内容预测后面会出现什么。它读到输入2、3、4,又读到开始时累计值为0,后面的程序和解释就在这些条件下继续展开。
训练时,教材本身提供实际的后续文字。模型给这些文字分配的概率越低,预测损失就越大。训练程序根据损失计算参数怎样调整,更新模型权重。下一篇材料到来时,模型继续使用更新后的权重学习。
题目、代码、过程和结论都属于这份预训练文档,也都提供学习信号。长文怎样切、短文怎样拼、文档边界怎样处理,沿用第九篇的规则。我们此时是在训练通用基础模型,完整文档都参与学习;以后教它按照对话要求回答问题,会另做后训练安排。
教师的工作到供稿为止,学生训练时读取的是已经保存好的教材。累计求和提供了一组关系,大量不同教材还会带来更多写法与操作。下一步要问的是:离开这些熟悉的文档,学生还会不会做?
预测损失:衡量模型给实际后续token分配的概率是否足够高。训练程序据此调整参数。
权重:模型在不同输入之间反复使用的参数。训练修改并保存这些参数。
教师还能提供文字以外的学习信号吗?
可以。教师在预测下一个token时,会给多个候选分配概率。保存这些信息,学生就能学习教师怎样分配可能性,而不只是学习最终出现的那一个词。
2026年10月21日的Nemotron 3.5技术报告采用了这种方法:Super和Lightning分别从已有基础模型出发,利用更大的教师提供的预测信息,各进行1T token蒸馏。这是一条需要教师概率信息的训练路线。我们当前的10B计划采用保存为文档的教师文字,沿着前面讲的教材流程推进。
怎样知道这些解释值得继续生产?
教材写得更详细,究竟值不值得占用训练时间?我保留一个对照:从同一个训练检查点出发,两组模型继续读取相同数量的token,保持其他训练设置一致。一组按配方读教师讲解,另一组用等量原始代码和文档替换这部分。两组总代码份额相同,中英文和数学材料的份额也相同。
训练完,把学生带到没有见过的新材料前。它能否解释新的程序,跟踪新的执行过程,或者完成新的代码任务?中文、英文和数学能力有没有变化?我们训练的是通用模型,因此局部改动也要看整体表现。
为了让这场考试有用,考题在教材生产以前就留好,按来源和任务家族与训练材料分开。平时用开发验证集发现问题、调整材料,最终测试集留到方案确定以后再用。小模型帮助筛掉明显无效的生产方法,再用目标模型的检查点检验实际收益,同时记录教师生产、核验和学生训练的花费。
ICLR 2026论文《Front-Loading Reasoning》的初稿发表于2025年,用8B模型比较了不同阶段加入推理数据的效果,为在预训练阶段研究这类教材提供了依据。我们的10B是本项目预留的试验份额。是否保留、调整或扩大,要由自己的实验结果决定。
回到最初那段“累计读了9页”的文字,中间过程已经补齐,也有了程序检查、库存记录和学生对照。增加这份解释是否值得,可以沿着这条记录看结果。教师写了多少只是产量,同样的500B学生有没有学得更好,才决定后面的教材继续怎样写。
数据这一端终于接成了一条线:第七篇找来源与数量,第八篇清洗,第九篇组织训练序列,这次再补上经过验证的教师教材。它们持续生产出来,另一端也要有地方接住。我回到第三篇那份设备计划:第十一篇把服务器放进真实的机房,安排机柜、电力和冷却,让这些材料有地方被持续读取和训练。
新文章,直接发到你的邮箱。
AI、工程与实验,每月 1–2 封。
无垃圾邮件,随时取消。