您当前的位置:首页 > 电脑百科 > 人工智能

一个简单模型就让ChatGLM性能大幅提升 | 最“in”大模型

时间:2023-08-17 11:07:01  来源:量子位  作者:

本文作者:

赵桢、罗成、李亭骞、邹文艺 引言

自大语言模型 (LLM) 成为热点话题以来,涌现了一大批中文大语言模型并在优化平台中得到了积极部署。ChatGLM 正是广受好评的主流中文大语言模型之一。

然而,由于 ChatGLM 模型尚未成为 Transformer 生态的原生模型,因此,官方 optimum 扩展库对其仍缺乏支持。

本文提供了一种使用 OpenVINO™ opset 重构该模型架构的便捷方法。

该方案包含专为 ChatGLM 定制的优化节点,且这些节点都利用英特尔® 高级矩阵扩展(Intel® Advanced Matrix Extensions,缩写为英特尔® AMX)内联和 MHA(Multi-Head Attention,多头注意力)融合实现了高度优化。

请注意,本文仅介绍了通过为 ChatGLM 创建 OpenVINO™ stateful模型实现优化的解决方案。本方案受平台限制,必须使用内置了英特尔® AMX 的第四代英特尔® 至强® 可扩展处理器[1](代号 SApphire Rapids)。笔者不承诺对该解决方案进行任何维护。

ChatGLM 模型简介

笔者在查看 ChatGLM 原始模型的源码[2]时,发现 ChatGLM 与 Optimum ModelForCasualML并不兼容,而是定义了新的类 ChatGLMForConditionalGeneration[3]。

该模型的流水线回路包含 3 个主要模块(Embedding、GLMBlock 层[4]和 lm_logits),结构如下:

图1 ChatGLM 模型结构

如上图所示,整个流水线实际要求模型有两个不同的执行图,使用输入提示符进行首次推理时不需要 KV 缓存作为 GLMBlock 层的输入。从第二次迭代开始,QKV 注意力机制的上一次结果将成为当前一轮模型推理的输入。

随着生成符的长度不断增加,在流水线推理过程中,模型输入和输出之间将存留大量的大型内存副本。

以 ChatGLM6b 默认模型配置[5]为示例,输入和输出阵列之间的内存副本类似于以下伪代码,其内存拷贝的开销由模型的参数 hidden_size 以及迭代的次数决定:

while(eos_token_id || max_seq_len){

memcpy(model_inp, model_outp, num_layer*2*sizeof(model_outp)* hidden_size)

model_outp.push_back(gen_token)

}

代码若显示不全,可左右滑动

因此,本文要解决的两大关键问题是:

  • 如何优化模型推理流水线来消除模型输入和输出之间的内存副本
  • 如何通过重新设计执行图来优化 GLMBlock 模块
构建 OpenVINO™ stateful 模型实现显著优化

首先,需要分析 GLMBlock 层的结构,尝试封装一个类并按以下工作流来调用 OpenVINO™ opset。接着,将图形数据序列化为 IR 模型 (.xml, .bin)。

图2 ChatGLM构建OpenVINO™ stateful模型

关于如何构建 OpenVINO™ stateful模型,以及如何使用OpenVINO™ 提供的模型创建样本,在 opset 构建模型,可参考文末文档。

ChatGLM 的自定义注意力机制是本文所关注和优化的部分。

主要思路是:构建全局上下文结构体,用于在模型内部追加并保存每一轮迭代后的 pastKV 的结果,这样减少了 pastKV 作为模型输入输出的拷贝开销,同时使用内联优化以实现 Rotary Embedding 和多头注意力机制 (Multi-Head Attentions)。

英特尔® AMX 是内置在第四代英特尔® 至强® 可扩展处理器中的矩阵乘法加速器,能够更快速地处理 bf16 或 int8 数据类型的矩阵乘加运算,通过加速张量处理,显著提高推理和训练性能。借助英特尔® AMX 内联指令(用于加速计算的单指令多操作),实现了对 ChatGLM 模型中 Attention,Rotary Embedding 等算子的高度优化,并且使用 bf16 指令进行乘加操作,在保证浮点指数位精度的同时提高运算效率。

与此同时,本方案还使用 int8 精度来压缩全连接层的权重,在实时计算中将使用bf16进行计算。因此,无需通过训练后量化 (PTQ) 或量化感知训练 (QAT) 对模型进行低精度处理。模型压缩方法可以降低模型存储空间,减少内存带宽的负载,因为计算仍然使用浮点,不会造成溢出,不会对模型精度造成损失。

