AI 基建
0%
第十二部分 · 实践与运营 · 第 84 章

训练与微调实践

作者Changkun Ou
阅读时长约 21 分钟

改变权重不是定制模型的第一步,训练任务完成也不等于工作结束。只有当可测量的行为变化必须写入权重时,微调才有理由存在。只有得到的制品能够复现、评估、服务、监控和回滚,这次微调才真正产生价值。

因此,实践中的基本单位是一项适配发布,而不是一次训练任务。它包括适配契约、固定基线、受治理的数据集、训练运行、评估报告和带版本的模型制品。第 17 章 介绍监督微调和参数高效方法,第 10 章 介绍分布式训练。本章把这些机制连接成一套产品团队可以执行的运营流程。

adaptation contract 适配契约 目标 • 基线 • 限制 data 受治理的数据 谱系 • 划分 • 模板 contract->data run 可复现的运行 方法 • 配置 • 检查点 data->run gate 晋升门 目标 • 保留 • 安全 run->gate artifact 带版本的制品 服务 • 金丝雀 • 回滚 gate->artifact
图 84.1. 一项适配发布从行为契约走向可回退的生产制品。训练只是其中一个阶段,并不是交付单位。

固定适配契约

先写清楚必须改变什么、绝不能改变什么,然后再选择训练方法。适配契约是一份可以审查的边界声明。它能避免团队把不断下降的损失曲线误当成产品问题已经解决的证据。

契约字段 需要记录的证据
任务边界 接受的输入、预期输出、语言、领域和明确排除的用途
目标行为 在已命名任务切片上的可测量改进
固定基线 基座模型、提示词、检索、工具、解码设置和当前得分
不得退化的要求 必须保持的通用能力、安全行为、校准和格式
数据边界 允许使用的来源、权利、保留期限、敏感类别和删除义务
部署目标 服务运行时、延迟与内存限制、适配器支持和数据驻留要求
预算上限 数据、算力、工程、评估和服务成本上限
晋升门 指标、不确定性规则、失败预算、审批人和证据期限
回滚 上一已知正常制品、回滚触发条件、负责人和最长恢复时间

训练开始前,目标行为就应当能在具体样本中观察到。“了解我们的产品”不是契约。“在固定测试集至少 98% 的样本上返回有效的客服分类对象,且拒绝准确率和通用帮助能力保留集的退化均不超过各自的失败预算”才更接近契约。实际阈值应由应用决定,本书不能替它规定。

固定基线必须包括用户看到的完整路径。更换对话模板、检索索引、工具 Schema 或解码器,即使不更新权重,也可能改变得分。如果遗漏这些环节,实验就无法把结果归因于微调。

判断行为是否应该写入权重

让固定基线和成本最低的可行替代方案在同一套评估集上运行。这是决定是否训练的关口。

  • 把变化的事实和需要来源支撑的回答放进检索系统,这样内容可以更新,也可以引用来源。
  • 把严格语法放进工具 Schema、语法约束、验证器或结构化解码器。更新权重无法保证输出一定有效。
  • 把简短且便于检查的策略写进提示词或应用代码。
  • 当任务需要当前状态或外部副作用时,使用工具。
  • 只有高频且长期稳定的行为必须写入权重,而且实测收益能够穿过完整服务路径时,才进行微调。

不能因为手里有示例就直接训练。训练无法替代缺失的数据库、授权检查或确定性解析器,也不适合直接处理尚未查明原因的评估失败。

接下来,应由现有监督信号决定采用哪条路径:

需求与现有证据 可行干预 需要重点测试的风险
已有正确的示范数据 监督微调(SFT) 模仿标注缺陷或格式噪声
已有优选和落选答案 直接偏好优化(DPO)或其他偏好目标 偏好不一致、长度偏差和过拟合
已有可靠的程序化奖励或学习到的奖励 强化学习或强化微调 奖励可能被钻空子,或被优化到超出其有效范围
基座缺少某种领域分布、词汇或模态 继续预训练,再做任务适配 遗忘、数据成本和污染
更大的系统质量足够,但服务成本过高 把教师模型的输出蒸馏到更小的学生模型 复制教师错误并丢失长尾行为
上下文、检索或工具已经满足契约 不改权重 非训练路径带来的运营复杂度

SFT 从示范中学习。DPO 不需要在线采样循环,而是从成对偏好中学习 (Rafailov et al. 2023)。经典 RLHF 先用示范拟合行为,再从排序数据学习奖励,最后针对该奖励优化策略 (Ouyang et al. 2022)。这些目标消耗的证据不同,失败方式也不同。方法名称无法修复不能表达契约的标签。

构建经得起审查的数据

训练样本不只是一段文本。它还包括来源记录、使用该记录的许可、转换历史、数据划分、模板修订版本,以及哪些词元参与损失计算的决定。

生成样本前,先建立数据来源记录。至少要包含稳定的来源 ID、来源位置、收集时间、负责人、许可证或其他法律依据、适用时的同意限制、允许用途、保留期限、敏感等级和删除机制。个人身份信息、凭据、客户机密和受版权保护的材料必须删除或接受明确治理。模型检查点不会让删除义务消失。数据聚合平台提供的标签不能单独充当证据。一项大型审计发现,许可证信息经常缺失或分类错误,因此数据必须保留指向原始来源的谱系 (Longpre et al. 2024)。

结构化的数据文档可以让这些决定保持可见。Data Cards 会记录来源、收集与标注过程、预期用途和生命周期维护方式 (Pushkarna et al. 2022)。在团队内部,可以用带版本的数据集清单达到同样目的,其中每一行都指回来源 ID。来源被撤回时,谱系应能找出所有需要审查的派生样本、数据集版本、训练运行和制品。

按可能泄漏的单位划分数据集

随机拆分数据行通常并不正确。应选择一种分组单位,确保相关材料始终留在一起,例如客户、对话、文档、代码仓库、事故、作者或时间窗口。每个分组只分配一次,进入训练集、开发集或测试集中的一个;随后既要在每个划分内部去重,也要跨数据划分去重。近似重复项会虚高评估结果,并增加记忆风险,语言模型实验已经观察到这两种影响 (Lee et al. 2022)。

只要可能,应在划分前把完全重复和近似重复项聚类,让整个重复项簇作为一个分组移动。数据划分完成后,再拟合数据过滤器、根据模型评分挑选样本、生成合成变体,或针对语料调整模板。把最终训练清单与内部评估集和公开基准进行比对,其中也包括生成教师数据时使用的提示词,并在污染报告中公开仍未排除的重合。

方法选型开始前,测试集就进入测试集隔离。训练代码不得读取,提示词作者不得针对它调参,合成数据生成也不得把它当作种子。只能在运行清单中保存测试集摘要和访问策略。开发集用于迭代,隔离的测试集只用于晋升决策。

data_path sources 来源清单 ID • 权利 • 敏感度 groups 合并相关记录和重复项 sources->groups split 分配一个数据划分 训练 • 开发 • 测试 groups->split seal 封存测试集 摘要 • 访问策略 split->seal render 生成训练数据 模板 • 工具 • 掩码 seal->render
图 84.2. 降低泄漏风险的数据路径。先核对使用权,让相关记录和重复项簇始终留在一起,并在生成训练转换结果前封存测试集。

把格式视为制品的一部分

训练和服务必须采用完全相同的分词器和对话模板。验证角色顺序、起止词元、工具调用序列化、截断和最大长度。不要只相信配置开关,应当把实际批次解码后逐项检查。对提示词补全或对话式 SFT,如果契约要求只对助手输出计算损失,就要使用损失掩码。否则,优化器可能把容量耗在预测用户文本或系统框架上。以当前 TRL 文档为例,它会明确区分完整序列、仅补全和仅助手输出三种损失行为 (Hugging Face n.d.)。

对编号为 ii 的样本,只计算助手输出的 SFT 目标可以写成:

LSFT(θ)=1Zi=1Nt=1Timi,tlogpθ(yi,txi,yi,<t),Z=i=1Nt=1Timi,t.\mathcal{L}_{\mathrm{SFT}}(\theta) = -\frac{1}{Z} \sum_{i=1}^{N} \sum_{t=1}^{T_i} m_{i,t} \log p_{\theta}(y_{i,t}\mid x_i,y_{i,<t}), \qquad Z=\sum_{i=1}^{N}\sum_{t=1}^{T_i}m_{i,t}.

