大模型基架:Transformer如何做优化?

news2024/11/17 3:35:10

大模型的基础模式是transformer,所以很多芯片都实现先专门的transformer引擎来加速模型训练或者推理。本文将拆解Transformer的算子组成,展开具体的数据流分析,结合不同的芯片架构实现,分析如何做性能优化。

Transformer结构

transformer结构包含两个过程,Encoder和Decoder。其中Decoder较Encoder结构相同,多了对于kv_cache的处理。

如下图经典的结构示意图,可以看到在Decoder阶段的Multi-Head Attentiond的三个输入箭头其中两个来自Encoderde输出,关于kv-cache对内容管理的优化也是一个很重要的研究方向。本文暂时重点关注与Transformer的Encoder阶段的优化分析。

Transformer的数据流图

下图对应上面transformer的左边Encoder阶段。不同颜色表示不同的算子,其中linear, 其实也是一种matmul算子,只不过它的两个输入一个来自tensor, 一个来自常量。蓝色标记的matmul算子则两个输入全部是tensor。

包含的算子为:linear, matmul, transpose, softmax, add_layernorm。

通过代入参数,了解具体的数据流执行过程,可以让我们更加直观的理解下面的优化之后,得到相同的输出数据的思路。

优化设计1:图优化

根据上面的数据流图可以发现,transpose算子只是对数据进行重排,并不需要计算,但是过多的transpose算子需要不停从内存搬移数据,消耗紧缺的带宽资源,所以一个简单的优化点就是通过硬件架构的设计,来减少transpose层。

对硬件来说,在实现GEMM算子是的时候,对两个矩阵取数过程,增加一个transpose的逻辑, 不会消耗很多的资源,所以可以对GEMM的两个输入数据,分别设计是否打开transpose的参数。

假设GEMM算子原始的数据存放排布矩阵A为(batch, M, K), 矩阵B为(batch, K, N)。得到的输出为(Batch, M , N)。下面对transpose的多头注意力模块进行优化,示例了两种方案,来减少单独的transpose算子开销。

transpose前置(A_transpose_en)

利用矩阵A的transpose开关,将q, k, v的transpose前置, 数据流图如下,这样可以将原本的5个transpose操作减小为2个。

注意图中用红色和蓝色标记了GEMM算子的矩阵A,矩阵B的设定,当一个linear或者matmul算子的两个输入中显示(Batch, K, M)时候,即认为打开了GEMM算子的A矩阵transpose开关

transpose内置(B_transpose_en)

当利用B矩阵的transpose_en功能,优化后的数据流图如下。在QV的matmul计算过程,逆向利用矩阵B的transpose开关,这样可以将原本的5个transpose操作减小为1个。

当一个linear或者matmul算子的两个输入中显示(Batch, N, K)时候,即认为打开了GEMM算子的B矩阵transpose开关

 ​​​​​​​​​​​​​​

通过上面两个方案,大家可能会对attnV_matmul那一步的数据流关于head位置有点疑问,在这里我们不妨这样考虑,将head分给多个thread线程来做,只要thread的数据位置取的对,是可以将(batch, head,seq_len_q, seq_len_k)和(batch, seq_len_v, head, hidden/head)进行矩阵乘得到(batch, head, seq_len_q, hidden/head)的输出的。

优化设计2:任务并行拆解

模型的分布式并行策略有数据并行,张量并行,pipline 并行等,这些策略的一个要点就是合理利用集群资源,让更多的任务并行基础上,减少中间节点的数据通信。

当我们在一个有很多节点的集群上部署大模型时候,因为模型数据维度较大,往往需要将其拆解到不同的芯片(集群)运行,尤其是GEMM算子,不同的拆分方案对应不同的通信开销。下面我们来具体分析一个任务并行的拆解方案。

如图,首先针对attention模块的多头特征,选择在qkv_linear的weights的outZ方向切分为head份,假设有head个计算节点,每个节点计算1个head的matmul任务,因为没有在累加的维度拆分,所以这样每个节点可以顺序执行下一层任务,不需要交互数据。直到attnV_matmul之后,需要做fc0_linear的任务,要把所有的head合并起来累加运算,所以增加了all_gather的通信开销。接着为了避免通信开销,fc0和add_layernorm选择在seq维度拆分。当到达fc1_linear,对depth_hidden进行了拆分,但是fc2_linear需要对所有的depth_hidden进行累加,所以fc2_linear之前需要再一次的all_gather通信。

