全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调

简介: 2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。

前言

在2024年11月12日凌晨,阿里云通义大模型团队正式开源通义千问代码模型全系列,共6款Qwen2.5-Coder模型,每个规模包含base和Instruct两个版本(Base模型为开发者可以自行微调的基座模型,Instruct模型是可以直接聊天的官方对齐模型)。

其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩,成为全球最强开源代码模型,在多项关键能力上超越闭源模型GPT-4o。

论文地址:https://arxiv.org/pdf/2409.12186

image.png

Qwen2.5-Coder的三大爆点

Qwen2.5-Coder系列模型是基于Qwen2.5基础大模型进行初始化的,具备「强大」、「多样」和「实用」等优点。该系列模型通过持续的训练,结合了源代码、文本代码混合数据以及合成数据,总计使用了5.5T tokens的数据,从而在代码生成、代码推理和代码修复等核心任务上实现了显著的性能提升。

image.png

强大——追越GPT-4o!

Qwen2.5-Coder-32B-Instruct模型在多个代码生成基准测试(EvalPlus、LiveCodeBench和BigCodeBench)中,超越大多数开源竞争对手,并能够与GPT-4o进行有效对比。

image.png
竞争模型在五个基准上的代码完成性能:HumanevaL-FIM、SAFIM、CrossCodeEval、RepoEval、
CrossCodeLongEval.

在编程大模型主要关注的5个方面上,它都实现了对GPT-4o的超越:

  • 代码生成
  • 代码修复
  • 代码推理
  • 多编程语言
  • 人类偏好对齐

image.png

代码生成

Qwen2.5-Coder-32B-Instruct在多个流行的代码生成基准上都取得了开源SOTA(state-of-the-art”(最先进)模型或方法),且在HumanEval、McEval、Spider、EvalPlus、BigCodeBench等基准上,同样都超越了闭源的GPT-4o和Claude 3.5 Sonnet。

代码修复方面

Qwen2.5-Coder-32B-Instruct 可以帮助用户修复代码中的错误,让编程更加高效。Aider 是流行的代码修复的基准,Qwen2.5-Coder-32B-Instruct 达到 73.7 分,在 Aider 上的表现与 GPT-4o 相当。

代码推理

在CRUXEval基准上,32B版本较7B版本有了明显提升,甚至达到了和GPT-4o、Claude 3 Opus相当的水平。

image.png

多编程语言方面

Qwen2.5-Coder-32B-Instruct在 McEval 上取得了 65.9 分,支持92种编程语言,并在其中40多种语言上表现出色,在Haskell、Racket等语言上表现格外突出,打败4o等闭源模型同时取得了超高分数。

image.png

另外,Qwen2.5-Coder-32B-Instruct 的多编程语言代码修复能力同样令人惊喜,这将有助于用户理解和修改自己熟悉的编程语言,极大缓解陌生语言的学习成本。

与 McEval 类似,MdEval 是多编程语言的代码修复基准,Qwen2.5-Coder-32B-Instruct 在 MdEval 上取得了 75.2 分,在所有开源模型中排名第一。

image.png
McEval 表现

人类偏好对齐

通义团队通过构建了内部标注的代码偏好评估基准Code Arena竞技场,采用匿名PK的形式,以此来评判模型表现。最终结果显示,Qwen2.5-Coder基本追平GPT-4o!

image.png
人类偏好对齐表现

总体而言,Qwen2.5-Coder-32B-Instruct无疑是当前开源领域的佼佼者,其性能不仅与市场上最强的闭源代码模型持平,甚至在某些方面实现了超越。

多样——6种尺寸,12版模型!

其实在上个月,通义团队早就推出了 1.5B 和 7B 两种模型尺寸。这一次的新一轮开源则新增了 0.5B、3B、14B 和 32B 四个模型尺寸,每个尺寸都开源了Base 和 Instruct 模型。

image.png
模型一览(蓝色为此次新发布版本)

其中,Base模型可供开发者微调,Instruct模型则是开箱即用的官方对齐模型,所有Qwen2.5-Coder模型在同等尺寸下均取得了模型效果最佳(SOTA)表现。

image.png
不同尺寸 Base 模型的表现

image.png
不同尺寸 Instruct 模型的表现

下图展示了不同尺寸 Qwen2.5-Coder 模型和其他开源模型在核心数据集上的对比:

  • 针对 Base 模型,选择 MBPP-3shot 作为评估指标,通过大量的实验表明,MBPP-3shot 更适合评估基础模型,且能够和模型的真实效果有较好的相关性。

  • 针对 Instruct 模型,选择 LiveCodeBench 最近 4 个月(2024.07 - 2024.11)的题目作为评估,这些最新公布的、不可能泄露到训练集的题目能够反映模型的 OOD 能力。

image.png
不同尺寸的Qwen2.5-编码器模型在MBPP-3shot和LiveCodeBench上的评估结果

可以看出,模型尺寸和模型效果之间存在预期中的正相关关系,并且, Qwen2.5-Coder 在所有尺寸下都取得了 SOTA 表现。

