从零开始之Qwen3微调及部署


前言

Qwen3是阿里云通义千问团队于2025年4月29日发布的最新大型语言模型系列,包含2个MoE模型和6个Dense模型。其基于广泛的训练,在推理、指令跟随、Agent 能力和多语言支持方面取得了突破性的进展。当我们需要针对模型的特定的能力进行增强时,需要对Qwen3的模型进行微调。本文将分别介绍两种线上微调的方案,分别为在阿里的魔搭社区平台 和 AutoDL 平台上微调。微调框架采用的是阿里的 ms-swift

一、工具列表

  • 魔搭社区平台
  • AutoDL
  • ms-swift
  • 微调数据集(精致的医疗r1数据)
  • 训练过程可视化平台 SwanLab

二、注册SwanLab

SwanLab 是一款开源、轻量的 AI 模型训练跟踪与可视化工具,提供了一个跟踪、记录、比较、和协作实验的平台。SwanLab传送门。注册后,将API KEY记录下,用于后续微调时的监控。API KEY的获取方式如下图所示。
API KEY

三、微调数据集预处理

1. 下载微调数据集

本文采用的微调数据集为精致的医疗r1数据,医疗r1数据传送门

2. 数据预处理

2.1. 微调数据格式

Qwen3具有思考模式。其微调需要的数据格式可参考 ms-swift 官方数据格式,微调数据格式传送门Qwen3微调数据格式传送门

# 通用格式
{"messages": [
    {"role": "system", "content": "<system-prompt>"},
    {"role": "user", "content": "<query1>"},
    {"role": "assistant", "content": "<response1>"}
]}
# 带think的格式
{"messages": [
    {"role": "user", "content": "Where is the capital of Zhejiang?"},
    {"role": "assistant", "content": "<think>\n...\n</think>\n\nThe capital of Zhejiang is Hangzhou."}
]}
# 不带think的格式
{"messages": [
    {"role": "user", "content": "Where is the capital of Zhejiang?"},
    {"role": "assistant", "content": "<think>\n\n</think>\n\nThe capital of Zhejiang is Hangzhou."}
]}
{"messages": [
    {"role": "user", "content": "Where is the capital of Zhejiang? /no_think"},
    {"role": "assistant", "content": "<think>\n\n</think>\n\nThe capital of Zhejiang is Hangzhou."}
]}

2.2. 微调数据处理

可参考项目ms-swift微调Qwen3完成医疗问答任务中的处理数据的代码,将数据处理成 2.1. 中的数据结构即可。ms-swift微调Qwen3完成医疗问答任务传送门

四、魔搭社区平台微调流程

魔搭社区平台是阿里达摩院于近一年刚上线的一款开源模型平台,里面提供了很多的热门模型供使用体验,而且与阿里云服务进行联动,让开发者免除了额外的部署成本,实现了模型推理与调优的极速体验。

1. 登录魔搭社区

进入魔搭社区的官网,魔搭社区传送门。进入后,点击左侧菜单栏中的【我的Notebook】。如下图所示。可选择【魔搭平台免费实例】中的GPU环境或【个人云账号授权实例】,对于新人【魔搭平台免费实例】有对应的免费额度,【个人云账号授权实例】也有连续3个月的免费定额。
魔搭社区主页
我的Notebook

2. 创建实例

【魔搭平台免费实例】中创建GPU实例,直接选择镜像即可,本文使用的镜像为【modelscope:1.29.0-pytorch2.3.1tensorflow2.16.1-gpu-py311-cu121-ubuntu22.04】,【个人云账号授权实例】页面中点击【创建实例】后,进入【创建实例】页面。其中资源规格选择的是【NVIDIA A10】,镜像版本选择的是【modelscope:1.29.0-pytorch2.3.1tensorflow2.16.1-gpu-py311-cu121-ubuntu22.04】。
资源规格选择
环境镜像选择

3. 启动实例

实例创建完成后,在实例列表界面直接点击【启动】即可。
实例列表界面

4. 放置数据

通过上传的方式,将步骤【微调数据集预处理】中处理后的微调数据和验证数据存放在/data路径下,分别命名为 【traindata.jsonl】和【valdata.jsonl】,并在根目录下创建一个train.sh文件,文件内容如下所示。其中的主要参数说明:

  • model:微调的基础模型
  • train_type:为微调的方式
  • dataset:微调的数据集
  • val_dataset:微调的验证数据集
  • bnb_4bit_compute_dtype,bnb_4bit_quant_type,bnb_4bit_use_double_quant,quant_method,quant_bits 为量化相关配置
  • num_train_epochs:训练轮数
  • loss_scale:在训练期间,指定 –loss_scale ignore_empty_think,以忽略对 <think>\n\n</think>\n\n 的损失计算,当微调数据中有不含思维链的数据时采用
  • model_author,model_name,report_to,swanlab_project 为将微调过程上传到Swanlab平台方便进行监控
  • 其余参数详解可参考官方参数文档,官方命令行参数详解传送门
