Qwen3.5-4b二次微调实战:LoRA训练、显存优化与部署排查
这次我们来看一个非常具体的话题微调 Qwen3.5-4b 模型而且是第二次尝试。如果你之前已经跑过一次微调但结果不理想或者卡在了显存、数据格式、训练不收敛这些环节上那这篇文章会给出一个比较完整的复盘思路和可以照做的流程。重点不是堆概念而是把“怎么在本地把 Qwen3.5-4b 微调起来、怎么验证效果、遇到问题怎么排查”讲清楚。先说结论4B 级别的模型微调最大的价值是硬件门槛相对可控。相比 7B、14B 甚至更大规模的模型4B 模型在显存占用、训练耗时和推理成本上都更适合个人开发者先跑通流程。微调方式建议优先选 LoRA而不是全参微调。原因很简单LoRA 只训练一小部分低秩矩阵参数显存占用大幅下降最终效果在垂直场景下往往也够用。文章会覆盖环境准备、数据集格式、LoRA 训练命令、合并导出、接口调用、批量推理、性能观察和常见坑内容按实操顺序展开。如果你正在纠结“微调还是 RAG”“全参微调与 LoRA 对显存要求差多少”“微调完怎么导入 LM Studio/Ollama 这类工具”这篇文章也可以作为一份参考。下面直接进入正题。1. 核心能力速览先给一张规格表快速判断这项微调实验的定位和投入产出。能力项说明微调对象Qwen3.5-4b约 4B 参数规模的开源语言模型以实际下载到的权重版本为准推荐微调方式LoRA / QLoRA 优先全参微调需更高显存不建议第一次尝试就直接全参显存需求以 4B 模型 LoRA 估算FP16 权重约 8GB训练时叠加梯度和优化器状态通常建议 12GB 以上显存实际占用需按本机测试支持平台Windows / Linux 均可Linux 下 CUDA 环境更稳定启动方式训练阶段用命令行脚本部署阶段可选 Ollama、LM Studio、vLLM 或直接 Python 加载数据集格式推荐 Alpaca 格式的 JSON / JSONL也可用 ShareGPT 格式是否支持 API微调完成并转换导出后可通过 Ollama / vLLM 暴露 OpenAI 兼容接口是否支持批量任务可以训练阶段支持多轮 epoch推理阶段可通过脚本批量处理测试样本适合场景领域问答、意图识别、文本分类、风格改写、垂直知识库增强等需要注意一点项目标题写的是 Qwen3.5-4b但不同渠道提供的权重版本可能不一致。更稳妥的做法是先去模型仓库确认当前可用的 4B 级别 Qwen 权重再按对应版本拉取。如果找不到完全同名的权重文件可以用同系列相近规模的模型做流程验证训练脚本和评估方法基本一致。2. 适用场景与使用边界2.1 适合谁这套流程适合以下人群已经跑通过一次简单微调但效果不稳定想复盘重来的人。想在垂直领域里做一个私有问答模型但不想直接用 API、希望数据不出本地的开发者。显存不大比如 12GB 到 24GB 显卡想验证 LoRA 微调效果的学生或算法工程师。需要把模型接入自动化管线比如批量打标签、内容分类、客服意图识别等场景。2.2 能解决什么问题微调的核心目的是改变模型在特定任务上的行为。Qwen3.5-4b 这类基座模型虽然通用能力不错但在专业术语、特定格式、私有知识、风格一致性上不一定满足业务要求。通过 LoRA 微调可以用几百到几千条高质量样本让模型在特定任务上的表现明显提升。2.3 不适合什么场景微调不是万能的。如果只是想给模型补充实时更新的知识RAG检索增强生成的成本更低、更容易维护。如果任务本身很简单比如固定的关键词映射直接用规则脚本可能比微调更稳。如果数据量只有几十条微调效果大概率不稳定不如先用提示词工程测试。2.4 合规与安全边界微调涉及模型权重和训练数据必须注意以下几点训练数据要确认来源合法涉及用户隐私、版权文本、人脸信息、声音样本时必须脱敏和授权。微调后的模型部署为 API 服务时要限制访问范围避免被未授权调用。不要用微调模型生成违法、虚假、诱导性或侵犯他人权益的内容。如果模型用于商业发布需要核对基座模型的开源协议和衍生模型分发要求。3. 环境准备与前置条件微调 Qwen3.5-4b 之前先检查环境。这里不写死具体版本因为不同训练框架、不同 CUDA 版本兼容性有差异给出通用检查清单更可靠。3.1 硬件检查训练的核心瓶颈是显存。4B 模型 LoRA 微调建议显存不低于 12GB16GB 以上会更舒服。显存不够时可以通过 QLoRA4bit 量化加载把占用压到更低但训练速度会下降。GPU 型号方面NVIDIA 显卡优先因为 CUDA 生态最成熟。AMD 显卡和 Apple Silicon 也可以跑但坑更多。如果本机只有 CPU理论可以跑推理但训练 4B 模型不建议耗时太长。3.2 软件环境需要准备Python 3.10 或更高版本。NVIDIA 驱动和 CUDA 工具包。驱动版本决定 CUDA 可用版本建议先装好驱动再安装对应版本的 PyTorch。PyTorch 2.x安装时选择支持 CUDA 的版本。微调框架常见选择是 LLaMA-Factory、ms-swift 或 transformers peft trl。模型权重文件从官方或镜像仓库下载。磁盘空间。4B 模型 FP16 权重约 8GB训练中间产物、LoRA 适配器、合并后的模型都需要额外空间预算 30GB 以上比较稳。3.3 端口与目录训练阶段一般不涉及端口但部署阶段会。Ollama 默认端口是 11434LM Studio 默认端口可能需要手动开启。如果端口被占用训练完再排查。建议建立如下目录结构qwen3.5-4b-finetune/ ├── data/ # 训练数据 ├── eval_data/ # 评测数据 ├── models/ # 原始模型权重 ├── output/ # LoRA 适配器和日志 ├── merged/ # 合并后的完整权重 └── scripts/ # 训练、推理、接口脚本4. 安装部署与启动方式4.1 创建虚拟环境先隔离 Python 环境避免依赖冲突。conda create -n qwen-finetune python3.10 -y conda activate qwen-finetune4.2 安装 PyTorch以 CUDA 12.1 为例安装命令如下。实际版本需要根据本机 CUDA 版本调整推荐到 PyTorch 官网生成安装命令。pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121注意download.pytorch.org 是官方 PyTorch 下载源安装时如果网络不稳定可以换用国内镜像源。但换源时不要混用不可信的第三方源优先使用 pip 官方镜像或 PyTorch 官方源。4.3 安装微调框架这里以 LLaMA-Factory 为例因为它对 Qwen 系列支持比较好命令行和 WebUI 都能用。git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .如果只需要特定功能可以只安装 peft、transformers、datasets、acceleratepip install transformers datasets accelerate peft4.4 下载模型权重从模型仓库下载 Qwen3.5-4b 权重。具体路径以实际仓库为准可以保存到models/目录下。# 示例真实路径以官方仓库说明为准 # huggingface-cli download 模型ID --local-dir models/qwen3.5-4b如果 Hugging Face 访问不稳定可以使用国内镜像站下载。下载完成后务必检查权重文件是否完整常见问题是从中断导致文件缺失。4.5 使用一键脚本启动训练LLaMA-Factory 提供了命令行入口下面是一个通用训练脚本模板需要按实际项目路径调整cd LLaMA-Factory python src/train_bash.py \ --model_name_or_path ../models/qwen3.5-4b \ --dataset_dir ../data \ --dataset alpaca_zh_train \ --finetuning_type lora \ --output_dir ../output/qwen3.5-4b-lora \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --learning_rate 1e-4 \ --num_train_epochs 3.0 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 200 \ --save_total_limit 2 \ --fp16训练启动后日志会打印 loss 变化。如果 loss 持续下降说明数据加载和训练流程正常。如果 loss 直接变成 NaN 或乱跳需要检查学习率、数据集格式和混合精度设置。5. 功能测试与效果验证训练完成只是第一步效果验证才是判断微调是否成功的关键。5.1 数据集验证先确认数据格式。LLaMA-Factory 的 Alpaca 格式如下[ { instruction: 解释一下什么是LoRA微调, input: , output: LoRA 是一种参数高效微调方法只训练低秩矩阵减少显存占用。 } ]数据准备好后可以用 datasets 库先读取一遍检查是否有空值、格式错误、字段缺失。import json with open(data/alpaca_zh_train.json, r, encodingutf-8) as f: data json.load(f) print(f样本数量: {len(data)}) print(data[0])5.2 训练前基线测试微调前先用原始 Qwen3.5-4b 测一批问题记录回答内容。训练后同一个问题再测一遍对比差异。没有对比很难判断微调是否真的改变了模型行为。5.3 微调后推理验证LoRA 训练完成后可以先用加载适配器的方式做推理不一定要立刻合并权重。from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel base_model_path models/qwen3.5-4b adapter_path output/qwen3.5-4b-lora tokenizer AutoTokenizer.from_pretrained(base_model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( base_model_path, trust_remote_codeTrue, device_mapauto ) model PeftModel.from_pretrained(model, adapter_path) prompt 你的领域内测试问题 inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokens256) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))5.4 合并导出如果需要在 LM Studio、Ollama 或其他工具中使用建议把 LoRA 适配器合并回基础模型导出完整权重。python src/export_model.py \ --model_name_or_path ../models/qwen3.5-4b \ --adapter_name_or_path ../output/qwen3.5-4b-lora \ --template qwen \ --finetuning_type lora \ --export_dir ../merged/qwen3.5-4b-sft5.5 效果评估效果评估建议分成几个维度领域术语是否准确。输出格式是否符合预期比如是否按要求的 JSON 结构输出。多轮对话是否保持稳定有没有答非所问。知识边界是否清楚不懂的问题是否诚实拒绝而不是编造。与原始模型对比同一批问题下是否变好。如果这一轮微调效果依然不理想不要急着调参先检查数据质量。数据噪声、指令和回答不匹配、字段格式错误是最常见的失败原因。6. 接口 API 调用示例微调完成并合并导出后模型可以部署成接口服务。6.1 使用 Ollama 导入Ollama 支持导入 GGUF 格式的模型。先把合并后的权重转换成 GGUF再写入 Modelfile。转换工具和导入命令以 Ollama 官方文档为准核心流程如下。ollama create qwen3.5-4b-sft -f Modelfile ollama serve6.2 OpenAI 兼容接口调用如果模型已通过 Ollama 或 vLLM 启动且端口为 11434可以用 requests 调用。import requests url http://127.0.0.1:11434/v1/chat/completions payload { model: qwen3.5-4b-sft, messages: [ {role: user, content: 测试问题} ], temperature: 0.7, max_tokens: 512 } response requests.post(url, jsonpayload, timeout120) print(response.json()[choices][0][message][content])使用 vLLM 部署时接口路径和参数会有一点差异但整体结构类似。需要提醒的是示例中的 IP、端口、模型名要按实际服务配置修改不能直接照抄。7. 批量任务与资源占用观察7.1 批量推理脚本接口测试通过后可以写一个批量推理脚本逐行读取测试问题并保存结果。import json import requests questions [ 问题1, 问题2, 问题3 ] results [] for q in questions: resp requests.post( http://127.0.0.1:11434/v1/chat/completions, json{ model: qwen3.5-4b-sft, messages: [{role: user, content: q}], max_tokens: 512 }, timeout120 ) answer resp.json()[choices][0][message][content] results.append({question: q, answer: answer}) print(q, answer) with open(eval_results.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2)批量任务建议加两点一是失败重试二是日志记录。脚本中加入try/except失败时保存错误信息避免一两个请求失败导致整个任务中断。7.2 显存占用观察训练和推理阶段都要关注显存。Linux 下用 nvidia-smi 实时查看watch -n 1 nvidia-smiWindows 下可以用任务管理器或 GPU-Z 查看。训练时显存占用是动态的重点关注几个节点加载模型后、训练开始后、梯度累积峰值时。如果出现 OOM优先降低 batch size、缩短序列长度、减少max_length或者启用梯度检查点。7.3 全参微调与 LoRA 的显存差异全参微调需要保存梯度、优化器状态和中间激活值显存开销远高于 LoRA。以 4B 模型为例全参微调在 24GB 显存上依然很紧张LoRA 则可以在 12GB 到 16GB 显存上顺利训练。这也是微调第一次尝试时强烈建议先用 LoRA 的原因。7.4 推理阶段性能推理性能和以下因素有关显卡算力显存带宽影响更大。输入长度越长耗时越大。max_new_tokens生成长度越长越慢。并发数高并发需要更大的显存和显存带宽。如果是个人验证单并发足够。如果要作为业务服务建议用 vLLM 这类推理加速框架并做压测。8. 常见问题与排查方法围绕“微调 Qwen3.5-4b 模型第二次尝试”这个主题下面按问题现象整理排查表。问题现象可能原因排查方式解决方案模型权重加载失败下载不完整或路径错误检查文件大小和目录结构重新下载确认--model_name_or_path指向权重目录训练启动报错缺少依赖Python 环境未激活或依赖冲突查看报错信息中的模块名重新安装对应依赖建议使用虚拟环境CUDA out of memorybatch size 太大、序列过长、显存不足查看 nvidia-smi 显存占用情况调小 batch size、开启梯度检查点、换 QLoRAloss 变成 NaN学习率过高、数据有异常值、FP16 溢出观察 loss 曲线检查数据降低学习率尝试 BF16 或关闭混合精度loss 不下降数据格式错误、学习率过低、模型没进入训练状态检查 dataset 配置和日志先用小 batch 跑一次 debug 模式确认 loss 在下降训练很慢batch size 太小、梯度累积步骤多、CPU 瓶颈查看 GPU 利用率增大 batch size显存允许时减少无效日志输出推理结果和原始模型一样LoRA 权重没加载成功或 adapter 路径错误检查 PeftModel 加载后的模型名确认 adapter 路径并对比加载前后模型输出端口 11434 被占用本地已有 Ollama 或其他服务在运行检查端口占用情况换端口启动服务或者停止占用进程接口调用返回 404模型名不对或服务未启动查看服务日志和模型列表确认模型名称与 Ollama 中一致批量任务中途卡住网络超时、GPU 资源不够、服务并发限制查看服务日志和任务日志加大 timeout加入失败重试和错误记录微调后输出中英文混杂数据中混入中英文样本或模板未指定语言检查训练数据标注统一训练数据语言推理时在 prompt 中明确输出语言9. 最佳实践与使用建议9.1 先用最小配置跑通不要上来就直接全量数据训练。先抽样几十条数据用 1 个 epoch、小 batch 跑通训练流程确认数据加载、loss 下降、推理验证等环节都正常再扩大数据量。这样排查问题的范围会小很多。9.2 训练数据质量高于数量微调效果瓶颈往往不是数据量而是数据质量。检查三点instruction 是否清晰是否包含正确答案。output 是否与 instruction 完全匹配。是否存在重复样本、矛盾样本、无意义样本。数据清洗在微调中的重要性甚至高于超参调优。9.3 记录每一次实验参数第二次尝试时一定要把第一次的实验记录找出来数据集版本、训练参数、loss 曲线、评测结果、问题现象。没有记录第二次基本等于从零开始。建议实验记录包含以下字段实验编号 基础模型版本 微调方式LoRA / QLoRA / 全参 数据集路径和样本数 batch size / 梯度累积 / 学习率 / epoch loss 最终值 评测集分数如果有 失败现象描述9.4 保留原始模型和 LoRA 适配器原始模型权重、LoRA 适配器、合并后的模型分开存放。LoRA 适配器体积只有几 MB 到几十 MB方便保留多个版本。合并后的模型体积大但可以直接部署。建议先保留 LoRA确认效果后再合并。9.5 评测集与训练集分离训练集和评测集必须分开。如果训练数据本身参与了评测指标会虚高无法判断模型是否真正学到泛化能力。9.6 部署安全设置接口服务部署时不要裸奔在公网。至少做到绑定 127.0.0.1 或内网 IP不直接绑定 0.0.0.0。如需要远程访问加访问令牌或反向代理认证。控制单次请求的最大 token 数避免资源被恶意消耗。保留访问日志方便排查和审计。10. 总结与后续扩展这次微调 Qwen3.5-4b 项目的第二次尝试核心思路是不贪大、不盲目调参、先补齐数据质量和流程验证。第一次大概率会踩坑第二次的重点应该放在“复现-诊断-修正”上。如果 loss 不降先查数据如果效果不对先比 baseline如果显存不够先上 LoRA 再考虑全参。下一步可以考虑这几个方向数据再扩充把训练集从几百条扩展到几千条观察效果是否继续提升。QLoRA 实验显存紧张时对比 QLoRA 与 LoRA 的效果差异。模型融合把多个领域适配器融合验证多任务能力。模型蒸馏用更大的模型生成训练数据蒸馏到 Qwen3.5-4b 上压缩部署成本。RAG 结合微调解决输出格式和任务风格问题RAG 补充动态知识两者结合往往比单用微调更稳。部署工具链尝试接入 LM Studio、Ollama 或 vLLM做完整的本地私有化 API 服务。微调这件事最怕的不是显存不够而是第一次失败之后没有记录、没有对比、没有方向。这篇文章就是帮你把第二次尝试的流程标准化。收藏备用下次跑微调直接按这个顺序来。