news 2026/10/15 9:59:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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.35,academic提到 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, n=13) # 重复率 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 size(token)
0.5B6e-40.5M
1.8B3e-41M
7B1.5e-42M

拟合幂律关系lr = a * N^b,用最小二乘就能得到 b 约 -0.32,a 约 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(f"72B 预测学习率: {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-7,weight decay 0.1,gradient 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, n=8, threshold=0.8): candidates = [] for _ in range(n): response = model.generate(question, temperature=0.7) score = reward_model.score(question, response) if score >= threshold: candidates.append((response, score)) if not candidates: return None return max(candidates, key=lambda 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 离线 RL:DPO 偏好对构造与训练配置

离线 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 在线 RL:GRPO 组内采样与奖励模型对接

在线 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: 1000000

SFT 阶段配置:

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: true

DPO 阶段配置:

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: true

GRPO 阶段配置:

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/api,Key 在控制台生成,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。如果你只验证 32K,factor设 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_len=65536): 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": f"Bearer {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.content,completions 接口用text。

OAuth 报错出现在用 Claude Code 或 Codex 这类工具时。如果你用 API Key 方式接入,不要走 OAuth 流程。Claude Code 的配置里 Base URL 填https://taotoken.net/api,Key 填控制台生成的 Key,Model ID 填Qwen/Qwen2.5-7B-Instruct。三件套齐全就不会触发 OAuth。

还有一个隐蔽的报错:长上下文请求返回max_tokens exceeds model limit。原因是推理端max_model_len没设够。vLLM 启动时加--max-model-len 131072,SGLang 加--context-length 131072。

奖励模型对接 GRPO 时,如果报reward model output shape mismatch,检查奖励模型输出是标量还是向量。GRPO 需要标量奖励,如果奖励模型输出的是 logits 向量,要取最后一个 token 的分数。

6. 从复现到落地:把训练配置接到推理验证链路

训练配置跑通后,最终要落到推理验证。如果你只是做研究复现,本地跑通 SFT + DPO 就够了。如果要长期做编码或 Agent 任务,建议把训练好的模型接到稳定的推理链路上。

接入时三件套必须齐全:Base URL 填https://taotoken.net/api,Key 在控制台生成,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.20,7B 模型在 MMLU 上涨了 1.2 分,但代码任务掉了 0.8 分,所以配比是权衡,不是越高越好。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 9:59:10

MCTP over PCIe VDM传输规范:复用PCIe链路实现轻量级设备管理

简介:本资源是DMTF(分布式管理任务组)发布的《MCTP PCIe VDM Transport Binding Specification》1.2.0版官方规范文档,面向系统固件工程师、BMC开发人员及数据中心设备管理协议研究者,解决MCTP协议在PCIe物理层上的标准…

作者头像 李华
网站建设 2026/10/15 9:59:04

超帧(HyperFrames)重构视频链路:从编码到AI推理的实践

上个月我一直在折腾云游戏画面的串流延迟问题。真机对战类游戏,每秒输出60帧,镜头快速甩动是常态,传统逐帧推流在这种高动态场景下码率直接冲着10Mbps以上去,网络稍微一抖就开始花屏。我把GOP调大试过,也试过B帧分层&a…

作者头像 李华
网站建设 2026/10/15 9:59:02

四种经典排序算法的本质差异与工程选型指南

1. 为什么今天还要手写这四种排序?不是有sorted()和Arrays.sort()吗?我带过不少刚转行的学员,第一节课讲完冒泡排序,总有人举手问:“老师,Python里一行sorted(arr)就搞定,Java里Arrays.sort()底…

作者头像 李华
网站建设 2026/10/15 9:58:32

基于SpringBoot的家教预约平台-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/10/15 9:57:59

SQLite FTS5中context-mode的本质与BM25优化实践

1. “context-mode”不是功能开关,而是MCP协议里的一类上下文协商机制你第一次在日志里看到context-mode: full或者调试器报出MCP context-mode mismatch,大概率会以为这是个类似“开启/关闭上下文”的配置项——就像浏览器开发者工具里的“Disable Cach…

作者头像 李华
网站建设 2026/10/15 9:57:48

DAMA2数据管理知识体系:组织级数据能力的施工蓝图

简介:本资源是DAMA国际数据管理协会《DAMA-DMBOK2》中文版知识体系精要解析PDF,面向数据治理工程师、数据架构师、企业数据管理者及备考CDMP认证的专业人士,系统解决数据概念模糊、治理路径不清、元数据与质量实践脱节等核心问题。全文共1个3…

作者头像 李华