# 24GB
CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen/Qwen3-8B \
    --train_type lora \
    --dataset ./data/traindata.jsonl \
    --val_dataset ./data/valdata.jsonl \
    --torch_dtype bfloat16 \
    --bnb_4bit_compute_dtype bfloat16 \
    --bnb_4bit_quant_type nf4 \
    --bnb_4bit_use_double_quant true \
    --quant_method bnb \
    --quant_bits 4 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-5 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 5 \
    --logging_steps 5 \
    --max_length 8192 \
    --output_dir output \
    --system 'You are a helpful assistant.' \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --loss_scale ignore_empty_think \
    --model_author swift \
    --model_name swift-test\
    --report_to swanlab \
    --swanlab_project swift-test

5. 开始微调

打开终端输入以下命令即可。首次微调时会提示你登录SwanLab,输入步骤二中获得的【API KEY】即可。

bash train.sh

开始微调

五、AutoDL平台微调流程

AutoDL 是一个算力平台,可以在此平台上租用GPU服务。AutoDL官网传送门

1. 租用GPU实例

本文选择的GPU实例如下图所示,GPU选择的RTX 3090(24GB),镜像选择的是 PyTorch 2.5.1 Python 3.12(ubuntu22.04)CUDA 12.4
GPU实例

2. 安装环境

因为AutoDL不像魔搭社区一样提前内置环境,所以我们需要安装相应的环境并进行配置。

2.1. 安装 ms-swift

此安装为ms-swift训练框架所需,打开终端后输入如下命令安装

pip install ms-swift -U

安装ms-swift

2.2. 安装 swan-lab

此安装为swanLab监控所需,在终端中输入如下命令安装

pip install swanlab

安装swanlab

2.3. 安装 bitsandbytes

此安装为量化所需,在终端中输入如下命令安装

pip install bitsandbytes

安装bitsandbytes

2.4. 其他安装

如下不是必要安装,只是记录下安装时的问题。

pip install deepspeed # 多GPU训练
pip install liger-kernel # 节约显存资源
pip install flash-attn --no-build-isolation  # packing需要

如果在安装【flash-attn】时遇到 Could not build wheels for flash-attn, which is required to install pyproject 问题,可参考此文章。flash-attn安装问题解决方案传送门

3. 上传微调数据

上传微调数据需要用ssh连接到AutoDL上的服务,本文采用的是 FinalShell,FinalShell下载官网,FinalShell连接AutoDL可参考文档 AutoDL用XShell传输文件帮助传送门

3.1. 配置FinalShell

打开FinalShell后,点击如下按钮,新增连接。
FinalShell新增连接
FinalShell新增SSH连接

  • 名称:可随意
  • 主机:复制AutoDL上的登录指令,如下图所示。复制出的内容类似如下文本,此时将 @ 后的内容复制到 【主机】即可。

登录指令

ssh -p 19423 root@connect.nmb2.seetacloud.com
  • 端口:将 ssh -p 后面的端口号复制上即可。即 19423
  • 用户名:填入 @ 前的内容,即 root
  • 密码:复制AutoDL上的密码即可,如下图所示。
    密码
    填写完成后如下图所示。
    ssh连接完成

3.2. 上传微调数据

利用FinalShell 上传微调数据到AutoDL,如下图所示。请一定要上传数据到 autodl-tmp 文件夹下,这样重置系统时数据盘和文件存储中的数据不受影响。
FinalShell上传数据

4. 开始微调

4.1. 创建train.sh文件

在 autodl-tmp 目录下创建 train.sh 文件,文件内容如下所示。其中的 export MODELSCOPE_CACHE=‘/root/autodl-tmp’ 部分为设置ms-swift将基础模型Qwen3-8B下载的路径,以防系统重置后重新下载,且放在autodl-tmp路径下占用的是数据盘,不占用系统盘。