其中:

  • NN 是样本数量,TiT_i 是第 ii 个样本的词元长度;
  • xix_i 是提示词和其他条件输入;
  • yi,ty_{i,t} 是第 tt 个输出词元,yi,<ty_{i,<t} 是此前的输出前缀;
  • pθp_{\theta} 是参数 θ\theta 可训练时的模型分布;
  • mi,t{0,1}m_{i,t}\in\{0,1\} 是损失掩码。助手答案词元通常取一,排除的提示词、填充或框架词元取零;
  • ZZ 是参与计算的词元数,用于归一化损失。

用少量固定样本为格式化器编写单元测试。测试应断言词元 ID、标签、掩码位置、截断行为和往返解码结果。模板变化既是数据变化,也是服务接口变化。

测量记忆,而不是假定隐私

在少量、重复或敏感的数据上微调,可能让模型暴露罕见字符串。训练前扫描密钥和完全重复项。评估时探测留出的金丝雀样本和合理前缀,并记录敏感片段是否能够复现。普通损失和准确率无法揭示意外记忆,这正是暴露度测试最初要解决的问题 (Carlini et al. 2019)。这些测试不能证明隐私,但可以把模糊风险变成发布门。

选择满足契约的最小权重改动

方法选择包含两个彼此独立的维度:目标函数决定模型从什么信号中学习,参数范围决定模型有多少部分可以变化。

WRdout×dinW\in\mathbb{R}^{d_{\mathrm{out}}\times d_{\mathrm{in}}} 为一个权重矩阵。LoRA 冻结该矩阵,只学习一个低秩更新 (Hu et al. 2022):

W=W+ΔW,ΔW=BA,W' = W + \Delta W, \qquad \Delta W = BA,

其中:

  • WW' 是适配后的矩阵;
  • ARr×dinA\in\mathbb{R}^{r\times d_{\mathrm{in}}}BRdout×rB\in\mathbb{R}^{d_{\mathrm{out}}\times r} 是可训练因子;
  • dind_{\mathrm{in}}doutd_{\mathrm{out}} 分别是输入与输出宽度;
  • rr 是适配器秩,通常远小于两个宽度。

对这个矩阵,两项因子合计带来的可训练参数量是:

NLoRA=r(din+dout)N_{\mathrm{LoRA}} = r(d_{\mathrm{in}} + d_{\mathrm{out}})

这个式子只计算两项低秩因子,不包括偏置和框架特有的缩放参数。适配器秩、目标模块、缩放、丢弃率,以及哪些非适配器模块仍可训练,都属于实验变量,不是通用默认值。

参数范围 哪些部分会变化 可能带来的收益 必须测量什么
LoRA 选定模块上的低秩因子 可训练状态小,任务制品可以单独保存 秩与目标模块敏感性、服务运行时的适配器支持、能力保留
QLoRA 基座是冻结的量化基座,只更新 LoRA 因子 适配期间占用更少的基座权重内存 量化后端、计算数据类型、峰值内存、相对非量化 LoRA 的质量
DoRA 分别更新幅值和低秩方向 获得不同于 LoRA 的容量与优化权衡 额外状态、运行时支持和目标任务上的实测收益
全量微调 所有选定的基座参数 最大的模型改动自由度 优化器内存、遗忘、检查点大小和完整回归测试集

QLoRA 让梯度穿过冻结的四比特基座,更新更高精度的适配器。论文方案结合了 NF4、双重量化和分页优化器 (Dettmers et al. 2023)。DoRA 将幅值和方向分解,更新几何与 LoRA 不同 (Liu et al. 2024)。两篇论文都没有给出适用于所有任务的样本数量门槛。应当在同一份契约上,通过实证比较在 LoRA、QLoRA、DoRA 和全量微调之间选择,并从最小可行试验开始。如果目的是比较参数范围,就固定数据、词元预算和评估方法。

启动前估算训练规模

检查点大小不等于训练所需内存。可以先用下面的恒等式核算:

Mpeak=Mparams+Mgrads+Mopt+Macts+Mworkspace,M_{\mathrm{peak}} = M_{\mathrm{params}} + M_{\mathrm{grads}} + M_{\mathrm{opt}} + M_{\mathrm{acts}} + M_{\mathrm{workspace}},

其中:

  • MparamsM_{\mathrm{params}} 是所选精度下常驻内存中的参数和适配器;
  • MgradsM_{\mathrm{grads}} 是可训练参数的梯度存储;
  • MoptM_{\mathrm{opt}} 是优化器状态和可能存在的主权重状态;
  • MactsM_{\mathrm{acts}} 是保存的激活内存,取决于批量、序列长度、模型形状和激活检查点策略;
  • MworkspaceM_{\mathrm{workspace}} 包括内核、通信缓冲区、临时张量、运行时和内存碎片。

nshardn_{\mathrm{shard}} 为数据并行工作进程数。全分片方法可能把参数、梯度和优化器状态在每个进程上的占用压低到:

MlocalMparams+Mgrads+Moptnshard+Macts+Mworkspace,M_{\mathrm{local}} \gtrsim \frac{M_{\mathrm{params}}+M_{\mathrm{grads}}+M_{\mathrm{opt}}} {n_{\mathrm{shard}}} + M_{\mathrm{acts}} + M_{\mathrm{workspace}},

但这只是规划下界,不是保证。逐层全收集、未分片模块、激活放置、通信重叠和优化器选择都会改变峰值。ZeRO 确立了训练状态分片的分解方式 (Rajbhandari et al. 2020);当前的 FSDP2 同样会分片参数、梯度和优化器状态,并调度全收集与归约分散操作 (PyTorch n.d.)。先用目标模型和实际的序列分布、批量大小、精度、检查点策略及后端做一次短时试跑,测出真实峰值。租用大规模集群前,再完成一次保存检查点、中断并恢复的测试。

核算整个项目,而不只是 GPU 时间

适配项目的固定成本是:

Cadapt=Cdata+Ctrain+Ceval+Cengineering+Cdeploy,C_{\mathrm{adapt}} = C_{\mathrm{data}} + C_{\mathrm{train}} + C_{\mathrm{eval}} + C_{\mathrm{engineering}} + C_{\mathrm{deploy}},

其中五项分别包括数据准备和审查、训练算力、评估、工程时间和部署工作。如果两个系统达到等价的质量和运营要求,服务量达到 VV 百万合格词元时的总成本可以写成:

Cbase(V)=Fbase+Vcbase,Ctuned(V)=Ftuned+Vctuned.C_{\mathrm{base}}(V)=F_{\mathrm{base}}+Vc_{\mathrm{base}}, \qquad C_{\mathrm{tuned}}(V)=F_{\mathrm{tuned}}+Vc_{\mathrm{tuned}}.

盈亏平衡服务量为:

V=FtunedFbasecbasectuned,V^*= \frac{F_{\mathrm{tuned}}-F_{\mathrm{base}}} {c_{\mathrm{base}}-c_{\mathrm{tuned}}},

前提是 cbase>ctunedc_{\mathrm{base}}>c_{\mathrm{tuned}}。这里,FtunedF_{\mathrm{tuned}} 包含 CadaptC_{\mathrm{adapt}};两项 FF 是以美元计的固定成本;两项 cc 是每百万合格词元的美元成本。如果质量、安全或可靠性不同,或者适配后的路径在每个合格词元上并不更便宜,就没有有意义的盈亏平衡点。

图 84.3. 示意性的盈亏平衡模型。适配路径先承担完整项目成本,再按每百万合格词元累加服务成本。拖动固定成本和变动成本,可以观察交点如何移动。只有两条路径满足相同的质量与运营契约时才能比较,这些数字不是供应商报价。
# 仅作示意。成本单位为美元,服务量单位为百万合格词元。
base_fixed = 0.0
adaptation_program = 50.0
tuned_fixed = adaptation_program
base_rate = 5.0
tuned_rate = 0.5

if base_rate <= tuned_rate:
    print("不存在正的盈亏平衡服务量")
else:
    break_even = (tuned_fixed - base_fixed) / (base_rate - tuned_rate)
    print(f"盈亏平衡服务量:{break_even:.1f}M 合格词元")

按能力选择工具

框架名称不是架构。应当根据契约建立一张能力矩阵,再用项目的官方支持矩阵、冒烟测试和目标模型修订版本逐项验证。

能力 选型前需要回答的问题
目标与模型 目标模型、分词器、模板、SFT 或偏好目标,以及适配器方法能否组合工作?
规模与恢复 单台设备能否容纳,是否需要分片,能否承受抢占,是否保存优化器状态,恢复后能否达到契约要求的确定性?
制品控制 检查点可移植性、适配器格式、可导出性和合并行为是否有文档并经过测试?
治理 样本、日志、检查点和指标会流向哪里?数据驻留、访问、删除和审计要求能否满足?
评估 训练器能否在训练期间评估,同时不读取隔离的测试集,也不通过提前停止泄漏测试信息?
运营 版本固定、可观测性、故障处理、成本归属和供应商退出方案是否齐备?

高层后训练工具包通常提供 SFT、偏好、奖励模型和强化学习训练器,TRL 是目前的一个例子 (Hugging Face n.d.)。PEFT 等适配器库实现 LoRA 系列方法和检查点操作 (Hugging Face n.d.)。如果团队希望用一份经过审查的配置文件描述训练任务,Axolotl 这类配置驱动项目可能很有用 (Axolotl AI n.d.)。当模型和优化器状态无法装入目标拓扑时,才需要 FSDP2 或 ZeRO 之类的原生分布式引擎。托管服务可以替代一部分基础设施工作,却不能替代数据契约、评估门、导出决策或回滚计划。

不能根据 GitHub 星标、供应商价格快照或某个工具永远最快的说法来选型。先对最小的代表性训练运行做基准测试,固定版本和容器镜像。扩大规模前,主动让一个工作进程失败,从检查点恢复,导出制品,并通过目标运行时提供服务。

让训练过程可复现

提交给训练器的配置只是运行清单的一部分。运行清单把数据、代码、模型、环境和评估绑定成同一个身份。这是代码、数据、配置和实验条件可复现性报告在生产环境中的对应形式 (Pineau et al. 2021)。

除了机器字段,正文也应明确列出每项内容:代码修订版本、容器摘要、基座检查点摘要、分词器修订版本、数据集清单、划分规则、随机种子、优化器、学习率调度器和检查点间隔。

run_id: support-sft-0042
code_revision: <git-commit>
container_digest: <sha256>
package_lock_digest: <sha256>
driver_and_runtime: <versions>
hardware_topology: <device-and-interconnect-description>
base_checkpoint: <model-id-and-revision>
base_checkpoint_digest: <sha256>
tokenizer_revision: <revision>
prompt_template_revision: <revision>
dataset_manifest: <uri-and-sha256>
split_rule: <grouping-unit-and-assignment-version>
test_set_digest: <sha256-only-no-training-access>
objective: sft
parameter_scope: lora
target_modules: <explicit-list>
adapter_rank: <measured-candidate>
optimizer: <name-and-all-parameters>
scheduler: <name-and-all-parameters>
random_seed: <integer>
determinism_flags: <explicit-values>
precision: <parameter-gradient-optimizer-dtypes>
batching: <microbatch-accumulation-sequence-policy>
checkpoint_interval: <steps-or-tokens>
resume_state: <optimizer-scheduler-scaler-rng-sampler-cursor>
evaluation_plan: <version>

运行前解析所有占位符。记录应用默认值并叠加环境变量后真正生效的配置,不能只保留操作人员原本打算提交的文件。保存数据加载顺序、打包策略、词元计数、学习率历史、梯度范数、跳过的更新、吞吐、峰值内存和检查点保存事件。可恢复状态包括模型或适配器、优化器、调度器、精度缩放器、随机数生成器、采样器或数据加载器游标、全局词元计数器和分片元数据。以原子方式保存最后一个完整检查点,并在干净进程中测试恢复。

跨加速器和内核不一定能逐比特重放,但运营要求仍然必须严格。运行清单必须准确复现数据和目标,能够恢复训练,并在声明的统计容差内得到结果。如果数据集很小或目标不稳定,使随机种子方差不可忽略,就要运行多个随机种子,并把这种不确定性带入晋升报告。

评估行为变化,而不是损失曲线

训练损失不是发布指标。 它衡量的是模型对训练目标的拟合,其中也包括标签和模板中的所有缺陷。晋升评估必须让候选方案与固定基线在未用于选择检查点的证据上比较。

至少覆盖五类评估:

  1. 目标任务质量。 评测已命名的成功标准和所有重要任务切片,包括少见但代价高昂的情况。
  2. 能力保留。 重新运行不变要求中列出的通用能力和产品行为。微调可能造成灾难性遗忘,语言模型微调研究已经直接观察到这一现象 (Li et al. 2024)。
  3. 安全与策略。 测试拒绝、提示注入、工具边界、人口群体或语言切片,以及应用特有的危害。
  4. 隐私与记忆。 根据数据威胁模型执行密钥扫描、金丝雀样本暴露度测试和抽取探测。
  5. 运营表现。 通过服务运行时测量输出长度、结构有效率、工具调用正确性、首词元时间、总延迟、内存、吞吐和成本。

基线与候选方案应使用配对提示词和相同的解码设置。报告配对差异、置信区间、样本数量和失败案例,不能只给平均值。如果训练了多个随机种子,要把训练方差与评估抽样不确定性分开。只有目标收益超过预先声明的阈值,而且每个能力保留、安全、隐私和运营切片都处于失败预算内,候选方案才算通过。第 87 章 进一步介绍这道评估门背后的测试框架和统计规范。

如果契约包含自动指标无法捕捉的性质,仍然需要人工审查。固定评分规则,并在可行时向评审人员隐藏模型身份。先检查分歧和具体失败,再把生产轨迹转入下一版训练集。

打包并部署完整制品

发布包不只有 adapter.safetensors。应当打包或引用:

  • 基座模型 ID、基座模型摘要和许可证;
  • 适配器摘要或完整检查点摘要,以及对应的参数范围;
  • 分词器文件和修订版本、提示词模板、工具 Schema 和生成默认值;
  • 运行清单、数据集清单、代码与容器摘要和训练日志;
  • 晋升报告、预期用途、排除用途、已测切片和已知限制;
  • 兼容的服务运行时、精度、硬件类别和回滚说明。

只有这些身份和兼容性约束全部经过检查,发布包才能进入 第 82 章 所述的服务路径。

Model Cards 为预期用途、评估条件、限制和按切片拆分的结果提供了一套实用结构 (Mitchell et al. 2019)。使用与 第 89 章 相同的生命周期规范,为清单签名,并把它与制品摘要绑定。

适配器可以保持独立,也可以合并到基座。独立适配器节省存储,并能让多个任务共用一个基座,但服务运行时必须加载正确的基座与适配器组合,还要核算切换适配器的延迟和容量。合并检查点更适合不支持适配器的运行时,却会复制基座,并需要单独审查许可证和摘要。发布前要在固定提示词上运行合并一致性测试:在相同分词器、精度和服务运行时下,对比独立适配器与合并制品的输出或 logits。序列化或量化后,代数上等价的合并不一定产生完全相同的运行时行为。

release manifest 运行清单与检查点 package 打包完整制品 基座 • 适配器 • 模板 manifest->package offline 离线晋升门 配对目标 • 回归测试 package->offline canary 经服务运行时进入金丝雀 offline->canary promote 晋升或回滚 保留上一已知正常版本 canary->promote promote->package 下一版本
图 84.4. 晋升和部署都可回退。候选制品通过服务运行时评估,先进入金丝雀群组,然后晋升或退回上一已知正常制品。

先部署到金丝雀群组,并设定明确的回滚触发条件。将质量代理指标、错误、拒绝、延迟、词元用量和任务完成率与上一已知正常版本比较。保留每次推理的完整溯源信息,使事故可以追溯到具体的基座、适配器、模板和运行时。分阶段发布不能放宽离线晋升门,它只负责测试离线数据无法复现的生产条件。线上回滚可以恢复服务行为,却无法从已经训练好的权重中删除被撤回记录的影响。后者需要重新训练、经过验证的机器遗忘,或按照删除策略退役制品。

强化学习会在训练内部引入一套服务系统

在线强化学习后训练既有训练工作进程,也有轨迹生成器。生成阶段产生轨迹,奖励路径负责评分,学习器随后更新策略。因此,每个批次都必须记录权重版本。如果生成工作进程落后于训练工作进程,应记录并限制策略陈旧度,不能默默把旧轨迹当作当前策略产生的数据。

共置拓扑把生成和训练放在同一个加速器池中,不需要专用的生成资源池,却可能承担内存争用、休眠或卸载切换、重新分片和阶段切换的成本。分离拓扑为生成端和学习端配置独立资源池,可以分别扩缩容,却会增加数据传输和调度开销,也更难保证轨迹足够新。HybridFlow 形式化描述了一种分布式 RLHF 数据流,以及在生成拓扑与训练拓扑之间重新分布 actor 状态的机制 (Sheng et al. 2025)。第 37 章 会深入讨论这些选择。这里的关键是保持制品身份可追溯:每条轨迹都必须记录策略、奖励、分词器、环境和采样版本,保证每次更新都可以审计。

运营适配生命周期

一套可执行流程如下:

  1. 固定契约。 写明目标行为、固定基线、不得退化的要求、预算、晋升门、负责人和回滚路径。
  2. 测试不训练的替代方案。 在同一套评估集上运行提示词、检索、工具 Schema 和结构化解码器改动。
  3. 盘点并治理数据。 记录数据来源、权利、同意限制、敏感度、保留期限和删除谱系。
  4. 一次性划分数据集。 选择分组单位,跨数据划分去重,并在实验前隔离测试集。
  5. 选择最小可行试验。 根据监督信号选择 SFT、偏好学习、强化学习、继续预训练或蒸馏,再比较最小的可行参数范围。
  6. 估算并演练。 测量峰值内存、吞吐、检查点耗时和成本;注入故障并通过恢复测试。
  7. 根据封存的清单运行。 记录有效配置、数据与代码摘要、遥测、检查点和随机种子。
  8. 编写晋升报告。 在目标任务、能力保留、安全、记忆、运营和人工审查切片上,带着不确定性比较候选方案与基线。
  9. 打包并进行金丝雀发布。 验证摘要、合并一致性、服务兼容性和回滚能力,再分阶段发布,同时保留上一已知正常制品。
  10. 监控并重新验证。 把经过审查的失败案例写入新的数据集版本,不得直接写入隔离的测试集。沿着已记录的谱系,对原始记录、派生数据集、日志、缓存、检查点和模型注册表执行保留与删除任务。

重新验证触发条件包括基座模型变化、分词器或模板变化、数据集或划分规则变化、目标函数或参数范围变化、服务运行时变化、精度或合并方式变化、新设备类别、流量结构显著变化、策略变化,或新发现的数据权利问题。每项触发条件都要创建新的制品身份,并重新运行受影响的评估门。

最终产物是一份适配决策记录,把契约、数据谱系、运行清单、候选制品、晋升报告、服务版本和回滚结果连接起来。正是这份记录把训练实验变成基础设施中可以运营的一部分。

下层约束

微调无法弥补服务栈不能加载的制品、分词器或模板不匹配、加速器内存不足、无法恢复的检查点,或组织无权使用的数据。适配发布会继承存储、算力、分布式执行、制品打包和服务层的约束。这些下层必须保留契约中记录的身份和限制,否则已经评估的候选方案和实际部署的系统就不是同一个系统。

容量规划也会向下传导。序列长度和批处理策略决定激活内存,参数范围决定优化器与检查点状态,轨迹生成拓扑决定通信和新鲜度成本。只有下层满足发布所需的恢复、延迟、驻留和成本要求,方法才真正可行。

争议所在

权重更新是否适合长期承载产品行为,仍然没有统一答案。适配器存储成本低,也可能改善重复任务,但它同样可能编码过时的策略、记住隐私样本、削弱通用行为,或形成一大批互相依赖的基座与适配器。全量微调和强化学习提供更多改动自由,也扩大了故障面。决策应当始终可逆:选择经过测量的最小干预,保留固定基线,只晋升能够通过完整发布路径的证据。

延伸阅读