为 ChatGLM 创建

OpenVINO™ stateful模型

请依照下方示例配置软硬件环境,并按照以下步骤优化 ChatGLM:

硬件要求

第四代英特尔® 至强® 可扩展处理器(代号 Sapphire Rapids)或其后续的、仍内置英特尔® AMX 的产品

软件验证环境

Ubuntu 22.04.1 LTS

面向 OpenVINO™ Runtime Python/ target=_blank class=infotextkey>Python API 的 Python 3.10.11

用于构建 OpenVINO™ Runtime 的 GCC 11.3.0

cmake 3.26.4

构建 OpenVINO™ 源码

  • 安装系统依赖并设置环境
  • 创建并启用 Python 虚拟环境

$ conda create -n ov_py310 python=3.10-y

$ conda activate ov_py310

代码若显示不全,可左右滑动

  • 安装 Python 依赖

$ pip install protobuf transformers==4.30.2cpm_kernels torch>=2.0sentencepiece pandas

代码若显示不全,可左右滑动

  • 使用 GCC 11.3.0 编译 OpenVINO™
  • 克隆 OpenVINO™ 并升级子模块

$ git clone https://Github.com/luo-cheng2021/openvino.git -b luocheng/chatglm_custom

$ cd openvino && git submodule update --init --recursive

代码若显示不全,可左右滑动

  • 安装 Python 环境依赖,以构建 Python Wheel

$ python -m pip install -U pip

$ python -m pip install -r ./src/bindings/python/src/compatibility/openvino/requirements-dev.txt

$ python -m pip install -r ./src/bindings/python/wheel/requirements-dev.txt

代码若显示不全,可左右滑动

  • 创建编译目录

$ mkdir build && cd build

代码若显示不全,可左右滑动

  • 使用 CMake 编译 OpenVINO™

$ cmake .. -DENABLE_LLMDNN=ON

-DBUILD_PYTHON_TESTS=ON

-DENABLE_CPU_DEBUG_CAPS=OFF

-DENABLE_DEBUG_CAPS=OFF

-DCMAKE_BUILD_TYPE=Release

-DENABLE_INTEL_MYRIAD_COMMON=OFF

-DENABLE_INTEL_GNA=OFF

-DENABLE_OPENCV=OFF

-DENABLE_CPPLINT=ON

-DENABLE_CPPLINT_REPORT=OFF

-DENABLE_NCC_STYLE=OFF

-DENABLE_TESTS=ON

-DENABLE_OV_CORE_UNIT_TESTS=OFF

-DENABLE_INTEL_CPU=ON

-DENABLE_INTEL_GPU=OFF

-DENABLE_AUTO=OFF

-DENABLE_AUTO_BATCH=OFF

-DENABLE_MULTI=OFF

-DENABLE_HETERO=OFF

-DENABLE_INTEL_GNA=OFF

-DENABLE_PROFILING_ITT=ON

-DENABLE_SAMPLES=ON

-DENABLE_PYTHON=ON

-DENABLE_TEMPLATE=OFF

-DENABLE_OV_ONNX_FRONTEND=OFF

-DENABLE_OV_PADDLE_FRONTEND=OFF

-DENABLE_OV_PYTORCH_FRONTEND=OFF

-DENABLE_OV_TF_FRONTEND=OFF

-DENABLE_OPENVINO_DEBUG=OFF

-DENABLE_CPU_DEBUG_CAPS=ON

-DCMAKE_INSTALL_PREFIX=`pwd`/install

-DCMAKE_INSTALL_RPATH=`pwd`/install/runtime/3rdparty/tbb/lib:`pwd`/install/runtime/3rdparty/hddl/lib:`pwd`/install/runtime/lib/intel64

-Dgflags_Dir=`pwd`/../thirdparty/gflags/gflags/cmake

$ make --jobs=$(nproc --all)

$ make install

代码若显示不全,可左右滑动

  • 安装针对 OpenVINO™ Runtime 和 openvino-dev 工具构建好的 Python Wheel

$ pip install ./install/tools/openvino*.whl

