项目解决了哪些疑难问题?一、服务层1、PPO强化学习微调三阶段训练PPO数据来源人工标注高质量基座蒸馏生成业务历史优质对话筛选开源指令集数据源核心定位推荐占比核心一句话人工标注质量锚点、底线兜底定义格式、风格、合规、边界 case、强约束 case作为整套数据集的 “标尺”也可以当蒸馏种子10%20%少而精负责守住质量和对齐底线高质量基座蒸馏生成低 T 单样本主力扩量低成本大批量生成同范式样本扩充任务覆盖量、补齐样本数量30%50%数量主力用来扩充体量但要过滤幻觉业务历史优质对话筛选对齐真实用户分布拿到真实用户 query让模型适配线上真实提问习惯20%40%贴近线上流量提升线上真实效果必须脱敏清洗开源指令集Alpaca/ShareGPT 等通用能力补充补常识、通用问答、多轮能力非必需0%20%锦上添花严格控比例防止冲淡业务能力✅一套稳妥的标准参考配比示例人工标注15% 基座蒸馏40% 业务历史对话30% 开源指令集15%总和 100%配比背后的设计思想人工数据定底线防止蒸馏、日志、开源数据把模型对齐跑偏蒸馏数据扛数量解决人工标注太贵、样本不足业务对话对齐真实分布避免模型只会回答 “造出来的指令”上线效果虚高开源数据做补充不是必须垂直领域如果业务性极强可以直接设为 0%避免通用知识稀释领域能力。⚠️重要调整规则如果是强垂直专业场景医疗、法律、工业开源集 → 0%人工标注提升到 20%~30%减少蒸馏占比如果缺少线上业务日志新业务、还没上线 业务对话→0%把额度分给蒸馏 少量人工如果预算充足、标注资源多可以提高人工标注占比降低蒸馏比例整体质量上限更高所有数据入库前都必须清洗、去重、过滤配比是清洗之后的有效样本占比不是原始数据。一句话背诵版人工标注 10%-20% 作为质量锚点兜底基座蒸馏 30%-50% 作为主力扩量业务历史对话 20%-40% 对齐真实用户分布开源指令集 0%-20% 补充通用能力垂直领域可不用。1、人工标注人工标注是 SFT 的锚点数据质量最高、意图和格式完全可控但成本高昂、扩量困难一般只占数据集一小部分用来定义业务的回答风格、合规、边界 case兜底整套微调的质量底线常作为蒸馏生成合成数据的种子。数量不需要多但要精在整套混合数据集里面占比一般10% ~ 20%不需要做为主力大量填充优先标注这些 case高频业务指令容易出错、边界、高风险、合规相关 case强制格式输出JSON、表格等标注流水线编写标注规范 → 标注员培训 → 初标 → 复审二次校验→ 抽样质检入库工业常用思路拿少量人工黄金样本还可以作为蒸馏的种子指令喂给大基座生成更多合成数据2、高质量基座蒸馏生成高质量基座蒸馏生成合成数据使用低 temperature 让模型优先选择概率最高 token降低自由发散带来的幻觉每个指令只采样单条回答该方案可以低成本大规模扩充 SFT 数据集但依然存在隐性幻觉、同质化问题必须增加过滤校验并且一般搭配人工标注锚点数据一起使用。人工标注过程准备种子指令集少量人工写的指令或者直接让基座生成指令送入更强的高质量基座模型例如 Qwen‑72B、Llama3‑70B生成配置temperature0.0~0.1单样本采样得到instructionresponse样本对必须过滤非常关键低 T≠完全没有幻觉规则过滤长度、重复、空回答、拒绝回答LLM 打分 / RM 打分剔除质量差、事实错误样本抽样人工复核3、业务历史优质对话筛选业务历史优质对话筛选从线上历史日志提取真实用户对话优势是指令分布贴近线上真实流量原始日志混杂大量劣质样本需要脱敏、规则粗筛 模型打分精筛 人工抽检是 SFT 混合数据集里非常重要的组成部分。筛选过程原始日志拉取 → 脱敏去除手机号、姓名等隐私【粗筛规则】过滤过短、过长对话过滤重复、乱码、报错、无效拒绝过滤违规内容【精筛打分】RM 奖励模型打分 / LLM 打分对回答质量、有用性打分保留高分样本抽样人工复核防止打分模型误判抽检入库4、开源指令集Alpaca、ShareGPT 这类开源指令集可以快速提供大量单轮 / 多轮指令样本用来补充模型通用和多轮对话能力但是数据集质量参差、和业务分布差异大还存在版权隐患使用前必须清洗过滤并且严格控制在 SFT 数据集里的混合占比避免冲淡业务能力。必须清洗规则过滤过滤太短 / 太长、重复、拒绝回答、乱码质量筛选LLM 打分 / RM 打分丢弃低分样本去重embedding 去重减少高度相似样本防止数据集同质化控制混合比例一般占比很低0~20%作为补充绝对不能作为 SFT 主力优先挑选和业务尽量贴近的子集不要直接全量灌入做子集筛选只保留和业务相关的指令类型PPO三阶段的数据构造指令 - 回答示范数据偏好对比数据prompt 提示池RLHF 三阶段数据源分工SFT 使用指令 - 回答示范数据教会模型基础指令跟随RM 使用同一 prompt 下的成对偏好对比数据学习人类好坏偏好PPO 阶段只准备 prompt 提示池回答由策略模型在线采样生成奖励由冻结 RM 实时提供属于在线 on-policy 训练。1、SFT阶段2、RM阶段3、PPO阶段模型超参数训练配置学习率远小于预训练避免覆盖基座通用能力1、优化器AdamWAdamW 在 Adam 基础上把权重衰减解耦维护一阶动量 m 平滑梯度方向、二阶矩 v 估计梯度波动通过偏置校正修正初始偏差每个参数根据梯度波动自适应缩放步长权重衰减独立于梯度更新直接收缩权重正则效果更好是 LLM SFT 首选优化器。参数含义AdamW训练步骤2、梯度累积Gradient Accumulation用小 batch模拟大 batch 训练解决显存不够的问题loss 需要除以 GAS做归一化保证梯度量级不变多次forward →loss loss / gradient_accumulation_steps→ loss.backward () → optimizer.step () → optimizer.zero_grad ()梯度累积不改变梯度本身大小只是把多个 batch 的梯度相加代价前向次数变多训练变慢时间换显存它不解决梯度爆炸只是模拟更大 batch 带来更平滑的梯度3、梯度裁剪 Gradient Clipping限制梯度的 L2 范数上限防止梯度爆炸不是把梯度超过阈值的部分直接砍掉是整体缩放clip_grad_norm最常用4、学习率lr微调lr大于全参lr避免灾难性遗忘冲掉基础模型学习的通用知识lr采用 warmup 策略训练初期lr由 0 逐步抬升至峰值peak_lr缓解模型前期参数随机带来的梯度噪声大、训练不稳定问题后续使用余弦调度器 cosine衰减学习率保证训练前中期充分学习后期学习率平缓下降精细收敛获得更好的收敛效果。调度器选择标准数据少、怕过拟合 → linear数据足想要更好收敛 → cosinefor epoch in range(epochs): for batch in train_dataloader: # 1.前向传播输入input_ids输出logits outputs model(**batch) loss outputs.loss # 2.反向传播计算梯度 loss.backward() # 3.梯度累积到指定步数执行优化更新 if (step1) % grad_accum 0: optimizer.step() scheduler.step() optimizer.zero_grad() # 4.定期跑验证集计算val_loss if step % eval_interval 0: val_loss evaluate(model, val_ds) # 保存最优checkpointval_loss最低 if val_loss best_loss: save_checkpoint() step 1 #batch训练过程 多次forward loss.backward (梯度累加完成)→ 梯度裁剪clip_grad_norm_ → optimizer.step () 结合梯度乘以旧lr,更新权重 → scheduler.step () 更新lr→ optimizer.zero_grad ()模型分布式训练配置与 ZeRO‑3 训练流程本套方案基于 Accelerate DeepSpeed ZeRO‑3单机 4 卡 A100采用 bf16 混合精度、LoRA 微调整体流程分为集群启动与权重初始化、前向传播、反向传播、分片优化器更新、Checkpoint 保存五个阶段。Accelerate 负责分布式环境拉起、模型初始化、入口调度、保存行为控制DeepSpeed 配置负责 ZeRO‑3 分片策略、通信调度、显存控制、训练循环内部逻辑、打印与 batch 调度。1、启动分布式集群和权重初始化Accelerate 配置先声明计算环境与分布式后端完成集群进程拉起、通信握手定位训练入口再结合 ZeRO‑3 规则完成模型权重分片初始化。compute_environment: LOCAL_MACHINE声明当前为本机 GPU 训练而非云集群、TPU 等其他计算环境debug: false关闭分布式调试日志避免日志冗余、拖慢训练distributed_type: DEEPSPEED指定底层分布式引擎为 DeepSpeed放弃原生 DDP。 本次为单机训练num_machines1代表物理机器数量为 1machine_rank0标记本机节点编号num_processes4启动 4 个训练进程进程与 GPU 一一绑定每张 A100 分配一个进程。main_training_function: main指定训练脚本入口函数名称为main所有分布式进程拉起后统一进入该函数执行模型加载、数据循环训练逻辑。same_network: true标记所有节点处于同一局域网单机场景恒为 trueTPU 相关配置tpu_env: []、tpu_use_cluster: false、tpu_use_sudo: false全部置为关闭代表不使用谷歌 TPU 集群use_cpu: false关闭 CPU 训练使用 GPU 执行计算。多进程启动后需要互相发现、构建通信组deepspeed_multinode_launcher: standard使用标准启动逻辑单机场景下该参数无明显影响预留适配后续多机扩展rdzv_backend: static采用静态 rendezvous 后端完成进程握手、建立 NCCL 通信组。 同时 Accelerate 读取指定 DeepSpeed 配置文件deepspeed_config_file: configs/ds_config_zero3.json加载 ZeRO‑3 相关参数。zero3_init_flag: true是初始化阶段核心开关在模型加载实例化阶段边构建网络层边对参数分片直接将模型参数拆分分散存储到各个 GPU不会在 CPU 内存生成一份完整模型权重规避大模型初始化阶段内存溢出如果该开关关闭会先在 CPU 上构建完整模型再分片14B 这类大模型极易初始化 OOM。 精度配置需要两端对齐Accelerate 侧mixed_precision: bf16与 ds_config 中bf16:{enabled:true}保持一致训练全程使用 bf16 混合精度downcast_bf16: no关闭 bf16 向 fp16 强制转换在 A100 原生支持 bf16 的硬件上保留 bf16 精度特性。区分边界ds_config 里不控制模型初始化分片行为ZeRO3 的初始化分片能力由 Accelerate 的zero3_init_flag控制ds_config 的zero_optimization.stage:3仅声明训练过程采用参数、梯度、优化器状态三者全分片策略前向、反向计算时才会触发 All‑Gather 通信。 ds_config 中train_batch_size: auto、train_micro_batch_size_per_gpu: auto交由 Accelerate 自动推导 batch 大小和上层数据加载逻辑对齐wall_clock_breakdown: false关闭 DeepSpeed 内置的细粒度性能计时剖析减少额外性能开销steps_per_print: 2000设置每 2000 个优化 step 打印一次训练日志。2、前向传播权重在 GPU 上保持分片存储状态当需要计算某一层时执行 All‑Gather 集合通信4 张 GPU 互相交换本地权重分片所有 GPU 都拿到该层完整全局权重各 GPU 基于自身 micro-batch 样本独立执行前向计算。 前向计算完成后依据缓存策略决定是否释放 gather 得到的完整权重保留则减少后续重复通信释放则降低显存占用。相关控制参数全部在 ds_config 的zero_optimization段overlap_comm: true开启计算通信重叠当前层执行前向算子计算的同时后台异步预取下一层需要的参数用计算掩盖通信等待延迟stage3_prefetch_bucket_size: auto控制预取参数的缓冲区大小auto 自动适配模型保障预取流水线稳定sub_group_size:1e9控制 All‑Gather 的粒度1e9 代表一次性拉取整层全部参数速度最优显存紧张、出现 OOM 时可下调该值将一层参数拆分为多组分批 gather压低瞬时显存峰值stage3_param_persistence_threshold: auto设置参数常驻阈值参数量小于阈值的小层gather 之后永久驻留显存后续访问无需重复 gatherstage3_max_live_parameters:1e9设置显存中同时存在的 gather 后参数总上限限制显存中同时驻留的参数规模stage3_max_reuse_distance:1e9控制参数复用逻辑若后续很近的网络层会再次使用该参数则暂时不释放减少重复通信开销。3、反向传播反向逐层回传当需要计算某一层权重梯度时同样执行 All‑Gather 通信4 张 GPU 再次获取该层完整全局权重每张 GPU 基于本地输入和上游回传的梯度独立计算该层完整权重梯度 所有 GPU 得到本地完整梯度后执行 AllReduce 完成多卡梯度全局求和得到全局汇总后的梯度再通过 Scatter 操作将求和后的完整梯度按照和权重一致的分片规则切分梯度分片分发、保存到对应 GPU 上。zero_optimization.stage:3是这套逻辑的基础开启权重分片权重不在单卡完整存放因此反向计算权重梯度前必须 All‑Gather 拿到完整权重overlap_comm: true在反向阶段同样生效将 gather、reduce 通信和反向算子计算并行执行掩盖通信时延contiguous_gradients: true预先分配一块连续显存缓冲区存放反向产生的梯度避免梯度零散分配造成大量显存碎片是反向阶段防 OOM 的关键配置reduce_bucket_size: auto开启梯度归约流水线不需要等待整层梯度全部计算完成梯度累积到 bucket 阈值就启动 AllReduce提升反向通信的并行度。4、分片优化器更新、梯度累积、梯度裁剪梯度分片存储在各个 GPU 后进入参数更新判断逻辑 读取gradient_accumulation_steps: auto梯度累积步数由上层 Accelerate 自动传入判断是否达到梯度累积步数未满足累积步数时暂不执行优化器更新继续下一轮前向 - 反向循环、累积梯度。 达到累积步数后先执行gradient_clipping: auto梯度裁剪梯度裁剪逻辑交由训练脚本控制在 PPO 训练中可以有效抑制梯度爆炸 ZeRO‑3 下 Adam 优化器的一阶、二阶动量和权重采用完全相同的分片规则每张 GPU 只持有自身对应的分片优化器状态、分片梯度每张 GPU 独立使用本地分片梯度与分片动量完成自己负责分片权重的更新。 分片权重更新完成后权重依旧维持分片存储的形态不需要额外 All‑Gather 同步出完整层权重直接进入下一轮训练循环。5、保存 Checkpoint触发 checkpoint 保存时需要导出可直接被 HuggingFace 加载的完整基座权重。 由zero3_save_16bit_model(accelerate)配合zero_optimization.stage3_gather_16bit_weights_on_model_save: true共同控制DeepSpeed 发起全局 All‑Gather 通信收集分布在所有 GPU 上的权重分片合并组装成完整的 bf16 基座权重文件。风险提示gather 合并权重会产生很高的瞬时显存峰值PPO 阶段同时存在 Actor、Reference 两套基座模型时极易保存 OOM此时可将两个开关同时关闭仅保存 DeepSpeed 分片 checkpoint训练结束后通过离线脚本合并权重。Transformer结构和LoRA微调设置1、ResNet网络和残差连接2、LoRA微调参数和模块SFT阶段RW阶段PPO训练阶段采样无梯度更新有梯度更新PPO 拆成采样、无梯度推理、有梯度更新三步核心是先拿旧策略收集交互样本、算出固定监督信号优势 / 回报再用这批信号去优化策略保证重要性采样合法、梯度稳定避免目标漂移。1. 采样阶段Rollout作用用当前旧 Actor 策略生成回答样本拿到模型交互数据。依靠共享主干的 Actor-Critic 生成完整 prompt 回复序列这批样本是后续所有计算的数据来源采样时的策略记为旧策略后续更新不能改动这一步的梯度保证 PPO 重要性采样的前提。2. 无梯度推理阶段冻结梯度只算信号不更新参数作用一次性算出固定、不动的监督标签奖励、KL 惩罚、优势、回报。跑奖励模型、参考模型、旧 Actor-Critic得到打分、KL 项、旧概率、旧价值组装逐 token 奖励每步 KL 惩罚 末尾 RM 分数再用 GAE 算出广义优势✅ 重点优势和回报在这里就固定下来后面梯度更新时它们是常量不参与梯度计算如果这里开梯度优势会跟着参数一起变训练目标来回飘PPO 极易不稳定。3. 有梯度更新阶段参数更新作用用前面固定好的优势信号优化 Actor-Critic让策略学会输出更高奖励的回复。同样的序列再前向一次得到新策略的概率和价值对比新旧策略计算 clip 策略损失、价值损失、熵正则损失反向传播更新 LoRA让 Actor 更懂偏好让 Critic 价值评估更准熵正则维持探索性防止输出固化。4、训练过程2、DQN网络训练二、MCP层三、A2A层
阅读完成 · 觉得有帮助?