Qwen3架构深度解析:从Base模型到Instruct模型
目录
Qwen3模型家族概览
Qwen3是阿里巴巴云团队开发的第三代大语言模型系列,于2025年4月发布。该系列包括密集模型(Dense)和专家混合模型(MoE)两大类:
密集模型系列
- Qwen3-0.6B: 边缘设备部署
- Qwen3-1.7B: 资源受限环境
- Qwen3-4B: 轻量级应用
- Qwen3-8B: 通用场景
- Qwen3-14B: 高性能需求
- Qwen3-32B: 企业级应用
MoE模型系列
- Qwen3-30B-A3B: 30B总参数,3B激活参数
- Qwen3-235B-A22B: 235B总参数,22B激活参数(旗舰模型)
核心特性
- 预训练数据: 36万亿tokens,覆盖119种语言
- 上下文长度: 32,768 tokens(原生),可扩展至131K-1M tokens
- 双模式支持: Thinking模式(深度推理)+ Non-thinking模式(快速响应)
- 开源协议: Apache 2.0
词汇表与Control Tokens
统一词汇表
Qwen3所有模型共享完全相同的词汇表,这是一个重要的设计决策:
词汇表组成:
├─ Regular tokens: 151,643个(BPE分词结果)
├─ Control tokens: 3个核心控制符
│ ├─ <|endoftext|> (ID: 151643) - 文档结束标记
│ ├─ <|im_start|> (ID: 151644) - 对话轮次开始
│ └─ <|im_end|> (ID: 151645) - 对话轮次结束
├─ Extra tokens: 208个预留位置
│ └─ <|extra_0|> ~ <|extra_204|> (ID: 151646-151853)
└─ 总计: 151,646个实际可用tokens
注意: 配置文件中的vocab_size
可能显示为151,936或152,064,这是为了GPU计算优化而填充的(能被128或256整除),但实际可用词汇仍是151,646个。
Control Tokens的实际应用
核心对话控制(ChatML格式)
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好,世界!<|im_end|>
<|im_start|>assistant
你好!有什么可以帮助你的吗?<|im_end|>
Extra Tokens的扩展用途
以Qwen3-Coder为例,使用了部分Extra Tokens实现代码补全功能:
特殊Token分配:
├─ <|fim_prefix|> (ID: 151659) - 代码前缀
├─ <|fim_middle|> (ID: 151660) - 要填充的中间部分
├─ <|fim_suffix|> (ID: 151661) - 代码后缀
├─ <|fim_pad|> (ID: 151662) - FIM填充
├─ <|repo_name|> (ID: 151663) - 仓库名标记
└─ <|file_sep|> (ID: 151664) - 文件分隔符
Fill-in-the-Middle示例:
<|fim_prefix|>def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
<|fim_suffix|>
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
<|fim_middle|>
# 模型生成: left = [x for x in arr if x < pivot]
不同规模模型的参数对比
参数配置总览
模型 | 总参数 | 非嵌入参数 | 层数 | 隐藏维度 | FFN维度 | Q头数 | KV头数 | 上下文长度 |
---|---|---|---|---|---|---|---|---|
Qwen3-0.6B | 0.6B | 0.44B | 28 | 1024 | 2816 | 16 | 8 | 32,768 |
Qwen3-1.7B | 1.7B | 1.4B | 28 | 1536 | 4096 | 16 | 8 | 32,768 |
Qwen3-4B | 4B | 3.3B | 32 | 2048 | 5632 | 16 | 8 | 32,768 |
Qwen3-8B | 8B | 6.5B | 32 | 4096 | 22016 | 32 | 32 | 32,768 |
Qwen3-14B | 14B | 11.5B | 40 | 5120 | 13824 | 40 | 8 | 32,768 |
Qwen3-32B | 32B | 26B | 64 | 5120 | 27648 | 40 | 8 | 32,768 |
关键观察
1. 参数增长的策略
0.6B → 1.7B (2.8倍增长) - 层数不变: 都是28层 - 维度扩展: - hidden_size: 1024 → 1536 (1.5倍) - intermediate_size: 2816 → 4096 (1.45倍) - 注意力配置: 保持16Q/8KV不变 - 设计理念: 增加每层的表达能力,而非增加深度
为什么这样设计? - ✅ 并行计算效率高(层数少,每层更宽) - ✅ 训练更稳定(浅层网络梯度问题更少) - ✅ 推理延迟可控(串行层数少)
2. 注意力头配置的演变
Grouped Query Attention (GQA) 在小模型中的应用:
Qwen3-0.6B/1.7B:
├─ Query heads: 16个
├─ KV heads: 8个
├─ 每2个Q头共享1个KV头
├─ 每个头维度: 64 (0.6B) / 96 (1.7B)
└─ 优势: 减少50% KV Cache内存
Qwen3-8B:
├─ Query heads: 32个
├─ KV heads: 32个
├─ Multi-Head Attention (MHA)
└─ 原因: 8B规模时内存不再是瓶颈,追求最大性能
3. 参数分布分析
以Qwen3-1.7B为例,详细拆解参数分配:
总参数: 1.7B
├─ Embedding层: 233M (151,646 × 1,536)
│ 占比: 13.7%
│
├─ 28个Transformer层: 1,440M
│ 每层参数: 51.4M
│ │
│ ├─ Attention部分: 7.1M/层
│ │ ├─ Q投影: 2.36M (1,536 × 1,536)
│ │ ├─ K投影: 1.18M (1,536 × 768)
│ │ ├─ V投影: 1.18M (1,536 × 768)
│ │ └─ O投影: 2.36M (1,536 × 1,536)
│ │
│ ├─ FFN部分: 18.9M/层
│ │ ├─ Gate投影: 6.29M (1,536 × 4,096)
│ │ ├─ Up投影: 6.29M (1,536 × 4,096)
│ │ └─ Down投影: 6.29M (4,096 × 1,536)
│ │
│ └─ LayerNorm: 3KB/层 (仅scale参数)
│
└─ 最终LayerNorm: 1.5KB
关键洞察:
• FFN占每层参数的73%(计算密集)
• Attention仅占27%(但主导长序列计算)
• 层数增加 = 线性增长
• 维度增加 = 平方增长(矩阵乘法)
4. 不同规模的推理内存需求
满载32K上下文时的内存占用(FP16精度):
Qwen3-0.6B:
├─ 模型权重: 1.2 GB
├─ KV Cache: 1.88 GB
└─ 总计: ~3.1 GB
Qwen3-1.7B:
├─ 模型权重: 3.4 GB
├─ KV Cache: 2.82 GB
└─ 总计: ~6.2 GB
Qwen3-8B:
├─ 模型权重: 16 GB
├─ KV Cache: 17.2 GB
└─ 总计: ~33 GB
结论: 长上下文时,KV Cache内存接近甚至超过模型权重!
核心架构组件
Transformer架构总览
Qwen3采用标准的Decoder-only Transformer架构,但加入了多项现代优化:
输入 → Embedding → 28/32/40/64层Transformer Block → LM Head → 输出
单个Transformer Block结构:
┌─────────────────────────────────┐
│ Input: (Batch, SeqLen, Hidden) │
│ ↓ │
│ RMSNorm (Pre-norm) │
│ ↓ │
│ Grouped Query Attention │
│ • RoPE位置编码 │
│ • QK-Norm (Qwen3新增) │
│ ↓ │
│ Residual Connection │
│ ↓ │
│ RMSNorm │
│ ↓ │
│ Feed-Forward Network │
│ • SwiGLU激活 │
│ • Gate & Up投影 │
│ ↓ │
│ Residual Connection │
│ ↓ │
│ Output: (Batch, SeqLen, Hidden)│
└─────────────────────────────────┘
关键组件详解
1. Grouped Query Attention (GQA)
传统MHA vs Qwen3的GQA(以0.6B为例):
传统MHA:
• Q heads: 16个,每个64维
• K heads: 16个,每个64维
• V heads: 16个,每个64维
• KV Cache: 16 × 64 × SeqLen × 2
Qwen3 GQA:
• Q heads: 16个,每个64维
• K heads: 8个,每个64维
• V heads: 8个,每个64维
• KV Cache: 8 × 64 × SeqLen × 2 ← 减少50%!
原理:
每2个Query头共享1组Key-Value头
Query1 ──┐
Query2 ──┼─→ KV1
Query3 ──┐
Query4 ──┼─→ KV2
...
优势:
✓ 内存占用减半
✓ 性能损失极小(<1%)
✓ 特别适合边缘部署
2. RoPE位置编码(简介)
Qwen3使用旋转位置嵌入(Rotary Position Embedding):
核心思想: 通过旋转矩阵在复数空间注入相对位置信息
特点:
• 不添加绝对位置向量到embedding
• 在Attention计算时动态应用旋转
• 相对位置关系自然编码
• 支持外推到更长序列
Qwen3的RoPE配置:
├─ Base频率: 1,000,000(原为10,000,已调整)
├─ 支持原生长度: 32,768 tokens
└─ 可扩展长度: 131K (YaRN) / 1M tokens (DCA)
为什么重要:
使得模型能灵活处理不同长度输入,
并支持超长文档理解。
3. SwiGLU激活函数
Feed-Forward Network使用SwiGLU而非传统的ReLU:
传统FFN:
x → Linear(Hidden → Inter) → ReLU → Linear(Inter → Hidden)
SwiGLU FFN (Qwen3):
x → Gate分支: Linear(Hidden → Inter)
→ Up分支: Linear(Hidden → Inter)
→ Gate ⊗ Swish(Up) ← SwiGLU
→ Linear(Inter → Hidden)
数学表达:
SwiGLU(x) = (x·W_gate) ⊗ Swish(x·W_up)
Swish(x) = x · sigmoid(x)
优势:
• 非线性表达能力更强
• 训练收敛更快
• 性能提升2-3%
4. RMSNorm + Pre-Normalization
Qwen3使用RMS Normalization代替LayerNorm:
LayerNorm vs RMSNorm:
LayerNorm(x) = (x - μ) / σ · γ
需要计算均值μ和标准差σ
RMSNorm(x) = x / RMS(x) · γ
RMS(x) = √(mean(x²))
只需要均方根,无需减去均值
优势:
✓ 计算更快(减少操作)
✓ 数值更稳定
✓ 性能几乎相同
Pre-Norm结构:
Norm → SubLayer → Residual
(传统是SubLayer → Residual → Norm)
好处:
✓ 训练更稳定
✓ 深层网络收敛更好
动态长度序列处理
为什么需要动态长度?
这是Qwen3高效推理的关键优化之一。
传统Padding方式的问题
场景: 4个样本,真实长度分别为2, 4, 3, 2个tokens
Padding到统一长度128:
样本1: [token1, token2, <pad>, <pad>, ..., <pad>] (126个padding)
样本2: [token1, ..., token4, <pad>, ..., <pad>] (124个padding)
样本3: [token1, token2, token3, <pad>, ..., <pad>] (125个padding)
样本4: [token1, token2, <pad>, <pad>, ..., <pad>] (126个padding)
统计:
• 总tokens: 4 × 128 = 512
• 有效tokens: 2+4+3+2 = 11
• 浪费率: 97.9%
• Attention计算: 512² = 262,144次操作
• 其中有效: 11² = 121次操作
• 计算浪费: 99.95%!
核心问题: - ❌ 大量计算浪费在padding tokens上 - ❌ 内存占用远超实际需求 - ❌ 短查询(占大多数)效率极低
Qwen3的动态长度处理
方案1: 动态Batching
每个样本保持真实长度:
样本1: [token1, token2] Shape: (1, 2)
样本2: [token1, token2, token3, token4] Shape: (1, 4)
样本3: [token1, token2, token3] Shape: (1, 3)
样本4: [token1, token2] Shape: (1, 2)
特点:
• 不同batch可以有不同长度
• 每个token都参与有效计算
• 零浪费
方案2: Sequence Packing(更高效)
将多个样本打包成一个序列:
[s1_tok1, s1_tok2, <eos>,
s2_tok1, s2_tok2, s2_tok3, s2_tok4, <eos>,
s3_tok1, s3_tok2, s3_tok3, <eos>,
s4_tok1, s4_tok2, <eos>]
Shape: (1, 15) ← 仅15个tokens!
通过Attention Mask确保样本间不交互:
[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 样本1只看自己
[0,0,0,1,1,1,1,0,0,0,0,0,0,0,0] 样本2只看自己
[0,0,0,0,0,0,0,0,1,1,1,0,0,0,0] 样本3只看自己
[0,0,0,0,0,0,0,0,0,0,0,0,1,1,0] 样本4只看自己
优势:
✓ GPU利用率最大化
✓ 吞吐量大幅提升
✓ 训练成本降低
实际效率对比
短序列查询(最常见场景)
查询: "你好" (4 tokens)
Padding方式 (固定32,768长度):
• 计算量: 32,768² × hidden_size × layers
≈ 30 GFLOPs (Qwen3-0.6B)
• 激活内存: 1.88 GB
• 延迟: ~500ms
• 利用率: 0.01%
动态长度方式:
• 计算量: 4² × hidden_size × layers
≈ 3.7 MFLOPs
• 激活内存: 0.23 MB
• 延迟: ~2ms
• 利用率: 100%
• 加速比: 250x!
不同长度的性能表现
序列长度 | Padding计算 | Dynamic计算 | 加速比 | 内存节省 |
---|---|---|---|---|
10 tokens | 30 GFLOPs | 9 MFLOPs | 3,333x | 99.97% |
128 tokens | 30 GFLOPs | 150 MFLOPs | 200x | 99.6% |
2,048 tokens | 30 GFLOPs | 3.8 GFLOPs | 8x | 93.8% |
16,384 tokens | 30 GFLOPs | 24 GFLOPs | 1.25x | 50% |
32,768 tokens | 30 GFLOPs | 30 GFLOPs | 1x | 0% |
关键洞察: - 短序列占日常查询的80%以上 - 动态长度对短序列提升巨大 - 这就是为什么Qwen3能实现快速响应
参数利用率的真相
重要澄清: 动态长度不影响参数利用率!
参数 vs 计算量的区别:
模型参数 (0.6B):
├─ 存储在GPU显存中
├─ 每次推理都使用全部参数
├─ 与序列长度无关
└─ 利用率: 永远100%
计算量 (FLOPs):
├─ 取决于输入长度
├─ 短序列 = 少计算
├─ 长序列 = 多计算
└─ 这是效率差异的来源
举例说明:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
输入: "你好" (4 tokens)
• 参数使用: 600M 全部 (100%)
• 计算量: 3.7 MFLOPs
• 时间: 2ms
输入: 长文档 (32K tokens)
• 参数使用: 600M 全部 (100%)
• 计算量: 30 GFLOPs
• 时间: 500ms
结论:
参数利用率都是100%!
差异在于Attention的O(n²)复杂度
从Base到Instruct:后训练数据格式
后训练概述
从Base模型到Instruct模型需要经过后训练(Post-training)阶段:
预训练阶段:
• 数据量: 36 trillion tokens
• 训练目标: 下一词预测(语言建模)
• 输出: Base模型(纯文本补全)
• 示例: 输入"人工智能" → 输出"的发展历程..."
后训练阶段:
• SFT数据量: ~50K-1M条指令对
• 训练目标: 遵循指令,对话
• 输出: Instruct模型(助手)
• 示例: 输入"解释人工智能" → 输出"人工智能是..."
关键差异:
预训练 ≈ 学习语言
后训练 ≈ 学习交流
后训练数据量级对比
数据量对比:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 数据量 占比
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
预训练 36T tokens 100%
SFT 100K-1M 条 0.000003%
RLHF 10K-100K 偏好对 0.0000003%
震撼事实:
仅用预训练0.000003%的数据量,
就能彻底改变模型的行为模式!
主流后训练数据集格式对比
1. Alpaca格式(最流行)
{
"instruction": "将这段文字翻译成英文",
"input": "你好,世界!",
"output": "Hello, World!"
}
特点: - ✅ 简单直观 - ✅ 适合单轮指令 - ✅ 易于人工标注 - 数据集: Stanford Alpaca (52K)、Alpaca-GPT4 (52K)、BELLE (1.5M中文)
2. ShareGPT格式(真实对话)
{
"conversations": [
{
"from": "human",
"value": "什么是机器学习?"
},
{
"from": "gpt",
"value": "机器学习是人工智能的一个分支,它让计算机能够从数据中自动学习规律,而无需明确编程。"
},
{
"from": "human",
"value": "能举个例子吗?"
},
{
"from": "gpt",
"value": "当然!比如邮件垃圾过滤器..."
}
]
}
特点: - ✅ 支持多轮对话 - ✅ 真实用户交互 - ✅ 上下文连贯 - 数据集: ShareGPT (~90K)、UltraChat (1.5M)
3. OpenAssistant格式(标准化)
{
"messages": [
{
"role": "user",
"content": "解释量子计算"
},
{
"role": "assistant",
"content": "量子计算利用量子力学原理..."
}
]
}
特点: - ✅ 标准化role字段 - ✅ 支持system角色 - ✅ 多语言覆盖 - 数据集: OpenAssistant (161K, 35语言)
不同开源模型的格式对比
模型 | 训练时格式 | 推理时格式 | 特殊标记 |
---|---|---|---|
Qwen3 | ChatML | <\|im_start\|>role\n...<\|im_end\|> |
im_start/im_end |
Llama2/3 | 自定义 | [INST] ... [/INST] |
INST标签 |
Vicuna | FastChat | USER: ...\nASSISTANT: ... |
无特殊token |
Mistral | 自定义 | [INST] ... [/INST] |
s标签 |
DeepSeek | 类ChatML | 类似Qwen | 自定义token |
关键发现: 每个模型都有自己的格式!
统一格式转换流程
核心问题: 不同格式的数据混在一起会让模型困惑吗?
答案: 不会!因为训练前会统一转换。
完整转换流程
原始数据 (多种格式)
↓
步骤1: 格式统一
↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Alpaca格式:
{
"instruction": "翻译",
"input": "Hello",
"output": "你好"
}
↓ 转换为统一messages格式
{
"messages": [
{"role": "user", "content": "翻译\nHello"},
{"role": "assistant", "content": "你好"}
]
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ShareGPT格式:
{
"conversations": [
{"from": "human", "value": "Hello"},
{"from": "gpt", "value": "你好"}
]
}
↓ 转换为统一messages格式
{
"messages": [
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": "你好"}
]
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
↓
步骤2: 应用Chat Template (Qwen3的ChatML)
↓
<|im_start|>user
Hello<|im_end|>
<|im_start|>assistant
你好<|im_end|>
↓
步骤3: Tokenization
↓
[151644, 872, 198, 9906, 151645,
151644, 77091, 198, 108386, 151645]
↓
步骤4: 模型训练
↓
模型只看到: [151644, 872, 198, ...]
完全不知道原始格式是什么!
为什么不会混乱?
关键理解:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 模型不理解"格式"
• 模型输入: token IDs (数字序列)
• instruction/from/role: 这些是人类组织数据的方式
• 模型从未见过这些字段名
2. 统一转换消除差异
• 所有数据 → ChatML → Tokens
• 模型学习的是ChatML模式
• 永远是: <|im_start|>...content...<|im_end|>
3. 类比理解
就像多个人用不同方言(格式)说话,
但都被翻译成普通话(ChatML)后再教给学生(模型),
学生只学会了普通话,不知道原本有不同方言。
4. 实际效果
✓ 可以混合任意格式的数据集
✓ 训练前统一转换即可
✓ 模型行为完全一致
实际数据准备示例
混合多源数据集
训练数据构成示例(假设的Qwen3-1.7B-Instruct):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
数据集 数量 格式 用途
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Alpaca-GPT4 52K Alpaca 通用指令
ShareGPT 90K ShareGPT 多轮对话
OpenAssistant 50K Messages 多语言
BELLE中文 100K Alpaca 中文增强
自有数据 20K Custom 特定领域
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
总计 312K 混合格式
↓ 统一转换
ChatML格式
转换代码概念
# 伪代码示例(概念性)
def convert_to_chatml(data, format_type):
"""将任意格式转换为ChatML"""
if format_type == "alpaca":
# Alpaca → Messages
content = data['instruction']
if data.get('input'):
content += '\n' + data['input']
messages = [
{"role": "user", "content": content},
{"role": "assistant", "content": data['output']}
]
elif format_type == "sharegpt":
# ShareGPT → Messages
messages = []
for conv in data['conversations']:
role = "user" if conv['from'] == "human" else "assistant"
messages.append({"role": role, "content": conv['value']})
elif format_type == "openassistant":
# 已经是messages格式
messages = data['messages']
# 应用ChatML模板
chatml_text = tokenizer.apply_chat_template(
messages,
tokenize=False
)
# 结果: "<|im_start|>user\n...<|im_end|>..."
return chatml_text
# 处理所有数据
all_data = []
all_data += [convert_to_chatml(d, "alpaca") for d in alpaca_data]
all_data += [convert_to_chatml(d, "sharegpt") for d in sharegpt_data]
all_data += [convert_to_chatml(d, "openassistant") for d in oa_data]
# 训练时,模型只看到统一的ChatML格式!
ChatML中的"ML"含义
ChatML = Chat Markup Language (聊天标记语言)
类比其他标记语言:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HTML = HyperText Markup Language (网页结构)
XML = eXtensible Markup Language (数据交换)
YAML = YAML Ain't Markup Language (配置文件)
ChatML= Chat Markup Language (对话结构)
共同特点:
✓ 使用特殊标记(tags)区分内容和结构
✓ 人类可读
✓ 机器可解析
✓ 语义明确
ChatML示例:
<|im_start|>user ← 标记:用户开始
你好<|im_end|> ← 标记:结束
<|im_start|>assistant ← 标记:助手开始
你好!<|im_end|> ← 标记:结束
与HTML对比:
<p>这是段落</p> ← HTML标记
<|im_start|>...<|im_end|> ← ChatML标记
总结与关键要点
核心架构特点
- 统一词汇表 (151,646 tokens)
- 所有Qwen3模型完全共享
- 3个核心control tokens + 208个可扩展位置
-
支持119种语言
-
参数扩展策略
- 优先增加维度,而非层数
- 0.6B → 1.7B: 层数不变(28),维度增加50%
-
GQA架构减少KV Cache内存
-
现代Transformer优化
- RoPE位置编码(支持外推)
- SwiGLU激活函数
- RMSNorm + Pre-normalization
- QK-Norm稳定训练
效率优化要点
- 动态长度处理
- 无需padding,按需计算
- 短序列加速百倍至千倍
-
参数利用率永远100%
-
实际应用影响
- 短查询(80%场景)延迟极低
- 长文档处理内存可控
- 成本效益显著提升
后训练关键认知
- 数据量对比
- 预训练: 36T tokens(100%)
- SFT: 100K-1M条(0.000003%)
-
质量 >> 数量
-
格式统一
- 不同数据集 → 统一ChatML → Tokenization
- 模型看不到原始格式
-
不会产生混淆
-
主流数据集
- Alpaca: 单轮指令
- ShareGPT: 多轮对话
- OpenAssistant: 多语言标准化
Base vs Instruct
关键差异:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
特性 Base模型 Instruct模型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
架构 完全相同 完全相同
参数量 完全相同 完全相同
词汇表 完全相同 完全相同
训练阶段 仅预训练 预训练+SFT+RLHF
输入形式 纯文本 ChatML格式对话
输出行为 文本续写 指令遵循/对话
适用场景 Fine-tuning基座 直接使用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
结论: 架构无差异,行为由后训练塑造!
给新手的建议
- 选择模型规模
- 个人学习/边缘设备: 0.6B-1.7B
- 原型开发/API服务: 4B-8B
-
生产环境/复杂任务: 14B-32B
-
微调方向
- 从Base开始: 适合大量特定领域数据
-
从Instruct开始: 适合小样本微调或特定风格调整
-
数据准备
- 收集高质量指令-响应对
- 转换为统一ChatML格式
-
质量>数量,建议从1K-10K开始
-
推理优化
- 利用动态长度特性
- 批处理时混合不同长度
- 量化(INT8/INT4)进一步降低成本
参考资源
- 官方仓库: QwenLM/Qwen3
- 技术报告: Qwen3 Technical Report
- 文档: Qwen Documentation
- 模型下载: Hugging Face - Qwen
本文档版本: v1.0
最后更新: 2025-01-01
适用模型: Qwen3系列(2504/2507版本)
格式排版 最终由Claude整理内容和排版