代码若显示不全,可左右滑动

  • 检查系统 GCC 版本和 Conda Runtime GCC 版本。如下所示,如果系统 GCC 版本高于 Conda GCC 版本,请升级 Conda GCC 至相同版本,以满足 OpenVINO™ Runtime 的需求。(可选)

##check system (OpenVINO compiling env) gcc version

$ gcc --version

gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0

##check conda python (runtime env for OpenVINO later) gcc version

$ python

Python 3.10.11(mAIn, May 162023, 00:28:57) [GCC 11.2.0] on linux

##If sys gcc ver > conda gcc ver, upgrade conda gcc ver -> sys gcc ver

$ conda install -c conda-forge gcc=11.3.0

代码若显示不全,可左右滑动

  • 将 PyTorch 模型转为 OpenVINO™ IR

$ cd ..

$ python tools/gpt/gen_chatglm.py /path/to/pytorch/model /path/to/ov/IR

代码若显示不全,可左右滑动

使用 OpenVINO™ Runtime API 为 ChatGLM 构建推理流水线

本文提供了使用 Transformer 和 OpenVINO™ Runtime API 构建推理流水线的样本。首先,在 test_chatglm.py 中,创建一个由 transformers.PreTrainedModel 衍生的新类。

然后,通过使用 OpenVINO™ Runtime Python API 构建模型推理流水线来更新转发函数。其他成员函数则迁移自 modeling_chatglm.py [2]的 ChatGLMForConditionalGeneration。

如此一来,即可确保输入准备工作、set_random_seed、分词器/连接器 (tokenizer/detokenizer) 以及余下的流水线操作能够与原始模型的源码保持一致。

如需启用 int8 权重压缩,只需设置简单的环境变量 USE_INT8_WEIGHT=1。这是因为在模型生成阶段,已使用 int8 对全连接层的权重进行了压缩,因此模型可在之后的运行过程中直接使用 int8 权重进行推理,从而免除了通过框架或量化工具压缩模型的步骤。

请按照以下步骤使用 OpenVINO™ Runtime 流水线测试 ChatGLM:

  • 运行 bf16 模型

$ python3 tools/gpt/test_chatglm.py /path/to/pytorch/model /path/to/ov/IR --use=ov

代码若显示不全,可左右滑动

  • 运行 int8 模型

$ USE_INT8_WEIGHT=1python test_chatglm.py /path/to/pytorch/model /path/to/ov/IR --use=ov

代码若显示不全,可左右滑动

权重压缩:降低内存带宽使用率,提升推理速度

本文采用了 Vtune 对模型权重数值精度分别为 bf16 和 int8 的内存带宽使用率(图 3 和图 4)以及 CPI 率进行了性能对比分析(表 1)。结果发现:当模型权重数值精度压缩至 int8 时,可同时降低内存带宽使用率和 CPI 率。

图3 模型权重数值精度为 bf16 时的内存带宽使用率

图4 模型权重数值精度为 int8 时的内存带宽使用率

表1 采用不同模型权重数值精度时的 CPI 率

每条指令消耗的时钟周期 (Clockticks per Instruction Retired, CPI) 事件率,也称为“平均指令周期数 (Cycles per Instruction)”,是基于硬件事件抽样收集的基础性能指标之一,在抽样模式下也称为“性能监控计数器 (PMC) 分析”。

该比率计算方式为:用处于非停机状态的处理器时钟周期数 (Clockticks) 除以已消耗指令数。每个处理器用于计算时钟周期数和已消耗指令数的确切事件可能并不相同,但 VTune Profiler 可辨别和使用正确的数量。

CPI < 1 时,通常为采用指令密集型代码的应用,而 CPI > 1 则可能是停滞时钟周期密集型应用,也可能是内存密集型应用。

由此,我们可以得出结论,类似 chatGLM 等语言模型对内存带宽的要求非常高,性能往往受到内存操作或带宽的限制。

很多场景下,消除内存操作的负载,性能会因此获得大幅收益。在优化此类模型时,如何在不影响精度的同时对模型进行压缩或轻量化处理是一项不可或缺的技巧。除此之外,在异构平台和框架上进行部署,还涉及到减少内存/设备存储之间的数据搬运等优化思路。

因此,在压缩模型的同时,还需要考虑对原始 pytorch 模型推理 forward/generates 等函数流水线的优化,而 OpenVINO™ 在优化模型自身的同时,还将流水线的优化思路体现在修改模型结构中(将 KV cache保存在模型内部),通过优化 Optimum-intel 等框架的流水线,减少内存拷贝和数据搬运。

