ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

083、LoRA与QLoRA低秩微调实战

083、LoRA与QLoRA低秩微调实战 083、LoRA与QLoRA低秩微调实战上个月给一个内部工具做指令微调,用的是Qwen-7B-Chat。一开始图省事,直接全参微调,batch size开到2,模型加载进去,optimizer state一分配,好家伙,显存直接爆了,OOM报错红闪闪。后来改成qlora,同样的数据,batch size还能开到4,训练速度反而快了,效果也没差多少。今天就把这次折腾期间踩过的坑和觉得值得记录的东西写下来。LoRA是什么,一句话说就是冻结原模型权重,在每一层注入一个低秩旁路,训练的时候只更新这些旁路矩阵。原模型还是那个原模型,但推理的时候可以把旁路矩阵合并回去,或者单独保存旁路权重做增量部署。低秩分解的本质就是假设权重更新量ΔW在低秩空间里,用A和B两个小矩阵相乘去近似,秩r设得越小,parameter越少。比如一个2048×2048的权重矩阵,全量更新是4M参数,但用r=8的LoRA,A是2048×8,B是8×2048,总共3.2万参数,差了俩数量级。QLoRA是在LoRA基础上把原模型的权重量化到4-bit,再用低秩适配器去微调。具体用了NormalFloat4量化,这是针对权重分布是零中心正态分布设计的一种分位数量化,比普通的int4能保留更多有效精度。还有双重量化,对量化常数再做一次量化,又省一点显存。分页优化器用CPU内存换GPU显存,把optimizer state的一些随机访问块挪到CPU,跑大模型的时候不容易被尖峰内存撞爆。当时我用的是HuggingFace的peft库加bitsandbytes,看起来很简单,但细节上的坑不少。先看加载模型的代码。
返回列表