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中LinearLayer的权重进行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

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

    关注

    1

    文章

    3003

    浏览量

    48223
  • 编译器
    +关注

    关注

    1

    文章

    1594

    浏览量

    48862
  • LLM
    LLM
    +关注

    关注

    0

    文章

    244

    浏览量

    274
收藏 人收藏

    评论

    相关推荐

    RADXA微服务器试用体验】+ GPT语音与视觉交互:2,图像识别

    ├── yolov 8s_opt.onnx# 导出的动态opt onnx 模型├── yolov 8s_qtable_fp16 # TPU-MLIR编译时,用于 BM1684X/
    发表于07-14 23:36

    esp-dlint8量化模型数据集评估精度下降的疑问求解?

    一 试着将 模型进行了esp-dl int16和 int8量化,并在测试数据集上进行精度评估,其中 int
    发表于06-28 15:10

    产品应用 | 小盒子跑大模型!英码科技基于BM1684X平台实现大模型私有化部署

    当前, 人工智能领域,大 模型 丰富人工智能应用场景中扮演着重要的角色,经过不断的 探索,大 模型进入到 落地
    的头像 发表于06-14 16:29 451次阅读
    产品应用 | 小盒子跑大<b class='flag-5'>模型</b>!英码科技基于<b class='flag-5'>算</b><b class='flag-5'>能</b><b class='flag-5'>BM1684X</b>平台实现大<b class='flag-5'>模型</b>私有化<b class='flag-5'>部署</b>

    bm1684运行demo报错怎么解决?

    ../models/ BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel[BMRT][bmcpu_setup:406] INFO:cpu_lib \'libcpuop.so
    发表于05-20 07:24

    256Tops力!CSA1-N8S1684X力服务器

    (基于 BM1684X的高 力服务器)高 力AI处理器 BM1684X搭载了 BM1684AI 力So
    的头像 发表于03-23 08:02 880次阅读
    256Tops<b class='flag-5'>算</b>力!CSA1-N<b class='flag-5'>8S1684X</b><b class='flag-5'>算</b>力服务器

    RADXA微服务器试用体验】Radxa Fogwise1684XMini 规格

    通过网络可以了解到, 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-6BCPUINT4量化部署

    ChatGLM3 是智谱 AI 和清华大学 KEG 实验室联合发布的新一代对话预训练 模型ChatGLM3-6B 是 ChatGLM3 系列中的开源
    的头像 发表于01-05 09:36 701次阅读
    <b class='flag-5'>ChatGLM</b>3-6B<b class='flag-5'>在</b>CPU<b class='flag-5'>上</b>的<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
    的头像 发表于11-23 16:40 977次阅读

    走向边缘智能,美格智能携手阿加犀成功力AI模组运行一系列大语言模型

    模型、RedPajama、 ChatGLM2、Vicuna,展现出卓越的边缘端大 模型 部署能力。▌构建智 底座,
    的头像 发表于11-14 14:34 318次阅读
    走向边缘智能,美格智能携手阿加犀成功<b class='flag-5'>在</b>高<b class='flag-5'>算</b>力AI模组<b class='flag-5'>上</b>运行一系列大语言<b class='flag-5'>模型</b>

    BM1684架构介绍

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

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

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

    本地化ChatGPT?Firefly推出基于BM1684X的大语言模型本地部署方案

    自ChatGPT发布以来,生成式AI 全球引起了新的浪潮,它影响着各行各业,为世界带来智能化的发展。然而,类ChatGPT的大语言 模型极度依赖 力巨大的服务器,导致目前大部分应用只能通过集中调用
    的头像 发表于09-09 08:02 1457次阅读
    本地化ChatGPT?Firefly推出基于<b class='flag-5'>BM1684X</b>的大语言<b class='flag-5'>模型</b>本地<b class='flag-5'>部署</b>方案

    INT8量子化PyTorchx86处理器

    INT8量子化PyTorch x86处理器
    的头像 发表于08-31 14:27 706次阅读
    <b class='flag-5'>INT8</b>量子化PyTorch <b class='flag-5'>x</b>86处理器