export MODELSCOPE_CACHE='/root/autodl-tmp'
# 24GB
CUDA_VISIBLE_DEVICES=0 \
swift sft \
   --model Qwen/Qwen3-8B \
   --train_type lora \
   --dataset ./data/traindata.jsonl \
   --val_dataset ./data/valdata.jsonl \
   --torch_dtype bfloat16 \
   --bnb_4bit_compute_dtype bfloat16 \
   --bnb_4bit_quant_type nf4 \
   --bnb_4bit_use_double_quant true \
   --quant_method bnb \
   --quant_bits 4 \
   --num_train_epochs 1 \
   --per_device_train_batch_size 1 \
   --per_device_eval_batch_size 1 \
   --learning_rate 1e-5 \
   --lora_rank 8 \
   --lora_alpha 32 \
   --target_modules all-linear \
   --gradient_accumulation_steps 16 \
   --eval_steps 50 \
   --save_steps 50 \
   --save_total_limit 5 \
   --logging_steps 5 \
   --max_length 8192 \
   --output_dir output \
   --system 'You are a helpful assistant.' \
   --warmup_ratio 0.05 \
   --dataloader_num_workers 4 \
   --loss_scale ignore_empty_think \
   --model_author swift \
   --model_name swift-test\
   --report_to swanlab \
   --swanlab_project swift-test

4.2. 执行train.sh

切换到autodl-tmp目录下后,执行train.sh即可。
执行train.sh
在train.sh运行过程中,如果是第一次运行,会要求你选择SwanLab账号,如下图所示。提示你是使用已有的,还是创建新的。本文采用已有的账号,因此输入2,回车确认。
swanlab输入
然后提示你输入SwanLab上已有的API KEY,其API KEY的获取方法见步骤二。复制后单击鼠标右键选择【粘贴】即可粘贴好,然后回车确认。

显示下图的训练进度,即开始训练,等待训练完成即可。

训练进度

5. 部署服务

完成微调后,即可进行部署。官方参考文档可参考 微调部署官方文档传送门

5.1. 安装VLLM

利用VLLM可以提升推理速度,通过如下命令安装即可。

pip install vllm -U

5.2. 创建推理脚本

本文在autodl-tmp的目录下创建deploy.sh文件,其内容如下所示。其中 adapters 参数对应为 lora 微调后生成的checkpoint的路径。

export MODELSCOPE_CACHE='/root/autodl-tmp'
CUDA_VISIBLE_DEVICES=0 \
swift deploy \
    --adapters ./output/v0-20250913-175621/checkpoint-450 \
    --infer_backend vllm \
    --temperature 0 \
    --max_new_tokens 8192 \
    --max_model_len 24576
    --served_model_name 'swift-test'

5.3. 开始部署

在终端中输入如下命令运行即可。

bash deploy.sh

部署图片
部署成功后如下图所示。

部署成功图

5.4. 配置代理

5.4.1. 下载代理软件

我们不能直接访问AutoDL上的服务,需要设置代理。点击实例上的【自定义服务】按钮,并下载对应的软件。
自定义服务
代理软件

5.4.2. 配置代理软件

软件运行后如下图所示,其指令和密码见实例上对应指令和密码,复制即可。代理到本地端口根据服务部署成功后显示的端口号设置,本文设置为:8000,代理到远程端口,可随意设置本地未使用的端口,本文设为:6006
代理软件
实例信息
配置完成图如下所示。

代理配置成功

5.5. 代码调用服务

本文采用的代码调用服务的方式为Open AI的方式。Python代码如下所示。

from openai import OpenAI

client = OpenAI(
    api_key='EMPTY',
    base_url=f'http://127.0.0.1:8000/v1',
)
models = [model.id for model in client.models.list().data]
print(f'models: {models}')

query = 'who are you?'
messages = [{'role': 'user', 'content': query}]

resp = client.chat.completions.create(model=models[1], messages=messages, max_tokens=512, temperature=0)
query = messages[0]['content']
response = resp.choices[0].message.content
print(f'query: {query}')
print(f'response: {response}')

gen = client.chat.completions.create(model=models[2], messages=messages, stream=True, temperature=0)
print(f'query: {query}\nresponse: ', end='')
for chunk in gen:
    if chunk is None:
        continue
    print(chunk.choices[0].delta.content, end='', flush=True)
print()
"""
models: ['Qwen3-8B']
query: who are you?
response: I am an artificial intelligence model named swift-robot, developed by swift. I can answer your questions, provide information, and engage in conversation. If you have any inquiries or need assistance, feel free to ask me at any time.
query: who are you?
response: I am an artificial intelligence model named Xiao Huang, developed by ModelScope. I can answer your questions, provide information, and engage in conversation. If you have any inquiries or need assistance, feel free to ask me at any time.
"""
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