0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探索ChatGLM2在算能BM1684X上INT8量化部署,加速大模型商业落地

算能开发者社区 2023-10-10 10:18 次阅读


1. 背景介绍

在2023年7月时我们已通过静态设计方案完成了ChatGLM2-6B在单颗BM1684X上的部署工作,量化模式F16,模型大小12GB,平均速度约为3 token/s,详见《算丰技术揭秘|探索ChatGLM2-6B模型与TPU部署》。为了进一步提升模型的推理效率与降低存储空间,我们对模型进行了INT8量化部署,整体性能提升70%以上,模型大小降低到6.4GB,推理速度达到6.67 token/s。

2. 量化方案

首先TPU-MLIR原有的INT8量化方案并不适合直接应用于LLM。主要是因为无论PTQ的校准或者QAT的训练对于LLM来说成本过高,对LLM的一轮PTQ的校准可能就需要1-2天时间;另外就是量化带来的误差在LLM上无法收敛,最终会导致模型精度大量损失。

在量化方案上我们沿用了ChatGLM2使用的W8A16策略,即只对GLMBlock中Linear Layer的权重进行per-channel量化存储,在实际运算时仍将其反量化回F16进行运算。因为LLM中Linear Layer权重数值间差异非常小,对INT8量化较为友好,所以量化过后的结果与F16计算结果在余弦相似度上仍然能保持99%以上,精度上几乎可以做到0损失。

3d05fb98-6713-11ee-9788-92fbcf53809c.pngW8A16 MatMul

3. TPU-MLIR实现

在Top到Tpu层的lowering阶段,编译器会自动搜寻模型中右矩阵输入为权重,且该矩阵维数为2的MatMul,将其替换为W8A16MatMul算子。此处主要是为了与左右矩阵都为Acitvation的MatMul算子区分开(mm, bmm与linear layer在编译器中会被统一转换为MatMul算子)。以ChatGLM2中其中一个MatMul算子为例:L = (max_lengthx4096xf16), R = (4096x27392xf16),量化后的权重由原来的214MB降为107MB,额外产生的Scale (4096xf16)只占了0.008MB的存储空间,基本上可以达到减半的效果。算子替换源码与权重量化源码可在TPU-MLIR仓库中查看。

3d1228dc-6713-11ee-9788-92fbcf53809c.pngOp Replacement in TPU-MLIR

4. 后端性能提升原理

前一节介绍的量化只实现了存储空间减半的效果,而性能提升主要在于W8A16MatMul后端算子的实现。如果对TPU架构不熟悉可通过TPU原理介绍(1)TPU原理介绍(2)两期视频了解(可关注b站“算能开发者”进行观看)按照算能当前的TPU架构,W8A16的计算过程主要分为5个步骤:

1. 从Global Memory中加载数据到Local Memory
2. 将INT8权重Cast为F16
3. 与Scale数据相乘完成反量化操作
4. 与Input Activation进行矩阵乘运算
5. 将计算结果存储回Global Memory

3d277ab6-6713-11ee-9788-92fbcf53809c.pngW8A16Matmul Computation on TPU

因为Local Memory空间有限,对于大型数据通常需要进行切分,分批对数据进行加载、运算与存储。为了提升效率,通常我们会利用GDMA与BDC指令并行,同时进行数据搬运与运算操作,所以Local Mmeory大致需要被需要被划分为两部分区域,同一个循环内一个区域用于数据运算,另一个区域存储上一循环计算好的结果以及加载下一循环需要用到的数据,如下图所示。

3d378e06-6713-11ee-9788-92fbcf53809c.pngLocal Memory Partition

矩阵乘等式如下:

当矩阵乘运算中左矩阵数据量较小时,性能瓶颈主要在于右矩阵的数据加载上,即数据加载时间远比数据运算时间要长很多。W8A16通过量化能够将右矩阵的数据搬运总量缩小为原来的一半,而且额外多出的Cast与Scale运算时间可以被数据搬运时间覆盖住,因此并不会影响到整体runtime,如下图所示。

3d494614-6713-11ee-9788-92fbcf53809c.pngGDMA and BDC parallel
总而言之,从后端角度来说,当越小,越大时,W8A16带来的性能提升收益越大。

从LLM的角度来看,我们以ChatGLM2为例,一次推理的完整流程分为一轮prefill与多轮decode。在prefill阶段,基于我们当前的静态设计方案,输入词向量会被补位为当前模型所支持的最大文本长度max_length (e.g., 512, 1024, 2048)。而decode阶段则固定只取前一轮生成的一个token作为输入。

3d53d2c8-6713-11ee-9788-92fbcf53809c.pngChatGLM2 Inference
因此max_length越长,GLMBlock接收的输入数据量越大,Linear Layer的也就越大,这就会导致W8A16的性能提升越有限。而decode阶段始终保持为1,此时W8A16就能带来明显的性能提升。3d711ad6-6713-11ee-9788-92fbcf53809c.pngMatMuls in ChatGLM2 prefill and decode phase

5. 效果展示

将W8A16量化应用于ChatGLM2-6B后,整体性能如下所示:

  1. 性能:整体性能得到70%以上的提升
  2. 精度:与F16下的回答略有不同,但答案正确性仍然可以保证
  3. 模型大小:由12GB降为6.4GB

3d86cac0-6713-11ee-9788-92fbcf53809c.pngResult Comparison

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2707

    浏览量

    47709
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48632
  • LLM
    LLM
    +关注

    关注

    0

    文章

    202

    浏览量

    234
收藏 人收藏

    评论

    相关推荐

    RADXA微服务器试用体验】Radxa Fogwise 1684X Mini 规格

    通过网络可以了解到,RADXA微服务器的具体规格: 处理器:BM1684X 力:高达32Tops INT8峰值
    发表于 02-28 11:21

    yolov5量化INT8出错怎么处理?

    bm1684 --tolerance 0.85,0.45 --model yolov5l_bm1684_int8.bmodel SOPHGO Toolchain
    发表于 01-10 06:40

    ChatGLM3-6B在CPU上的INT4量化部署

    ChatGLM3 是智谱 AI 和清华大学 KEG 实验室联合发布的新一代对话预训练模型ChatGLM3-6B 是 ChatGLM3 系列中的开源
    的头像 发表于 01-05 09:36 564次阅读
    <b class='flag-5'>ChatGLM</b>3-6B在CPU上的<b class='flag-5'>INT</b>4<b class='flag-5'>量化</b>和<b class='flag-5'>部署</b>

    【爱芯派 Pro 开发板试用体验】爱芯派部署ChatGLM3(一)

    模型公开 benchmark ChatGLM2-6B 模型性能接近。这一创新为自然语言处理应用在移动设备
    发表于 12-17 22:54

    Yolo系列模型部署、精度对齐与int8量化加速

    在基于PytorchQuantization导出的含有QDQ节点的onnx时,我们发现尽管量化版本的torch模型精度很高,但是在TensorRT部署时精度却很低,TRT部署收精度损失
    的头像 发表于 11-23 16:40 629次阅读

    BM1684架构介绍

    L2cache 2.2 峰值力 峰值力: FP32峰值力 = 64 * 16 * 2(FP32 MAC) *
    发表于 09-19 08:11

    BM1684中各种内存的概念

    (SC5/SM5) Host Memory是主机的内存 Device Memory是PCIe板卡的设备内存 CModel模式:BMNNSDK中提供的BM1684软件模拟器环境,可在没有TPU硬件的情况下,验证模型转换编译
    发表于 09-19 07:47

    INT8量化常见问题的解决方案

    一、int8的输出和fp32模型输出差异比较大 解决方案: 检查前后处理是否有问题,int8网络输入输出一般需要做scale处理,看看是否遗漏? 通过量化可视化工具分析
    发表于 09-19 06:09

    BM1684x SOC下avframe转换问题求解

    /samples/ff_bmcv_transcode/ff_avframe_convert.cpp文件中,函数int bm_image_to_avframe()将bm_image内存转换为AVFrame
    发表于 09-18 08:03

    yolov5s_v6.1_3output.torchscript.pt模型auto_cali一键量化工具执行报错的原因?

    下图附件 ps: 直接用算法脚本下载yolov5s_v6.1_3output.torchscript.pt然后执行 ./gen_int8bmodel_nntc.sh BM1684 可以得到量化
    发表于 09-18 08:01

    基于ChatGLM2和OpenVINO™打造中文聊天助手

    ChatGLM 是由清华大学团队开发的是一个开源的、支持中英双语的类 ChatGPT 大语言模型,它能生成相当符合人类偏好的回答, ChatGLM2 是开源中英双语对话模型
    的头像 发表于 08-24 17:13 989次阅读
    基于<b class='flag-5'>ChatGLM2</b>和OpenVINO™打造中文聊天助手

    请问新CPU推断INT8模型的速度是否比旧CPU快?

    与采用旧 CPU 的推理相比,新 CPU 推断的 INT8 模型的推理速度更快。
    发表于 08-15 08:28

    基于算能第四代AI处理器BM1684X的边缘计算盒子

    英码IVP03X智能工作站搭载算能全新一代AI处理器BM1684X,八核ARM Cortex-A53,主频2.3GHz;INT8算力高达32Tops,FP16算力达16 TFLOPS,FP32算力 2 TFLOPS,边缘端少有的大算力。
    发表于 08-10 09:46 752次阅读
    基于算能第四代AI处理器<b class='flag-5'>BM1684X</b>的边缘计算盒子

    YOLOv8模型ONNX格式INT8量化轻松搞定

    深度学习模型量化支持深度学习模型部署框架支持的一种轻量化模型
    的头像 发表于 07-18 09:34 2393次阅读
    YOLOv8<b class='flag-5'>模型</b>ONNX格式<b class='flag-5'>INT8</b><b class='flag-5'>量化</b>轻松搞定

    32Tops!高算力主板AIO-1684XQ

    采用SOPHON算能AI处理器BM1684X,可配置16GB大内存;INT8算力高达32TOPS,支持主流编程框架,开放SDK,提供一站式AI开发包,工具链完备易用度高。适用于智能安防、智慧交通
    的头像 发表于 07-01 10:00 684次阅读
    32Tops!高算力主板AIO-<b class='flag-5'>1684</b>XQ