【AGI】Qwen3模型高效微调
【AGI】Qwen3模型高效微调
- (1)Unsloth安装部署
- (2)vLLM安装部署流程
- 2.1 vLLM安装部署
- 2.2 Qwen3模型权重下载
- 2.3 借助vllm进行模型调用
- (3)EvalScope安装部署流程
- 3.1 EvalScope安装流程
- 3.2 借助EvalScope进行压力测试
- 3.3 进行模型性能评估
- (4)wandb安装与注册
- 4.1 wandb基本说明
- 4.2 wandb注册与使用
为确保企业级模型微调全流程的可复现性,本内容需预先配置以下工具环境:
核心依赖
- Unsloth [必需]
高效参数微调框架,提供优化的训练流程与资源管理,必须安装作为基础执行环境。
可选组件(完整流程扩展)
-
vLLM
高性能模型推理框架,用于微调后模型的部署验证。支持替代方案:ollama等同类调度框架。 -
EvalScope
标准化评估框架,提供量化指标对比微调前后模型性能。人工评估可作为备选方案。 -
Weights & Biases (wandb)
训练过程监控平台,实现:- 损失函数曲线可视化
- 梯度变化追踪
- 硬件资源利用率监控
- 实验数据版本化管理
安装建议
- 最小化配置:仅安装Unsloth即可完成核心微调流程
- 完整配置:需集成全部组件以实现端到端的训练-监控-评估闭环
请根据实验目标选择相应配置方案,建议提前完成环境预配置以保证课程顺利进行。
(1)Unsloth安装部署
由于要安装多个项目,因此建议创建虚拟环境以避免依赖冲突。这里首先为Unsloth创建虚拟环境:
conda create --name unsloth python=3.11
conda init
source ~/.bashrc
conda activate unsloth
然后在虚拟环境中安装Jupyter及Jupyter Kernel:
conda install jupyterlab
conda install ipykernel
python -m ipykernel install --user --name unsloth --display-name "Python unsloth"
然后使用如下命令安装Unsloth:
pip install --upgrade --force-reinstall --no-cache-dir unsloth unsloth_zoo
安装完成后在任意Jupyter中选择unsloth kernel,即可进入对应的虚拟环境进行代码编写:
可以输入如下代码进行测试
from unsloth import FastLanguageModel
import torch
(2)vLLM安装部署流程
2.1 vLLM安装部署
接下来继续安装vLLM,若是在AutoDL上租赁的服务器,则可以在默认环境中进行安装,其他服务器上建议创建虚拟环境进行安装。虚拟环境创建流程如下(AutoDL不用):
conda create --name vllm python=3.11
conda init
source ~/.bashrc
conda activate vllm
vllm主要提供后台的模型调用服务,因此不用安装Jupyter Kernel。
接下来继续进行vllm安装:
pip install bitsandbytes>=0.45.3
pip install --upgrade vllm
注:bitsandbytes是为了适配4bit动态量化模型调用的库
2.2 Qwen3模型权重下载
接下来进行模型权重下载,更多Qwen3模型全尺寸模型本地ollama、vllm、llama.cpp调用及部署方法,详见公开课:https://www.bilibili.com/video/BV1qVG9z4ELJ/ 及赋范大模型技术社区文档。
而要下载4bit动态量化的Unsloth模型,则可以在魔搭社区上搜索Qwen3-unsloth-bnb-4bit
:
选择模型下载即可。需要注意的是,有时我们会遇到这两种不同的模型,其中带有Unsloth标志的是动态量化模型,而不带unsloth则是普通量化模型,需要注意区分。
注,目前最新版vLLM已支持Unsloth动态量化模型,目前Unsloth团队已完成dense模型优化,MoE模型兼容vLLM版目前还未上线。即目前vLLM只支持
unsloth/Qwen3-1.7B-unsloth-bnb-4bit
、nsloth/Qwen3-4B-unsloth-bnb-4bit
、unsloth/Qwen3-8B-unsloth-bnb-4bit
、unsloth/Qwen3-14B-unsloth-bnb-4bit
、unsloth/Qwen3-32B-unsloth-bnb-4bit
四款模型。
然后安装魔搭社区工具并进行模型下载,以Qwen3-32B-unsloth-bnb-4bit为例(注,不同模型均可完成微调流程,大家根据自己硬件配置选择即可):
https://www.modelscope.cn/models/unsloth/Qwen3-32B-unsloth-bnb-4bit/files
使用如下命令进行下载:
pip install modelscope
modelscope download --model unsloth/Qwen3-32B-unsloth-bnb-4bit --local_dir ./Qwen3-32B-unsloth-bnb-4bit
下载后模型权重如图所示:
2.3 借助vllm进行模型调用
下载完模型权重后,接下来即可测试模型调用流程了,首先开启vllm服务,需要注意的是,Unsloth的动态量化模型只支持单卡调用,最低22G显存即可运行。因此这里是设置的单卡运行vLLM:
# cd /root/autodl-tmp/Qwen3
vllm serve ./Qwen3-32B-unsloth-bnb-4bit --enable-auto-tool-choice --tool-call-parser hermes
此外,更多关于vLLM调用qwen3参数说明,详见:https://qwen.readthedocs.io/en/latest/deployment/vllm.html#
开启后执行效果如下:
实际显存占用如下:
注,vllm会占用显卡的80%以上显存。实际调用32B 4bit动态量化模型时,最低22G显存即可调用,最低37G显存即可微调。
接下来则可在代码环境中进行调用测试:
from openai import OpenAIopenai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)messages = [{"role": "user", "content": "你好,好久不见!"}
]response = client.chat.completions.create(model="./Qwen3-32B-unsloth-bnb-4bit",messages=messages,
)print(response.choices[0].message.content)
(3)EvalScope安装部署流程
3.1 EvalScope安装流程
接下来进行EvalScope安装部署,项目官网:https://github.com/modelscope/evalscope
为了避免和Unsloth的依赖产生冲突,EvalScope需要再单独创建虚拟环境:
conda create --name evalscope python=3.11
conda init
source ~/.bashrc
conda activate evalscopeconda install jupyterlab
conda install ipykernel
python -m ipykernel install --user --name evalscope --display-name "Python evalscope"
然后安装对应的库
pip install evalscope # 安装 Native backend (默认)
# 额外选项
pip install 'evalscope[opencompass]' # 安装 OpenCompass backend
pip install 'evalscope[vlmeval]' # 安装 VLMEvalKit backend
pip install 'evalscope[rag]' # 安装 RAGEval backend
pip install 'evalscope[perf]' # 安装 模型压测模块 依赖
pip install 'evalscope[app]' # 安装 可视化 相关依赖# 或可以直接输入all,安装全部模块
# pip install 'evalscope[all]' # 安装所有 backends (Native, OpenCompass, VLMEvalKit, RAGEval)
源码安装:
git clone https://github.com/modelscope/evalscope.git
cd evalscope/pip install omegaconfpip install -e . # 安装 Native backend
# 额外选项
pip install -e '.[opencompass]' # 安装 OpenCompass backend
pip install -e '.[vlmeval]' # 安装 VLMEvalKit backend
pip install -e '.[rag]' # 安装 RAGEval backend
pip install -e '.[perf]' # 安装 模型压测模块 依赖
pip install -e '.[app]' # 安装 可视化 相关依赖
pip install -e '.[all]' # 安装所有 backends (Native, OpenCompass, VLMEvalKit, RAGEval)
3.2 借助EvalScope进行压力测试
紧接着,我们就可以尝试进行模型的压力测试,可以测试当前4bit动态量化模型在单卡H800上,由vllm调度框架驱动时的实际性能表现:
evalscope perf \--url "http://127.0.0.1:8000/v1/chat/completions" \--parallel 5 \--model ./Qwen3-32B-unsloth-bnb-4bit \--number 20 \--api openai \--dataset openqa \--stream
输出结果保存在:outputs/20250505_164404/Qwen3-32B-unsloth-bnb-4bit
:
然后即可在summary.json中查看压测的benchmark
{"Time taken for tests (s)": 632.0044,"Number of concurrency": 5,"Total requests": 20,"Succeed requests": 20,"Failed requests": 0,"Output token throughput (tok/s)": 45.5503,"Total token throughput (tok/s)": 46.4759,"Request throughput (req/s)": 0.0316,"Average latency (s)": 142.0679,"Average time to first token (s)": 0.2191,"Average time per output token (s)": 0.0994,"Average input tokens per request": 29.25,"Average output tokens per request": 1439.4,"Average package latency (s)": 0.0985,"Average package per request": 1439.4,"Expected number of requests": 20,"Result DB path": "outputs/20250505_164404/Qwen3-32B-unsloth-bnb-4bit/benchmark_data.db"
}
Benchmarking summary:
Percentile results:
压测结果解释:
📊 压测核心指标解读
指标项 | 含义 | 解读 |
---|---|---|
Time taken for tests (s) | 总测试耗时 | 632 秒,表示本次压测运行了约 10 分钟。 |
Number of concurrency | 并发数 | 使用了 5 个并发请求同时测试,表明模型支持一定程度的并发推理能力。 |
Total requests | 总请求数 | 总共向模型发起了 20 次推理请求。 |
Succeed requests / Failed requests | 成功与失败数 | 全部成功(20/20),说明模型稳定性良好。 |
🚀 吞吐性能
指标项 | 含义 | 解读 |
---|---|---|
Output token throughput (tok/s) | 每秒生成 token 数 | 45.55 tok/s,生成速度在 4bit 动态量化大模型中属于正常偏低水平。 |
Total token throughput (tok/s) | 总吞吐(包括输入+输出) | 46.48 tok/s,说明输入 token 占比较小,推理主要时间在输出部分。 |
Request throughput (req/s) | 每秒处理请求数 | 0.0316 req/s,即大约 31 秒才完成一次请求(见下方 latency)。适用于高吞吐非交互式任务。 |
⏱️ 延迟分析
指标项 | 含义 | 解读 |
---|---|---|
Average latency (s) | 单次请求平均耗时 | 142 秒,即每个请求耗时超过 2 分钟,说明单次生成量很大。 |
Average time to first token (s) | 首 token 延迟 | 0.2191 秒,响应启动速度非常快,体现了量化模型的推理启动效率。 |
Average time per output token (s) | 每个生成 token 的平均耗时 | 0.0994 秒,略高,意味着模型速度偏慢,可能与显存带宽或激活参数有关。 |
📦 Token 分布与批处理
指标项 | 含义 | 解读 |
---|---|---|
Average input tokens per request | 每次输入平均 token 数 | 29.25,说明输入 prompt 很短。 |
Average output tokens per request | 每次输出平均 token 数 | 1439.4,生成文本非常长,这解释了高 latency 与低 req/s。 |
Average package latency (s) | 批处理延迟 | 0.0985 秒,表示模型每次接受请求到开始处理之间延迟极短。 |
Average package per request | 每次请求中 token 包含数 | 同为 1439.4,表明未使用分片或 chunk 输出,模型按完整长度生成。 |
- 优点:
- 模型非常稳定(20 次请求 100% 成功)
- 首 token 响应迅速(0.21 秒),表明部署结构良好
- 适合长文本生成类任务
- 缺点:
- 整体吞吐较低(45 tok/s),属于 32B 大模型的正常范围
- 单次推理耗时较长(每次平均 142 秒),适用于非实时场景。
3.3 进行模型性能评估
接下来即可进一步进行模型性能评估。这里我们先尝试对其进行初始状态下的性能评估,然后等微调结束后,再进行新一轮的评估,进而对比微调前后模型性能变化情况。这里需要在Jupyter中选择evalscope kernel:
然后运行如下代码:
【可选】数据集构造代码:
from evalscope.collections import CollectionSchema, DatasetInfo, WeightedSampler
from evalscope.utils.io_utils import dump_jsonl_dataschema = CollectionSchema(name='Qwen3', datasets=[CollectionSchema(name='English', datasets=[DatasetInfo(name='mmlu_pro', weight=1, task_type='exam', tags=['en'], args={'few_shot_num': 0}),DatasetInfo(name='mmlu_redux', weight=1, task_type='exam', tags=['en'], args={'few_shot_num': 0}),DatasetInfo(name='ifeval', weight=1, task_type='instruction', tags=['en'], args={'few_shot_num': 0}),]),CollectionSchema(name='Chinese', datasets=[DatasetInfo(name='ceval', weight=1, task_type='exam', tags=['zh'], args={'few_shot_num': 0}),DatasetInfo(name='iquiz', weight=1, task_type='exam', tags=['zh'], args={'few_shot_num': 0}),]),CollectionSchema(name='Code', datasets=[DatasetInfo(name='live_code_bench', weight=1, task_type='code', tags=['en'], args={'few_shot_num': 0, 'subset_list': ['v5_v6'], 'extra_params': {'start_date': '2025-01-01', 'end_date': '2025-04-30'}}),]),CollectionSchema(name='Math&Science', datasets=[DatasetInfo(name='math_500', weight=1, task_type='math', tags=['en'], args={'few_shot_num': 0}),DatasetInfo(name='aime24', weight=1, task_type='math', tags=['en'], args={'few_shot_num': 0}),DatasetInfo(name='aime25', weight=1, task_type='math', tags=['en'], args={'few_shot_num': 0}),DatasetInfo(name='gpqa', weight=1, task_type='knowledge', tags=['en'], args={'subset_list': ['gpqa_diamond'], 'few_shot_num': 0})])
])# get the mixed data
mixed_data = WeightedSampler(schema).sample(100000000) # set a large number to ensure all datasets are sampled
# dump the mixed data to a jsonl file
dump_jsonl_data(mixed_data, 'outputs/qwen3_test.jsonl')
创建好的完整数据集已上传至课件网盘:
评测代码:
from evalscope import TaskConfig, run_task
task_cfg = TaskConfig(model='./Qwen3-32B-unsloth-bnb-4bit',api_url='http://127.0.0.1:8000/v1/chat/completions',eval_type='service',datasets=['data_collection',],dataset_args={'data_collection': {'dataset_id': 'modelscope/EvalScope-Qwen3-Test','filters': {'remove_until': '</think>'} # 过滤掉思考的内容}},eval_batch_size=128,generation_config={'max_tokens': 30000, # 最大生成token数,建议设置为较大值避免输出截断'temperature': 0.6, # 采样温度 (qwen 报告推荐值)'top_p': 0.95, # top-p采样 (qwen 报告推荐值)'top_k': 20, # top-k采样 (qwen 报告推荐值)'n': 1, # 每个请求产生的回复数量},timeout=60000, # 超时时间stream=True, # 是否使用流式输出limit=2000, # 设置为2000条数据进行测试
)run_task(task_cfg=task_cfg)
这里采用了EvalScope专门为Qwen3准备的modelscope/EvalScope-Qwen3-Test
数据集进行评测,会围绕模型的推理、指令跟随、代理能力和多语言支持方面能力进行测试,该数据包含mmlu_pro
、ifeval
、live_code_bench
、math_500
、aime24
等各著名评估数据集。
数据集地址:https://modelscope.cn/datasets/modelscope/EvalScope-Qwen3-Test/summary
评测运行结果如下:
此时后台显示如下:
查看模型能力评测结果
evalscope app
对评测结果进行可视化:
(4)wandb安装与注册
4.1 wandb基本说明
在大规模模型训练中,我们往往需要监控和分析大量的训练数据,而WandB可以帮助我们实现这一目标。它提供了以下几个重要的功能:
实时可视化:WandB可以实时展示训练过程中关键指标的变化,如损失函数、学习率、训练时间等。通过这些可视化数据,我们能够直观地了解模型的训练进展,快速发现训练中的异常或瓶颈。
自动记录与日志管理:WandB会自动记录每次实验的参数、代码、输出结果,确保实验结果的可追溯性。无论是超参数的设置,还是模型的架构调整,WandB都能够帮助我们完整保留实验记录,方便后期对比与调优。
支持中断与恢复训练:在长时间的预训练任务中,系统中断或需要暂停是常见的情况。通过WandB的checkpoint功能,我们可以随时恢复训练,从上次中断的地方继续进行,避免数据和时间的浪费。
多实验对比:当我们尝试不同的模型配置或超参数时,WandB允许我们在多个实验之间轻松进行对比分析,帮助我们选择最优的模型配置。
团队协作:WandB还支持团队协作,多个成员可以共同查看实验结果,协同调试模型。这对研究和项目开发中团队的合作非常有帮助。
4.2 wandb注册与使用
wandb官网:https://wandb.ai/site
然后即可在令行中输入如下代码安装wandb:
pip install wandb
接下来在unsloth微调前,我们即可设置wandb进行微调记录,并可在对应网站上观察到训练过程如下: