当前位置: 首页 > web >正文

【论文复现】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

结果:

ModelMethodPPLAlpha
Llama-2-7BFP165.474
SQ W8A85.5150.85
Llama-2-13BFP164.950
SQ W8A84.9290.85
Llama-2-70BFP163.320
SQ W8A83.3590.9
Llama-3-8BFP166.138
SQ W8A86.2580.85
Llama-3-70BFP162.857
SQ W8A82.9820.85
Mistral-7BFP165.253
SQ W8A85.2770.8
Mixtral-8x7BFP163.842
SQ W8A83.8930.8
Falcon-7BFP166.590
SQ W8A86.6290.6
Falcon-40BFP165.228
SQ W8A85.2550.7

对于测量的加速,建议使用NVIDIA TensorRT-LLM实现的SmoothQuant。

4 结果

 

 

 

至此,本文分享的内容就结束了。

http://www.xdnf.cn/news/2637.html

相关文章:

  • (云计算HCIP)HCIP全笔记(十三)本篇介绍虚拟化技术,内容包含:虚拟化资源、虚拟化过程、I/O虚拟化、虚拟化架构KVM和Xen介绍、主流虚拟化技术介绍
  • 亚马逊云科技2025战略解析:AI驱动下的全球生态重塑
  • 链表相关——Python实现
  • 【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战
  • 使用 MQTT - C 访问 IoTDA 平台:一个完整的嵌入式示例
  • Java面试场景深度解析
  • 排序--数据结构初阶(4)(C/C++)
  • QT开发技术【qcustomplot 曲线与鼠标十字功能】
  • 【C++ Qt】快速上手 显⽰类控件(Label、LCDNumber、ProcessBar、CalendarWidget)
  • Java项目技术栈使用场景深度解析
  • el-Input输入数字自动转千分位进行展示
  • Golang|外观模式和具体逻辑
  • 前端:纯HTML、CSS和JS菜单样式
  • 如何免费把PPT的页面输出为透明的图片-快速制作图新说汇报内容
  • 【Java开发日记】OpenFeign 的 9 个坑
  • 【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)
  • GCC 15.1 发布,包含 COBOL 编译器及多项其他改进
  • FastAPI中使用Pydantic进行数据验证的示例与关键技术点分析
  • java Optional
  • 【vLLM 学习】CPU 离线处理
  • 通俗易懂一文讲透什么是 MCP?
  • 坐标转换:从WGS-84到国内坐标系(GCJ-02BD-09)
  • 大语言模型 - 运行、微调的显存计算详解与优化 全量微调、LoRA 优化策略
  • windows安装docker教程
  • PTA -L1-005 考试座位号(BufferedReader、Arraylist动态数组、Map)
  • 记录一下从debian12升级到debian13出现的小插曲01
  • C++翻转数相乘 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • shell编程基础知识及脚本示例
  • Android源码编译命令详解
  • 基于 Amazon RDS 数据库之间复制数据并屏蔽个人身份信息