又名高级Redis应用进阶课 一站式Redis解决方案
核心代码,注释必读
// download:3w 52xueit com
vue 2.x 响应式
Object.defineProperty
爱学it学无止境
今天的分享主要从工程师的视角来剖析 Transformer 的整体架构,主要分 4 个部分:
第 1 部分会介绍一些基础知识,帮助大家对后面讨论的内容做个铺垫。
第 2 部分是对 Transformer 架构的定量分析,也是今天分享的重点。在这个部分我会把 Transformer 架构打开,告诉大家它内部做了什么事情,并针对该模型做了一些定量分析,进而形成一些量化的结论。
第 3 部分我们会展示一些目前比较热门的 Transformer 架构变种,并从架构的视角来分析各个变种的效果和优化点。
第 4 部分是对一些实际案例进行分析,通过实战更好地让大家对大模型的性能和相关问题有更深入的理解。
1 基础知识回顾
在该部分我会介绍张量基础概念、张量和矩阵乘法以及 GPU 标称算力的基本原理。
1.1 张量是什么
张量这个概念可能大家平时听的比较多,但不太理解它具体是什么。其实张量就是多维数组。举个例子,如果数组是零维的,那其实它就是一个标量,即一个数字。如果是一维的,那么它就是一个向量,或者称之为一维数组。如果是二维的,那么它就是一个矩阵。如果数组的维度再高,比如说三维或者更高的维度,那么就给它起了个统一的名字,即张量。本次分享中,我们使用括号 [ ] 的形式来表示张量。
在大语言模型中,我们通常会在以下几种场景中使用到张量。
首先是权重 [hidden_size, hidden_size],我们一般使用二维的张量,即矩阵的形式来进行表示。在本次分享中,我们后续会用 [H, H] 来表示。
其次是激活值 [batch_size, seq_len, hidden_size],即输入输出值,我们一般使用三维的张量来进行表示。其中 batch_size 代表批的大小,seq_len 代表句子的长度 ,hidden_size 代表隐空间的大小。在本次分享中,我们后续会用 [B, S, H] 来表示。
第三是区分多头注意力的表示 [batch_size, seq_len, num_heads, head_size],我们一般用四维的张量来进行表示,在本次分享中,我们后续会用 [B, S, h, d] 来表示。
1.2 矩阵乘法与张量乘矩阵
接下来,我们来介绍一下矩阵乘法以及涉及到张量的矩阵乘法。
M*K 的矩阵 A 与一个 K*N 的矩阵 B 相乘后,就会得到一个 M*N 的矩阵。在后面,我们统一用@表示矩阵乘法,上面的例子我们也可以形式化表示为 [M, K]@[K, N]。
对于上述矩阵乘法,由于结果矩阵中的每一项我们都做了 K 次乘法和 K 次加法,所以对最终结果来说,总的计算量为 2*M*K*N(其中 2 表示一次乘法与一次加法计算)。相应的访存量我们也可以推导出来,包括 A 和 B 矩阵的读与结果矩阵的写,即(M*K + K*N + M*N)*sizeof(dtype),这也是下文我们统计计算量和访存量时会反复用到的工具。
那如果我们希望将上述简单的矩阵乘法应用到张量上,那应该如何来做呢?比如图中的 [B, S, H] 的张量与 [H, H] 的矩阵做乘法,我们可以将前一个张量理解为 S*H 的矩阵复制了 B 份,对于每个 S*H 的矩阵都和 H*H 的矩阵相乘。这样相乘后,我们其实就得到了一个 [B, S, H] 的结果。
所以从计算量的角度来说,对于 [A, M, K] 与 [K, N] 的矩阵乘法,最终的结果为 [A, M, N],总计算量相较于二维的矩阵乘法多了 A 次复制,所以总计算量为 2*A*M*K*N,访存量则为(A*M*K + K*N + A*M*N)*sizeof(dtype)。
以上就是张量乘法的一些基本过程,后面我们在推导实际计算过程时,会用到这些数学知识。
领取专属 10元无门槛券
私享最新 技术干货