解决方案体验 | 基于 GPU 云服务器微调 Qwen3 模型

简介: 本方案通过模型蒸馏,利用大模型生成标注数据,微调Qwen3-0.6B小模型,实现高效、低成本的结构化信息抽取。结合ms-swift与vLLM框架,仅需一行命令完成训练与部署,准确率从14%提升至98%,显著提升推理速度与性价比,适用于物流填单等实际场景。

背景

大参数模型效果好,但成本高、响应慢。为了在保障效果的同时提升推理速度、降低成本,可首先借助大参数模型完成目标任务的数据生成,并使用这些数据微调小参数模型,使其在特定任务中达到接近大参数模型的表现,这一过程也被称为模型蒸馏

本方案将以从一句话中提取结构化信息(如收件人、地址、电话)为例,演示如何通过模型蒸馏,让 Qwen3-0.6B 模型在此任务上达到大参数模型的表现。

效果对比

image.png

方案路线

数据准备

由于真实的物流填单数据涉及到用户隐私,我们将使用一批虚拟地址描述信息作为输入,并使用 Qwen3-235B-A22B 作为教师模型提取结构化的信息作为输出。

模型微调

在获取教师模型的输入输出后,我们可以使用该数据来微调 Qwen3-0.6B 模型,提升其在此任务场景下的表现。这里我们将使用魔搭社区提供的 ms-swift 框架,即使您不了解微调算法的细节,依然可以借通过一行命令来完成微调任务。

效果验证

最后,为了确保模型在真实业务场景中的稳定性与准确性,建议在部署到生产环境前准备评测数据与评测标准,对微调后的模型进行效果验证。

配置计算环境

大模型微调对计算环境有较高要求,需配套安装合适版本的 GPU 驱动、CUDA(NVIDIA的并行计算平台和编程模型)和 cuDNN(NVIDIA的深度神经网络加速库)。手动通过命令行安装不仅步骤繁琐,而且容易出错。为提升部署效率,可在创建 GPU 云服务器实例时选择带有 GPU 驱动的镜像,省去复杂的命令行操作,快速启动微调任务。此处采用试用的方式进行体验。

在界面中单击立即试用,右侧将实时展示资源创建进程。

image.png

单击左侧的远程连接按钮,再单击登录,即可连接到 GPU 云服务器。

image.png

准备数据

高质量的数据集可以为微调过程提供充足的输入–输出示例,使小模型能够准确学习并在真实场景中稳定输出准确结果。本方案所需要的数据包含收件人地址信息与对应的结构化信息两部分:

image.png

为了将教师模型(Qwen3-235B-A22B)处理该任务的知识蒸馏到 Qwen3-0.6B 中,我们需要先调用教师模型的 API,将收件人的地址信息提取成结构化的 JSON 数据。

调用教师模型生成这些 JSON 数据需要耗费一些时间,需要在终端运行以下命令,来直接下载我们提前准备好的数据。

# 进入 /root 目录
cd /root && \
# 下载训练数据 train.jsonl
curl -f -o train.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/azvmpb/train_with_system.jsonl"

image.png

下载并微调模型

微调模型通常上手门槛较高。通过魔搭社区提供的 ms-swift 框架,仅需一句命令即可快速启动微调任务,大幅降低操作复杂度。

本方案依赖以下两个核心组件:

  • ms-swift : 魔搭社区提供的训练框架,支持模型的下载、微调和权重合并,极大简化了微调流程。

  • vllm : 用于部署微调后的模型,支持高性能推理服务,不仅方便验证微调效果,还可用于生成 API,供业务方直接调用。

在终端运行以下命令来安装依赖:

pip3 install vllm==0.9.0.1 ms-swift==3.5.0

image.png

运行以下命令可以完成模型下载、微调、合并权重的操作:

# 进入 /root 目录
cd /root && \
# 下载微调脚本 sft.sh
curl -f -o sft.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250623/cggwpz/sft.sh" && \
# 执行微调脚本
bash sft.sh

模型微调核心代码如下,您可以在 sft.sh 文件中看到:

swift sft \
    --model Qwen/Qwen3-0.6B \
    --train_type lora \
    --dataset 'train.jsonl' \
    --torch_dtype bfloat16 \
    --num_train_epochs 10 \
    --per_device_train_batch_size 20 \
    --per_device_eval_batch_size 20 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --save_steps 1 \
    --save_total_limit 2 \
    --logging_steps 2 \
    --max_length 2048 \
    --output_dir output \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4

微调模型大约需要10分钟,期间会实时打印如下所示的模型在训练集与验证集的损失变化情况:

image.png

当出现以下信息表明模型微调已完成:

image.png

完成该步骤会在output/v0-xxx-xxx路径下生成带有 merged 后缀的文件夹,为微调后的模型文件。

我们可以在output/v0-xxx-xxx路径下中找到 images 文件夹,打开 train_loss.png(反映训练集损失) 与 eval_loss.png(反映验证集损失),根据损失值的变化趋势初步判断当前模型的训练效果:

  • 在结束训练前 train_loss 与 eval_loss 仍有下降趋势(欠拟合),那么就可以增加 num_train_epochs(训练轮次,与训练深度正相关) 参数,或适当增大 lora_rank(低秩矩阵的秩,秩越大,模型能表达更复杂的任务,但更容易过度训练)的值后再进行训练,加大模型的对训练数据的拟合程度;

  • 在结束训练前 train_loss 持续下降,eval_loss 开始变大(过拟合),可以减少 num_train_epochs 参数,或适当减小lora_rank的值后再进行训练,防止模型过度训练;

  • 在结束训练前 train_loss 与 eval_loss 均处于平稳状态(良好拟合),可以进行后续步骤。本方案的 train_loss 与 eval_loss 变化如下表所示:

image.png

验证效果

在将微调后的模型部署到实际业务环境前,建议先对其效果进行系统性的评测。只有通过充分验证,才能确保模型具备良好的稳定性和准确性,避免上线后出现意料之外的问题。

测试数据的格式应与训练数据一致,以确保评测的可比性,但内容上,测试数据应使用区别于训练数据的全新样本用于测试。这样可以更准确地反映模型在新数据上的泛化能力,避免因“见过的样本”导致分数虚高。

运行以下命令获取准备好的测试数据:

cd /root && \
# 下载测试数据 test.jsonl
curl -o test.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/mhxmdw/test_with_system.jsonl"

评测标准应紧贴实际业务目标。以本方案为例,除了判断生成的 JSON 字符串是否合法,还应该关注对应 Key、Value 的值是否正确。主要核心代码如下:

def compare_address_info(actual_address_str, predicted_address_str):
    """比较两个JSON字符串表示的地址信息是否相同"""
    try:
        # 解析实际地址信息
        if actual_address_str:
            actual_address_json = json.loads(actual_address_str)
        else:
            actual_address_json = {
   }

        # 解析预测地址信息
        if predicted_address_str:
            predicted_address_json = json.loads(predicted_address_str)
        else:
            predicted_address_json = {
   }

        # 直接比较两个JSON对象是否完全相同
        is_same = actual_address_json == predicted_address_json

        return {
   
            "is_same": is_same,
            "actual_address_parsed": actual_address_json,
            "predicted_address_parsed": predicted_address_json,
            "comparison_error": None
        }

    except json.JSONDecodeError as e:
        return {
   
            "is_same": False,
            "actual_address_parsed": None,
            "predicted_address_parsed": None,
            "comparison_error": f"JSON解析错误: {str(e)}"
        }
    except Exception as e:
        return {
   
            "is_same": False,
            "actual_address_parsed": None,
            "predicted_address_parsed": None,
            "comparison_error": f"比较错误: {str(e)}"
        }

针对 Qwen3-0.6B 模型设计了多版提示词,选取效果最好的系统提示词为:

你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的结构化信息。

## 任务说明
请根据给定的输入文本,准确提取并生成包含以下六个字段的JSON格式输出:
- province: 省份/直辖市/自治区(必须是完整的官方名称,如"河南省""上海市""新疆维吾尔自治区"等)
- city: 城市名称(包含"市"字,如"郑州市""西安市"等)
- district: 区县名称(包含"区""县"等,如"金水区""雁塔区"等)
- specific_location: 具体地址(街道、门牌号、小区、楼栋等详细信息)
- name: 收件人姓名(完整的中文姓名)
- phone: 联系电话(完整的电话号码,包括区号)

