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

    文章

    3648

    浏览量

    51710
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51080
  • LLM
    LLM
    +关注

    关注

    1

    文章

    340

    浏览量

    1257
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【CIE全国RISC-V创新应用大赛】基于 K1 AI CPU 的大模型部署落地

    ” 策略。我们必须使用 Q2_K (2-bit) 量化格式,将模型体积压缩到 5.5GB 左右,从而在 8GB 内存
    发表于 11-27 14:43

    AI边缘力盒子TS-SG-SE7系列产品规格书

    是基于国产嵌入式ARM架构、超强力SoC芯片BM1684/BM1684X开发的AI边缘
    发表于 10-27 17:31 0次下载

    AI力模组TS-SG-SM7系列产品规格书

    腾视科技AI力模组TS-SG-SM7搭载了AI芯片BM1684X,支持多模态大模型,可集成于边缘计算盒、智能NVR、机器人、无人机等,
    发表于 10-27 17:15 0次下载

    AI力模组TS-SG-SM9系列产品规格书

    腾视科技AI力模组TS-SG-SM9系列搭载高集成度处理器CV186AH/BM1688片,功耗低、力强、接口丰富、兼容性好。7.2-
    发表于 10-27 17:12 0次下载

    小白必读:到底什么是FP32、FP16、INT8

    网上关于力的文章,如果提到某个芯片或某个智中心的力,都会写:FP32精度下,英伟达H100的力大约为0.9PFlops。
    的头像 发表于 10-20 14:34 623次阅读
    小白必读:到底什么是FP32、FP16、<b class='flag-5'>INT8</b>?

    Qwen3-VL 4B/8B全面适配,BM1684X成边缘最佳部署平台!

    BM1684X完成Qwen3-VL4B/8B模型的适配,推理速度13.7/7.2token
    的头像 发表于 10-16 18:00 1695次阅读
    Qwen3-VL 4B/<b class='flag-5'>8</b>B全面适配,<b class='flag-5'>BM1684X</b>成边缘最佳<b class='flag-5'>部署</b>平台!

    科技上线赤兔推理引擎服务,创新解锁FP8模型

    模型量化部署方案。用户通过远程力平台预置的模型镜像与AI工具,仅需50%的GPU力即可解
    的头像 发表于 07-30 21:44 724次阅读

    使用 NPU 插件对量化的 Llama 3.1 8b 模型进行推理时出现“从 __Int64 转换为无符号 int 的错误”,怎么解决?

    推理量化的 Llama 3.1 8B 模型时遇到错误: Runtime error: Bad cast from __int64 to unsigned
    发表于 06-25 07:20

    为什么无法GPU使用INT8INT4量化模型获得输出?

    安装OpenVINO™ 2024.0 版本。 使用 optimum-intel 程序包将 whisper-large-v3 模型转换为 int 4 和 int8,并在 GPU 使用
    发表于 06-23 07:11

    se5 8使用YOLOv5_object示例程序出错“Not able to open cpu.so”的原因?

    /test_model/bmnnsdk2-bm1684_v2.7.0/examples/YOLOv5_object/data/models/yolov5s_fix8b_640_1.bmodel [BMRT
    发表于 04-22 11:29

    RK3588核心板边缘AI计算中的颠覆性优势与场景落地

    与低功耗。相比传统四核A72方案(如RK3399),单线程性能提升80%,多线程任务处理能力翻倍。 6TOPS独立NPU: 支持INT8/INT16混合精度计算,可直接部署YOLOv5
    发表于 04-15 10:48

    i.mx95的EIQ转换器将int8更改为uint8后出现报错怎么解决?

    我有一个大型量化 tensorflow lite 模型。它包括输入和输出类型为 “int8” 的 “Softmax”作。 我正在运行 eIQ 模型工具版本 1.14.0 将
    发表于 04-14 07:15

    OpenVINO™工具套件的深度学习工作台中无法导出INT8模型怎么解决?

    无法 OpenVINO™ 工具套件的深度学习 (DL) 工作台中导出 INT8 模型
    发表于 03-06 07:54

    是否可以输入随机数据集来生成INT8训练后量化模型

    无法确定是否可以输入随机数据集来生成 INT8 训练后量化模型
    发表于 03-06 06:45

    添越智创基于 RK3588 开发板部署测试 DeepSeek 模型全攻略

    DeepSeek 模型部署与测试,开启这场充满挑战与惊喜的技术探索之旅。 RK3588 开发板:AI 性能担当 RK3588 开发板基于先进的 8nm LP 制程工艺精心打造,其硬
    发表于 02-14 17:42