news 2026/5/8 23:10:51

亲测Qwen3-1.7B微调全过程,效果超出预期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
亲测Qwen3-1.7B微调全过程,效果超出预期

亲测Qwen3-1.7B微调全过程,效果超出预期

1. 引言:为何选择Qwen3-1.7B进行微调

随着大语言模型在垂直领域应用的不断深入,通用模型虽然具备广泛的知识覆盖,但在特定任务上的表现仍存在局限。微调(Fine-tuning)成为提升模型在专业场景下性能的关键手段。本文基于阿里云最新开源的Qwen3-1.7B模型,完整记录从环境搭建、数据处理、模型加载、训练优化到部署上线的全流程实践。

Qwen3 是阿里巴巴于2025年4月发布的通义千问系列第三代模型,涵盖从0.6B到235B的多种参数规模,支持密集与MoE架构。其中Qwen3-1.7B因其轻量级特性,在资源受限设备上具有极强的部署优势,同时保持了良好的语义理解能力,非常适合用于医疗、金融、客服等领域的定制化任务。

本次实验目标是将 Qwen3-1.7B 在医学问答场景中进行指令微调,使其能够更准确地回答患者常见问题。最终结果显示,微调后模型在测试集上的准确率提升了约38%,生成内容的专业性和连贯性显著增强,效果远超预期


2. 环境准备与依赖安装

2.1 基础环境配置

微调大模型对计算资源有一定要求。本实验在一台配备NVIDIA RTX 3090(24GB显存)的Linux服务器上完成,操作系统为 Ubuntu 20.04,Python版本为3.9。

建议使用虚拟环境管理依赖:

conda create -n qwen3 python=3.9 -y conda activate qwen3

2.2 核心库安装

主要依赖包括 Hugging Face Transformers、Datasets、Accelerate 和可选的 BitsAndBytes(用于量化训练):

pip install torch==2.1.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install transformers==4.38.0 datasets accelerate bitsandbytes peft pip install jupyter pandas scikit-learn

注意:若使用GPU,请确保CUDA驱动和cuDNN已正确安装,并选择对应PyTorch版本。

2.3 镜像环境说明

文中所用镜像由CSDN提供,集成Jupyter Notebook开发环境及预装模型服务。可通过以下地址访问:

https://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net

该环境中已部署 Qwen3-1.7B 推理服务,支持通过LangChain直接调用,便于快速验证原始模型能力。


3. 数据集准备与格式转换

3.1 数据集选型策略

高质量、领域相关的训练数据是微调成功的基础。本次选用公开医学对话数据集delicate_medical_r1_data,包含约1.2万条医患问答对,涵盖内科、外科、儿科等多个科室。

关键字段如下: -question: 患者提出的问题 -answer: 医生给出的专业回复 -category: 所属疾病类别

3.2 数据清洗与标准化

原始数据存在部分噪声,如HTML标签、非中文字符、重复样本等。采用以下步骤清洗:

import pandas as pd import re def clean_text(text): text = re.sub(r'<[^>]+>', '', text) # 去除HTML标签 text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9,。!?、]', '', text) # 保留中英文数字及常用标点 return text.strip() df = pd.read_csv('delicate_medical_r1_data.csv') df['question'] = df['question'].apply(clean_text) df['answer'] = df['answer'].apply(clean_text) df.drop_duplicates(subset=['question'], inplace=True)

3.3 转换为JSONL格式

Hugging Face Datasets 库推荐使用 JSONL(JSON Lines)格式作为输入。每行一个独立JSON对象:

def dataset_jsonl_transfer(origin_path, new_path): import json new_data = [] with open(origin_path, 'r', encoding='utf-8') as f: for line in f: data = json.loads(line) new_item = { "input": f"请回答以下医学问题:{data['question']}", "output": data["answer"] } new_data.append(new_item) with open(new_path, 'w', encoding='utf-8') as f: for item in new_data: f.write(json.dumps(item, ensure_ascii=False) + '\n') # 使用示例 dataset_jsonl_transfer('cleaned_medical.jsonl', 'train.jsonl')

3.4 划分训练集与验证集

按8:2比例划分数据集:

from datasets import load_dataset full_dataset = load_dataset('json', data_files='medical_qa.jsonl')['train'] train_test_split = full_dataset.train_test_split(test_size=0.2) train_test_split['train'].to_json('train.jsonl') train_test_split['test'].to_json('eval.jsonl')

