同一个大模型,完整微调可能需要几百 GB 显存,换成 QLoRA 后却能塞进一张 48GB 的显卡。这个数字很容易让人以为训练难题已经解决。我把原始论文和作者公开的代码说明对了一遍,QLoRA解决得很具体,它主要把训练时保存基础模型所需的显存压了下来。

论文里的做法分成两部分。预训练模型的权重先以 4 比特保存,训练时保持冻结。训练只更新后来接上的 LoRA 适配器。梯度仍然穿过基础模型,计算时也会把 4 比特权重还原到更高精度参与前向和反向计算,只是不再为基础模型的每个权重保存更新量。

先缩存量,再训练增量

QLoRA沿用了 LoRA 的关键取舍。一个线性层原来有一大块权重,LoRA在旁边接上两个小矩阵,用它们表示这次任务需要的改动。基础权重留着不动,训练只改这两个小矩阵。以后切换任务,也可以换一组适配器,不必保存几份完整模型。

4 比特保存又把基础权重占用压低了一截。论文提出 NF4,让量化区间更适合接近正态分布的预训练权重。它还把量化时用到的常数再量化一次,平均每个参数又省约 0.37 比特。65B 模型上,这一项约省 3GB。分页优化器会在显存短时吃紧时借用 CPU 内存,重点处理长序列批次带来的峰值。

这几招一起用,论文把 65B 模型的微调显存需求从超过 780GB 降到不足 48GB。这个结果来自特定模型、实现与实验条件,不能直接换算成任意电脑都能训练任意 65B 模型。作者的代码说明还列过 4 比特推理慢、部分精度配置不稳定等问题。软件版本会继续变化,显卡能装下也只是第一道门。

数据往往比省下的显存更要紧

研究团队用 QLoRA 训练了上千个模型,覆盖 8 组指令数据和多种规模。他们报告的一项结果很朴素。约 9000 条的 OASST1 数据,在聊天任务上胜过抽样后的 45 万条 FLAN v2 数据。数据是否适合任务,影响可以大过数据条数。

论文也没有把跑分当成最后答案。作者同时使用人评和模型评审,还专门列出 Guanaco 失败的样本。他们发现不同聊天评测会给出不一致的判断,模型评审与人评也有分歧。微调样本若混入错误答案、越权话术或过期流程,QLoRA只会更省显存地学进去。

落到实际训练,我会先用较小模型跑通数据格式、训练和回滚,再拿固定测试集比较基础模型与适配器。测试要包含目标任务、原有能力和拒答边界。显存峰值、训练时间与推理占用也要分别记,因为训练能跑和线上能用是两件事。

QLoRA把一类昂贵实验变得容易开始。它没有替人选择数据,也没有替业务确认答案。省下来的显存,最好拿来多做几轮有记录的对照测试。

参考资料