Qwen2.5-Coder 是通义千问最新的代码语言模型,基于 Qwen2.5 的架构继续 pretrain 了 5.5T 的 token。通过细致的数据清洗、可扩展的合成数据生成和平衡的数据混合,Qwen2.5-Coder在展示令人印象深刻的代码生成能力的同时,还保留了通用的多功能性。本文根据官方的技术报告(Qwen2.5-Coder Technical Report)总结一下训练方法。
1 模型架构
整体同 Qwen2.5,不同参数(1.5B 和 7B)在 hidden size、query heads、key-value heads、intermediate size 和 embedding tying(embedding layer 和 Pre-softmax layer 共享参数,减少模型参数量) 有所区别,具体如下图:
为了帮助模型更好理解代码,Qwen2.5-Coder 多了几个特殊 token
2 Pre-training
2.1 预训练数据
包含五种关键数据类型:
- 源代码数据(Source Code Data)
GitHub 上的公开 repo,包括 PRs、commits、Jupyter Notebooks 和 Kaggle datasets - 文本-代码基础数据(Text-Code Grounding Data)
从 Common Crawl 中整理的 text-code mixed dataset,包括 文档、教程、博客 - 合成数据(Synthetic Data)
使用 Qwen2.5-Coder 的前身 CodeQwen1.5 来生成大规模合成数据集。为了降低在此过程中出现幻觉的风险,引入了一个 executor 进行验证,确保只保留可执行代码 - 数学数据(Math Data)
将 Qwen2.5-Math 的预训练语料库集成到 Qwen2.5-Coder 数据集中 - 文本数据(Text Data)
与数学数据类似,从 Qwen2.5 模型的预训练语料库中引入了高质量的通用自然语言数据,以保留 Qwen2.5-Coder 的通用功能
数据配比: 70% Code, 20% Text, 10% Math
2.2 训练策略
File-Level Pretraining
- 独立代码文件
- maximum training sequence length: 8,192 tokens
- 5.2T of high-quality data
- training objectives
- next token prediction
- fill-in-the-middle (FIM)
File-Level FIM format
<|fim_prefix|>{code_pre}<|fim_suffix|>{code_suf}<|fim_middle|>{code_mid}<|endoftext|>
Repo-Level Pretraining
增强模型的 long-context 能力
- context length: 32,768 tokens
- RoPE’s base frequency: 1,000,000
- sequences up to 131,072 (132K) tokens(YARN mechanism)
Repo-Level FIM format
<|repo_name|>{repo_name}
<|file_sep|>{file_path1}
{file_content1}
<|file_sep|>{file_path2}
{file_content2}
<|file_sep|>{file_path3}
<|fim_prefix|>{code_pre}<|fim_suffix|>{code_suf}<|fim_middle|>{code_fim}<|endoftext|>
3 Post-training
3.1 Instruction Data
- 多语种代码分类
使用 LLM 从 1024 个 token 内的代码片段生成指令,然后使用代码 LLM 生成响应,最后使用 LLM scorer 过滤低质量结果 - Instruction 合成
开源 instruction dataset - 多语种代码 Instruction 数据
- Language-Specific Intelligent Agents
- Collaborative Discussion Protocol
- Adaptive Memory System
- Cross-Lingual Discussion
- Synergy Evaluation Metric
- Adaptive Instruction Generation
- 代码静态检查
- 将代码片段解析成 AST,将有解析错误的代码过滤掉
3.2 训练策略
- 由粗到精的 Fine-tuning
先合成了数千万个低质量但多样化的指令样本来微调基础模型。然后采用数百万个高质量指令样本,通过拒绝采样和监督微调来提高指令模型的性能 - 混合 Tuning
使用大部分标准 SFT 数据和一小部分 FIM 指令样本优化指令模型。
使用 FIM 格式构造指令对,以保持基础模型的长上下文能力。使用 tree-sitter-languages 来解析代码片段并提取基本逻辑块作为中间代码进行填充。
4 Base Model 和 Instruct Model 效果
Base Model
-
code generation
HumanEval and MBPP
-
code completion
-
code reasoning
-
mathematical reasoning
-
general natural language understanding
-
long-context modeling
Instruct Model
-
code generation
-
code reasoning
-
code editing
-
text-to-sql
-
mathematical reasoning
-
general natural language understanding