实用——适配Cursor 和 Artifacts!

实用的 Coder 一直是开发者的愿景,为此,通义团队探索了 Qwen2.5-Coder 模型在代码助手Cursor和 Artifacts 场景下的实际应用。

Qwen2.5-Coder & Cursor

image.png
Qwen2.5-Coder 🤝 Cursor

Qwen2.5-Coder & Artifacts

提到Artifacts,很多人可能会想到Claude Artifacts。在使用Claude时,你生成的代码、文档、SVG图像、流程图和图表会实时展示效果,实现所见即所得。类似的还有OpenAI发布的Canvas功能。这些工具为使用大模型提供了一个通用的工作空间,显著提升了聊天工具的实用性。

Qwen2.5-Coder 在 Artifacts 场景下的潜力,下面是一些具体的例子:

image.png
Qwen2.5-Coder 🤝 Artifacts

总结

在看完整个报告之后,我的内心还是比较震撼的,国产的开源模型能够在如此短的时间内取得这样的成就,实属不易。这不仅是对国内技术研发实力的一次有力证明,也为全球开发者提供了一个强大且可靠的选项。但是到底好不好用,还是得实践见真知,下面我们就来体验一下Qwen2.5-Coder的能力。

Qwen2.5-Coder在线实测

在线试用地址:

魔搭社区:https://modelscope.cn/studios/Qwen/Qwen2.5-Coder-Artifacts

Huggingface:https://huggingface.co/spaces/Qwen/Qwen2.5-Coder-Artifacts

进入后需登录魔搭社区账号才可使用,界面如下所示:

image.png

我们可以发现,其实对于这个Artifacts也是有进行过prompt设置的:

image.png

你是一个网页开发工程师,根据下面的指示编写网页。 你是一个功能强大的代码编辑助手,可以在和用户的对话中编写代码并创建artifacts,或者根据用户要求对已有的artifacts进行修改更新。
所有代码写在一个代码块中,形成一个完整的代码文件进行展示,不用将HTML代码和JavaScript代码分开。 Artifact是指可运行的完整代码段,你更倾向集成并输出这类完整的可运行代码,而非拆分成若干个代码块输出。对于部分类型的代码能够在UI窗口渲染图形界面。
生成之后请你再检查一遍代码运行,确保输出无误。
仅输出 html,不要附加任何描述文案。

通过以上限制,可以更好的保证生成的代码直接进行渲染,自检运行可以确认结果的正确性

下面,我们继续体验,一般来说,预置的prompt效果都会比较好,所以我们先从官方给出的prompt看起

选择第一个prompt,点击生成

image.png

大致5s左右生成完毕,效果如下:

d9faee92-2428-42f2-a82d-43a3e3582b4d.gif

效果还行,基本符合prompt描述,我们继续看第二个:

b3467f99-108a-4a3e-b361-9958decb5697.gif

个人认为,在第二个页面的生成上是比第一个还要好许多的,我们继续看第三个:

790f26b6-2f81-4172-8368-fc9e1053fdf8.gif

还算凑合吧,勉强算是个todo list,通过上述测试,我们至少可以看出coder写的简单前端代码都是能成功运行,我们继续加难度。

给出prompt如下:

开发一款多功能计算器应用,旨在为用户提供便捷的数学计算工具。该应用将支持基本的四则运算(加、减、乘、除)以及更高级的功能,如平方根、指数运算等。

coder生成的结果如下:

image.png

笑死,这个界面也太抽象了吧!我们继续优化prompt:

开发一款多功能计算器应用,旨在为用户提供便捷且高效的数学计算工具。本应用不仅支持基本的四则运算(加、减、乘、除),还包括一些高级数学运算功能,如平方根、指数运算等。特别地,需要注重用户体验,确保应用界面简洁美观,操作直观易懂,使用户能够轻松完成复杂的计算任务。

在强调注重用户体验之后,coder也是进行了定向优化,优化后界面如下:

image.png

在功能上自是一点也不含糊,加、减、乘、除、平方根、指数运算都是可以计算的:

5dfa9b0c-fcdb-4ac0-8bb2-471e017a93d9.gif

我们继续上难度,直接让coder来开发一个类似Facebook的主页

开发一个类似于Facebook或微博的社交网络主页,用户可以发布动态、查看好友的动态、发表评论和点赞。应用程序应具有良好的用户体验和响应式设计。

最终结果如下,行吧,确实是可以发布动态和发表评论,但是却把点赞忽略掉了,而且比较简陋:

image.png

我们再尝试两个经典小游戏的生成测试——《贪吃蛇》和《2048》。

开发一个经典的《贪吃蛇》游戏,玩家通过键盘控制蛇的方向,让蛇吃到食物以增长长度,同时避免撞到墙壁或自身。游戏应具有简洁的界面和流畅的动画效果。

大家都知道,过去我在用别的编码工具时,其生成的贪吃蛇很容易碰到bug,比如食物位置生成错误,正好生成在蛇身上了,导致我老吃不到。