## 抽取规则
1. **地址信息处理**- 必须准确识别省、市、区的层级关系
   - 省份名称必须使用官方全称(如"河南省"而非"河南"- 直辖市的province和city字段应该相同(如都填"上海市"- specific_location应包含详细的街道地址、小区名称、楼栋号等

2. **姓名识别**- 准确提取完整的中文姓名,包括复姓
   - 包括少数民族姓名

3. **电话号码处理**- 提取完整的电话号码,保持原有格式

## 输出格式
请严格按照以下JSON格式输出,不要添加任何解释性文字:
{
   
  "province": "省份名称",
  "city": "城市名称", 
  "district": "区县名称",
  "specific_location": "详细地址",
  "name": "收件人姓名",
  "phone": "联系电话"
}

使用上述系统提示词与测试样本对没有微调的本地 Qwen3-0.6B 模型进行评测:

# 进入 /root 目录
cd /root && \
# 下载并执行验证脚本
curl -o evaluate_without_sft.py "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250617/ksrneh/evaluate_without_sft.py" && \
curl -o evaluate_without_sft.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250617/cmvbcz/evaluate_without_sft.sh" && \
bash evaluate_without_sft.sh

执行后可以看到,尽管优化了提示词,测试样本准确率仅有14%:

image.png

使用测试样本对微调后的模型进行评测:

# 进入 /root 目录
cd /root && \
# 下载并执行验证脚本
curl -o evaluate.py "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/bzszyc/evaluate.py" && \
curl -o evaluate.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/xtgxql/evaluate.sh" && \
bash evaluate.sh

针对微调后的模型,我们使用了更简单的提示词,这可以提升模型推理时的响应速度:

你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的JSON信息,包含的Key有province(省份)、city(城市名称)、district(区县名称)、specific_location(街道、门牌号、小区、楼栋等详细信息)、name(收件人姓名)、phone(联系电话)

即使使用了更简单的提示词,微调模型的准确率也达到 98%,相比微调前的 14% 准确率有了大幅提升。

image.png

应用到生产环境

我们此处使用的数据集为通用的物流填单示例,无法覆盖真实业务中的全部情况,如字段缺失、填写错误等。在实际场景中,还可以进一步采用真实数据对模型进行进一步评估或持续优化,提升模型的泛化性能。

同时,我们要认识到,模型训练并非“一劳永逸”,而是一个持续迭代、动态优化的过程。尽管微调后的模型在测试集上可能表现优异,但其在真实业务场景中的效果仍需进一步验证。所以需要建立完善的模型监控体系,持续跟踪其在实际任务中的指标表现,并据此判断是否需要进一步优化模型,例如引入更多样化的训练样本、调整训练轮次,或重新设计数据标注策略,以提升模型在真实环境下的适应能力与稳定性。

运行以下脚本可以使用 vLLM 框架部署微调后的模型,并发布为 API 服务:

# 下载部署脚本 deploy.sh
curl -o deploy.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250613/hbojjv/deploy.sh" && \
# 后台运行部署脚本
bash deploy.sh

当看到如下信息时,表明 API 服务已成功部署:

image.png

部署成功后,业务方可以参考以下代码来接入您的 API 服务:

from openai import OpenAI
from pydantic import BaseModel

class Labels(BaseModel):
    province: str
    city: str
    district: str
    specific_location: str
    name: str
    phone: str


JSON_SCHEMA = Labels.model_json_schema()

def main(user_message: str) -> None:
    """示例:调用 Chat Completions 接口抽取地址信息。"""
    client = OpenAI(
        # 建议您配置环境变量
        api_key="sk-xxx",
        # 替换xx.xx.xx.xx为您的公网IP
        base_url="http://xx.xx.xx.xx:8000/v1",
    )

    completion = client.chat.completions.create(
        model="Qwen3-0.6B-SFT",
        messages=[
            {
   
                "role": "system",
                "content": "你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的JSON信息,包含的Key有province(省份)、city(城市名称)、district(区县名称)、specific_location(街道、门牌号、小区、楼栋等详细信息)、name(收件人姓名)、phone(联系电话)"
            },
            {
   
                "role": "user",
                "content": user_message,
            },
        ],
        extra_body={
   
            "chat_template_kwargs": {
   "enable_thinking": False},
            "guided_json": JSON_SCHEMA,
        },
    )

    print(completion.choices[0].message.content)

if __name__ == "__main__":
    main("号码021-3439592西宁市城东区昆仑东路289号海湖新区万新广场3号楼18层索南扎西")
相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
2月前
|
数据采集 人工智能 物联网
国产AI封神!炒股狂赚40%碾压对手 教你微调Qwen3打造专属金融分析师
国产AI在实盘炒股中大放异彩,DeepSeek与Qwen3收益率最高超60%,碾压国际大模型。本文教你用LLaMA Factory平台微调Qwen3-VL-30B,打造专属多模态金融分析师,实现趋势研判、财报分析等专业能力,赋能投资决策。
876 156
国产AI封神!炒股狂赚40%碾压对手 教你微调Qwen3打造专属金融分析师
|
机器学习/深度学习 人工智能 算法
通义千问Qwen-72B-Chat大模型在PAI平台的微调实践
本文将以Qwen-72B-Chat为例,介绍如何在PAI平台的快速开始PAI-QuickStart和交互式建模工具PAI-DSW中高效微调千问大模型。
|
5月前
|
机器学习/深度学习 JSON 并行计算
10分钟微调,让0.6B模型媲美235B模型!免费体验进行中
本方案介绍如何通过模型蒸馏技术,利用大参数模型生成数据并微调小参数模型(如 Qwen3-0.6B),使其在特定任务(如从一句话中提取结构化信息)中达到接近大模型的效果。通过 GPU 云服务器进行高效微调,结合魔搭社区的 ms-swift 框架,用户可快速完成模型训练与部署,显著提升推理速度并降低成本。方案包含详细步骤:数据准备、模型微调、效果验证及部署建议,并提供免费试用资源,助力开发者快速上手实践。
10分钟微调,让0.6B模型媲美235B模型!免费体验进行中
|
2月前
|
机器学习/深度学习 人工智能 API
用Macbook微调Qwen3!手把手教你用微调给Qwen起一个新名字
本文介绍如何在MacBook上使用苹果MLX框架高效微调Qwen3大模型。借助MLX的高性能计算与统一内存架构,仅需2分钟即可完成训练,内存占用低至2GB,推理速度达400 Token/s,并支持快速部署为本地API服务,展现Mac轻薄本的强大AI生产力潜力。
968 16
用Macbook微调Qwen3!手把手教你用微调给Qwen起一个新名字
|
1月前
|
人工智能 自然语言处理 机器人
中小企业也能玩转大模型:把AI搬到自己机房里不是梦
中小企业也能玩转大模型:把AI搬到自己机房里不是梦
384 3
|
4月前
|
文字识别 算法 语音技术
基于模型蒸馏的大模型文案生成最佳实践
本文介绍了基于模型蒸馏技术优化大语言模型在文案生成中的应用。针对大模型资源消耗高、部署困难的问题,采用EasyDistill算法框架与PAI产品,通过SFT和DPO算法将知识从大型教师模型迁移至轻量级学生模型,在保证生成质量的同时显著降低计算成本。内容涵盖教师模型部署、训练数据构建及学生模型蒸馏优化全过程,助力企业在资源受限场景下实现高效文案生成,提升用户体验与业务增长。
632 23
|
2月前
|
人工智能 文字识别 并行计算
为什么别人用 DevPod 秒启 DeepSeek-OCR,你还在装环境?
DevPod 60秒极速启动,一键运行DeepSeek OCR大模型。告别环境配置难题,云端开箱即用,支持GPU加速、VSCode/Jupyter交互开发,重塑AI原生高效工作流。
709 35
|
7月前
|
智能硬件
《Code to All-Stack|Bolt.diy 一步搞定创意建站》获奖名单公布!
《Code to All-Stack|Bolt.diy 一步搞定创意建站》获奖名单公布!
162 0