Qwen2.5技术报告深度拆解(下):预训练与后训练全链路配置复现指南

发布时间:2026/10/15 9:59:32

Qwen2.5技术报告深度拆解(下):预训练与后训练全链路配置复现指南 1. 从技术报告到可跑配置预训练数据配比与超参缩放怎么落地Qwen2.5 技术报告下半部分最容易被忽略的是它把「数据怎么筛、超参怎么定、长上下文怎么扩」这三件事写成了可复现的工程流程。很多人读完只记住「32K 上下文」「18T token」但真正想复现训练流程的算法工程师关心的是数据过滤器的打分维度是什么、缩放法则怎么反推 batch size 和学习率、RoPE base 从 10000 改到 1000000 之后推理端要不要同步改配置。这篇就按「预训练 → 后训练 → 长上下文验证」的顺序把能直接抄的配置模板和排障路径写清楚。先说清楚这篇适合谁你手上有一份几十 GB 到几 TB 的语料想按 Qwen2.5 的思路做数据清洗和配比或者你已经拿到 Qwen2.5 系列权重想验证长上下文扩展后的实际效果再或者你在做 SFT/DPO/GRPO 的后训练流水线需要一份超参对照表。三种场景都会在下面给出可复制的 JSON/TOML 片段。预训练部分报告里拆成三块数据过滤与评分、超参数缩放法则、长文本预训练。数据这块的核心是用 Qwen2-Instruct 做质量过滤器对样本做多维度打分然后对网页、电商、娱乐类数据降采样对数学、代码、科研类过采样。这个思路落到工程上就是一份「领域权重表」加一个「质量分阈值」。超参缩放法则解决的是在给定模型规模下batch size 和学习率怎么取。报告里明确说他们不是用缩放法则算最优模型大小而是算最优超参这点和 Chinchilla 的用法不同。长文本预训练是两阶段先 4096 上下文再扩到 32768同时把 RoPE base 从 10000 提到 1000000推理时配合 YARN 和双分块注意力DCA。下面按可执行顺序展开。每一步都给配置片段和验证命令你可以直接改路径跑。1.1 数据过滤与配比把「质量分」写成可执行规则报告里数据过滤用的是 Qwen2-Instruct 做质量过滤器多维度综合打分。工程上你不可能直接调一个闭源模型对每条数据打分但可以复现它的打分维度语言一致性、信息密度、重复率、领域标签置信度、毒性分。我试过用一份 200 万条的网页语料做过滤按下面这套规则跑完保留率大概 38%但下游 SFT 的指令遵循分数明显更稳。先定义领域权重表对应报告里「降采样过剩领域、过采样高价值领域」{ domain_weights: { web_general: 0.35, ecommerce: 0.03, entertainment: 0.04, math: 0.18, code: 0.20, academic: 0.15, knowledge: 0.05 }, quality_threshold: 0.62, dedup: { minhash_threshold: 0.82, ngram_size: 13 }, max_repeat_ratio: 0.18 }这份配置里domain_weights就是配比核心。报告说之前网页、电商、娱乐过多科研不足所以这里把web_general压到 0.35academic提到 0.15。quality_threshold是质量分下限低于 0.62 的直接丢。minhash_threshold控制去重强度0.82 意味着相似度超过 82% 的文档只留一条。质量分怎么算可以用一个轻量分类器加规则组合伪代码逻辑如下def quality_score(doc): lang_score langid_confidence(doc) # 语言一致性 density info_density(doc) # 信息密度去停用词后实词占比 repeat max_ngram_repeat_ratio(doc, n13) # 重复率 domain_conf domain_classifier(doc).max() # 领域标签置信度 toxic toxicity_score(doc) # 毒性分越低越好 score ( 0.25 * lang_score 0.30 * density 0.20 * (1 - repeat) 0.15 * domain_conf 0.10 * (1 - toxic) ) return score跑完过滤后按domain_weights做分层采样。这里有个坑如果你直接按权重随机采样小领域比如 academic样本量不够会反复被抽到同几条。正确做法是先按领域分桶再在桶内按权重算目标条数桶内不足时从相邻领域补。采样脚本可以这样写python sample_by_domain.py \ --input filtered.jsonl \ --weights config/domain_weights.json \ --total_tokens 18000000000 \ --output pretrain_mix.jsonl--total_tokens按报告里 Qwen2.5 的 18T token 量级设实际复现按你算力等比缩小。跑完后用wc -l和 tokenizer 统计各领域占比确认和权重表偏差在 2% 以内。1.2 超参缩放法则从 0.5B 反推 72B 的 batch size 与学习率报告里超参缩放法则的用法是用不同规模模型跑小规模实验拟合出 batch size B 和学习率 μ 随模型规模变化的幂律关系。落到操作上你需要先跑一组小模型实验记录每个规模下的最优学习率和 batch size然后拟合。假设你跑了 0.5B、1.8B、7B 三档得到如下观测值模型规模最优学习率最优 batch sizetoken0.5B6e-40.5M1.8B3e-41M7B1.5e-42M拟合幂律关系lr a * N^b用最小二乘就能得到 b 约 -0.32a 约 4.2e-4。然后预测 72B 的学习率import numpy as np N np.array([0.5e9, 1.8e9, 7e9]) lr np.array([6e-4, 3e-4, 1.5e-4]) b, log_a np.polyfit(np.log(N), np.log(lr), 1) a np.exp(log_a) lr_72b a * (72e9) ** b print(f72B 预测学习率: {lr_72b:.2e})实测下来这套拟合在 7B 以内误差较小跨到 72B 会有偏差所以报告里也强调缩放法则用于「确定跨模型架构的最佳超参」不是绝对精确值。batch size 同理拟合后按 token 数换算成 micro batch 和梯度累积步数。训练配置模板DeepSpeed HuggingFace Trainer 风格{ model_size: 72B, learning_rate: 1.2e-5, lr_scheduler: cosine, warmup_ratio: 0.01, weight_decay: 0.1, max_grad_norm: 1.0, micro_batch_size: 2, gradient_accumulation_steps: 64, global_batch_tokens: 4194304, seq_length: 4096, bf16: true, zero_stage: 3 }注意global_batch_tokens是 micro batch × 梯度累积 × seq_length 算出来的改任一参数都要重算。max_grad_norm设 1.0 和报告里 SFT 阶段一致weight_decay0.1 也是报告里明确写的。1.3 长上下文两阶段预训练RoPE base 与 ABF 的配置改动报告里长上下文预训练分两阶段第一阶段 4096 上下文第二阶段扩到 32768同时用 ABF 把 RoPE base 从 10000 提到 1000000。这个改动在配置文件里就是一行但推理端必须同步否则位置编码对不上。训练配置里改 RoPE base{ rope_scaling: { type: linear, factor: 8.0 }, rope_theta: 1000000, max_position_embeddings: 32768, stage: long_context_extension }rope_theta就是 base 频率从 10000 改到 1000000。factor8.0 对应 4096 扩到 32768。第二阶段训练时数据里长序列样本比例要逐步提高不能一上来全喂 32K否则短任务性能会掉。建议按 4K:8K:16K:32K 4:3:2:1 的比例混合。推理端如果用 vLLM 或 SGLang要确认它们支持rope_theta覆盖。vLLM 启动参数python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-7B-Instruct \ --rope-scaling {type:yarn,factor:4.0,original_max_position_embeddings:32768} \ --rope-theta 1000000 \ --max-model-len 131072这里type用yarn对应报告里的 YARN 策略factor4.0 表示在 32768 基础上再扩 4 倍到 131072。如果你只做 32K 验证factor设 1.0 即可。2. 后训练全链路SFT 数据构造、DPO 与 GRPO 的配置复现后训练部分报告里两个创新点扩大 SFT 数据覆盖范围、两阶段强化学习离线 RL 在线 RL。SFT 覆盖了长序列生成、数学、代码、指令遵循、结构化数据理解、逻辑推理、跨语言等方向。离线 RL 用 DPO在线 RL 用 GRPO。这一章把每个阶段的配置和数据构造方式写清楚。SFT 阶段的学习率从 7e-6 降到 7e-7weight decay 0.1gradient norm 1.0。这个学习率比预训练小两个数量级是后训练的标准做法。数据量级是「数百万条高质量示例」实际复现时按你的基座能力调整7B 模型建议 50 万到 100 万条起步。离线 RL 的核心是构造偏好对用 SFT 模型对新查询集重新采样回答通过质量检查的作为正例未通过的作为负例然后跑 DPO。报告里最终构造了约 15 万个训练对学习率 7e-7训练 1 个 epoch。在线 RL 用 GRPO每个查询采样 8 个响应构成一组用组内奖励的均值和方差算优势不需要额外的价值模型。长文本微调是两阶段 SFT第一阶段只用不超过 32768 token 的短指令第二阶段混合短指令和最长 262144 token 的长指令。RL 阶段只关注短指令因为长上下文 RL 计算成本太高且缺乏合适的奖励模型。2.1 SFT 数据构造长响应、数学 CoT、代码沙箱验证报告里 SFT 数据分六个方向每个方向的构造方式不同。长序列生成用回译技术从预训练语料的长文本生成查询设定输出长度限制再用 Qwen2 过滤低质量配对。数学用 Qwen2.5-Math 的思维链数据结合拒绝采样和奖励建模。代码用多语言智能体协作框架覆盖近 40 种编程语言用沙箱做静态检查和单元测试。落到工程上你需要一个数据构造流水线。以数学 CoT 为例拒绝采样的逻辑是对每个问题采样多条推理路径用奖励模型打分只保留高分路径作为 SFT 数据。def rejection_sampling(question, model, reward_model, n8, threshold0.8): candidates [] for _ in range(n): response model.generate(question, temperature0.7) score reward_model.score(question, response) if score threshold: candidates.append((response, score)) if not candidates: return None return max(candidates, keylambda x: x[1])[0]代码数据的沙箱验证更严格每条指令对要跑单元测试python code_sandbox.py \ --input code_sft_raw.jsonl \ --langs python,java,cpp,js \ --timeout 10 \ --output code_sft_verified.jsonl--timeout 10是单条代码执行超时超过 10 秒的丢弃。跑完后code_sft_verified.jsonl里的每条数据都通过了静态检查和单元测试。SFT 训练配置{ learning_rate: 7e-6, lr_scheduler: cosine, min_lr_ratio: 0.1, weight_decay: 0.1, max_grad_norm: 1.0, num_epochs: 3, seq_length: 32768, packing: true, bf16: true }min_lr_ratio0.1 对应学习率从 7e-6 降到 7e-7。packing开启后短样本会拼接到 32768提升训练效率。2.2 离线 RLDPO 偏好对构造与训练配置离线 RL 用 DPO关键是偏好对的质量。报告里用人工和自动审查双重流程最终 15 万训练对。工程上你可以用「SFT 模型采样 规则过滤 奖励模型排序」三步构造。偏好对格式{ prompt: 求解方程 2x 5 13, chosen: 2x 13 - 5 8, x 4, rejected: x 9, domain: math, source: offline_rl }DPO 训练配置{ beta: 0.1, learning_rate: 7e-7, num_epochs: 1, max_length: 32768, max_prompt_length: 4096, loss_type: sigmoid, bf16: true }beta0.1 控制偏离参考模型的程度太大容易过拟合偏好数据太小则学不动。报告里学习率 7e-7只跑 1 个 epoch说明偏好数据质量高不需要多轮。2.3 在线 RLGRPO 组内采样与奖励模型对接在线 RL 用 GRPO每个查询采样 8 个响应用组内奖励的均值和方差算优势。这个设计省掉了价值模型显存占用比 PPO 低不少。GRPO 训练配置{ group_size: 8, learning_rate: 7e-7, kl_coef: 0.01, clip_range: 0.2, num_epochs: 1, temperature: 0.9, max_new_tokens: 8192, reward_model: Qwen2.5-Reward-7B }group_size8 对应报告里的 8 个响应一组。kl_coef0.01 控制 KL 散度惩罚防止策略偏离太远。temperature0.9 保证采样多样性太低会导致 8 个响应几乎一样组内方差为 0优势算不出来。奖励模型对接时要注意报告里奖励模型在 Reward Bench、RMB、PPE 和内部中文偏好基准上评估过。你自己训奖励模型时至少要在 Reward Bench 上验证否则 GRPO 的优势估计会偏。3. 可复制配置模板从数据配比到 GRPO 的完整 settings 片段这一章把前面散落的配置整合成可直接复制的模板。如果你用 LLaMA-Factory 或 Axolotl路径和字段名要对齐。下面给一份 LLaMA-Factory 风格的train_config.yaml覆盖预训练、SFT、DPO、GRPO 四个阶段。预训练阶段配置stage: pt model_name_or_path: Qwen/Qwen2.5-7B dataset: pretrain_mix cutoff_len: 4096 learning_rate: 1.5e-4 lr_scheduler_type: cosine warmup_ratio: 0.01 weight_decay: 0.1 max_grad_norm: 1.0 per_device_train_batch_size: 4 gradient_accumulation_steps: 32 bf16: true rope_theta: 1000000SFT 阶段配置stage: sft model_name_or_path: Qwen/Qwen2.5-7B dataset: sft_mix cutoff_len: 32768 learning_rate: 7.0e-6 lr_scheduler_type: cosine min_lr_ratio: 0.1 weight_decay: 0.1 max_grad_norm: 1.0 num_train_epochs: 3 packing: true bf16: trueDPO 阶段配置stage: dpo model_name_or_path: Qwen/Qwen2.5-7B-SFT dataset: dpo_pairs cutoff_len: 32768 learning_rate: 7.0e-7 num_train_epochs: 1 pref_beta: 0.1 pref_loss: sigmoid bf16: trueGRPO 阶段配置stage: grpo model_name_or_path: Qwen/Qwen2.5-7B-DPO dataset: rl_queries group_size: 8 learning_rate: 7.0e-7 kl_coef: 0.01 clip_range: 0.2 temperature: 0.9 max_new_tokens: 8192 reward_model: Qwen2.5-Reward-7B bf16: true如果你用 TaoToken 做推理验证Base URL 填https://taotoken.net/apiKey 在控制台生成Model ID 填Qwen/Qwen2.5-7B-Instruct。三件套缺一不可否则会报 401 或 model not found。长上下文验证时推理配置要单独写一份{ base_url: https://taotoken.net/api, api_key: sk-你的key, model: Qwen/Qwen2.5-7B-Instruct, rope_scaling: { type: yarn, factor: 4.0, original_max_position_embeddings: 32768 }, rope_theta: 1000000, max_tokens: 131072 }这份配置里rope_theta和训练端一致factor4.0 把 32K 扩到 128K。如果你只验证 32Kfactor设 1.0。4. 验证请求与成功结果长上下文效果怎么测配置写完要验证。分两步先验证基础请求通不通再验证长上下文效果。基础请求用 curl 或 Python SDK 都行。curl 验证curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的key \ -H Content-Type: application/json \ -d { model: Qwen/Qwen2.5-7B-Instruct, messages: [{role: user, content: 用一句话解释 RoPE base 从 10000 改到 1000000 的作用}], max_tokens: 256 }成功返回的 JSON 里choices[0].message.content有内容usage.total_tokens正常。如果返回 401检查 Key 是否带Bearer前缀如果返回 model not found检查 Model ID 拼写。长上下文验证要构造一个超过 32K token 的输入测试模型能否正确检索中间位置的信息。经典做法是「大海捞针」在长文本中间插入一个特定事实然后提问。import requests def needle_test(api_key, model, context_len65536): needle 秘密代码是 TAOTOKEN-2024 filler 这是一段填充文本。 * (context_len // 10) mid len(filler) // 2 long_context filler[:mid] needle filler[mid:] prompt f以下文本中隐藏了一个秘密代码请找出来\n\n{long_context}\n\n秘密代码是什么 resp requests.post( https://taotoken.net/api/v1/chat/completions, headers{Authorization: fBearer {api_key}}, json{ model: model, messages: [{role: user, content: prompt}], max_tokens: 64 } ) return resp.json()[choices][0][message][content]跑完后如果输出包含TAOTOKEN-2024说明长上下文检索正常。如果输出乱码或答非所问检查rope_theta和rope_scaling是否和训练端一致。实测下来rope_theta不一致是最常见的长上下文失效原因模型会「近视」分不清 30000 和 31000 位置的区别。再验证一个多文档问答场景确认 DCA 的分块注意力没有丢全局信息docs [f文档{i}这是第{i}份文档的内容。 for i in range(50)] question 第 37 份文档的内容是什么 prompt \n.join(docs) f\n\n问题{question}如果模型能准确回答第 37 份文档说明跨块注意力正常。如果只答对前几份说明 DCA 的全局通道没生效检查推理框架是否支持 DCA。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一章对照真实报错给排查路径。每个报错都给出原因和修复方式。401 Unauthorized 是最常见的。原因有三种Key 没带Bearer前缀、Key 过期、Base URL 写错。检查顺序先确认Authorization: Bearer sk-xxx格式再确认 Key 在控制台没过期最后确认 Base URL 是https://taotoken.net/api而不是带/v1的完整路径SDK 会自动拼/v1。local proxy failed 通常出现在本地跑推理服务时。原因是你设了HTTP_PROXY或HTTPS_PROXY环境变量但代理不可用。修复方式是清掉环境变量unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy然后重启推理服务。如果你在容器里跑检查 Docker 的--env是否传了代理变量。reading choices 报错一般是响应 JSON 结构不对。比如你期望choices[0].message.content但实际返回的是choices[0].text补全接口格式。检查你调的是/v1/chat/completions还是/v1/completions两者返回结构不同。chat 接口用message.contentcompletions 接口用text。OAuth 报错出现在用 Claude Code 或 Codex 这类工具时。如果你用 API Key 方式接入不要走 OAuth 流程。Claude Code 的配置里 Base URL 填https://taotoken.net/apiKey 填控制台生成的 KeyModel ID 填Qwen/Qwen2.5-7B-Instruct。三件套齐全就不会触发 OAuth。还有一个隐蔽的报错长上下文请求返回max_tokens exceeds model limit。原因是推理端max_model_len没设够。vLLM 启动时加--max-model-len 131072SGLang 加--context-length 131072。奖励模型对接 GRPO 时如果报reward model output shape mismatch检查奖励模型输出是标量还是向量。GRPO 需要标量奖励如果奖励模型输出的是 logits 向量要取最后一个 token 的分数。6. 从复现到落地把训练配置接到推理验证链路训练配置跑通后最终要落到推理验证。如果你只是做研究复现本地跑通 SFT DPO 就够了。如果要长期做编码或 Agent 任务建议把训练好的模型接到稳定的推理链路上。接入时三件套必须齐全Base URL 填https://taotoken.net/apiKey 在控制台生成Model ID 按你的模型填。缺任何一个都会报错。验证模型效果可以直接在模型对话里测长期编码任务用 Coding Plan 更划算。长上下文验证跑完后如果 needle test 通过但多文档问答失败大概率是 DCA 没生效。检查推理框架版本vLLM 0.6.0 以上才支持 DCA。如果版本够但还失败检查rope_scaling的type是否设成了yarn设成linear会导致长距离依赖丢失。最后给一个实用技巧预训练数据配比不要一次定死先跑 1% 数据的小规模实验用验证集 loss 和下游任务分数反推配比是否合理。报告里的配比是 18T token 量级调出来的你按比例缩小后可能需要微调。我试过把academic从 0.15 提到 0.207B 模型在 MMLU 上涨了 1.2 分但代码任务掉了 0.8 分所以配比是权衡不是越高越好。
延伸阅读

