【论文复现】SmoothQuant的安装与使用
◆大语言模型参数量巨大,计算和存储成本极高。为了降低部署成本,常用的方法是量化(Quantization),即用低精度(如8-bit整数)代替高精度(如16-bit浮点数)存储和计算。但大语言模型的激活值(即每层输出的中间结果)会出现异常大的离群值(outliers),导致直接量化后精度暴跌。
◆核心问题:如何在不重新训练模型的情况下(即“训练后量化”),高效且准确地量化大语言模型?
SmoothQuant就是要解决这个问题。
目录
1 SmoothQuant
2 安装
3 使用
PyTorch的平滑量化INT8推理
激活通道尺度和校准
W8A8量化在OPT-13B上的演示
W8A8量化对Llama-1/2/3, Falcon, Mistral和Mixtral的结果
4 结果
1 SmoothQuant
论文题目:SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models
论文地址:[2211.10438] SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models
代码地址:https://github.com/mit-han-lab/smoothquant
【摘要】大型语言模型( large language models,LLMs )表现出优异的性能,但计算和内存密集型。量化可以减少内存,加速推理。然而,现有方法无法同时保持精度和硬件效率。提出了SmoothQuant,一种免训练,精度保持和通用的训练后量化( PTQ ,post-training quantization)解决方案,以实现LLMs的8位权重,8位激活( W8A8 )量化。基于权重易于量化而激活不易量化的事实,SmoothQuant通过数学等价变换将量化难度从激活离线迁移到权重,平滑了激活异常值。Smooth Quant对LLMs中的所有矩阵乘法,包括OPT、BLOOM、GLM、MT-NLG、Llama-1/2、Falcon、Mistral和Mixtral模型,都能实现权重和激活的INT8量化。对于LLMs,展示了高达1.56倍的加速比和2倍的内存减少,而精度损失可以忽略不计。SmoothQuant能够在单个节点内服务530B LLM。我们的工作提供了一种turn-key解决方案,降低了硬件成本,并使LLMs大众化。
[paper] [slides][video]
2 安装
conda create -n smoothquant python=3.8conda activate smoothquantpip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113pip install transformers==4.36.0 accelerate datasets zstandardpython setup.py install
3 使用
PyTorch的平滑量化INT8推理
使用CUTLASS INT8 GEMM 内核为PyTorch实现了SmoothQuant INT8推理,这些内核被封装为PyTorch模块 torch-int。在运行SmoothQuant PyTorch INT8推理之前安装 torch-int 。
在 smoothquant/opt.py中实现了量化OPT模型类,它使用了INT8线性层和束量化尺度。在https://huggingface.co/mit-han-lab/opt-[MODEL-SIZE]-smoothquant上提供了已经平滑和量化的OPT模型,其中[model - size]可以是125m,1.3B, 2.7B,6.7B,13B, 30b和66b。可以用下面的代码加载INT8模型:
from smoothquant.opt import Int8OPTForCausalLM
model = Int8OPTForCausalLM.from_pretrained("mit-han-lab/opt-30b-smoothquant")
也可以检查 generate_act_scales.py 和 export_int8_model.py看看是如何平滑、量化和导出INT8模型的。
在 examples/smoothquant_opt_real_int8_demo.ipynb。使用OPT-30B模型来演示SmoothQuant的延迟和内存优势。在OPT-30B上进行演示,因为它是可以在单个A100 GPU上运行FP16和INT8推理的最大模型。对于需要多个gpu的大型模型,建议使用SmoothQuant的 FasterTransformer实现。
激活通道尺度和校准
在act_scales/中提供了Llama, Mistral,Mixtral,Falcon,OPT和BLOOM模型的激活通道量表。在验证集中用512个随机句子得到这些尺度。可以使用OPT演示(examples/smoothquant_opt_demo.ipynb)和Llama演示(examples/smoothquant_llama_demo.ipynb)来测试这些模型的平滑和量化。
还提供了脚本来获取模型的激活通道尺度。请参考examples/generate_act_scales.py。可以使用下面的命令来获取模型的尺度:
python examples/generate_act_scales.py \--model-name <model_name_or_path> \--output-path <output_act_scales_file_path> \--num-samples <num_samples> \--seq-len <sequence_length> \--dataset-path <path_to_the_calibration_dataset>
W8A8量化在OPT-13B上的演示
在examples/smoothquant_opt_demo.ipynb,以OPT-13B为例,证明了SmoothQuant可以匹配FP16和INT8推理的精度,而基线则不能。用FP16 (smoothquant/fake_quant.py)模拟INT8推理,即伪量化。
W8A8量化对Llama-1/2/3, Falcon, Mistral和Mixtral的结果
通过W8A8模拟量化,提供了一个评估脚本来评估OPT、BLoom、Llama、Falcon、Mistral和Mixtral模型的语言建模困惑度。请参考 smoothquant/ppl_eval.py。可以使用以下命令来评估模型:
python smoothquant/ppl_eval.py \--model_path <model_name_or_path> \--act_scales_path <act_scales_file_path> \--smooth \--alpha <alpha> \--quantize
结果:
Model | Method | PPL | Alpha |
---|---|---|---|
Llama-2-7B | FP16 | 5.474 | |
SQ W8A8 | 5.515 | 0.85 | |
Llama-2-13B | FP16 | 4.950 | |
SQ W8A8 | 4.929 | 0.85 | |
Llama-2-70B | FP16 | 3.320 | |
SQ W8A8 | 3.359 | 0.9 | |
Llama-3-8B | FP16 | 6.138 | |
SQ W8A8 | 6.258 | 0.85 | |
Llama-3-70B | FP16 | 2.857 | |
SQ W8A8 | 2.982 | 0.85 | |
Mistral-7B | FP16 | 5.253 | |
SQ W8A8 | 5.277 | 0.8 | |
Mixtral-8x7B | FP16 | 3.842 | |
SQ W8A8 | 3.893 | 0.8 | |
Falcon-7B | FP16 | 6.590 | |
SQ W8A8 | 6.629 | 0.6 | |
Falcon-40B | FP16 | 5.228 | |
SQ W8A8 | 5.255 | 0.7 |
对于测量的加速,建议使用NVIDIA TensorRT-LLM实现的SmoothQuant。
4 结果
至此,本文分享的内容就结束了。