赞
踩
大语言模型(LLM)证明了工业界的主流仍然是大力出奇迹,对此我通常持保留态度。之前折腾时间序列的时候,还没有 LLaMA 这类模型,能找到的最大的模型是 gpt-neox-20b[3],而 RTX 3090 能用 fp16 加载的模型也不过是 pythia-6b[4]。由于这些参数量 10b 以内的模型跟 LLaMA-6B 都有比较大的差距,我简单地尝试以后就放弃了,毕竟不可能为了一个完全不熟悉的领域去买更大显存的专业卡。
没想到才过了一个月,就发现网上已经能找到用 GPTQ-4 bit 量化的 LLaMA 模型,而且还有些爱好者宣称它甚至比 8 bit 量化精度还要高[5]。跑通 LLaMA-30B 的模型之后,我才意识到大预言模型的涌现能力并非都市传奇,而是在消费级显卡上就能重现的常识。
Yann LeCun 被 GPT4 的酸葡萄伤害之后,最近放出来的 PPT 有点极端[6]。抛开措辞不谈,大佬看问题还是很深刻的。典型的自回归语言模型的采样是个离散的随机过程,在极端情况下误差可能会以指数放大。虽然更大的模型也不能解决这个问题,但是更小的误差可以极大地降低发散的速度,而且可以在跑歪之后若无其事地一本道。
反动学阀吐槽(我是温和的 Bayesian 修正主义者)
今天花了点时间研究语言模型的量化方案,才发现自己比较孤陋寡闻。其实 LLM.int8() 早就实现了误差很小的 8 位量化方案,而且通过 bitsandbytes 库集成到了 huggingface transformers,只需要几行代码就能节省 50% 的显存。
2208.07339
技术细节详见官方 Blog ——
而 GPTQ 也并不是新技术,只是在 LLaMA 放出之前并未得到重视,想要用起来也比较麻烦。
2210.17323
技术细节请参考知乎大佬的专栏文章 ——
LokLok:GPTQ: 模型量化,穷鬼救星176 赞同 · 5 评论文章正在上传…重新上传取消
项目链接如下 ——
我关注量化精度的起因是发现 LLaMA-13b-gptq-w4 的长程注意力有问题,使用多个 Parallel Context Windows[7] 的时候经常采样到无趣的短内容。作为对比,LLaMA-7b-fp16 虽然采样质量差很多,但是可以有效地整合 Parallel Context Windows 中的信息,采样出天马行空的故事大纲。后来又试了 LLaMA-13b-int8,虽然有所改善但还是很糟糕。今天自己量化了一个 LLaMA-13b-gptq-8,几乎是药到病除,效果立刻超越了 LLaMA-7b-fp16。而且很奇怪的是,我本地测试的 wikitext-2 的 PPL 跟官方提供的 fp16 精度完全一样。检讨了一下,我魔改过 Transformers 库中的 modeling_llama.py[8],把自注意力机制强行改成了 fp32。此外,默认的 GPTQ 加速库里面的累加使用的也是 fp32,而不是 fp16,而 pytorch 在默认的配置下使用 fp16 对矩阵乘法求和[9]。
可以通过以下代码减小误差:
torch.backends.cuda.matmul.allow_fp16_reduced_precision_reduction = False
GPTQ 默认使用单精度进行矩阵计算
由于 GPTQ-for-LLaMA 实现了原生的高性能 cuda kernel,使用 GPTQ 量化模型推理时性能和单精度版本几乎没有区别。因为对内存带宽的需求降低了,单 batch 推理时量化后的模型反而会更快。模型越大,GPTQ 量化模型的精度损失越小,对性能的提升越高,感觉就跟免费的午餐一样[10]。
OPT-175B 的加速效果
对于没有专业显卡的普通人,GPTQ-for-LLaMA[11] 几乎是本地部署 LLaMA-30B 和 LLaMA-65B 的唯一选择。为了调戏 LLaMA-65B,我最近在严肃地评估是不是要整一块 RTX A6000(或者更大胆一些,RTX 6000 ADA?)[12]。
GPTQ-for-LLaMA 官方给出的 Wiki2 PPL 如下表。
请注意 4bit-RTN 的 PPL
在 RTX 3090/RTX A6000 级别的显卡上,LLaMA-30B 和 LLaMA-65B 的推理性能几乎完全由模型尺寸和内存带宽决定。换句话说 LLaMA-30B gptq-w8 的性能和 LLaMA-65B gptq-w4 几乎没有区别[13],所以前者几乎没有存在的意义。我实测了本地模型的 Wiki2 PPL,从这个指标上看 W8G128 和 FP16 几乎没有区别[14]。
13B-W8G128 | 30B-W4G128 | 30B-W8G128 | 65B-W4G128 | |
---|---|---|---|---|
Wiki2 PPL | 5.09 | 4.2303 | 4.1016 | 3.6933 |
LLM.int8() 的性能非常差,在 RTX A6000 上实测 LLaMA-30B 推理性能不到 gptq-w8 的一半。它最大的优点是无需预先量化模型,而且没有引入额外的 cuda kernel,因此可以保证计算的可重复性[15]。
注意,如果使用 Windows 原生的环境,需要使用 GPTQ CUDA 分支。GPTQ 主分支为了追求性能使用 Triton 实现 cuda kernel,不再支持 Windows。
考虑到大多数人都没有 RTX A6000 的使用经验,特意给大家种个草[16]。
RTX A6000 datasheet
只考虑 RTX 3090、RTX 4090 和 RTX A6000、RTX 6000 ADA。
为了推理 LLaMA-65B,单卡 RTX A6000 是扩展性最好的解决方案[20],必要的时候可以组双卡系统[21]。如果电源和插槽不是问题,带 NVLINK 的 RTX 3090 双卡方案性价比最高。双卡 RTX 4090 的峰值功耗实在是太高还没有 NVLINK[22],RTX 6000 ADA 纯属炫富。
由于我只有 NUC 12 不想买个大机箱放在客厅,所以只能在 RTX A6000 和 RTX 6000 ADA 里面选。
NUC 12 实在装不下别的卡
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。