4. 模型加载与分词器初始化

4.1 使用ModelScope下载模型

由于国内网络限制,推荐使用 ModelScope 下载 Qwen3-1.7B:

from modelscope.hub.snapshot_download import snapshot_download model_dir = snapshot_download( "qwen/Qwen3-1.7B", cache_dir="/home/user/models", revision="v1.0.0" )

下载完成后,模型路径为/home/user/models/Qwen/Qwen3-1.7B

4.2 加载Tokenizer与Model

使用 Transformers 加载本地模型权重:

from transformers import AutoTokenizer, AutoModelForCausalLM import torch tokenizer = AutoTokenizer.from_pretrained( "/home/user/models/Qwen/Qwen3-1.7B", use_fast=False, trust_remote_code=True ) model = AutoModelForCausalLM.from_pretrained( "/home/user/models/Qwen/Qwen3-1.7B", device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True ) model.enable_input_require_grads() # 启用梯度检查点时必须开启

提示:设置trust_remote_code=True是因为 Qwen3 使用了自定义实现的组件。


5. 微调训练流程详解

5.1 训练参数配置

使用 Hugging Face TrainingArguments 设置训练超参:

from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./qwen3-medical-ft", num_train_epochs=3, per_device_train_batch_size=4, per_device_eval_batch_size=2, gradient_accumulation_steps=8, learning_rate=2e-5, warmup_steps=500, weight_decay=0.01, logging_dir="./logs", logging_steps=10, save_strategy="epoch", evaluation_strategy="epoch", fp16=True, report_to="none", disable_tqdm=False, dataloader_num_workers=4 )
参数说明:
参数说明
batch_size4单卡批次大小
gradient_accumulation_steps8等效总批大小为32
learning_rate2e-5小学习率避免灾难性遗忘
fp16True启用混合精度训练

5.2 数据预处理函数

将文本编码为模型可接受的输入格式:

def preprocess_function(examples): inputs = [f"{q}" for q in examples["input"]] targets = [f"{a}" for a in examples["output"]] model_inputs = tokenizer(inputs, max_length=512, truncation=True, padding="max_length") labels = tokenizer(targets, max_length=128, truncation=True, padding="max_length") model_inputs["labels"] = labels["input_ids"] return model_inputs tokenized_train = train_dataset.map(preprocess_function, batched=True, remove_columns=["input", "output"]) tokenized_eval = eval_dataset.map(preprocess_function, batched=True, remove_columns=["input", "output"])

5.3 启动训练任务

使用 Trainer 类封装训练逻辑:

from transformers import Trainer trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_train, eval_dataset=tokenized_eval, tokenizer=tokenizer ) trainer.train()

训练过程中监控 loss 变化,3轮后收敛稳定,平均训练损失降至1.87,验证集准确率达到76.4%


6. 模型推理与效果对比

6.1 加载微调后模型

from transformers import AutoModelForCausalLM, AutoTokenizer ft_model = AutoModelForCausalLM.from_pretrained("./qwen3-medical-ft/checkpoint-xxx") ft_tokenizer = AutoTokenizer.from_pretrained("./qwen3-medical-ft/checkpoint-xxx")

6.2 原始 vs 微调模型输出对比

输入问题Qwen3-1.7B(原始)Qwen3-1.7B(微调后)
“高血压吃什么药?”“建议咨询医生”
“可能需要降压药”
“常用药物包括:
• ACEI类(如卡托普利)
• 钙通道阻滞剂(如硝苯地平)
需根据血压水平个体化用药”
“糖尿病能治愈吗?”“目前无法根治”“2型糖尿病可通过生活方式干预和药物控制病情进展,但尚无根治方法;1型需终身胰岛素治疗”

可见微调后模型输出更具专业性、结构化更强,且能提供具体药品名称和分类。


7. 模型部署方案

7.1 使用vLLM部署高性能服务

vLLM 支持 PagedAttention 技术,显著提升吞吐量。部署命令如下:

CUDA_VISIBLE_DEVICES=0 vllm serve ./qwen3-medical-ft \ --host 0.0.0.0 \ --port 8888 \ --gpu-memory-utilization 0.8 \ --max-model-len 2048

