eval_chat_quality() 连接到了错误的运行器
一个本应在第 3 天停止的 10 天故障
ANDREA-120M v1 在 RTX 4090 上以 130W 连续功率训练了 16.1 天。每 200 步存储样本输出,但运行期间从未分析。到第 80K 步(第 4 天),样本输出为 region region region region region。到第 110K 步,为 ''''' ''''' '' ''' ''。训练继续了另外 11 天,直到第 165K 步被手动终止。
烟雾报警器出了什么问题
eval_chat_quality() 存在于代码库中。它对样本质量进行评分。它甚至正确工作。但它仅连接到遗留的多阶段运行器。v1 火hose 课程使用了不同的代码路径,从未调用该评估。烟雾报警器放在另一个房间,门是关着的。
代价
16.1 天计算时间。130W 连续运行。~50 kWh 电量。模型在任何时候都没有产生可用的输出。损失 EMA 在第 110K 步达到 3.23 的最低点,然后在训练停止的第 165K 步回升到 4.54。数值合理;语义空洞。
对于 8449 个 token 的词汇表,随机几率是 9.04。v1 在产生 region region region 时达到了 3.23 EMA 损失。损失本身无法检测连贯性崩溃。 一个通过重复高频 token 来最小化交叉熵的模型会因这种失败模式而获得数值奖励。
为什么损失曲线撒谎
在四个轴上为每个样本评分
复合分数
v2发布了一个连贯性门,它对每个样本(在火hose训练期间每100步取样一次)在四个指标上进行评分:
| 指标 | 范围 | 它捕捉的内容 |
|---|---|---|
| 二元组多样性 | 0-35 | 两标记级别的重复 (region region) |
| 三元组多样性 | 0-35 | 三标记级别的重复 (a, b, a, b, a, b) |
| 英语单词存在度 | 0-20 | 漂移到非英语(CJK、斯拉夫字母、乱码) |
| 字符多样性 | 0-10 | 单字符坍缩 (''''', ... ... ...) |
总分:100。及格线:30。
为什么使用四个指标,而不是一个
每个指标捕捉不同的失败模式:
- 模型崩溃为一个二元组的模型会失败于二元组多样性,但通过字符多样性。
- 产生标点噪声(''''' ''''' '')的模型会失败于字符多样性,但如果标点对变化,则可能通过二元组多样性。
- 模型漂移到非英语(翻译训练污染)会失败英语单词存在性测试,但如果产生语法正确的普通话,则通过 Bigram 和 Trigram 多样性测试。
- 产生 a, b, a, b, a, b 的模型通过 Bigram(a-b 和 b-a 出现),但失败 Trigram(a-b-a、b-a-b 主导)。
四个指标共同覆盖了失败空间。复合分数低于 30 意味着至少一个维度严重崩溃,足以拖累整个样本。
连续计数器
自动停止在 5 个连续样本 分数低于 30 后触发。单个坏样本可能在相变或稀有源抽取期间发生;连续五个意味着模型已停止恢复。每 100 步取样一次,5 个连续退化样本 = 500 步确认的连贯性崩溃。
计算分数
v1 的运行情况会是什么样子
回测触发
根据 v1 的存储样本,追溯应用 v2 连贯性门控显示,门控会在第 132K 步触发。v1 运行到第 165K 步才手动终止。门控本会提前 33,000 步停止训练。
计算节省
RTX 4090 在 FP16 cuBLAS 下训练速度约为 ~6 步/分钟。33,000 步 / 6 步/分钟 = 5,500 分钟 = 91.6 小时 = 节省 3.8 天的计算时间。 以 130W 持续功率计算,那是约 12 kWh 的电量,加上 3.8 天的 GPU 损耗。
为什么选择第 132K 步而不是第 80K 步
v1 在第 80K 步产生了 region region region。为什么那时门没有触发?
因为在坏样本之间偶尔会出现好的样本。bandit 每 7-42 步循环遍历来源。即使是退化的模型,在从不同来源采样时偶尔会产生更多样化的输出,从而短暂重置连续计数器。到第 132K 步时,模型已经深度崩溃,以至于 5 个连续退化样本(500 步)变得不可避免。
课程:将烟雾报警器连接到每个运行器
v2 将 eval_chat_quality() 直接连接到火hose课程的样本处理代码路径,而不仅仅是遗留运行器。每个样本、每次运行、每个代码路径:相同的关卡。此修复只需约30行代码。