本来这次我还抱着多次尝试的打算,结果真没想到Qwen2.5-Coder生成的一次就能成功运行,并且逻辑完全正确!

体验结果非常好!

6643deed-aaca-43b1-a0a1-719b1e6ce410.gif

但是,在生成2048上却翻了车,prompt如下:

开发一个经典的《2048》游戏,玩家通过键盘的上下左右箭头键控制数字方块的移动,使相同的数字方块合并成更大的数字,最终达到2048或更高的分数。游戏应具有简洁的界面和流畅的动画效果。

coder生成的结果如下:

image.png

我们进一步优化prompt:

开发一个经典的《2048》游戏,玩家通过键盘的上下左右箭头键控制数字方块的移动,使相同的数字方块合并成更大的数字,最终达到2048或更高的分数。游戏应具有简洁的界面和流畅的动画效果,同时保证背景方块位置的正确摆放。

尝试了一下,似乎也谈不上翻车,游戏功能是没有问题的,只是那几个方块的生成位置有问题,可能和浏览器有关系?

我们尝试一下在火狐中生成:

image.png

还真是,同样的未经优化的prompt在火狐中生成完全正常!看来真是浏览器的适配问题了,不过想来此时也可以让coder加上对于谷歌的适配,故给出prompt如下:

开发一个经典的《2048》游戏,玩家通过键盘的上下左右箭头键控制数字方块的移动,使相同的数字方块合并成更大的数字,最终达到2048或更高的分数。游戏应具有简洁的界面和流畅的动画效果,同时适配谷歌浏览器。

image.png

不错!

最后,我们来体验一下官方给出的prompt,看看能否生成所谓的“三日凌空

prompt如下:

Create a complete HTML page using Canvas and JavaScript to simulate a three-bo>dy effect.

Using the following planet resources:

  1. https://img.alicdn.com/imgextra/i4/O1CN01R6wlzD1lhhMlBcGLg_!!6000000000925-2-tps-800-800.png

  2. https://img.alicdn.com/imgextra/i4/O1CN01Ad5SeB20tv1nfRoA2_!!6000000006908-2-tps-800-800.png

  3. https://img.alicdn.com/imgextra/i1/O1CN01OlZAk81OVEHJ0pazq_!!6000000001710-2-tps-800-800.png

Requirements:

  1. set size of images as 100px * 100px

  2. add "Start" and "Reset" button

  3. When it is not started, allow drag to place the planets, and "start" to simulate

  4. "Reset" place the three planets to the default location

Draw both acceleration and velocity vectors on each planet, assume all the planets are stationary at the beginning.

  1. Add a slider to control the update speed.

  2. Set largely different mass to make the movement obvious, set G constant large enough to make the animation obvious too.

Write the entire code in a single HTML

不是哥们,我还有一个日呢?

image.png

看了一下图片来源,居然是地址挂掉了。。。好吧

双日就双日吧,我们看下效果:

985fc481-8668-49bb-a131-539d2eecf183.gif

很显然,由于缺少一个星体,整体效果也是出现了较大的错误,不过这里还真不好追究到底是哪边的问题哈哈

总结

这里周周直接总结了一图流,通过上述测试,基本能够验证大部分demo的功能性和稳定性,总体效果而言比之前的开源模型确实好了很多。

image.png

Qwen2.5-Coder本地使用及本地部署

其实在谈到本地部署之前,周周还是想聊聊如何本地使用,通过前文可知,在本地可以通过Cursor和Artifacts两个工具调取百炼平台的API来进行使用,除此,采用VScode的插件Cline也可以进行调取使用,下面,我们分别看一下使用步骤。

Cursor

此处Cursor的安装就略过了,直接进入官网点击下载即可:

image.png

点击齿轮按钮,选择models,点击新增模型:

image.png

此时回到百炼平台中,搜索coder:

image.png

比如我选择通义千问2.5-coder-32B,点击查看详情,复制模型名称:

image.png

将复制后的名称填入Cursor中:

image.png

然后将其他模型调用全部关闭:

image.png

回到百炼,找到API调用示例:

image.png

复制此处到Cursor中:

image.png
image.png

点击百炼里的个人头像,选择API-Key,复制此处到Cursor中:

image.png
image.png

创建一个页面,执行 ctrl+K 快速调出代码功能:

输入prompt:

帮我创建一个飞机大战游戏

image.png

Artifacts

Qwen2.5-Coder-Artifacts可以部署到本地使用,命令如下:

git clone https://www.modelscope.cn/studios/Qwen/Qwen2.5-Coder-Artifacts.git
cd Qwen2.5-Coder-Artifacts
pip install -r requirements.txt
pip install gradio
python app.py

部署完成后界面与在线版本基本一致,唯一的区别就是上面多了一个可以看到当前模型的位置

image.png

在使用上也和在线版本基本一致,这里就不过多赘述了:

e58be3b8-db23-4d77-a4fb-26916b74d7f0.gif

Cline

Cline是一个VSCode插件,能够让用户直接在编辑器中调用大模型进行代码生成和修改,方便在开发流程中灵活应用LLM模型。

image.png

