作者:杨亦诚
针对大语言模型 (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 个方面:
01CPU 及 iGPU 支持原生 int4 模型推理
OpenVINO工具目前已经可以直接读取经 NNCF 量化以后的 int4 模型,或者是将 HuggingFace 中使用 AutoGPTQ 库量化的模型转换后,进行读取及编译。由于目前的 OpenVINO 后端硬件无法直接支持 int4 数据格式的运算,所以在模型执行过程中,OpenVINO runtime 会把 int4 的权重反量化的到 FP16 或是 BF16 的精度进行运算。简而言之:模型以 int4 精度存储,以 fp16 精度计算,用计算成本换取空间及 IO 成本,提升运行效率。这也是因为大模型的性能瓶颈主要来源于 memory bound,用更高的数据读写效率,降低对于内存带宽与内存容量的开销。
图:经 NNCF 权重压缩后的模型结构
02NNCF 工具支持 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 会通过搜索的方式,逐层比较伪量化后的权重和原始浮点权重的差异,衡量量化操作对每个 layer 可能带来的误差损失,并根据排序结果以及用户定义的 ratio 值,将损失相对较低的权重压缩到 int4 位宽。
中文大语言模型实践
随着 OpenVINO2023.2 的发布,大语言模型的 int4 压缩示例也被添加到了openvino_notebooks 仓库中,这次特别新增了针对中文 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 权重量化的支持,可以全面提升大模型在英特尔平台上的运行性能,同时降低对于存储和内存的容量需求,降低开发者在部署大模型时的门槛,让本地化的大语言模型应用在普通 PC 上落地成为可能。
审核编辑:汤梓红
-
轻量化技术
+关注
关注
0文章
6浏览量
2227 -
大模型
+关注
关注
2文章
2423浏览量
2637 -
LLM
+关注
关注
0文章
286浏览量
327 -
OpenVINO
+关注
关注
0文章
92浏览量
196
原文标题:如何利用低比特量化技术在 iGPU 上进一步提升大模型推理性能|开发者实战
文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论