首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

高级Redis进阶课 解决Redis实际问题-完整分享

又名高级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)。

以上就是张量乘法的一些基本过程,后面我们在推导实际计算过程时,会用到这些数学知识。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O6Qz7E25sbIQOArCzQg4jM4Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券