与刚才一样,填入对应的 Base URL 、 API Key 、Model ID

image.png

Cline比Cursor好的地方是可以直接执行命令,只需要点点点就可以完成一个完整应用,如遇到报错它还会帮你修复。

0c747119-0b91-47f6-9849-b13de85030d7.gif

制作完成后效果如下所示,基本功能如旋转、消除都无问题,只是方块的滑动轨迹会保留下来:

image.png

于是我们给出prompt进一步优化:

俄罗斯方块的掉落轨迹不需要显示出来

可以看到Cline直接修改了上文中自己创建的js文件,实现了对掉落轨迹消除

fa767a41-9006-4dac-a970-0e86b8baff1f.gif

除了与上述常规编码工具结合使用外,还可以融入到新一代LLM“载具”中 如:结合Open Interpreter打造AI操作系统

Open Interpreter

Open Interpreter 是一个开源项目,旨在构建一个基于 LLM 的交互式解释器或操作系统。通过将 Qwen2.5-Coder 集成到这样的系统中,可以增强其理解和执行编程指令的能力,为用户提供更加流畅和高效的开发体验。用户可以通过自然语言命令来执行复杂的编程任务,而不仅仅是简单的文本生成,从而实现更高级别的自动化和智能化。

新建一个文件夹,运行cmd(注意不要用 PowerShell),克隆仓库到本地

git clone https://github.com/KillianLucas/open-interpreter.git
cd open-interpreter
pip install open-interpreter

image.png

进入python环境编辑:

from interpreter import interpreter
interpreter.llm.api_base = "YOUR_BASE_URL"
interpreter.llm.api_key = "YOUR_API_KEY"
interpreter.llm.model = "openai/Qwen-Coder-32B-Instruct"

安装后运行:

interpreter

image.png

很多人可能好奇AI操作系统能实现什么,这里举一个简单的例子,给出prompt如下:

将我的系统设置为深色模式

当Open Interpreter收到指令后,会直接进行与注册表相关的配置操作:

image.png

由此我们可以看到,通过集成如 Qwen2.5-Coder 这样的高级编程能力的模型,AI 操作系统能够直接解析用户的自然语言指令,并转换为具体的系统操作

这种能力不仅仅局限于简单的界面设置更改,还可以扩展到更多复杂的任务,例如:用户可以通过简单的自然语言描述,让AI操作系统自动下载并安装所需的软件,甚至完成一系列复杂的配置步骤;通过语音或文本命令,快速查找、分类、重命名或移动大量文件等

讲完了本地使用,我们继续看如何本地部署

根据我之前的测评内容,我本人还是更倾向于使用Ollama工具来进行一键部署的

部署步骤见我的过往文章:

基于Ollama+AnythingLLM轻松打造本地大模型知识库

目前,Ollama已经成功集成了Qwen2.5-Coder系列模型,进入官网后点击模型处复制下载命令即可:

ollama run qwen2.5-coder:7b

image.png

因为考虑到是编码侧模型,所以即使本地部署之后最好的方式还是集成到代码编辑器中去使用,由于作者本人偏爱VScode,所以后续都以该编辑器为例

把ollama调成为后端服务模式,此时是已经启用了,所以提示Only one usage of each socket address

ollama serve

image.png

要将本地模型结合到VScode,仍然需要使用到我上述提到的Cline工具,值得注意的是,在Cline调用本地模型时,需要填入的是其ID:

image.png

Qwen2.5-Coder微调

基于魔搭平台构建LLaMA-Factory实现微调

考虑到与作者的职业相关,一直需要一个擅长代码方面的大模型,Qwen2.5-Coder的开源确实给了我不少灵感,下面就以此为例来进行微调

对于初学者而言,大模型的微调是一项既复杂又具技术挑战的任务,但如今已有多种工具能够降低操作门槛。例如,Llama Factory 和阿里巴巴的魔搭社区都是广受欢迎的选择。为了使新手也能理解大模型微调的过程,本文选择了阿里巴巴的魔搭社区作为实践平台

进入魔搭社区,找到如下模型:

image.png

在模型介绍页, 选择Notebook快速开发

image.png

可以看到我还有36小时的免费额度,点击启动

image.png

启动大概需要2分钟,等GPU环境启动好以后点击"查看NoteBook"进入

image.png

点击创建一个新的 Notebook 页面

image.png

增添一个代码块,并且执行以下命令(点击左侧的运行按钮运行该代码块,下同,这一步是安装依赖库)

!pip3 install --upgrade pip
!pip3 install bitsandbytes>=0.39.0

输入如下代码拉取 LLaMA-Factory,过程大约需要几分钟

!git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git

image.png

接下来需要去 Launcher > Terminal 执行

image.png

cd LLaMA-Factory
pip3 install -e ".[torch,metrics]"

image.png

等以上所有步骤完成后,回到魔搭社区中,点击下载模型:

image.png

复制此处的git链接到terminal中:

git clone https://www.modelscope.cn/Qwen/Qwen2.5-Coder-32B-Instruct.git

image.png

