在AI技术飞速发展的今天,大语言模型(LLM)已经渗透到各行各业。然而,通用大模型虽然能力强大,但直接用于垂直领域往往效果不佳——它们缺乏对特定术语、业务流程或回答风格的深度理解。而微调(Fine-tuning) ,正是让通用大模型“学会说你的语言”的关键手段。本文基于学习实践整理了一份完整的多卡微调笔记,涵盖环境搭建、数据准备、2卡LoRA微调、推理测试和部署上线全流程,希望能帮助正在尝试模型微调的开发者们少走一些弯路。
大语言模型通常在海量通用语料上进行预训练,掌握语言的语法结构、基本常识和逻辑推理能力,这个过程产出的基座模型好比一位学识渊博的“通才”。但通才也有局限:
知识泛化但不精准:知道“客服”是什么,但不知道你公司的具体退换货政策。
风格不匹配:回答过于学术,而你可能需要简洁、口语化的话术。
领域术语缺失:医疗、金融、法律等专业词汇未充分覆盖。
微调,正是为了解决这些问题而生。它通过使用高质量、小规模、有标注的特定领域数据集,对基座模型进行针对性的再训练,让模型从“通才”转变为精通某一领域的“专家”。想象一下:你是一名法律从业者,需要模型准确理解法律条文;或者是一名医生,希望模型能给出专业的医疗建议——微调就能让通用模型“专精”这些领域。
在动手之前,先了解主流的微调方法,有助于选择最适合你场景的技术路径。
传统方式,更新所有模型参数,效果最好。但成本极高——以Llama-7B为例,全参数微调需要80GB以上的GPU显存,普通开发者很难负担。
目前工业界的主流选择,仅更新模型的一小部分参数,大幅降低计算和存储成本。
LoRA(Low-Rank Adaptation) :在原始模型旁边添加低秩分解的适配器,训练时只更新适配器参数,训练完成后可与原模型合并,不增加推理延迟。
QLoRA(Quantized LoRA) :在LoRA基础上叠加4-bit量化,可将显存需求进一步降低。使用QLoRA后,16GB显存的GPU也能胜任Qwen3.5-9B的微调。
一句话总结:资源充足追求极致效果,选全参数微调;想用消费级显卡低成本训练,选LoRA/QLoRA。
以下是基于2卡分布式训练的完整环境搭建流程,基于MS-SWIFT框架和DeepSpeed ZeRO-2方案,已在实际项目中验证通过。
这部分参考 https://mp.weixin.qq.com/s/X6iZxAsi1atczliTsGuc7w
# 创建新环境conda create -n swift python=3.11 -y# 激活环境conda activate swift
# MS-SWIFT框架pip install uvuv pip install -U ms-swift# Transformers和相关库uv pip install -U "transformers==5.2.0" "qwen_vl_utils>=0.0.14" peft liger-kernel# Flash-Linear-Attention(请安装main分支)uv pip install -U git+https://github.com/fla-org/flash-linear-attention# Causal-Conv1dpip install -U git+https://github.com/Dao-AILab/causal-conv1d --no-build-isolation# Flash-Attention(可跳过,安装耗时约3小时,不安装也能训练)uv pip install "flash-attn==2.8.3" --no-build-isolation# DeepSpeed(多卡训练必须安装)uv pip install deepspeed# vLLM(推理部署可选,可暂时不安装)uv pip install -U "vllm>=0.17.0"# 再安装一遍transformers,防止vLLM版本覆盖uv pip install transformers==5.2.0
⚠️
transformers==5.3.0目前会报错,已实测验证,请务必使用transformers==5.2.0版本。✅ 如果安装了vLLM,训练前需要覆盖其默认版本,再次安装一遍
transformers==5.2.0。✅ 多卡训练必须安装DeepSpeed。
# 查看swift命令行工具swift sft --help# 如果能显示帮助信息,说明安装成功# 验证DeepSpeed安装ds_report# 应显示DeepSpeed版本和CUDA信息
MS-SWIFT框架简介:MS-SWIFT是阿里云ModelScope联合微软推出的大模型开发工具包,核心定位是低代码、高效、通用的大模型微调/推理框架。它集成了LoRA、QLoRA等多种微调策略,并深度对接vLLM实现高性能推理服务。
MS-SWIFT支持多种数据格式,以下是几种常用的文本数据格式。
{"messages": [{"role": "user", "content": "中国的首都是哪个城市?"},{"role": "assistant", "content": "中国的首都是北京市。"}]}
{"messages": [{"role": "system", "content": "你是一个专业的AI助手"},{"role": "user", "content": "xxx"},{"role": "assistant", "content": "xxxx"},{"role": "user", "content": "xxxxxx"},{"role": "assistant", "content": "xxxxxxxx"}]}
说明:支持多轮对话历史;system角色可选,用于设置助手行为;对话轮次不限。
根据目标领域收集相关数据,例如:
法律领域:法律条文、案例解析、合同范本
医疗领域:医学文献、诊疗指南、医患对话
金融领域:财经新闻、财报分析、投资策略
数据清洗注意事项:
去除敏感信息和隐私数据
统一格式和术语
确保数据的准确性和专业性
保持适当的多样性
建议准备至少1000~5000条高质量样本,数据质量远比数量更重要。
对于Qwen3.5-9B这样的90亿参数模型,单卡显存往往不够用。使用QLoRA等高效微调技术后,16GB显存可以勉强运行,但训练速度和batch size都会受限。多卡分布式训练可以通过数据并行(DDP)或ZeRO优化来分散显存压力,大幅提升训练效率。
DeepSpeed是微软开源的大模型训练优化库,其ZeRO(Zero Redundancy Optimizer)技术通过分片优化器状态、梯度和参数来降低显存占用。ZeRO-2是平衡版,分片优化器状态和梯度,保留参数副本,是2卡训练的常用配置。
CUDA_VISIBLE_DEVICES=0,1 \NPROC_PER_NODE=2 \swift sft \--model Qwen/Qwen3.5-4B \--dataset /path/to/your/dataset.jsonl \--tuner_type lora \--lora_rank 8 \--lora_alpha 32 \--output_dir ./output \--num_train_epochs 3 \--per_device_train_batch_size 1 \--gradient_accumulation_steps 8 \--learning_rate 1e-4 \--warmup_ratio 0.1 \--logging_steps 10 \--save_steps 500 \--eval_steps 500 \--deepspeed ds_config.json
其中ds_config.json配置文件示例:
{"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","gradient_accumulation_steps": "auto","zero_optimization": {"stage": 2,"allgather_partitions": true,"allgather_bucket_size": 2e8,"overlap_comm": true,"reduce_scatter": true,"reduce_bucket_size": 2e8,"contiguous_gradients": true},"fp16": {"enabled": true}}
| 参数 | 含义 | 建议值 |
|---|---|---|
lora_rank | LoRA低秩矩阵维度 | 8~64,越大效果越好但参数量越大 |
lora_alpha | LoRA缩放系数 | 通常设为rank的2~4倍 |
per_device_train_batch_size | 每卡训练batch大小 | 根据显存调整,通常1~4 |
gradient_accumulation_steps | 梯度累积步数 | 等效batch = 每卡batch × 卡数 × 累积步数 |
learning_rate | 学习率 | LoRA推荐1e-4左右 |
训练完成后,需要将LoRA适配器权重与原始模型合并:
swift export \--model Qwen/Qwen3.5-4B \--adapters ./output/checkpoint-xxx \--merge_lora true \--output_dir ./merged_model
vLLM是一个高性能推理引擎,支持PagedAttention等技术,大幅提升推理吞吐量。部署命令如下:
# 安装vLLMpip install vllm# 启动API服务python -m vllm.entrypoints.openai.api_server \--model ./merged_model \--served-model-name qwen3.5-4b-ft \--tensor-parallel-size 2 \--host 0.0.0.0 \--port 8000
curl http://localhost:8000/v1/completions \-H "Content-Type: application/json" \-d '{"model": "qwen3.5-4b-ft","prompt": "你好,请介绍一下自己","max_tokens": 100}'
解决方案:强制指定transformers==5.2.0。如果安装了vLLM,其默认版本会覆盖transformers,需要在安装vLLM后再次安装一遍transformers 5.2.0。
解决方案:
确认DeepSpeed已正确安装:ds_report
检查CUDA_VISIBLE_DEVICES设置是否正确
确保所有卡都可访问:nvidia-smi
解决方案:
使用QLoRA(4-bit量化)代替LoRA
减小per_device_train_batch_size
增加gradient_accumulation_steps
启用梯度检查点(Gradient Checkpointing)
解决方案:
检查数据质量,确保指令-输出对齐
调整学习率(LoRA通常1e-4,全参数微调1e-5~5e-5)
增加训练epoch或数据量
适当提高LoRA rank
解决方案:
使用vLLM替代原生transformers推理
启用FP16/INT8量化
使用tensor parallelism多卡并行推理
本文从为什么需要微调讲起,系统梳理了从环境搭建、数据准备、2卡LoRA微调到推理部署的全流程。几点总结:
数据质量大于数量:1000条高质量标注数据的效果往往胜过10000条杂乱数据。
LoRA是最友好的入门选择:参数少、显存小、效果好,值得作为微调的首选方案。
多卡训练要重视DeepSpeed:它让分布式训练的门槛大大降低,ZeRO-2就能覆盖绝大多数场景。
版本锁死是救命良药:transformers、vLLM等关键依赖务必锁定稳定版本,避免版本兼容问题浪费时间。
从轻量级开始:推荐先从Qwen3.5-0.8B或2B小模型开始尝试,熟悉流程后再挑战更大模型。
Qwen3.5多卡微调全流程(非常详细),https://gitcode.csdn.net/69c0d85d54b52172bc6379c9.html(GitCode)
Qwen3.5-9B模型微调实战:使用自有数据定制专属领域模型,https://blog.csdn.net/weixin_35294091/article/details/159937650(CSDN)
Qwen3.5 0.8B/2B/4B/9B 小模型本地部署指南,微调教程,https://cloud.tencent.com/developer/article/2634241(腾讯云开发者社区)
大模型微调实战指南:从零开始定制你的专属 LLM,https://developer.aliyun.com/article/1687402(阿里云开发者)
〖大模型微调〗一文掌握5种大模型微调的方法,https://cloud.tencent.com.cn/developer/article/2580416(腾讯云开发者社区)
AI大模型算法-从大模型原理剖析到训练(微调)落地实战,https://cloud.tencent.com.cn/developer/article/2561134(腾讯云开发者社区)
基于ms-swift框架微调多模态模型,http://www.51testing.com/mobile/view.php?itemid=7808984(51Testing)
使用ms-swift训练序列分类任务模型的完整流程,http://www.51testing.com/html/46/n-7809246.html(51Testing)
Qwen3.5 Usage Guide - vLLM Documentation,https://docs.vllm.ai(vLLM官方文档)
Qwen3.5 多卡微调全流程:从环境安装到微调训练以及部署上线 ,https://mp.weixin.qq.com/s/X6iZxAsi1atczliTsGuc7w