Qwen2.5-Coder 技术报告
此外,多语言沙箱是一个全面的平台,用于验证多种编程语言的代码片段。此外,这种方法还能够为数据分配质量评分,最终保留的数据质量更高,为高质量的数据混合提供了有价值的参考。如表 5 所示,Qwen2.5-Coder 在基础代码生成方面表现出色,不仅在同规模的开源模型中取得了最先进的结果,甚至超过了更大规模的模型。为了进一步确保评估的准确性,EvalPlus 将 HumanEval 扩展为 HumanE
引言
Qwen2.5-Coder 系列是阿里巴巴团队推出的一款重要的代码生成模型,相比其前代 CodeQwen1.5,该系列在多个方面进行了显著的升级。Qwen2.5-Coder 系列包括两个模型:Qwen2.5-Coder-1.5B 和 Qwen2.5-Coder-7B。这些模型基于 Qwen2.5 架构,并在超过 5.5 万亿个 tokens 的大规模语料库上进行了进一步预训练。
模型特点
Qwen2.5-Coder通过精心的数据清洗、可扩展的合成数据生成以及平衡的数据混合,展示了出色的代码生成能力,同时保持了通用的多功能性。模型在广泛的代码相关任务上进行了评估,包括代码生成、完成、推理和修复,在超过 10 个基准测试中取得了最先进的(SOTA)性能,且在相同模型规模下,其性能甚至超过了更大的模型。
模型评估
为了评估 Qwen2.5-Coder 的性能,我们使用了多个基准测试,包括 HumanEval 和 MBPP。HumanEval 包含 164 个手动编写的编程任务,每个任务提供一个 Python 函数签名和一个 docstring 作为模型的输入。MBPP 则包含 974 个由众包贡献者创建的编程问题,每个问题包括一个问题陈述(即 docstring)、一个函数签名和三个测试用例。
为了进一步确保评估的准确性,EvalPlus 将 HumanEval 扩展为 HumanEval+,增加了 80 倍的唯一测试用例,并修正了 HumanEval 中不准确的基准解决方案。类似地,MBPP+ 提供了比原始 MBPP 多 35 倍的测试用例。
性能表现
如表 5 所示,Qwen2.5-Coder 在基础代码生成方面表现出色,不仅在同规模的开源模型中取得了最先进的结果,甚至超过了更大规模的模型。特别是,Qwen2.5-Coder-7B-Base 在所有五个指标上均超过了之前最佳的密集模型 DS-Coder-33B-Base。
大规模基准测试
BigCodeBench(Zhuo 等,2024)是一个最近推出的、更具挑战性的代码生成基准测试,主要旨在评估模型在工具使用和复杂指令跟随方面的能力。基础模型通过生成预期的代码来完成任务。
许可与应用
Qwen2.5-Coder 系列的发布不仅推动了代码智能研究的边界,还通过其宽松的许可政策,鼓励开发者在实际应用中更广泛地采用。
模型架构
模型架构
Qwen2.5-Coder 采用了两种不同规模的模型架构,分别为1.5B参数和7B参数的模型。这两种模型在某些关键配置上有所不同,但共享相同的词汇表大小和训练数据量。以下是两种模型的具体配置对比:
配置项 | Qwen2.5-Coder 1.5B | Qwen2.5-Coder 7B |
---|---|---|
隐藏层大小 | 1,536 | 3,584 |
层数 | 28 | 28 |
查询头数量 | 12 | 28 |
键值头数量 | 2 | 4 |
头大小 | 128 | 128 |
中间层大小 | 8,960 | 18,944 |
嵌入层绑定 | True | False |
词汇表大小 | 151,646 | 151,646 |
训练数据量 | 5.5T | 5.5T |
嵌入层绑定
嵌入层绑定(Embedding Tying)是指在模型中使用相同的权重矩阵来生成输入嵌入和输出嵌入。Qwen2.5-Coder 1.5B 模型使用了嵌入层绑定技术,而7B模型则没有。嵌入层绑定可以减少模型的参数量,同时在某些任务上提高模型的性能。
词汇表
Qwen2.5-Coder 继承了 Qwen2.5 的词汇表,但引入了若干特殊标记,以帮助模型更好地理解代码。表2展示了在训练过程中添加的特殊标记及其用途。这些标记在代码处理流水线中发挥特定的作用,例如:
预训练与数据处理
预训练和数据处理
在Qwen2.5-Coder的开发过程中,预训练和数据处理是至关重要的步骤。预训练阶段的目标是通过大量的高质量数据来训练模型,使其能够理解和生成高质量的代码。数据处理则包括数据的收集、清洗和混合,以确保模型在训练过程中能够接触到多样化的数据,从而提升其泛化能力。
数据收集
Qwen2.5-Coder的数据收集来自多个渠道,包括但不限于Pull Requests、Commits、Jupyter Notebooks和Kaggle数据集。此外,我们还从Common Crawl中提取了大量的文本-代码混合数据,这些数据包括代码相关的文档、教程和博客等。通过这些多渠道的数据收集,我们确保了模型能够接触到不同领域和风格的代码,从而提升其适应性和多样性。
数据清洗
为了确保数据的质量,我们设计了一套多阶段的数据清洗流程。这一流程采用了粗到细的层次过滤方法,通过多个过滤器逐步筛选数据。每个过滤器负责一个特定的维度,确保数据在每个维度上都得到全面处理。此外,这种方法还能够为数据分配质量评分,最终保留的数据质量更高,为高质量的数据混合提供了有价值的参考。
具体来说,我们的清洗流程包括以下几个步骤:
-
初步过滤:使用较小的模型(如fastText)进行表面特征的过滤,去除明显无关或低质量的数据。
-
深度过滤:使用更复杂的模型进行进一步的过滤,确保数据的语义和逻辑正确性。
-
质量评分:为每条数据分配质量评分,确保最终保留的数据质量最高。
通过这一多阶段的清洗流程,我们显著提高了数据的质量,从而提升了模型的训练效果。
数据清理与混合
在数据清理和混合过程中,我们特别关注如何平衡不同类型的数据,以构建一个强大的基础模型。虽然研究社区之前已经探索过这种平衡,但针对大规模数据集的可扩展性证据仍然有限。为了找到最优的数据混合比例,我们进行了多个实验,设计了不同的数据比例组合,具体包括:
-
100:0:0:100%代码数据,0%文本数据,0%数学数据。
-
85:10:5:85%代码数据,10%文本数据,5%数学数据。
-
70:20:10:70%代码数据,20%文本数据,10%数学数据。
实验结果显示,70:20:10的比例表现最佳,甚至超过了代码数据比例更高的组合。这可能是因为数学和文本数据在达到一定浓度时,能够正向促进代码性能的提升。
最终,我们选择了70%代码、20%文本和10%数学数据的比例。最终的训练数据集包含5.2万亿个token。
代码数据
代码数据主要来自上述多个渠道,包括Pull Requests、Commits、Jupyter Notebooks和Kaggle数据集。我们还从Common Crawl中提取了大量的高质量代码数据。这些数据经过多阶段的清洗和过滤,确保了其高质量和多样性。
数学数据
为了增强模型的数学能力,我们整合了Qwen2.5-Math的预训练语料库。这些数学数据的引入不仅没有负面影响模型的代码性能,反而提升了其在数学任务上的表现。
文本数据
类似于数学数据,我们还引入了Qwen2.5模型的高质量自然语言数据,以保持Qwen2.5-Coder的通用能力。这些数据在清洗阶段已经经过了严格的质量检查,因此无需进一步处理。然而,我们移除了所有代码段,以避免与代码数据重叠,确保不同数据源的独立性。
通过这些细致的数据处理和混合策略,Qwen2.5-Coder在多个任务上表现出色,特别是在代码生成、代码完成和代码推理等方面。
训练策略
训练策略
在Qwen2.5-Coder的预训练和微调过程中,训练策略起着至关重要的作用。本节将详细介绍训练策略的具体内容,包括文件级预训练和仓库级预训练的详细步骤和方法。
文件级预训练
文件级预训练是Qwen2.5-Coder预训练的第一阶段。在这一阶段,模型主要通过处理单个文件的内容来学习编程语言的基础知识和结构。文件级预训练的数据来源包括各种编程语言的代码文件,这些文件经过清洗和格式化处理,确保数据的质量和一致性。
文件级预训练的具体步骤如下:
-
数据准备:从多个来源收集高质量的代码文件,包括开源项目、代码托管平台等。
-
数据清洗:对收集到的代码文件进行清洗,去除无关内容和低质量数据。
-
数据格式化:将清洗后的代码文件转换为模型可接受的格式,例如使用特定的标记(如
<file>
)来表示文件的开始和结束。 -
模型训练:使用上述准备好的数据对模型进行训练,优化模型的参数,使其能够更好地理解和生成代码。
3.2.2 仓库级预训练
在文件级预训练之后,Qwen2.5-Coder进入仓库级预训练阶段,这一阶段的目的是增强模型的长上下文处理能力。在仓库级预训练中,模型的上下文长度从8,192个token扩展到32,768个token,同时调整RoPE(Rotary Position Embedding)的基础频率从10,000到1,000,000。为了进一步提升模型的外推能力,我们应用了YARN机制,使模型能够处理长达131,072(132K)个token的序列。
仓库级预训练的具体步骤如下:
-
数据准备:收集高质量的长代码数据,总量约为300B。
-
数据格式化:将文件级FIM(File-In-File)扩展到仓库级FIM(Repo-Level FIM),具体格式如下:
<|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|>
后训练与指令调优
指令数据生成指南
多语言编程代码识别:
微调了一个CodeBERT模型,用于执行语言识别任务,将文档分类为近100种编程语言。保留了主流编程语言的指令数据,并随机丢弃了一部分长尾语言的指令数据。如果给定的样本包含非常少的代码数据,甚至没有代码片段,该样本可能会被分类为“无编程语言”标签。我们移除了大部分不包含代码片段的样本,以保持我们指令模型的代码生成能力。
从GitHub生成指令:
对于大量存在于许多网站(例如GitHub)中的无监督数据(代码片段),尝试构建监督指令数据集。具体来说,使用大型语言模型(LLM)从1024个token内的代码片段生成指令,然后使用代码LLM生成响应。最后,使用LLM评分器过滤低质量的指令,以获得最终的指令-响应对。给定不同编程语言的代码片段,从这些代码片段中构建一个指令数据集。为了增加指令数据集的多样性,首先从代码生成答案,然后使用LLM评分器过滤低质量的答案,以获得最终的三元组。类似地,给定不同编程语言的代码片段,可以从这些代码片段中构建一个包含通用代码的指令数据集。为了充分发挥提出的方法的潜力,还在种子指令数据集中包含了开源指令数据集。最后,将这三部分指令数据集结合起来,用于监督微调。
多语言代码指令数据
为了弥合不同编程语言之间的差距,我们提出了一种多语言多智能体协作框架,用于合成多语言指令语料库。我们引入了特定语言的智能体,创建了一组专门针对特定编程语言的智能体。这些智能体使用从有限的代码片段中提取的特定语言指令数据进行初始化,并分为以下几个部分:
-
特定语言智能体:我们创建了一组专门针对特定编程语言的智能体。这些智能体使用从精选代码片段中提取的特定语言指令数据进行初始化。
-
协作讨论协议:多个特定语言智能体参与结构化对话,以制定新的指令和解决方案。这一过程可以增强现有语言的能力,或为新的编程语言生成指令。
-
自适应记忆系统:每个智能体维护一个动态记忆库,存储其生成历史,以避免生成相似的样本。
-
跨语言讨论:我们实现了一种新的知识蒸馏技术,允许智能体在语言边界之间共享见解和模式,促进对编程概念的更全面理解。
-
协同评估指标:我们开发了一种新的指标,用于量化模型中不同编程语言之间的知识共享和协同程度。
-
自适应指令生成:该框架包括一种机制,根据识别出的跨语言知识差距动态生成新指令。
基于清单的指令数据评分:
基于检查清单的指令数据评分
为了全面评估生成的指令对的质量,我们为每个样本引入了几个评分点:
-
问题与答案一致性:问题与答案是否一致且正确,适合微调。
-
问题与答案相关性:问题与答案是否与计算机领域相关。
-
问题与答案难度:问题与答案是否足够具有挑战性。
-
代码存在性:问题或答案中是否提供了代码。
-
代码正确性:评估提供的代码是否没有语法错误和逻辑缺陷。
-
考虑因素:如适当的变量命名、代码缩进以及遵循最佳实践。
-
代码清晰度:评估代码的清晰度和可理解性。评估是否使用有意义的变量名、适当的注释,并遵循一致的编码风格。
-
代码注释:评估注释的存在及其在解释代码功能方面的有用性。
-
易于学习:确定其对目标为学习基本编码概念的学生是否具有教育价值。
在获得所有分数后,我们可以通过公式 得到最终分数,其中 是一系列预定义的权重。
多语言沙箱代码验证:
为了进一步验证代码语法的正确性,我们对所有提取的代码片段进行静态检查。我们将代码片段解析为抽象语法树,并过滤掉包含解析错误的代码片段。我们创建了一个多语言沙箱,支持主要编程语言的代码静态检查。此外,多语言沙箱是一个全面的平台,用于验证多种编程语言的代码片段。它自动化生成相关单元测试的过程,并评估提供的代码片段是否能成功通过这些测试。特别是,只有自包含的代码片段(如算法问题)才会被送入多语言沙箱。
多语言验证沙箱主要由以下五个部分组成:
- 语言支持模块
-
实现对多种语言的支持(例如,Python、Java、C++、JavaScript)
-
维护语言特定的解析和执行环境
-
处理每种支持语言的语法和语义分析
- 样本代码仓库
-
存储每种支持语言的多样化代码样本
-
按语言、难度级别和编程概念组织样本
-
由语言专家定期更新和整理
- 单元测试生成器
-
分析样本代码以识别关键功能和边缘情况
-
自动生成基于预期行为的单元测试
-
生成涵盖各种输入场景和预期输出的测试用例
- 代码执行引擎:
-
提供安全的隔离环境用于执行代码片段
-
支持多个测试用例的并行执行
-
处理资源分配和超时机制
- 结果分析器:
-
将代码片段的输出与单元测试的预期结果进行比较
-
生成详细的测试用例成功和失败报告
-
根据失败的测试用例提供改进建议
训练策略
从粗到细的微调:
首先合成了数千万个低质量但多样化的指令样本,以微调基础模型。在第二阶段,采用数百万个高质量的指令样本来通过拒绝采样和监督微调来提升指令模型的性能。对于相同的查询,使用大型语言模型(LLM)生成多个候选方案,然后使用LLM对最佳方案进行评分,以进行监督微调。
混合调优:
由于大多数指令数据长度较短,使用FIM(填充-插入-掩码)格式构建指令对,以保持基础模型的长上下文能力。受编程语言语法规则和实际场景中用户习惯的启发,利用tree-sitter-languages解析代码片段,并提取基本逻辑块作为中间代码进行填充。例如,抽象语法树(AST)以树形格式表示Python代码的结构,其中树中的每个节点代表源代码中出现的构造。树的层次结构反映了代码中构造的语法嵌套,并包含表达式、语句和函数等各种元素。通过遍历和操作AST,可以随机提取多层次的节点,并使用同一文件的代码上下文来揭示被掩码的节点。最后,使用大部分标准SFT数据和一小部分FIM指令样本来优化指令模型。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)