当前位置: 首页 > news >正文

大模型学习笔记 · 第五篇 · LoRA 与省显存训练

大多数人微调大模型,应该从 LoRA 开始,而不是全量微调。LoRA 只训练一小部分附加参数,训完得到的是几十到几百 MB 的 adapter,基座模型不变,显存友好。显存不够时,按顺序尝试:batch 改 1、加大梯度累积、缩短 cutoff_len、上四 bit 量化、换更小模型。LoRA 训完不是完整模型,部署时要「基座加 adapter」或先 merge。


一、为什么很少人一上来就全量微调

七 B 量级的大模型,如果所有参数都参与更新,显存占用非常可观,往往需要多张高端显卡。对个人学习者、小团队和业务验证来说,这条路的成本和门槛都偏高。

LoRA 的思路很务实:不动整个模型,只在部分层加一小撮可训练参数,叫做 adapter。训练完成后,你得到的是体积很小的 adapter 文件,基座模型仍然是 Hugging Face 上那个原样。对个人、小团队、第一次做项目,LoRA 应该是默认首选,而不是备选项。

yaml 里典型写法是 finetuning_type: lora,lora_rank: 8,lora_target: all。看到训练日志里可训练参数只占全模型的百分之零点几,这是正常现象,不是配置错了。


二、三个参数,够你理解八成

lora_rank 可以理解成 adapter 的容量,越大通常越强,也越吃显存。入门先试 8,需要再调到 16 或 32。

lora_alpha 是缩放强度,常设为 rank 的一到两倍,不写时框架会按默认规则处理。

lora_target 决定在哪些层加 LoRA。不确定时写 all 最省心,让框架帮你选。

不必一开始就被 LoRA 的论文公式困住。把它想成「在模型旁边挂一个小外挂,专门学你的任务」,就够用很久了。


三、显存大概是什么量级

以下只是七 B、四 B 量级、batch 为 1 时的经验参考,实际还受 cutoff_len 和显卡型号影响。

LoRA 加 bf16,十六到二十四 G 显存通常比较从容。LoRA 加四 bit 量化,也就是 QLoRA,八到十二 G 也有机会跑起来。全量微调则往往需要多卡。

如果一训练就 OOM,不要硬扛,按下面顺序救。


四、显存不够时的救命顺序

第一步,把 per_device_train_batch_size 设为 1,同时增大 gradient_accumulation_steps。这样每次只喂一条样本,但累积多步再更新,等效 batch 并不小,显存却省很多。

第二步,缩短 cutoff_len,比如从 2048 降到 1024。客服 FAQ、短对话场景,1024 往往够用。

第三步,上四 bit 量化。可以用 examples/train_qlora/ 下的 yaml,或在配置里加 quantization_bit: 4,需要先安装 bitsandbytes 相关依赖。

第四步,换更小模型。七 B 换四 B 或三 B,有时比在一卡上硬挤量化更省心。

这个顺序背后的逻辑是:先动训练策略,再动模型精度,最后动模型大小。


五、LoRA 训完,你手里到底是什么

output_dir 里主要是 adapter_config.json 和 adapter_model.safetensors,体积小,拷贝方便。使用时有两条路:推理配置里同时指定基座路径和 adapter 路径,直接加载;或者用 llamafactory-cli export 合并成完整模型,交给更习惯「单目录部署」的平台。

不要误以为 LoRA 训完就得到了一个可以独立拷贝的完整大模型。基座仍然在原处,adapter 是你训出来的「差分」。


六、什么时候才值得考虑全量微调

公司有充足 GPU,且已经验证 LoRA 的效果触顶。领域差距极大,需要改动大量参数才能收敛。研究或竞赛场景,追求极致指标。

对应配置在 examples/train_full/。对个人学习和大多数业务验证,全量微调不是第一站。


七、其他省显存手段,知道即可

flash_attn: fa2 在支持的显卡上能省显存、加速训练,4090、A100 这类卡值得开。use_unsloth: true 在部分模型上能进一步加速 LoRA,需要额外依赖。多卡训练在第八篇会讲,两张卡以上时框架通常会自动分布式。

对个人学习者,最稳的组合仍然是 batch 为 1、梯度累积、LoRA。不要和显存较劲,把精力放在数据和评估上,回报更高。


http://www.gsyq.cn/news/1623322.html

相关文章:

  • TrafficMonitor插件终极指南:Windows任务栏信息监控的完整解决方案
  • MATLAB结构光超分辨SIM重建全套函数:从频域估计到Hessian增强可视化
  • DownKyi终极解析:从传统下载到智能管理的技术革命
  • 家电故障排查先看这几步
  • RePKG:5分钟快速上手,如何用开源工具解锁Wallpaper Engine壁纸资源
  • XUnity.AutoTranslator完全指南:让Unity游戏瞬间实现多语言翻译的终极解决方案
  • F2:多平台内容采集的 Python 工具
  • 告别Python子进程!C#原生集成YOLOv8,视觉上位机延迟降低90%实战
  • 工业预诊:02 振动、温度、电流数据如何变健康报告
  • ASM330LHH与STM32F407VGT6的高精度运动跟踪方案
  • 空洞骑士模组管理器Scarab:终极完整使用指南与安装教程
  • KeeWeb:一个能跑在浏览器里的密码管理器
  • CS2200-CP与PIC18F67K40实现纳秒级精确计时系统
  • 别再写协议适配了!C# + OPC UA打造跨品牌数字孪生底座,接入效率翻3倍
  • 框架v5本体建模画布怎么用
  • 007-曼哈顿计划中的费曼
  • conda-ecopkgs与conda-forge、bioconda的对比分析:openEuler生态的独特价值
  • 从Normal到Realm:openEuler/CCA四大隔离世界的终极架构设计与实现指南
  • ub-dhcp配置详解:从基础到高级的DHCP服务器设置教程
  • OECP错误排查手册:常见问题与解决方案大全 [特殊字符]
  • 2026免费图片去水印工具推荐!电脑本地无联网/网页/手机APP通用教程
  • openEuler sync-bot 与 CI/CD 集成:构建完整的自动化开发流水线
  • 舟山定海案例,涉及第三人查扣的技术问题。
  • STM32与74HC32实现高效按键管理方案
  • openEuler/hi-mpu项目结构全解析:从零开始理解源码架构
  • 从入门到精通:Kiran-Qt5-Integration开发指南与最佳实践
  • DeepSeek V4官宣:上班用AI,比下班贵一倍
  • 深色主题适配指南:如何配置Kiran图标主题支持深色模式 [特殊字符]
  • 百度网盘直链解析终极指南:3分钟获取高速下载链接的完整教程
  • IIM-42652与PIC18F45K22实现6DoF运动追踪系统