把训练账单公开直播之前,先要回答这些钱花在哪一步

一、单一总金额的两种失真
据公开报道,有厂商把一次大模型强化学习训练放进直播间实时展示花费,历时六天、最终账单约三百五十万美元,参评的两个模型版本各自跑完三十个训练步。这里不评价这笔支出是否值得,也不做任何单位成本换算——这两个数字在我们的判断里只是引子。真正值得抄的部分是那个”实时跳动”:一旦把训练花费做成一个可以对外展示的量,口径问题就藏不住了。
单一总金额同时犯两种失真,而且方向相反。
一边是高估。它把探索性失败的步也一并计入成本:那些跑完之后被判定为无效、参数没写进模型、整段重来的步,在总账里和有效步长得一样。看总额的人会以为每一块钱都换到了模型能力的推进,实际有一部分买到的是”这条路线不行”这个结论。结论当然有价值,但它不该混在有效产出的分母里。
另一边是低估。总金额通常只覆盖算力计费项,没算人的时间——调参、盯作业、修数据、复盘失败步都是成本;没算数据存储与读写,一次训练的数据集体积不小,检查点写入尤其容易被漏;也没算验证开销,评测量、评测环境的占用、评测集的维护常常挂在另一个科目下面。于是”三百五十万”这样的数字既像天文数字,又明显偏小,两个印象同时存在,正说明它不适合作为决策依据。
二、四个量拆开,各自要单独采
训练成本不是一个数,是四个可以各自优化的量乘在一起:算力时长、利用率、失败重跑、有效步数。这四个量各自的采集方式不同,缺任何一个,其余三个读出来都是错的。
| 量 | 真正要看什么 | 采集方式 |
|---|---|---|
| 算力时长 | 申请卡时与实际占用卡时的差 | 按作业统计而不是按日历统计,从调度层取作业事件流,配设备侧的起止时间戳 |
| 利用率 | 单卡有效算力占比、通信等待占比、空闲占比,三档分开设 | 设备侧按固定间隔采样,每条样本打回作业标识后再聚合 |
| 失败重跑 | 区分节点故障与逻辑错误两类原因 | 作业终止时落原因码,并记录重启谱系:哪一次运行是哪一次的续跑或重来 |
| 有效步数 | 总步数与真正计入模型的步数之差 | 训练循环内落步级记录,标注该步是否写入参数、是否因数据问题被丢弃 |
四行里最容易做浅的是利用率。多数集群只报一个百分比,而这个百分比把”在算”和”在等”混成了同一个状态。三档分开之后,结论通常完全不同:有效算力占比不高但通信等待占比很高,问题在并行切分与互联;空闲占比高,问题在调度与数据供给。这两类的整改成本差一个数量级,混成一个数就只能靠猜。
失败重跑那一行的关键也不是次数,而是原因分类。同一类故障反复出现是容量与硬件问题,各次原因互不相关更像是提交质量与配置漂移。没有原因码,重跑只是一串数字。
三、天数和步数放在一起才能读出东西
六天三十步,这两个数单看都没有信息,放一起立刻显出问题:平均一步多少时间没有意义,因为步与步之间耗时差得很多。强化学习这一步里通常有采样、有环境交互、有梯度更新,任何一次同步等待、任何一次数据加载慢一点,整步就被拉长。用平均值,这些都会被抹平。
该看的是两个字段:步耗时的中位数和最长值。中位数告诉你正常一步多久,最长值告诉你被谁拖了。再补一个”最长值出现在第几步”,通常就能看出来拖慢发生在采样规模变大之后、还是在某次数据切换之后。平均值在这件事上不提供任何决策信息,只会让看板显得整洁。
同样道理,步数本身也得分层。三十步里如果有几步因为数据质量被丢弃、因为奖励定义改动而作废,那”计入模型的步数”就和”跑过的步数”不同。对外只报后者的话,别人无法判断这三十步里有多少真的动了参数;对内只报后者的话,优化方向会被带偏——你以为要提速,其实要减少作废。
四、按四段归因,别把账全压在训练段
把一次训练的花费按段切开,我们固定用四段:探索、训练、验证、分析。这四段的记账习惯天差地别,也正是总金额失真的来源。
探索段的算力账最容易完全漏记。跑基线、试不同提示与奖励形状、做小规模对照,这些作业常常由个人发起、由个人清理,很多集群压根没有”探索”这个标签。结果是探索段的浪费看不见,等它长到能被看见时已经变成训练段的一部分。做法不复杂:作业提交时就要求带段标签,探索段允许失败率高,但必须单独出账。
训练段的账最完整,也最容易虚胖——它会把验证和分析的开销一起吃掉。验证段包括评测量、评测环境的占用和评测集的维护,这部分在很多系统里挂在同一个队列上,看起来就是训练时间。分析段的存储与查询又容易被算进训练,因为它读写的是同一份数据体。三段分开之后,”这次训练贵在哪一步”才有可回答的形式,也才有可优化的对象:探索段贵就改准入,训练段贵就改利用率与重跑,验证段贵就改评测并行度。
五、实时展示的三个要求与三个误读字段
要把账单做成可对外展示的对象,先要满足三个技术要求。第一,每一步的费用快照必须能回溯到当时的配置与数据版本,否则这个数字解释不了自己;第二,快照不可事后修改,只能追加,口径改动要以新版本记录,不能让历史数字被静默改写;第三,展示口径要在上线前定死——实时性会强迫你尽早做决定,而仓促定下的口径往往没人复核,做不好就变成一笔对不上账的数。第三点代价最大:一个不能改的历史数字,等于把你所有口径缺陷都固定下来了。
看板自身还有三个字段最容易被误读,值得写进使用文档。
- 按天累计的费用没扣重跑。看起来是”一天花了多少”,实际包含同一段工作被算了两次的部分。
- 单位成本用总花费除以总量。分子里有失败与作废,分母里只有成功,算出来的东西既不是成本也不是单价。
- 利用率取自调度层。调度层知道自己把卡分出去了,不知道卡在这期间等了多久的通信和输入。
正确的那条口径要写成一句话:有效产出单位成本,等于总算力成本除以通过验证的产出量;分子必须含重跑,分母必须含被丢弃。这句话里没有一项能省。少了分子的重跑,等于让失败免费;少了分母的剔除,等于让无效步冒充产出。
六、什么时候不该公开,以及该先交什么
公开账单不是所有人都该做的事。三种情形下我们不建议:数据尚未脱敏,成本明细里带着可以倒推业务量的信息;单价里含未到期的合同折扣,公开展示等于把自己最难看的一段价格结构钉在历史上;项目本身是内部探索,公开之后竞争对手不用买算力就能读出你的技术路线走到哪。跳动数字的传播价值很高,但这三种情形里它的信息泄露价值同样很高。
训练账和推理账也不能共用一套看板。推理是按请求计费的,可以分摊到业务线和租户,天然能做单位成本;训练是按作业计费的,一次作业服务的是整个模型而不是某个客户,只能按时间窗摊,硬摊到租户只会造成虚假精确。两类账放在同一张表里,最常见的后果是拿训练的分摊结果去定推理报价。
给客户做算力咨询时,洹拓建议的交付顺序是反直觉的:先交一份口径说明书,再谈降本。说明书要写死的就是上面这些——四个量的定义与采集点、三档利用率的分界、重跑原因码的枚举、步级记录里”计入模型”的判定条件,以及那三个易误读字段的正确读法。没有这份东西,双方看到的不是同一个数,任何降本结论都会在第一次对账时崩掉;有了它,后续每一笔优化才能被验证是不是真的省了。