科技网站建设总结,北京现在可以自由出入吗,公众号开发网站建设合同,网站备案时间太长由于基座模型通常需要海量的数据和算力内存#xff0c;这一巨大的成本往往只有巨头公司会投入#xff0c;所以一些优秀的大语言模型要么是大公司开源的#xff0c;要么是背后有大公司身影公司开源的#xff0c;如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…由于基座模型通常需要海量的数据和算力内存这一巨大的成本往往只有巨头公司会投入所以一些优秀的大语言模型要么是大公司开源的要么是背后有大公司身影公司开源的如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的前景从数据开源、到基座模型到新方法的迭代升级使得个人都有机会践行fine-tune这一过程。
为了使得基座模型能够迁移到不同的任务应用场景中Fine-tune是最为使用的方法之一为了减少fine-tune阶段需要的算力内存开销当前主要有PEFTparameter-efficient fine-tuning和参数量化两类方向PEFTparameter-efficient fine-tuning核心思想是重新训练对新任务影响较大的少部分参数而基座模型大部分参数保持不变量化的核心思想是通过模型参数位宽量化的减少降低内存消耗将二者结合使用能够进一步减少资源消耗如何高效的使用量化、PEFT等技术在减少算力的需求的前提下减少准确性损失是当前主流研究方向。
本篇博客讨论当前高效训练和推理LLM的PEFT和量化相关技术PEFT技术仅介绍使用较广的LoRA。
量化的目的是提高芯片计算吞吐量和减少内存占用当前8-bit和4-bit量化已经在商业上可以在消费级硬件上运行模型量化GPTQ、GGUF开源LLamaPEFTLoRA QLoRA开源数据集的组合极大降低了大模型的门槛这一闭环的生态是的训练和部署都可以以较低的成本进行这里讨论QLoRA、GPTQ以及GGUF三种量化方法基座模型训练的时候采用的是单精度浮点32bit位宽推理的时候如果将32-bit位宽的数据变成8-bit甚至4bit那么内存的需求量将大大减少但是量化也会劣化模型的表现。
QLoRA
LoRA技术在《大语言模型之十四-PEFT的LoRA》和《大语言模型之十六-基于LongLoRA的长文本上下文微调Llama-2》因而LoRA基础思想和实现方法本篇博客不再介绍。
QLoRA的全称是Quantized and Low-Rank Adapters这里的and表示的意义是量化和LoRA方法的组合量化的意思是将32-bit单精度浮点数量化为8-bit/4-bit/2-bit等方法以减少内存的消耗采用低秩分解的方法降低fine-tune的参数量二者思想相组合即为这里的QLoRA。
QLoRA将存储数据类型和计算数据类型相分离存储数据类型通常为4-bit NormalFloat类型计算数据类型是16-bit BrainFloat类型。在前向计算loss和反向根据梯度更新权重参数的时候将存储的数据类型转为计算数据类型但仅在计算LoRA参数的权重梯度时才使用16-bit BrainFloat。
4-bit NormalFloatNF4数据类型
4-bit NormalFloat先经过Normalization将模型的权重参数归一化即变成零均值单位方差的权重参数这是为了确保权重参数集中在0附近很小的范围以便用很少的比特位量化。 对于32-bit单精度浮点数表示的网络权重0.5678再用4-bit float量化时首先假设4-bit整数表示16个间隔分布的范围[-1, 1]即
[-1.0, -0.8667, -0.7333, -0.6, -0.4667, -0.3333, -.02, -0.0667, 0.0667, 0.2, 0.3333, 0.4667, 0.6, 0.7333, 0.8667, 1.0]1首先将原始32-bit单精度数0.5678量化为0.6因为0.5678距离0.6比0.4667近 24bit可以表示的无符号数为0~15有符号数为-8~7这里以无符号表示则15对应于1.0则0.6对应于12所以权重参数按4-bit整数存储为12而不是单精度的0.5678也不是0.6 3在计算的时候前向计算loss或者反向根据梯度更新权重参数的时候首先将12转为0.6量化逆过程表示的浮点数参与运算而0.6和0.5678之间差值是逆量化误差。
量化到8-bit可以减少量化误差fine-tune过程和4bit类似但是存储的内存增加一倍。
量化误差会影响模型的准确性这可以通过混合精度训练在准确性和速度/内存使用上平衡。
这里总结一下QLoRA的方法首先将32-bit单精度参数模型以4-bit的方式加载到内存中也有使用DQDouble quantization对量化残差再使用4-bit量化进一步减少精度带来模型准确性损失然后配置LoRA参数针对特定层如1%的参数了仍然使用32-bit单精度作为权重但是由于进行了低秩分解因而相比原始参数量也是大大减少的在训练的时候前向计算时首先将内存中freeze的NF4格式数据转为浮点数参与loss计算对于LoRA注入层则使用单精度计算这是没有量化因而无量化误差计算loss之后反向梯度更新的时候只更新LoRA注入层影响的权重参数freeze的NF4数据不受影响。
QALoRA
QALoRA论文显示QA-LoRA和QLoRA在MMLU数据集上不同量化比特位数的准确度对比情况由此可以看到同量化比特位数情况下QA-LoRA准确性最高。QALoRA官方 github工程 图1 QLoRA vs QA-LoRA score 从上面的测试情况来看QA-LoRA方法在同比特情况下得分最高。未来QA-LoRA极有可能是成为主流相比QLoRAQALoRA方法提供了更高的精度。 图 2 LoRA vs QLoRA vs QA-LoRA
LoRA方法在《大语言模型之十五-预训练和监督微调中文LLama-2》已有涉及QLoRA方法在《大语言模型之七- Llama-2单GPU微调SFT》使用了。 Fine-tune的时候LoRA方法是依然使用FP16比特类型数据而QLoRA则使用NF4类型格式数据而QA-LoRA则使用INT4类型数据格式 在推理的时候QA-LoRA也是直接使用INT4类型的数据格式。 图3 QA-LoRA
因为当前介绍QA-LoRA方法的资料比较少毕竟是github工程两周前才公布的这里以《大语言模型之四-LlaMA-2从模型到应用》插图3为例说明。 图4 大语言模型之四-LlaMA-2从模型到应用插图3部分 这里收入token的每个维度是4096对应于上述公式的D_in即输入token Embedding维度。这里的WqWkWv对应于图2中pre-trained weight。图2中输入X都是4096维Embedding数。 QA-LoRA的方法是将Embedding 4096分组假设是组L128则GroupEmb/L4096/32128这样A就变成了32x64B变成了644096A和B相乘结果AB324096和group后的输入相乘即[132][AB]14096这样就得到了和LoRA和QLoRA一样的结果即图4中圈3、圈4、圈5对应的QKV1*4096。 在图3的公式中还有pre-quantization函数这一函数的作用是对浮点数量化然后将量化值在转为浮点数这样做的目的是在训练的过程中感知量化。
GPTQ
GPTQ对训练好的模型首先对参数进行标量量化然后对残差进行向量量化向量量化的思想和方法可以参考《编解码》这种被称之为Post-training量化这种方法压缩效率高、算力需求也会降低。GPTQ方法使得模型可以在消费级显卡GPU上运行。在推理上GGUF已经超过了GPTQ方法。
GGUF
GGUF是ggml的后继者GGUF已经支持cuBLAS、MPI、BLAS、BLIS、Intel MKL等库支持在GPU、CPU上都可以高效实现推理运算ggml是专为CPU推理而实现的c库由于影响力比较大所以blas、mkl以及GPU也都支持了升级为了GGUF我们在推理的时候已经见到过了这是基于c的推理使用了ggml向量计算库因而模型的参数是需要转换为GGUF格式的GGUF官网说明是为了Llama模型能够使用4-bit整型量化以便在MacBook上实现推理。除了量化也使用了硬件加速SIMD指令和GPU的一些支持。quantize详见github