结论

笔者根据上述方法重新设计执行图并优化了 GLMBlock,消除了 ChatGLM 模型输入和输出之间的内存副本,且模型运行高效。

随着 OpenVINO™ 的不断升级,本方案的优化工作也将得到推广并集成至正式发布的版本中。这将有助于扩展更多的大语言模型用例。敬请参考 OpenVINO™ 官方版本[6]和 Optimum-intel OpenVINO™ 后端[7],获取有关大语言模型的官方高效支持。

了解更多内容,请点击文末【阅读原文】。

作者简介:

英特尔® OpenVINO™ 开发工具客户支持工程师赵桢和邹文艺,英特尔® OpenVINO™ 开发工具 AI 框架工程师罗成和李亭骞,都在从事 AI 软件工具开发与优化工作。

OpenVINO™ stateful模型构建:

https://docs.openvino.ai/2022.3/openvino_docs_OV_UG.NETwork_state_intro.html

通过 opset 构建模型:

https://github.com/openvinotoolkit/openvino/blob/master/samples/cpp/model_creation_sample/main.cpp

参考链接:

[1]https://www.intel.cn/content/www/cn/zh/events/accelerate-with-xeon.html

[2]https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py

[3]https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py#L1031

[4]https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py#L554

[5]https://huggingface.co/THUDM/chatglm-6b/blob/main/config.json

[6]https://www.intel.cn/content/www/cn/zh/developer/tools/openvino-toolkit/overview.html

[7]https://huggingface.co/docs/optimum/main/en/intel/index

*本文系量子位获授权刊载,观点仅为作者所有。

最“in”大模型专栏

1

十亿参数,一键瘦身!「模型减重」神器让大模型狂掉3/4

2

保护大模型应用安全,现在不需要拿性能做代价了

3

如何优化ChatGLM-6B?一行代码就行

— 



