ARTICLE DETAIL

资讯详情

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

QLoRA双重量化的原理

QLoRA双重量化的原理 1.什么是QLoRA?单次量化也叫QLoRA,双重量化叫标准QLoRA2.常见的模型保存格式QLoRA是对单个权重矩阵进行量化Base模型权重精度是FP16这里讲一下常见的模型权重精度一个字节8个比特位FP324字节FP162字节FP8: 1字节BF162字节精度低范围和FP32一样大小数位少指数位多INT8:一个字节int无小数部分INT4:半个字节INT4均匀码本存储编码是[-8,7]一共15个数NF4非均匀码本0 附近点挤得密两端稀疏正态分位数设计码本16 个代表浮点数是全局写死固定不变的存储编码是0-15一共15个数nf4 np.array([ -1.00000000, -0.69619280, -0.52507300, -0.39490030, -0.28446770, -0.18487450, -0.09105004, 0.00000000, 0.07958031, 0.16093908, 0.24611496, 0.33791524, 0.44070983, 0.56266755, 0.72295761, 1.00000000 ])3.为什么使用非均匀码本Base模型的权重参数可近似为正态分布Base模型的参数分布主要集中在原点附近为了反量化能够还原更多不同的权重参数使用非均匀码本中间密集两端稀疏。如果均匀码本则中间大量的权重参数也只能转换为两三个整数反量化后损失就特别大。4.为什么需要量化Base模型的权重参数模型训练推理默认BF16原因不容易溢出FP16的整数范围太小Base的权重只在前向传播时计算我们量化后BF16--NF4降低显存占用降低内存带宽瓶颈加快推理速度适配本地部署硬件限制少量精度损失换取工程可行性5. QLoRA的具体流程5.1 第一步量化FP16转NF4取Transformer中的W_q矩阵为例矩阵形状假如[1024,1024]如果上来就使用整个矩阵参数的最大值进行归一化那么损失的精度太大了解决办法先展平一维数组然后划分每64个参数为一组每个组单独进行归一化归一化后的每个数根据就近原则映射为NF4中的一个整数即BF16成功转化为一个整数。每64个参数/这个组的最大值这个比值也就是缩放因子。单次量化模型在前向传播和推理阶段找到整数对应的小数再×缩放因子即可。假设Base模型有7B参数量化后如下图5.2 第二步对缩放因子再进行量化FP32量化为FP8具体公式如下、其中x是FP32的输元素x_q是量化后的元素。clip是截断确保数据全部落在FP8区间内双重量化模型前向传播/推理的时候先还原缩放因子。6. 训练的时候反量化QLoRA 的 base 模型以 NF4 存储但在做前向传播时不能直接用 NF4 算矩阵乘法硬件只原生支持FP16/BF16/FP32/INT8 计算完全不支持 NF4、不支持 4bit 矩阵乘所以每次前向传播时从显存读取 NF4 权重在 GPU 内临时反量化回 BF16用 BF16 做矩阵乘法反量化结果立刻丢弃不占显存这就是为什么 QLoRA 训练比 LoRA 慢 30% 左右——每次都要做一次反量化。但因为反量化的算力开销远小于矩阵乘法本身所以慢的幅度有限。7. LoRA和QLoRA的应用场景根据自己硬件或者场景需求选择适合的算法。如果有不对的地方还请指正。
返回列表