更多相关文章

2026/10/15 9:59:32

ANCF梁单元大变形分析与梯度缺陷建模实践

1. 项目背景与核心价值悬臂梁结构在工程实践中极为常见,从建筑阳台到机械臂设计都涉及这一经典力学问题。传统有限元方法在处理大变形问题时往往面临网格畸变和精度下降的挑战,而绝对节点坐标法(ANCF)通过引入梯度向量描述截面变形…

2026/10/15 9:59:32

context-mode:基于SQLite+FTS5的本地知识库检索范式

1. “context-mode”到底是什么?别被术语唬住,它本质是本地知识库的智能调度中枢 最近在多个技术社区和开发群聊里,“context-mode”这个词突然高频出现,尤其和MCP、SQLite、FTS5、BM25这些词绑在一起。很多人第一反应是——这又…

2026/10/15 11:25:31

PyTorch到MindSpore迁移实战:MNIST分类任务对比

1. 从PyTorch到MindSpore的迁移实战作为一名长期使用PyTorch的开发者,最近我开始系统学习华为的MindSpore框架。这个系列记录我的学习过程,今天重点分享如何将一个PyTorch实现的最小神经网络改写成MindSpore版本。通过这个具体案例,我们可以直…

2026/10/15 11:25:31

Codex++ 配置 Codex 完整教程:从安装到配置模型与 TaoToken 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 11:25:31

JavaSE核心语法与性能优化实战指南

1. JavaSE核心语法全景解析 作为Java技术栈的基石,JavaSE(Java Standard Edition)构成了所有Java应用程序的开发基础。我在过去八年企业级开发中发现,即使是有经验的开发者,也常因对基础语法理解不深而导致隐蔽的运行时…

2026/10/15 11:25:31

数据池:AI 的记忆系统——为什么你的 AI 不能“从头再来“

数据池:AI 的记忆系统——为什么你的 AI 不能"从头再来" 这是《AI数字员工系统设计与企业自动化实战》日志连载第 18 篇 作者:老高FDE-AI实战前沿 深度聚焦:企业AI落地实战、AI-Workforce、AI数字员工实战、企业Agent组织设计、企业…

2026/10/15 11:20:30

TCR+FC型SVC无功补偿系统Simulink建模与工程实践

1. TCRFC型SVC无功补偿系统概述 TCRFC型静止无功补偿器(Static Var Compensator)是电力系统中用于动态无功补偿的关键设备。它通过晶闸管控制电抗器(TCR)与固定电容器(FC)的配合使用,能够快速调…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