Tags:ChatGLM   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
使用 Triton 部署 chatglm2-6b 模型
一、技术介绍 NVIDIA Triton Inference Server 是一个针对 CPU 和 GPU 进行优化的云端和推理的解决方案。支持的模型类型包括 TensorRT、TensorFlow、PyTorch (meta-llama/L...【详细内容】
2023-09-27  Search: ChatGLM  点击:(364)  评论:(0)  加入收藏
一个简单模型就让ChatGLM性能大幅提升 | 最“in”大模型
本文作者:赵桢、罗成、李亭骞、邹文艺 引言自大语言模型 (LLM) 成为热点话题以来,涌现了一大批中文大语言模型并在优化平台中得到了积极部署。ChatGLM 正是广受好评的主流中文...【详细内容】
2023-08-17  Search: ChatGLM  点击:(422)  评论:(0)  加入收藏
非程序员小白版本地部署ChatGLM2-6B +LangChain 个人知识库模型
ChatGLM2-6B 部署我这次采用的是本地部署,机器是 Macbook pro M1 64G进入你的系统“终端”# 键盘:command + 空格键 # 搜索“终端”,点击“打开”,进入“终端”界面 下载源码#...【详细内容】
2023-07-31  Search: ChatGLM  点击:(837)  评论:(0)  加入收藏
基于 ChatGLM-6B 部署本地私有化 ChatGPT
最近chatGPT很火,但是用起来需要翻墙,国内也有很多模型,什么百度的文心一言、阿里的盘古、还有科大讯飞的模型等等,那么今天我们就来介绍下怎么在本地自己部署自己的聊天模型,也...【详细内容】
2023-06-01  Search: ChatGLM  点击:(306)  评论:(0)  加入收藏
折腾ChatGLM的几个避坑小技巧
我昨天说从数据技术嘉年华回来后就部署了一套ChatGLM,准备研究利用大语言模型训练数据库运维知识库,很多朋友不大相信,说老白你都这把年纪了,还能自己去折腾这些东西?为了打消这...【详细内容】
2023-04-12  Search: ChatGLM  点击:(566)  评论:(0)  加入收藏
想不想把ChatGPT装在自己电脑上?国产开源大语言模型 ChatGLM 帮你实现!
今天给大家分享一个开源的大语言模型ChatGLM-6B。十几天的时间,就收获了近 1w 个 star。ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model...【详细内容】
2023-03-27  Search: ChatGLM  点击:(291)  评论:(0)  加入收藏
▌简易百科推荐
藏在AI背后的“吃电狂魔”
人工智能时代的能耗黑洞据估算,到2027年,人工智能行业每年将消耗85~134太瓦时的电力,相当于瑞典或荷兰一年的总用电量。马斯克判断,电力缺口最早可能会在2025年发生,“明年你会看...【详细内容】
2024-04-09    雪豹财经社  Tags:AI   点击:(1)  评论:(0)  加入收藏
OpenAI和谷歌再起纷争:AI的尽头是内容
日前,纽约时报的一篇报道称,人工智能公司 OpenAI为收集高质量训练数据而开发了一个语音转录模型Whisper。该模型主要用于转录 OpenAI 获取的超过 100 万小时的 YouTube 视频,也...【详细内容】
2024-04-09  小编也疯狂  新浪网  Tags:AI   点击:(1)  评论:(0)  加入收藏
AI产业的灰色暗面:OpenAI、谷歌、META如何搞训练语料
财联社4月7日讯(编辑 史正丞)种种迹象显示,目前站在全世界AI领域潮头浪尖的这些公司,早在几年前就已经陷入对训练语料的“绝望”追逐中&mdash;&mdash;为此他们不惜修改政策条款...【详细内容】
2024-04-09    财联社  Tags:AI产业   点击:(1)  评论:(0)  加入收藏
和“数字人”交朋友,当心隐私被出卖......
在虚拟社交中如何在保护用户隐私和数据安全的同时提供高质量的社交体验?如何避免过度依赖虚拟社交找到虚拟与真实之间的平衡点?《中国消费者报》记者就此展开了调查APP里有个...【详细内容】
2024-04-09    中国消费者报  Tags:数字人   点击:(2)  评论:(0)  加入收藏
AI“复活”成产业链:成本可降至数百元
大模型应用落地,带火数字人(11.560, 0.29, 2.57%)赛道。文|《中国企业家》记者李艳艳 实习生 孙欣编辑|姚赟头图来源|《流浪地球2》电影画面截图清明节前,预估会有需求的庞立...【详细内容】
2024-04-09    中国企业家  Tags:AI“复活”   点击:(2)  评论:(0)  加入收藏
多方热议人工智能产业新机遇
编者按&emsp;&emsp;从前沿科技展会到高层对话平台,从上海、重庆到博鳌,从线上到线下&hellip;&hellip;一场场高规格、大规模的盛会中,人工智能正在成为各界热议的高频词。赋能千...【详细内容】
2024-04-08    中国家电网  Tags:人工智能   点击:(4)  评论:(0)  加入收藏
​人形机器人时代来了吗
日前,由中国人形机器人(11.080, -0.05, -0.45%)百人会主办的人形机器人大赛在北京经济技术开发区开赛。工作人员向参观者展示一款人形机器人。参观者与一款陪护型人形机器人...【详细内容】
2024-04-08    中国青年报  Tags:​人形机器人   点击:(5)  评论:(0)  加入收藏
AI重塑社交:腾讯与字节跳动的新赛场
文|新火种 一号编辑|美美最近,腾讯和字节跳动这两大互联网巨头几乎同步推出了各自的AI社交产品,尽管腾讯和字节跳动在前段时间刚刚“破冰”,但这一举措不仅意味着这两大巨头之...【详细内容】
2024-04-07    蓝鲸财经  Tags:AI   点击:(8)  评论:(0)  加入收藏
第一批用 Kimi 做内容的网红已经杀疯了
作者:王东东 文章来自:斗战圣佛小组技术信仰派 VS 市场信仰派 朱啸虎和月之暗面老板杨植麟在前几天有一场不算 battle 的 battle。battle 的争论点是:大模型有没有戏。技术派...【详细内容】
2024-04-04    斗战圣佛小组  Tags:Kimi   点击:(4)  评论:(0)  加入收藏
昆仑万维发布面向人工智能时代的六条人才宣言
过去的一年多,是人工智能取得非凡进步的一年。在这充满突破性技术飞跃和备受争议的一年里,我们见证了人工智能的快速发展和广泛的影响,人工智能已经迅速地融入了我们的生活,深刻...【详细内容】
2024-04-03    砍柴网  Tags:昆仑万维   点击:(7)  评论:(0)  加入收藏
站内最新
站内热门
站内头条