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

2024-06-06 09:12

本文主要是介绍大模型基架:Transformer如何做优化?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大模型的基础模式是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通信。

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

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

这篇关于大模型基架:Transformer如何做优化?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035690

相关文章

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI