多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Jeff 训练管道全解:全权重 SFT、交叉熵与温度校准的完整实现原理

Jeff 训练管道全解:全权重 SFT、交叉熵与温度校准的完整实现原理 Jeff 训练管道全解全权重 SFT、交叉熵与温度校准的完整实现原理【免费下载链接】jeffMillisecond decisions, any domain: a 0.8B open System 1 model that picks between your options with calibrated probabilities. One base, swappable LoRA adapters, on your own hardware.项目地址: https://gitcode.com/gh_mirrors/jeff6/jeffJeff 是一个 0.8B 参数的开放System 1决策模型一次前向传播即可在任意选项列表中输出校准概率。它的训练管道jeff-train实现了全权重监督微调SFT、软标签交叉熵损失、黄金分割搜索温度校准、CPU 卸载 AdamW 优化器与基于开发集 NLL 的检查点选择整条链路在 scripts/train.sh 中一条命令驱动约 3½ 小时即可在单卡上完成一个 60 万行数据集的微调。一、模型结构255 选项决策读出层Jeff 的核心结构由两部分组成定义在 src/jeff/model.pyQwen 主干Backbone继承 Qwen3.5-0.8B 的 24 层 Transformer 解码器GPU 上使用 BF16 精度。决策读出层Readout一个Linear(hidden_size, 255, biasFalse)全连接层将最后一个 token 的隐状态映射到 255 个答案编码的 logits 上。这 255 个编码对应词表中的单 token 字符串A、B…Z、AA…ZZ…初始化时直接从主干的lm_head中截取对应行的权重使读出层天然继承语言模型对字母的语义理解。推理时只需一次前向传播backbone(prompt) → last_hidden_state → readout → 255 logits → softmax → 概率分布。没有自回归生成、没有文本解析延迟仅 22 msRTX PRO 6000。二、数据格式与 SFT 管道输入每条训练样本是一个 JSON 对象结构定义在 src/jeff/types.py核心字段如下字段含义state情境描述纯文本或对象question问题定义choice多选项、noul是/否、score量表label硬标签评估参考target训练目标硬标签字符串、浮点数概率、或概率向量训练入口将数据切分为三个互不重叠的 foldsrc/jeff/train.pytrain训练集支持流式 schedule 或整文件development开发集用于检查点选择temperature校准集独立 fold仅用于拟合温度参数绝不参与选择或超参调优官方完整编排见 scripts/train_all.sh先用jeff-mix将公开数据、合成数据、概率题、长列表等混合到 100 万行再调用train.sh执行单 epoch 全权重微调。三、交叉熵损失硬标签与软标签统一处理损失函数在 src/jeff/train.py 中实现loss -(target × log_softmax(logits)) . sum(-1) . mean()targets()函数同文件第 266-280 行将每行的target字段转换为与选项数等长的概率向量硬标签target parcels→ one-hot 向量[0, 0, 1, 0, …]软概率target 0.73noul 题→[0.27, 0.73]概率分布target [0.6, 0.2, 0.1, 0.1]→ 直接使用这种设计让 Jeff 能同时学习选哪个和有多确定。例如 src/jeff/probability.py 生成的概率题中target就是代码精确计算的p值模型通过交叉熵直接回归到校准概率。四、全权重微调 vs LoRA 适配器jeff-train通过--lora-rank参数切换两种训练模式全权重 SFT默认所有 backbone 参数 readout 均可训练。适合构建基座模型如 Jeff v1.3 base。LoRA 适配器--lora-rank 16基于 src/jeff/lora.py冻结整个 backbone仅在注意力q_proj/k_proj/v_proj/o_proj和 MLPgate_proj/up_proj/down_proj上注入低秩更新视觉/音频塔完全不参与Readout 层仍然全量训练默认alpha 2 × rank可独立设置readout_lr一个 0.8B 基座 rank-16 LoRA 适配器仅约 40 MB加载后对推理延迟几乎无影响0.5 ms。适配器通过 SHA-256 绑定到特定基座版本防止跨版本误用。五、温度校准让概率说真话温度校准是 Jeff 区别于普通分类器的关键步骤实现在 src/jeff/evaluate.py 的fit_temperature函数中输入独立校准 fold 上模型的原始 logits 和硬标签索引搜索目标最小化NLL mean(log Σ exp(logits/T) − logits_target/T)搜索方法黄金分割搜索Golden Section Search在log T ∈ [log 0.05, log 20]区间内执行 80 次迭代最终候选取搜索端点、中点、T1log T 0四个候选中 NLL 最小者拟合出的温度值被写入检查点的decision_config.json推理时自动应用probabilities softmax(logits / T_fitted)温度 1 表示模型过于自信概率过度集中于正确选项温度 1 表示模型过于保守。校准后 ECE期望校准误差通常可降至 0.004-0.028 量级。六、优化器与学习率调度CPU 卸载 AdamWsrc/jeff/optim.py 实现了CPUOffloadAdamWMaster 权重FP32和优化器动量始终保留在 CPU 内存每步将 GPU 上的梯度拷贝到 CPU → CPU 执行 AdamW 更新 → 将更新后的权重拷回 GPU使用pin_memory加速 GPU↔CPU 传输支持按参数名分组设置不同peak_lr如 readout 层使用更高学习率这种设计让 27B 级主干的全精度优化状态不需要额外 GPU 显存对 0.8B 模型则完全无感知。学习率形状learning_rate_factor函数src/jeff/train.py支持两种调度形状描述cosine默认前 5% 步数线性 warmup之后余弦衰减至 0.1× 峰值wsd前 5% warmup → 保持峰值至--decay-start比例 → 线性衰减至 0.1×默认学习率0.8B 模型5e-62B 模型1e-5见 scripts/train_all.sh。七、检查点选择与早停选择策略每次评估默认每 40 步在开发集上计算原始 logits 的NLL校准前温度校准后的accuracy / ECE / Brier选择键selection_key为(raw_nll, -calibrated_accuracy, step)——优先最小化开发集 NLL其次最大化校准后准确率。若提供了参考预测--reference则还要求 ECE 和 Brier 不差于参考 1% 容差calibration_ok门控。早停--patience N从第 2 个 epoch 起若连续 N 次评估未出现新的最低开发集 NLL则停止训练并归档。原子保存selected→ 最优步的符号链接final→ 最终步的符号链接训练完成后自动清理中间检查点和优化器状态prune_finished八、实操一条命令启动训练以 examples/chess/train.sh 为例训练一个 60 万行数据集的国际象棋 Jeffuv run jeff-train \ --train data/train.jsonl \ --development data/dev.jsonl \ --temperature data/calibration.jsonl \ --initial-checkpoint jeff-base-v1.3 \ --epochs 1 --lr 5e-6 --weight-decay 0.01 \ --batch-size 32 --effective-batch-size 256 \ --token-budget 8192 --max-length 8192 \ --eval-every 40 --resume-every 50 \ --run runs/chess/my-run --output checkpoints/chess/my-run关键参数速查参数默认值作用--epochs1训练轮数基座通常 1 轮--effective-batch-size256全局批大小内部自动分 micro-batch--token-budget8192单个 micro-batch 的 token 上限--lr2e-6峰值学习率--eval-every20评估间隔步--lora-rank—指定后切换为 LoRA 模式--patience—早停耐心值--lr-shapecosine学习率调度形状训练产物runs/run/下记录逐步事件日志与评估 JSONLcheckpoints/run/下生成selected最优和final最终两个原子检查点目录。九、数据流式调度进阶对于大规模合成数据管道src/jeff/sft_pipeline.py 实现了冻结调度Frozen Schedule机制将 69,200 行全局训练集预排为 10 个不可变批次tranche每个 5,000 新合成 1,920 回放每批次通过 SHA-256 收据链绑定计划 → 审计 → 数据 → 前序收据任何环节篡改都会触发拒绝训练器以--schedule模式启动后按游标流式读取数据未就绪时阻塞等待并记录事件这套机制确保训练数据在生成过程中可验证、不可篡改且任何一步都可精确复现。总结组件文件核心设计模型 读出层src/jeff/model.pyQwen 主干 255 选项 Linear单 token 答案码训练主循环src/jeff/train.py交叉熵 SFT、micro-batch、原子检查点温度校准src/jeff/evaluate.py黄金分割搜索独立 fold 拟合优化器src/jeff/optim.pyCPU FP32 master pinned memoryLoRA 适配器src/jeff/lora.py低秩更新 SHA-256 基座绑定数据调度src/jeff/sft_pipeline.py不可变 tranche 收据链完整编排scripts/train_all.sh混合 → 训练 → 多集评分Jeff 的训练管道将一次前向 一次决策的极简推理范式与严格的概率校准流程结合在一起全权重或 LoRA 微调负责学习决策能力交叉熵损失同时优化准确性与概率分布而独立的温度拟合则确保模型输出的置信度与真实正确率一致——这正是它在 22 ms 内做出毫秒级校准决策的底层保障。【免费下载链接】jeffMillisecond decisions, any domain: a 0.8B open System 1 model that picks between your options with calibrated probabilities. One base, swappable LoRA adapters, on your own hardware.项目地址: https://gitcode.com/gh_mirrors/jeff6/jeff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表