此时看到,整个模型库已经被克隆了下来,等待约10分钟,让其把主model文件下载完毕:

image.png

在左侧的文件列表,进入如下链接:Llama-Factory\examples\train_qlora

image.png

选择第一个,复制并重命名为qwen_lora_sft_shenji.yaml

image.png

打开这个文件,修改以下内容

### model
model_name_or_path: Qwen2.5-Coder-32B-Instruct
quantization_bit: 4
  • model_name_or_path是指定了要微调的基础模型的路径或名称,这里表明基础模型是存放在Qwen2.5-Coder-32B-Instruct路径下的qwen模型

  • 4表示将模型的权重进行量化的位数为 4 位,可以在一定程度上提高模型的运行效率

image.png

### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
  • 这里的sft代表“Supervised Fine-Tuning”(有监督微调),即使用有标注的数据对模型进行微调训练

  • true:表示要进行训练操作

  • 使用“LoRA”(Low-Rank Adaptation)方法进行微调。LoRA 是一种高效的微调技术,它通过在原始模型的基础上添加一些低秩矩阵来实现对模型的微调,从而减少了训练的参数数量和计算成本

  • all:表示对模型的所有部分都应用 LoRA 微调

image.png

### dataset
dataset: identity
template: qwen
cutoff_len: 1024
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
  • identity:指定了使用的数据集identity

  • qwen:指定了数据的模板或格式与qwen模型相匹配。这有助于将数据集转换为适合模型输入的格式

  • 1024:设置输入文本的截断长度为 1024。如果输入文本超过这个长度,会被截断以适应模型的处理能力

  • 1000:限制数据集中使用的最大样本数量为 1000。这可能是出于训练时间或资源限制的考虑

  • true:表示如果缓存存在,将覆盖缓存。这意味着每次运行时都会重新处理数据集,而不是使用之前缓存的数据

  • 16:指定了用于数据预处理的工作进程数为 16。增加工作进程数可以加快数据预处理的速度,但也会消耗更多的系统资源

image.png

### output
output_dir: saves/qwen-7b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
  • saves/qwen-7b/lora/sft:指定了微调后的模型输出路径。训练后的模型将保存在saves/qwen-7b/lora/sft文件夹中

  • 10:表示每 10 步记录一次训练日志,以便跟踪训练过程中的指标和进度

  • 500:每 500 步保存一次模型的中间状态,以便在训练过程中可以随时恢复或检查模型的进展

  • true:表示绘制训练过程中的损失曲线,以便直观地观察模型的训练效果

  • true:如果输出目录已经存在,将覆盖该目录。这确保了每次训练的结果都会保存在指定的输出目录中

image.png

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
  • 1:每个设备上的训练批次大小为 1。这意味着每次只处理一个样本进行训练,通常在资源有限或模型较大时使用较小的批次大小

  • 8:梯度累积的步数为 8。梯度累积是一种技术,通过多次前向传播和反向传播累积梯度,然后再进行一次参数更新,以等效于使用较大的批次大小进行训练

  • 1.0e-4:学习率为 0.0001。学习率决定了模型在训练过程中参数更新的步长,较小的学习率可能导致训练速度较慢,但可以提高模型的稳定性和准确性

  • 3.0:训练的轮数为 3 轮。一轮是指对整个数据集进行一次完整的遍历

  • cosine:使用余弦退火(cosine annealing)的学习率调度策略。这种策略可以在训练过程中逐渐降低学习率,有助于提高模型的收敛速度和性能

  • 0.1:热身比例为 0.1。在训练开始时,使用较小的学习率进行热身,然后逐渐增加到指定的学习率,以帮助模型更好地适应训练

  • true:表示使用 BF16(Brain Floating Point 16)数据类型进行训练。BF16 是一种半精度浮点数格式,可以减少内存占用和计算时间,但可能会对精度产生一定影响

  • 180000000:分布式数据并行(DDP)的超时时间为 180000000 毫秒(约 50 小时)。这是在分布式训练中等待其他进程的最长时间,如果超过这个时间,训练将被终止

image.png

### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 500
  • 0.1:将数据集的 10%作为验证集。在训练过程中,会使用验证集来评估模型的性能,以便及时调整训练策略

  • 1:每个设备上的评估批次大小为 1。与训练批次大小类似,评估时每次只处理一个样本

  • steps:按照指定的步数进行评估。这意味着在训练过程中,每隔一定的步数就会对模型进行一次评估

  • 500:每 500 步进行一次评估。这与eval_strategy配合使用,确定了评估的频率

image.png

完整文件如下:

### model
model_name_or_path: Qwen2.5-Coder-32B-Instruct
quantization_bit: 4

### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all

### dataset
dataset: identity
template: qwen
cutoff_len: 1024
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: saves/qwen-7b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000

### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 500

从上面的配置文件中可以看到,本次微调的数据集是 identity,所以我们找到该文件进行内容修改即可:

image.png

比如你可以将 identity.json 中的 { {name}} 字段替换为你的名字来微调一个属于自己的大模型,但是注意,默认生成的 identity.json是不能修改的,用户需要自己写好之后再将json上传

image.png

因为我们此处的为代码审计模型,所以我依托通义千问给出了一系列关于代码设计和编程的基本问题及其答案:

[
    {
   
        "instruction": "What is the purpose of code design?",
        "input": "",
        "output": "The purpose of code design is to create a blueprint for software development that ensures the program is efficient, maintainable, and scalable."
    },
    {
   
        "instruction": "Explain the concept of 'DRY' in programming.",
        "input": "",
        "output": "'DRY' stands for 'Don't Repeat Yourself'. It's a principle aimed at reducing repetition of software patterns, replacing it with abstractions or using data normalization to avoid redundancy."
    },
    {
   
        "instruction": "Describe the SOLID principles in object-oriented design.",
        "input": "",
        "output": "SOLID is an acronym for five design principles intended to make software designs more understandable, flexible, and maintainable: Single Responsibility Principle (SRP), Open/Closed Principle (OCP), Liskov Substitution Principle (LSP), Interface Segregation Principle (ISP), and Dependency Inversion Principle (DIP)."
    },
    {
   
        "instruction": "What is the difference between procedural and object-oriented programming?",
        "input": "",
        "output": "Procedural programming focuses on procedures or routines that perform operations on data. Object-oriented programming (OOP) emphasizes the use of objects, which encapsulate both data and functions that operate on that data, promoting modularity and reusability."
    },
    {
   
        "instruction": "How does refactoring improve code quality?",
        "input": "",
        "output": "Refactoring improves code quality by restructuring existing code without changing its external behavior. This process helps eliminate code smells, simplify complex logic, and enhance readability, making the code easier to understand and maintain."
    },
    {
   
        "instruction": "Define what a code audit is and why it is important.",
        "input": "",
        "output": "A code audit is a systematic review of source code to ensure it meets specific standards and guidelines. It is important because it helps identify potential security vulnerabilities, performance issues, and compliance problems before the software goes live."
    },
    {
   
        "instruction": "List three common tools used for static code analysis.",
        "input": "",
        "output": "Three common tools used for static code analysis are SonarQube, ESLint, and Checkmarx. These tools help developers find bugs, security flaws, and coding standard violations without executing the code."
    },
    {
   
        "instruction": "Explain what a buffer overflow is and how it can be exploited.",
        "input": "",
        "output": "A buffer overflow occurs when more data is written to a block of memory than it can hold, causing adjacent memory locations to be overwritten. Attackers can exploit this vulnerability to execute arbitrary code, often leading to unauthorized access or system compromise."
    },
    {
   
        "instruction": "What is input validation, and how does it prevent security vulnerabilities?",
        "input": "",
        "output": "Input validation is the process of ensuring that user-supplied data conforms to expected formats and constraints. By validating inputs, developers can prevent injection attacks, such as SQL injection or cross-site scripting (XSS), which rely on malformed inputs to exploit security holes."
    },
    {
   
        "instruction": "Describe the importance of code reviews in the software development lifecycle.",
        "input": "",
        "output": "Code reviews are crucial in the software development lifecycle as they help catch bugs early, improve code quality, and foster knowledge sharing among team members. They also serve as a learning opportunity for junior developers and can reduce the risk of security vulnerabilities."
    },
    {
   
        "instruction": "What are some best practices for secure coding?",
        "input": "",
        "output": "Some best practices for secure coding include: using secure coding standards, performing regular code reviews, implementing input validation, avoiding hard-coded secrets, managing dependencies securely, and continuously testing for vulnerabilities."
    },
    {
   
        "instruction": "How can automated testing complement manual code audits?",
        "input": "",
        "output": "Automated testing can complement manual code audits by providing quick feedback on the presence of known vulnerabilities and coding errors. While manual audits are thorough and can uncover deeper issues, automated tests are efficient for routine checks and regression testing."
    }
]

后续让千问继续模仿生成即可,数量可以稍微较多一些:

image.png

也可以直接使用魔搭社区大佬提供的数据集:

https://modelscope.cn/datasets/conheaven/security-dataset/summary

image.png

该数据集主要数据来源如下:

image.png

但是很遗憾的是,魔搭中的空间并不够,所以此处只能作罢了,如果服务器内存充足的话可以用此数据集:

image.png

保存刚才文件的更改,回到终端terminal

在 LLaMA-Factory 目录下,输入以下命令启动微调脚本

llamafactory-cli train examples/train_qlora/qwen_lora_sft_shenji.yaml

运行过程大概需要10分钟,看着进度条慢慢走,当看到执行结束的时候,微调过程就结束了:

image.png

参考Llama-Factory\examples\inference下提供的llama3_lora_sft.yaml,复制一份,并重命名为 qwen_lora_sft.yaml

model_name_or_path: Qwen2.5-Coder-32B-Instruct
adapter_name_or_path: saves/qwen-7b/lora/sft
template: qwen
finetuning_type: lora

回到刚刚结束微调的终端Terminal,运行下面的推理命令(同样在Llama-Factory目录下运行)

llamafactory-cli chat examples/inference/qwen_lora_sft.yaml

稍微等待一下模型加载,然后就可以聊天了

image.png

不知道是不是我数据集太少的缘故,测试后感觉效果基本没有很大变化(没有修改自我认知,仅仅是微调的对于网络安全的知识)

基于阿里云百炼平台实现微调

鉴于上面的效果并不是很好,周周苦思冥想了两天,终于想到了还有阿里云的百炼大模型平台

百炼平台中有提供模型调优模块,可以以可视化的形式快速进行训练

image.png

但是很尴尬的问题就是,这里居然还没有更新,暂时不支持微调Qwen2.5-Coder,所以索性直接尝试以普通的Qwen2.5来从头微调一个代码审计模型

image.png

先点击管理数据集:

image.png

上传数据集文件:

image.png

拿前1000条试试水,导出来大小为43MB,需要分割为3个小于20MB的才可上传:

image.png

数据集大概是这个样子:

image.png

上传成功后可以在模型数据处查看,点击发布即可发布数据集

image.png

回到模型调优,选择对应数据集

image.png

中:代码和英:代码先拉满看看,循环次数拉满,结果最后价格也给我拉满了。。。

image.png

采用百炼平台方便确实是方便,但是成本还是有点太高了,资金充足的可以考虑一下

Qwen2.5-Coder 7B本地微调

根据安装官方文档说明,运行环境Python3.8+ PyTorch 2.2 或以上版本

CUDA与PyTorch版本要一一对应的,官方安装版本要求参考:https://pytorch.org/get-started/previous-versions

基本上 CUDA 11.8 + PyTorch 2.1 CUDA 12.1 + PyTorch 2.2 ,注意CUDA与PyTorch版本要对应,CUDA要与NVIDIA 驱动版本要对应

环境搭建过程可以参考如下文档:

CUDA安装、环境配置及项目创建准备

win11及cuda121环境下pytorch安装及避坑

linux cuda环境搭建

在环境搭建好之后,我们来拉取模型,有两种拉取方式:

SDK拉取

创建一个Python文件

vi Dmodel.py

复制如下内容至上述脚本中:

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-Coder-7B-Instruct')

运行下载即可,下载速度较慢,需要等一会

python3 Dmodel.py

image.png

Git下载

先务必确保已安装lfs

git lfs install
git clone https://www.modelscope.cn/qwen/Qwen2.5-Coder-7B-Instruct.git

安装必备依赖

pip3 install transformers -U
pip3 install accelerate backports.lzma

当模型下载完成之后,我们下载运行脚本

git clone https://github.com/QwenLM/Qwen2.git
cd Qwen2/examples/demo

image.png

修改cli_demo.py中的模型路径为自己的路径,如采用Git下载,可以在结束时看到路径位置:

/mnt/workspace/.cache/modelscope/hub/Qwen/Qwen2___5-Coder-7B-Instruct

image.png
image.png

修改完成后,执行该脚本,此时就已经实现了与Qwen2.5-Coder-7B的交互:

python3 cli_demo.py

image.png

下面我们还是安装LLaMA-Factory来进行微调训练

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip3 install -e ".[torch,metrics]"

image.png

安装完成后执行如下命令判断是否安装成功:

llamafactory-cli help

image.png

执行如下命令启动:

llamafactory-cli webui

默认为7860端口访问,相比于魔搭部署,本地部署的最大优势就是有Web-ui

image.png

然后还是涉及到数据集的问题,周周找了半天,又发现了一个新的数据集,感觉质量可能比魔搭的那个会好上一些:

https://huggingface.co/datasets/clouditera/security-paper-datasets

该数据的训练开源主要包括安全书籍、安全知识库、安全论文、安全社区文章、漏洞库等

image.png

同样,全球第一个网络安全开源大模型也是依靠这个数据集训练出来的,其基座模型选择的是Baichuan-13B

image.png

回到Web-ui界面,设置为中文,模型选择Qwen2.5-Coder-7B,路径填写上文中拉取完后存在的路径

image.png

这里有三种微调方法,full全参数微调 Freeze(冻结部分参数)LoRA(Low-Rank Adaptation)、 QLoRA 等

  • 全参数微调可以最大的模型适应性,可以全面调整模型以适应新任务。通常能达到最佳性能

  • Freeze 训练速度比全参数微调快,会降低计算资源需求

  • LoRA :显著减少了可训练参数数量,降低内存需求,训练速度快,计算效率高。还可以为不同任务保存多个小型适配器,减少了过拟合风险。QLoRA训练速度跟 LoRA 差不多,基本保持了 LoRa 的优势,会进一步减少内存使用

综合速度,灵活性考虑一般都是选择 LoRA 或者 QLorRA

image.png

量化等级有8位量化( INT8)和4位量化( INT4 ),QLoRA 它允许在使用低位量化(如4位)的同时,通过 LoRA 方法进行高效的微调

提示模板是构建结构化输入的一种方式,好的提示模板可以显著提高模型的性能和适用性,为了适应不同的需求,我们要自定义模板

RoPE 插值方法,线性插值和动态 NTK 缩放,线性插值简单直观,动态 NTK 缩放更灵活,可以适应不同长度的输入

Unsloth 是一种特定的优化技术,用于减少训练过程中的计算冗余和内存占用,从而加快训练速度

image.png

训练默认使用【Supervised Fine-Tuning】,数据路径默认为data

image.png

这里的数据集需要自己进行上传,保存为datasets.json,上传至LLaMA-Factory/data目录下

进入注册路径LLaMA-Factory文件夹下data目录,编辑dataset_info.json文件,注册数据集

cd /root/LLaMA-Factory/data
vi dataset_info.json

image.png

回到web界面就可以看到刚刚注册的数据集

然后设置训练参数,训练轮数,这里是学习的别人大佬微调LLama时的参数,如下

image.png



到这里就配置完了,下面依次点击预览命令,保存训练参数,载入训练参数,开始

image.png

也不知道过了多久(数据集少,电脑配置不行,预估大概40分钟左右),反正总之是训练完了

在高级设置的检查点路径选择刚刚训练好的模型

image.png

选择到chat

image.png

最终效果如下所示

image.png

事实上,我确实也没有完全使用网络安全的数据集来进行此次训练,一个是因为训练集太参差不齐了,一个是因为效果实在不明显,没办法很好的体现出训练前后的差异

总结

综合以上三种方式,我们也可以对比出优劣:

image.png

结语

写了这么多了,最后该怎么结尾呢?我实在是有些犹豫,虽说是一篇实操型文章,到最后我依然还是想谈一点别的

不算很强,但我会继续用

Qwen2.5-Coder-32B固然是好用的,而且代码能力确实远胜于过去的Qwen2以及Qwen2.5基座模型,从跑分上看是在代码能力上赢下了GPT-4o,但是说实话,在实际使用中却很难感受出来

在我微调完之后也是花时间做了多语言编程的代码测试,目前感受是只有前端html生成比较稳定,其他的如Next.js等还是略逊于GPT-4o、Claude 3.5 Sonnet的,关键是结合Cline插件时,可以明显感受到复杂项目的上下文理解能力弱于上述两者

写到这里可能大家感觉我准备喷它了,但是我想说的是,我仍然会一直用下去

而用下去的原因仅仅因为两个字——开源

我个人站在开发者的角度其实是比较支持开源的,特别是某些情况下在没有网络环境时我们仍然可以利用开源的本地模型来辅助完成工作任务,这是特别关键的

同时,开源也为万千开发者创造了大量机会,意味着更多的可能性,意味着当遇到问题时,不是一个人在战斗,而是有一个庞大的社区可以依靠

并且,我个人认为开源模型没有必要强行和闭源进行比较!它们服务于不同的需求和场景,如果仅仅因为单一的基准分数去衡量两者的价值,那么就忽视了它们各自的优势和适用范围了

基准分数≠实际能力

我们从小就是小镇做题家,习惯了用分数来衡量一切。无论是学校的考试,还是如今的模型评估,分数似乎总是那个最直观、最直接的标准。然而,生活与工作中的许多场景,并不像做题那样有着明确的答案和评分标准。在这些场景下,真正重要的往往是一个系统或工具能否解决实际问题,提升效率,而不是它在特定测试集上的表现如何

真正好用的模型,不仅仅是只靠官方的宣传,更多的是依赖于实际应用中的表现和用户间的口口相传

把握未来,步步为营

在11月12日,根据The Information爆料,传统的大模型Scaling Law已经撞墙,OpenAI下一代旗舰Orion遭遇瓶颈

Ilya Sutskever曾在过去表示,现在重要的是「扩大正确的规模」。「2010年代是scaling的时代,现在,我们再次回到了奇迹和发现的时代。每个人都在寻找下一个奇迹。」

曾经在推动OpenAI的GPT模型时,他的准则是「越大越好」。但在SSI的最近一轮融资中,Ilya开始希望尝试一种与OpenAI不同的Scaling方法

Scaling正确的东西,比以往任何时候都更重要

以前,Ilya是暴力scaling的早期倡导者之一,那时有一种想法广泛认为,通过预训练中使用更多的数据和算力,能让AI模型的性能暴涨

目前,Ilya拒绝透露,只是表示,SSI正在研究一种全新的替代方法,来扩展预训练

在未来,随着一种Scaling Law的消退,定会有另一种定律取而代之如果是放在阿里云,开源超越闭源,国内超越国外,也并非是不可能之事


参考文章:

魔搭社区 Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!

量子位 最强开源CodeLLM模型深夜来袭!320亿参数,Qwen2.5-Coder新模型超越GPT-4o

量子位 Scaling Law遭遇瓶颈,OpenAI被曝押注智能体“Operator”

CSDN LlamaFactory可视化微调大模型 - 参数详解

论文 https://arxiv.org/pdf/2409.12186

相关文章
|
5天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
8天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
14天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
15天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
5天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
505 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
11天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
986 3
|
9天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
415 17
白话文讲解大模型| Attention is all you need
|
4天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
9天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
561 5