当然根据具体的硬件条件限制,还可以有其他的任务拆解方案,总之,需要具体场景具体分析。这里仅做简单的优化示例参考。

欢迎评论交流,如果觉得内容有帮助,需要您的点赞鼓励!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF本地靶场搭建——GZ:CTF安装

GZ:CTF 项目地址:https://gitcode.com/GZTimeWalker/GZCTF GZCTF 是一款开源的网络安全竞技平台,由开发者GZTimeWalker维护。该项目旨在提供一个环境,让网络安全爱好者和专业人士能够实践他们的技能,通过解决各种安全问题(即“…

流量分析——一、蚁剑流量特征

君衍. 一、Webshell特征流量分析二、环境介绍三、使用Wireshark进行流量分析1、环境说明2、HTTP追踪流分析3、蚁剑请求体中代码块解读 四、使用BurpSurite进行流量分析1、环境配置2、抓包分析 六、总结 一、Webshell特征流量分析 对于重保、护网等攻防演练的防守方来说&#x…

Python03:python代码初体验2

1、变量命名规范 1)字母(Unicode字符)、数字、下划线,不能使用特殊字符,数字不能开头 2)变量名是区分大小写的(大小写敏感,x和X是两个不同的变量名) 3)不能使…

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午,DolphinDB 携手光大证券,在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场,深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…

【一百】【算法分析与设计】N皇后问题常规解法+位运算解法

N皇后问题 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给出一个nnn\times nnn的国际象棋棋盘,你需要在棋盘中摆放nnn个皇后,使得任意两个皇后之间不能互相攻击。具体来说,不能存在两个皇后位于同…

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示: 三、进入容器内部 通过CONTAINER ID进入到容器…

x86国产化麒麟系统上安装docker及问题解决

以前感觉安装docker没有问题,所以没有记录怎么安装的,最近在国产化系统上安装docker总是失败,经过仔细研究完全解决了该问题,特此记录。 参考链接: 在 OpenKylin 上安装 Docker 按照上面的链接可以知道整个docker安装…

足球俱乐部管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,教练管理,用户管理,合同信息管理,赛事管理 前台账户功能包括:系统首页,个人中心,公告信息,赛事…

在k8s中部署Kafka高可用集群超详细讲解

🐇明明跟你说过:个人主页 🏅个人专栏:《数据流专家:Kafka探索》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Kafka简介 2、为什么在Kubernetes中部署Kafka 二、…

Facebook的隐私保护挑战:用户数据安全的新时代

在全球范围内,Facebook已经成为了不可忽视的社交媒体巨头,它连接着超过20亿的活跃用户。然而,随着其影响力的不断扩大,关于用户隐私和数据安全的问题也愈加引人关注。本文将深入探讨Facebook面临的隐私保护挑战,以及它…

列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能,以满足实时分析的需求。 本文作为《特性解读:列存技术》的后续,将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程,以及未来的趋势。 一、前言 1970 年,关系模型之父 Co…

275 基于matlab的脉搏信号处理GUI界面编程

基于matlab的脉搏信号处理GUI界面编程,并实现滤波、去噪、实时回放、小波分析 计算脉率。采用低通滤波器,计算巴特沃斯数字滤波器的阶数N和截止频率Wn、使用coif4小波基计算信号的平稳小波分解完成降噪。程序已调通,可直接运行。 275 脉搏信号…

Ubuntu22.04之安装有道词典(二百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

SQL158 每类视频近一个月的转发量/率

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:20011NULL210220012021-10-01 10:00:002021-10-01 10:00:15001NULL310320012021-10-01 11:00:502021-10-01 11:01…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…

微处理器体系结构

1.冯诺依曼结构 传统计算机采用冯●诺依曼(Von Neumann)结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 特征: 冯●诺依曼结构的计算机程序和数据共用一个存储空间,程序指令存储地址和数据…

SAP IQ03 Error IW351

今天在系统内碰到一个情况是IQ03 无法显示设备对象 报错为:IW 351 Equipment object status errors BS001 IW351 查阅资料后,note 1835087 提供了解决办法 1.SE38-->RISTEQ03 2.输入设备号,测试执行,确认无误后&#xff0…

8990890

作者主页:作者主页 数据结构专栏:数据结构 创作时间 :2024年5月18日

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…