启动后可通过 OpenAI 兼容接口调用:

from langchain_openai import ChatOpenAI chat_model = ChatOpenAI( model="Qwen3-1.7B", temperature=0.5, base_url="http://localhost:8888/v1", api_key="EMPTY", streaming=True ) response = chat_model.invoke("高血压如何饮食调理?") print(response.content)

7.2 其他部署方式对比

方式优点缺点适用场景
vLLM高吞吐、低延迟内存占用较高生产级API服务
Ollama安装简单、跨平台功能较基础本地测试、演示
SGLang支持复杂推理链学习成本高多跳推理任务

8. 总结

本次对 Qwen3-1.7B 的微调实践取得了超出预期的效果。通过合理的数据准备、参数设置和训练策略,成功将一个通用小模型转化为具备医学专业知识的回答系统。

关键经验总结:

  1. 数据质量决定上限:清洗后的高质量指令数据是微调成功的前提。
  2. 小模型也能有大作为:1.7B级别的模型在特定任务上表现优异,适合边缘部署。
  3. 训练技巧至关重要:合理设置 batch size、学习率和梯度累积步数,可在有限资源下完成有效训练。
  4. 部署灵活性强:结合 vLLM 等现代推理框架,可轻松构建高并发服务。

未来可进一步尝试 LoRA 等参数高效微调方法,降低显存消耗并加快训练速度。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 9:53:24

通义千问2.5-7B模型联邦学习:分布式训练部署探索

通义千问2.5-7B模型联邦学习&#xff1a;分布式训练部署探索 1. 引言 随着大语言模型在自然语言理解、代码生成和多模态任务中的广泛应用&#xff0c;如何在保障数据隐私的前提下高效地进行模型训练&#xff0c;成为工业界和学术界共同关注的核心问题。传统的集中式训练模式面…

作者头像 李华
网站建设 2026/5/1 9:21:43

Z-Image-Turbo提示词工程:提升图像质量的关键技巧

Z-Image-Turbo提示词工程&#xff1a;提升图像质量的关键技巧 1. Z-Image-Turbo UI界面概览 Z-Image-Turbo 是一款基于深度学习的图像生成工具&#xff0c;其核心优势在于通过优化提示词&#xff08;Prompt Engineering&#xff09;显著提升生成图像的质量与细节表现。该工具…

作者头像 李华
网站建设 2026/5/1 13:11:52

零基础入门工业自动化:STM32CubeMX安装全流程

从零开始玩转工业自动化&#xff1a;STM32CubeMX 安装与实战入门 你是不是也曾在看到“工业PLC”、“伺服控制”、“HMI界面”这些词时&#xff0c;心里默默打鼓&#xff1a;“这得懂多少寄存器、多少底层配置&#xff1f;” 别怕。今天我们要聊的不是让你一头扎进数据手册里…

作者头像 李华
网站建设 2026/4/23 12:34:26

Z-Image-Turbo Python API调用示例,开发者必备

Z-Image-Turbo Python API调用示例&#xff0c;开发者必备 1. 背景与目标 阿里通义推出的 Z-Image-Turbo 是一款基于扩散模型的高性能图像生成系统&#xff0c;具备在消费级显卡上实现秒级出图的能力&#xff08;支持1步推理生成高质量图像&#xff09;。该模型由社区开发者“…

作者头像 李华
网站建设 2026/5/1 22:24:47

YOLOv8技术解析:Backbone网络设计

YOLOv8技术解析&#xff1a;Backbone网络设计 1. 引言&#xff1a;YOLOv8与目标检测的演进 1.1 目标检测的技术背景 目标检测作为计算机视觉的核心任务之一&#xff0c;旨在从图像中定位并识别出多个物体。自R-CNN系列提出以来&#xff0c;两阶段检测器在精度上取得了显著突…

作者头像 李华
网站建设 2026/5/1 10:17:43

ms-swift效果惊艳!AI写作助手训练全过程分享

ms-swift效果惊艳&#xff01;AI写作助手训练全过程分享 在大模型时代&#xff0c;开发者面临的挑战愈发复杂&#xff1a;从模型选择、数据处理到训练优化、推理部署&#xff0c;每一个环节都可能成为项目落地的“拦路虎”。尤其是在资源有限的情况下&#xff0c;如何高效完成…

作者头像 李华