开发者实战 | 如何利用低比特量化技术进一步提升大模型推理性能

原创
2023/12/01 17:00
阅读数 12

点击蓝字

关注我们,让开发变得更有趣

作者| 杨亦诚

排版| 李擎

如何利用低比特量化技术

进一步提升大模型推理性能


针对大语言模型(LLM)在部署过程中的性能需求,低比特量化技术一直是优化效果最佳的方案之一,本文将探讨低比特量化技术如何帮助LLM提升性能,以及新版OpenVINO™ 对于低比特量化技术的支持。

大模型性能瓶颈

相比计算量的增加,大模型推理速度更容易受到内存带宽的影响(memory bound),也就是内存读写效率问题,这是因为大模型由于参数量巨大、访存量远超内存带宽容量,意味着模型的权重的读写速度跟不上硬件对于算子的计算强度,导致算力资源无法得到充分发挥,进而影响性能。


图:memory bound与compute bound比较


低比特量化技术

低比特量化技术是指将模型参数从fp32/fp16压缩到更低的比特位宽表达,在不影响模型输出准确性和参数量的情况下,降低模型体积,从而减少缓存对于数据读写的压力,提升推理性能。由于大模型中单个layer上的权重体积往往要远大于该layer的输入数据(activation),因此针对大模型的量化技术往往只会针对关键的权重参数进行量化 (WeightOnly),而不对输入数据进行量化,在到达理想的压缩比的同时,尽可能保证输出结果,实现最高的量化“性价比”


图:权重压缩示意


经验证常规的int8权重量化,对大模型准确性的影响极低,而为了引入像int4,nf4这样的更极致的压缩精度,目前在权重量化算法上也经过了一些探索,其中比较典型的就是GPTQ算法,简单来说,GPTQ 对某个 block 内的所有参数逐个量化,每个参数量化后,需要适当调整这个 block 内其他未量化的参数,以弥补量化造成的精度损失。GPTQ 量化需要准备校准数据集,因此他也是一种PTQ (Post Training Quantization)量化技术。


OpenVINO™ 2023.2对于int4模型的支持

OpenVINO™ 2023.2相较2023.1版本,全面引入对int4模型以及量化技术的支持。主要有以下2个方面:

1. CPU及iGPU支持原生int4模型推理

OpenVINO™ 工具目前已经可以直接读取经NNCF量化以后的int4模型,或者是将HuggingFace中使用AutoGPTQ库量化的模型转换后,进行读取及编译。由于目前的OpenVINO™后端硬件无法直接支持int4数据格式的运算,所以在模型执行过程中,OpenVINO™ runtime会把int4的权重反量化的到FP16或是BF16的精度进行运算。简而言之:模型以int4精度存储,以fp16精度计算,用计算成本换取空间及IO成本,提升运行效率。这也是因为大模型的性能瓶颈主要来源于memory bound,用更高的数据读写效率,降低对于内存带宽与内存容量的开销。


图:经NNCF权重压缩后的模型结构


2. NNCF工具支持int4的混合精度量化策略(Weights Compression)

刚提到的GPTQ是一种data-based的量化方案,需要提前准备校验数据集,借助HuggingFace的Transformers和AutoGPTQ库可以完成这一操作。而为了帮助开发者缩短LLM模型的压缩时间,降低量化门槛,NNCF工具在2.7.0版本中引入了针对int4以及nf4精度的权重压缩模式,这是一种data-free的混合精度量化算法,无需准备校验数据集,仅对LLM中的Linear 和Embedding layers展开权重压缩。整个过程仅用一行代码就可以完成:

compressed_model = compress_weights(model, mode=CompressWeightsMode.NF4, group_size=64, ratio=0.9)

其中 model 为 PyTorch 或 OpenVINO™ 的模型对象;mode 代表量化模式,这里可以选择CompressWeightsMode.NF4 ,或是 CompressWeightsMode.INT4_ASYM/INT4_SYM 等不同模式;为了提升量化效率,Weights Compression使用的是分组量化的策略(grouped quantization),因此需要通过 group_size 配置组大小,例如 group_size=64 意味64个channel的参数将共享同一组量化参数(zero point, scale value);此外鉴于data-free的int4量化策略是比带来一定的准确度损失,为了平衡模型体积和准确度,Weights Compression还支持混合精度的策略,通过定义ratio值,我们可以将一部分对准确度敏感的权重用int8表示,例如在ratio=0.9的情况下,90%的权重用int4表示,10%用int8表示,开发者可以根据量化后模型的输出结果调整这个参数。

在量化过程中,NNCF会通过搜索的方式,逐层比较伪量化后的权重和原始浮点权重的差异(https://github.com/openvinotoolkit/nncf/blob/5eee3bc293da2e94b30cb8dd19da9f20fce95f02/nncf/quantization/algorithms/weight_compression/openvino_backend.py#L409C5-L409C5),衡量量化操作对每个layer可能带来的误差损失,并根据排序结果以及用户定义的ratio值,将损失相对较低的权重压缩到int4位宽。


中文大语言模型实践

·随着OpenVINO™ 2023.2的发布,大语言模型的int4压缩示例也被添加到了openvino_notebooks仓库中(https://github.com/OpenVINO-dev-contest/openvino_notebooks/tree/main/notebooks/254-llm-chatbot),这次特别新增了针对中文LLM的示例,包括目前热门模型 ChatGLM2  Qwen。在这个notebook中,开发者可以体验如何从HuggingFace的仓库中导出一个OpenVINO™ IR格式的模型,并通过NNCF工具进行低比特量化,最终完成一个聊天机器人的构建。


图:fp16与int4模型空间占用比较


通过以上这个截图可以看到,qwen-7b-chat经过NNCF的int4量化后,可以将体积压缩到原本fp16模型的1/3,这样使得一台16GB内存的笔记本,就可以流畅运行压缩以后的ChatGLM2模型。此外我们还可以通过将LLM模型部署在酷睿CPU中的集成显卡上,在提升性能的同时,减轻CPU侧的任务负载。


图:Notebook运行效果



总结

OpenVINO™ 2023.2中对int4 权重量化的支持,可以全面提升大模型在Intel平台上的运行性能,同时降低对于存储和内存的容量需求,降低开发者在部署大模型时的门槛,让本地化的大语言模型应用在普通PC上落地成为可能。



参考项目地址

https://github.com/openvinotoolkit/openvino_notebooks/tree/main/notebooks/254-llm-chatbot

https://github.com/openvinotoolkit/nncf/tree/5eee3bc293da2e94b30cb8dd19da9f20fce95f02/nncf/quantization/algorithms/weight_compression


OpenVINO™

--END--


               
               
               
你也许想了解(点击蓝字查看)⬇️
➡️  OpenVINO™ 2023.2 发布:让生成式 AI 在实际场景中更易用
➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI
➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手
➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人
➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能
➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易
➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能
➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型
➡️ 开发者实战系列资源包来啦!
➡️  以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️  还不知道如何用OpenVINO™作画?点击了解教程。


              
              
              

扫描下方二维码立即体验 

OpenVINO™ 工具套件 2023.2


点击 阅读原文 立即体验OpenVINO 2023.2
文章这么精彩,你有没有“在看”?

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部