一手论文界定适配方法及其实测范围,系统论文和官方文档则说明如何运营最终结果。

  • Hu et al., “LoRA: Low-Rank Adaptation of Large Language Models,” 2022. arXiv:2106.09685
    LoRA 冻结预训练权重,向每个 Transformer 层注入可训练的低秩矩阵对,与全量微调相比可将可训练参数减少 10,000 倍、将 GPU 显存需求降低 3 倍,且不引入额外推理延迟。
  • Dettmers et al., “QLoRA: Efficient Finetuning of Quantized LLMs,” 2023. proceedings.neurips.cc
    QLoRA 通过将冻结的 4 位量化模型的梯度反向传播至 LoRA 低秩适配器,并引入 NF4、双重量化和分页优化器,实现在单张 48GB GPU 上对 65B 参数大语言模型进行参数高效微调。
  • Liu et al., “DoRA: Weight-Decomposed Low-Rank Adaptation,” 2024. proceedings.mlr.press
    DoRA 把预训练权重分解为大小和方向,并对方向分量应用低秩更新。
  • Rafailov et al., “Direct Preference Optimization: Your Language Model is Secretly a Reward Model” (DPO), 2023. proceedings.neurips.cc
    DPO 用简单的二元交叉熵损失替代基于人类反馈的强化学习(RLHF)中的显式奖励模型与强化学习循环,直接从人类偏好数据中提取最优策略。
  • Ouyang et al., “Training Language Models to Follow Instructions with Human Feedback” (InstructGPT), 2022. proceedings.neurips.cc
    InstructGPT 通过基于人类反馈的强化学习(监督微调后用 PPO 优化人类偏好奖励模型)对 GPT-3 进行微调,使 1.3B 参数的模型在人类评测中优于 175B 的 GPT-3 基线。
  • Lee et al., “Deduplicating Training Data Makes Language Models Better,” 2022. aclanthology.org
    对大语言模型训练数据去重可将逐字记忆率降低十倍、减少训练-测试集重叠,同时以更少训练步骤达到相同或更高的准确率。
  • Carlini et al., “The Secret Sharer: Evaluating and Testing Unintended Memorization in Neural Networks,” 2019. usenix.org
    该论文提出金丝雀暴露度,用于量化测试生成模型是否无意记住了罕见序列。
  • Li et al., “Revisiting Catastrophic Forgetting in Large Language Model Tuning,” 2024. aclanthology.org
    该研究衡量语言模型微调期间的灾难性遗忘,并从微调损失面的几何形态解释实验结果。
  • Pushkarna et al., “Data Cards: Purposeful and Transparent Dataset Documentation for Responsible AI,” 2022. arXiv:2204.01075
    Data Cards 围绕数据集来源、收集与标注、预期用途、伦理考量、维护和生命周期演进来组织文档。
  • Longpre et al., “A Large-Scale Audit of Dataset Licensing and Attribution in AI,” 2024. nature.com
    这项审计追踪了 1800 多个文本数据集,发现数据集聚合平台经常缺少许可和署名信息,或对其错误分类。
  • Mitchell et al., “Model Cards for Model Reporting” (评测披露), 2019. doi.org
    模型卡记录预期用途、评测过程和分组性能,支持关于模型部署的透明决策。
  • Pineau et al., “Improving Reproducibility in Machine Learning Research: A Report from the NeurIPS 2019 Reproducibility Program,” 2021. jmlr.org
    该报告介绍了一项可复现性计划,核心包括开放代码、报告实验细节,以及使用相同代码和数据进行独立复现。
  • Rajbhandari et al., “ZeRO: Memory Optimizations Toward Training Trillion Parameter Models,” 2020. arXiv:1910.02054
    ZeRO 对优化器状态、梯度与参数进行分片,在改变通信调度的同时消除数据并行的内存冗余。
  • PyTorch, “Getting Started with Fully Sharded Data Parallel (FSDP2),” n.d.. docs.pytorch.org
    官方教程说明了 FSDP2 如何分片参数、梯度和优化器状态,并调度全收集与归约分散操作。
  • Sheng et al., “HybridFlow: A Flexible and Efficient RLHF Framework” (开源实现为 veRL;其 3D-HybridEngine 在生成布局与训练布局之间重新分片行动者模型), 2025. arXiv:2409.19256
    HybridFlow 提供分布式 RLHF 数据流,并用 3D-HybridEngine 在共享资源池中把同一 actor 重分片到生成与训练布局。
  • Hugging Face, “TRL Documentation,” n.d.. huggingface.co
    TRL 文档介绍了当前的监督微调、偏好学习、奖励模型和强化学习训练器,以及它们所需的数据集格式。
  • Hugging Face, “PEFT Documentation,” n.d.. huggingface.co
    PEFT 文档介绍了参数高效方法、适配器配置、检查点格式、合并方式,以及与分布式训练的集成。
  • Axolotl AI, “Axolotl,” n.d.. github.com
    Axolotl 是一个以配置为中心的开源训练项目。其代码仓库和文档是查询支持模型与当前配置字段的权威来源。

评论

登录后评论