首页 / 资讯中心 / 文章详情

基于LoRA的Qwen2.5-7B微调实操:从AutoDL到模型合并

基于LoRA的Qwen2.5-7B微调实操:从AutoDL到模型合并 ★ FEATURED ARTICLE
简介面向有一定机器学习基础的研究人员和开发者这份PDF教程以Qwen2.5-7B-Instruct为例系统讲解在AutoDL平台完成大模型微调的完整路径。文档从账号注册、实名认证与4090云GPU选型开始逐步覆盖实例创建、社区镜像选择、SSH/VSCode远程连接、基于hf-mirror下载预训练模型再到LLaMA-Factory环境配置、LoRA训练、训练集格式调整、检查点使用、显存占用监控以及通过wandb搭建外部实验记录与多轮结果对比。读者按文档操作即可掌握从环境准备到训练结果留痕的主要流程并将这套流程迁移到自然语言处理任务优化、模型性能提升等实际项目中。全包为1个PDF文件压缩后约2.28MB内容包含大量截图位置说明、命令示例与踩坑提示便于边看边练。已有12452人浏览学习适合需要系统化参考的大模型应用实践者。1. 从 4090 到 Qwen2.5-7B-Instruct先搞清楚微调这件事值不值如果你手头有一个自然语言处理任务想用开源大模型做底座又不想用 API 烧钱那这条路基本绕不开「大模型微调」。我拆过不少微调项目最终落在 Qwen2.5-7B-Instruct 上的原因很简单7B 参数规模在消费级算力上勉强跑得动效果又比 3B 系列扎实一个档次。这份实操手册完整记录了从 AutoDL 租卡、装环境、下载模型到 LLaMA-Factory 跑通 LoRA 微调的全过程。适合有一点 Python 基础、熟悉 Linux 命令但没有完整跑过微调流程的研究人员和开发者。读完你能自己复现整个链路并且知道哪些环节会翻车。2. 环境搭建AutoDL 选卡、镜像与连接一小时跑通2.1 为什么 4090 是性价比之王显存、带宽与租用成本微调 Qwen2.5-7B-Instruct第一道坎是算力。自己买卡不现实租云 GPU 是最常见的做法。我一般在 AutoDL 上选 4090原因很直接24GB 显存刚好能塞下 7B 模型做 LoRA 微调。如果用全参数微调7B 模型光权重就要 14GB 以上加上优化器状态和梯度24GB 很紧张所以实际项目里 90% 的 7B 微调都走 LoRA 或 QLoRA。选卡时除了看显存还要看算力单价和卡间通信。4090 的性价比在于单卡价格低且 7B 规模根本用不到多卡并行一张卡就能跑完一个 epoch。对比 A100 或 H800单卡价格高好几倍对于单次实验反而浪费。如果你只是验证想法、跑一两个数据集4090 是当前最稳的选择。2.2 创建实例与镜像选择finetune-lab-v8 到底省了什么AutoDL 上创建实例的流程不复杂进入算力市场筛选 GPU 型号选定后点「N 卡可租」进入创建页面。这里有一个关键决策——镜像。平台提供基础镜像但基础镜像里没有微调所需的依赖装起来很折腾。社区镜像 agiclass/fine-tuning-lab/finetune-lab-v8 是专门为微调场景预装好的环境里面已经有了 PyTorch、transformers、datasets、peft 等常用包省掉了大量安装时间。我建议直接选这个镜像的最新版本因为旧版本可能不兼容新版本的 LLaMA-Factory。创建实例后注意状态变为“运行中”才开始计费。不用的时候记得关机下次开机数据盘还在但要注意 AutoDL 对实例的保留策略——长期不用的实例数据盘可能被回收重要模型和数据集最好提前下载保存。2.3 SSH 与 VSCode 远程连接文件传输和端口转发的两套打法实例创建后需要远程连接。我习惯用 VSCode 的 Remote-SSH 插件因为后面启动 LLaMA-Factory 的 webui 时VSCode 可以直接做端口转发浏览器里打开localhost:7860就能访问界面。如果用 FinalShell 或 Termius 这类 SSH 客户端也可以连接但端口转发需要去 AutoDL 控制台的「自定义服务」里手动配置多一道工序。连接时注意区分 SSH 登录和文件传输。FinalShell 自带 SFTP可以直接拖拽上传数据集VSCode 则依赖 Remote-SSH 扩展装好后左侧文件列表会显示远程目录。第一次连接会要求输入密码或密钥建议在 AutoDL 控制台绑定 SSH 密钥省去每次输密码的麻烦。另外注意 AutoDL 实例的根目录和/root/autodl-tmp数据盘是两个位置模型和大文件要放数据盘否则关机后系统盘重置会丢。2.4 下载 Qwen2.5-7B-Instructhf-mirror 加速与清理 .git模型文件从 HuggingFace 官方仓库下载国内直连很慢我一般用 hf-mirror 镜像站。命令如下cd /root/autodl-tmp git lfs install git clone https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct这个流程会用到 Git LFS 来拉取大文件。git lfs install先初始化 LFS 环境然后git clone会把模型权重和配置文件一起拉下来。下载过程中耐心等7B 模型大约 15GB取决于网络速度可能耗时十几分钟到半小时。下载完成后建议立刻清理.git目录cd Qwen2.5-7B-Instruct rm -rf .git原因很简单.git里存的是 Git 的历史记录和 LFS 指针能占几个 GB 空间而数据盘空间有限。删掉后模型文件本身不受影响只是不能再git pull更新了。如果后续要换模型版本直接删干净重新 clone 更靠谱。3. 微调准备LLaMA-Factory 安装、参数入口与界面逐项配置3.1 conda 虚拟环境与依赖安装pip install -e .[torch,metrics] 做了什么LLaMA-Factory 是当前微调开源模型的常用工具把数据处理、训练、推理、评测都包在了一个命令行入口里。安装前我习惯新建独立 conda 环境避免把系统 Python 环境搞得乱七八糟git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda activate llama_factory cd LLaMA-Factory pip install -e .[torch,metrics]pip install -e .[torch,metrics]是「可编辑安装」加扩展依赖。-e表示以开发模式安装源码改了什么立刻生效适合调试torch和metrics是两组额外的依赖包torch 是训练必需的深度学习框架metrics 则在跑评测时需要用到。如果你的机器已经装过 PyTorch可以去掉torch只装metrics避免重复安装大体积包。3.2 llamafactory-cli 参数体系train、chat、api、webui 的入口逻辑安装完成后所有功能的入口统一是llamafactory-cli通过第一个参数来切换功能。这一点很关键新手常在这里迷路。常用参数包括version显示版本信息train命令行方式训练chat命令行方式推理对话export模型合并与导出api启动 API 服务供外部接口调用eval用 MMLU 等标准数据集评测webchat前端版纯推理对话页面webui启动 LlamaBoard 可视化面板包含训练、预测、聊天、模型合并多个子页面我一般直接跑llamafactory-cli webui因为图形界面能看到所有参数不用记一堆 yaml。但如果你要批量跑多组实验命令行加 yaml 配置才是高效方式。webui和webchat的区别在于webchat只能对话webui能训练、合并、评测。微调前建议先打开webui。conda activate llama_factory cd LLaMA-Factory llamafactory-cli webui启动成功后如果是 VSCode 连接会自动转发端口浏览器访问http://localhost:7860即可。用 SSH 客户端连接的需要去 AutoDL 控制台的「自定义服务」里找到对应端口打开。3.3 LlamaBoard 界面字段拆解从模型路径到 LoRA 检查点打开 webui 后第一个选项卡是「Train」。界面是全英文的但每个字段的含义并不复杂。我按顺序说① 语言切换默认英文可以切到中文。 ② 模型名称输入Qwen2.5-7B-Instruct。这里只要填一个标识实际加载路径由下一项决定。 ③ 模型路径即 2.2 中下载的模型目录完整路径填/root/autodl-tmp/Qwen2.5-7B-Instruct。 ④ 微调方式默认lora。这是最常用的方式只训练一小部分低秩适配器参数显存占用小训练速度快。如果你的显存有 80GB也可以试full全参数微调但 4090 上不建议。 ⑤ 检查点路径每次训练结束会生成一个检查点初次训练为空。一个检查点加上原始模型就等于本次微调的结果模型。一定要理解这个逻辑LoRA 训练产出的不是完整模型而是一个几十到几百 MB 的适配器文件。 ⑥ 数据集选择训练数据集对应 3.4 的配置。 ⑦ 数据集预览可以多选数据集预览确认格式无误。 ⑧ 训练轮次默认 20。这个数字对新手有误导性7B 模型在一般指令数据上跑 3-5 轮就会收敛20 轮很可能过拟合。我一般先从 3 轮开始看 loss 下降曲线再调整。设置完成后按界面上的「开始」按钮训练。这里注意模型加载和训练过程中不要频繁操作界面否则可能卡死。3.4 训练数据集配置c4_demo.json 格式与自定义数据集接入LLaMA-Factory 源码自带data目录里面放着示例数据集。第一次跑通流程直接用自带的c4_demo.json最省事。点开这个文件你会发现它内部引用了具体的数据源{ c4_demo: { file_name: c4_demo.json, columns: { prompt: input, query: instruction, response: output } } }这里c4_demo是数据集标识columns把原始数据列映射到训练模板的字段。prompt、query、response是 LLaMA-Factory 的标准字段分别对应系统提示、用户输入和期望输出。如果你要自定义数据集把 JSON 文件放到data目录下再修改data/dataset_info.json在其中加入你的数据集描述。比如{ my_dataset: { file_name: my_data.json, columns: { prompt: instruction, query: input, response: output } } }然后在 webui 的数据集下拉框里就能看到my_dataset。这里最大的坑是数据格式不匹配如果原始 JSON 里没有input字段query就会留空反之如果你用了一个没有instruction字段的数据集训练会直接报错。我在 5.2 节会专门讲这个问题的排查思路。4. 训练监控与实验记录nvidia-smi 与 wandb 双链路4.1 显存观察三板斧nvidia-smi、-l 与 watch训练开始后第一件事是确认显存真的被模型吃满了同时观察是否接近 24GB 上限。最直接的命令是nvidia-smi显示一次当前 GPU 占用情况nvidia-smi上面能看到显存总量、已用、功耗、温度还有进程列表。训练中看到python进程占用 18GB 左右是正常的——7B 模型 LoRA 优化器状态差不多就是这个量级。如果你开了 QLoRA显存占用会更低。如果想持续观察nvidia-smi -l会每秒刷新一次但刷屏太频繁。我推荐用watch命令每 5 秒刷新一次输出稳定且不花眼watch -n 5 nvidia-smi按CtrlC退出。这个命令适合训练时挂在一旁观察显存和温度。如果发现显存占用接近 24GB说明 batch size 或序列长度设大了需要调低否则下一步就是 OOM。4.2 wandb 注册与安装为什么多次实验必须留记录微调不是跑一次就结束的事。同一个任务换学习率、换训练轮次、换数据集结果可能差几个点。如果不用实验记录工具只靠控制台日志过两天就忘了哪组参数对应哪个结果。所以我在做多次对比实验时都会启用 wandb。wandb 的接入分两步。第一步注册账号并安装 Python 包pip install wandb wandb loginwandb login会要求输入 API key在 wandb 官网的个人设置里可以找到。登录成功后运行任何训练脚本时wandb 会自动把 loss、学习率、显存占用这些指标同步到云端面板。第二步是在训练时把结果记录到 wandb。LLaMA-Factory 里有两种方式见下一节。4.3 在 LLaMA-Factory 里启用 wandbyaml 配置与 webui 勾选第一种方式在训练用的 yaml 配置文件里加一段use_wandb: true wandb_project: qwen2.5-finetune wandb_name: lr1e-4_epoch3use_wandb开关决定是否启用wandb_project指定项目名同一个任务的多组实验归在同一项目下wandb_name给本次实验起名便于区分不同参数组合。第二种方式直接在 webui 界面的训练参数区域找到「启用外部记录面板」选项勾选上并在旁边填入项目名和实验名。这里需要说明如果已经用llamafactory-cli webui启动并且之前执行过wandb login那么勾选后训练开始就会自动记录。多次运行后你会在 wandb 面板看到不同实验的 loss 曲线叠在一起。哪个参数组合收敛快、哪个过拟合一眼就能比较出来。这比手工截图保存 loss 文本靠谱得多。5. 常见问题排查微调路上的五个翻车现场5.1 现象训练刚开始就报 OOM显存不足现象点开始训练后没几秒进程退出控制台提示CUDA out of memory。原因最典型的是 batch size 或序列长度设置过大。Qwen2.5-7B-Instruct 的上下文长度支持很大但 4090 只有 24GB 显存如果数据集里有超长样本显存会瞬间被塞满。另外如果同时开了多个训练进程也会叠加占用。解决先看nvidia-smi确认显存是否被占满。然后降低训练参数中的batch_size比如从 4 降到 2或者把gradient_accumulation_steps调大用小 batch 加梯度累积来逼近等效 batch。还可以开启quantization_bit为 4用 QLoRA 方式把模型量化到 4-bit能显著降低显存。我在 4090 上跑 LoRA 时常用 batch_size2、gradient_accumulation_steps4显存占用稳定在 19GB 左右。5.2 现象数据集格式报错或训练时 loss 不下降现象启动训练时提示列名找不到比如KeyError: instruction或者训练能跑但 loss 一直不降。原因数据集字段映射不对。LLaMA-Factory 在加载数据时会按照dataset_info.json里的columns配置取字段。如果你的自定义数据用的是instruction作为输入文本但配置里写的是prompt就会报 KeyError。loss 不降通常是数据质量问题数据里全是相同前缀或者回答和指令没有对齐。解决先用 webui 里数据集旁边的「预览」按钮查看每条数据是否被正确解析。如果字段对不上打开data/dataset_info.json检查columns映射是否与 JSON 文件的实际键名完全一致。我一般习惯把所有文本字段统一成instruction、input、output三个键这样配置最省事也方便后续换数据集。5.3 现象模型下载慢或下载中断现象git clone下载 Qwen2.5-7B-Instruct 时卡住或者下载到一半提示error: RPC failed。原因镜像站虽然比 HuggingFace 官方快但大文件仍然受制于网络抖动和磁盘 IO。另外如果你在系统盘而非数据盘下载空间不足也会导致失败。解决先确认目录在/root/autodl-tmp下。使用git lfs install后重新 clone。如果反复中断可以分文件下载用huggingface_hub的snapshot_download指定allow_patterns分批拉取。还有一个土办法把git config --global http.postBuffer调大比如设置成524288000能减少 HTTP 错误。下载完成后务必rm -rf .git否则磁盘很快被占满。5.4 现象webui 能启动但浏览器打不开现象终端显示Running on localhost:7860但本地浏览器访问localhost:7860超时。原因没有做端口转发。如果你用的是 FinalShell 这类 SSH 客户端它不会自动转发端口必须手动在 AutoDL 控制台配置自定义服务。VSCode 的 Remote-SSH 通常会自动提示转发但如果没弹窗也需要手动配置。解决在 AutoDL 控制台的「自定义服务」页面添加端口 7860 的转发规则然后使用控制台给的一个映射后的公网地址访问。VSCode 用户可以在远程资源管理器里找到「端口」面板手动添加7860端口。还有一种情况是防火墙拦截检查本地网络是否限制了非标准端口。5.5 现象LoRA 训练完但模型表现和原来几乎一样现象训练日志显示 loss 已经下降但实际对话时输出没有任何变化或者回答仍然不是期望的风格。原因最常见的是忘了加载检查点。LoRA 训练后原始模型文件没有变新知识存在检查点里。如果你用webchat直接加载原始模型路径当然看不到微调效果。另一个原因是学习率设置得过低LoRA 权重更新量极小被原始模型盖过了。解决先确认训练日志里保存了检查点路径类似output/checkpoint-100。然后用 webui 的「Chat」选项卡在模型路径里选择原始模型在检查点路径里选择刚才生成的 checkpoint。如果效果仍不明显考虑调大学习率到2e-4到5e-4并增加训练轮次。只有做了模型合并第 6 章之后留存下来的才是完整可部署的模型。6. 微调收尾把 LoRA 检查点合并回原始模型再验证效果训练结束后光有检查点不够因为大多数推理框架不会直接加载 LoRA 适配器。正确做法是先合并再导出成完整的模型文件。在 LLaMA-Factory 的 webui 里切到「Export」选项卡填写以下参数模型名称Qwen2.5-7B-Instruct模型路径原始模型目录/root/autodl-tmp/Qwen2.5-7B-Instruct检查点路径训练出的检查点目录比如/root/autodl-tmp/LLaMA-Factory/output/checkpoint-100导出路径写一个全新的目录比如/root/autodl-tmp/Qwen2.5-7B-Instruct-finetuned点击导出等待合并完成。合并会把 LoRA 权重按比例加回原始模型的参数中生成一个完整的、不需要 adapter 就能加载的模型。合并完必须做一次验证。我习惯先用量化后的测试问题过一遍llamafactory-cli chat \ --model_name_or_path /root/autodl-tmp/Qwen2.5-7B-Instruct-finetuned \ --template qwen这条命令会启动命令行对话输入几个训练时见过的样本确认输出风格已经变化。如果回答和训练数据相似说明微调是有效的如果还是原模型的风格检查一下检查点路径是否选对或者学习率是否太小。也可以打开 webui 的「Chat」选项卡加载导出后的完整模型逐个验证训练集里的问题。最后把导出的模型目录上传到自己的存储或者部署到推理服务里。从那以后我每次微调完都强制走一遍「合并-导出-对话验证」的流程再也不会出现拿着旧模型冒充微调结果的尴尬。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站