Transformers 中的 Softmax 可以并行加速么?

Transformers 中的 Softmax 可以并行加速么?

面试题

Softmax 如何并行?

Softmax 计算公式

图片

安全的 Softmax 运算

Softmax函数在深度学习中广泛应用于多分类问题的输出层,它通过指数化和归一化将一个实数向量转换为概率分布。然而,在实际计算中,Softmax函数可能会遇到数值溢出的问题,尤其是当输入值较大或者采用半精度(如FP16)进行计算时。

数值溢出分为上溢出和下溢出。上溢出发生在指数函数的参数非常大时,导致计算结果超过了浮点数的最大表示范围,结果可能变为无穷大(Inf)。下溢出则是指数函数的参数非常小,导致计算结果趋近于0,可能会被计算机舍入为0,这在Softmax函数的分母中尤其成问题,因为分母接近于0会导致最终结果不稳定。

为了解决这个问题,通常采用的一种方法是从每个输入值中减去向量中的最大值,即进行数值稳定化处理。这种方法可以减少指数函数的参数范围,从而避免上溢出。具体来说,对于输入向量 ,Softmax函数的计算公式可以修改为:

$\text{softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_{j=1}^{n} e^{x_j - \max(x)}}
$其中,是输入向量中的最大值。这样,减去最大值后,最大的指数参数不会超过0,从而避免了上溢出。同时,由于分母中至少有一项是1(当 是最大值时),这也避免了下溢出的问题。

此外,还可以使用LogSoftmax来进一步增强数值稳定性。LogSoftmax首先计算Softmax,然后取对数,这样可以将上溢出和下溢出的风险降到最低。

在实际应用中,深度学习框架如PyTorch和TensorFlow等,已经内置了数值稳定化的Softmax实现,可以直接使用而无需手动进行数值稳定化处理。例如,PyTorch中的nn.Softmaxnn.LogSoftmax模块就已经考虑了数值稳定性问题。

具体来说,可以采用以下方式来保证计算 softmax 时的数值稳定性

  • step 1: 计算 x 的最大值 m

图片

  • step 2: 计算 softmax 分母

图片

  • step 3: 计算对应位置的 softmax

图片

由此可见,若不采取任何优化措施,至少需要与GPU进行6次数据交换(包括3次数据写入和3次读取)。

如果我们对循环的每一步实施并行分割,还需额外承担如 reduce_sum 和 reduce_max 操作的通信开销。

我们能否通过整合某些操作来减少通信次数?根据以往在layernorm并行化中的实践经验,我们需要开发一种在线算法来实现这一目标。

Online Softmax

在 2018年 Maxim Milakov和Natalia Gimelshein 发表《Online normalizer calculation for softmax》,文章提出了一种称为“Online Softmax”的算法,该算法能够在单次遍历输入向量的过程中同时计算最大值和归一化项,从而将每个向量元素的内存访问次数从4次减少到3次。这种方法的灵感来自于数值稳定的方差计算在线算法。文章还提出了一种并行版本的在线归一化计算方法,以及一种将Softmax和TopK操作融合的方法,进一步提高了性能。

我们再来看一下第二步:

图片

可以看出,如果能够去掉这个式子对 的依赖,那么就能对 softmax 进行并行加速。

假设

图片

注:这里减去的全局最大值变成了当前最大值。这个式子有如下的性质

图片

  1. 求解 x 的最大值 m, 和计算 softmax 的分母

图片

  1. 求对应位置的 softmax

在这里插入图片描述

我们是否能够进一步整合操作?似乎已经达到极限了,因为第二步的计算结果依赖于第一步的输出。

不过,我们可以利用GPU的共享内存来暂存中间数据,通过一个单一的kernel执行上述两个步骤,这样就可以减少与全局内存的交互次数,仅需进行一次数据写入和一次结果读取。

总结

总体而言,优化的关键在于两个主要策略:

  1. 通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。
  2. 利用共享内存来存储临时数据,以减少对全局内存的访问成本。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot vue 大学生竞赛管理系统设计与实现

博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

YoloV10改进策略:BackBone改进|PoolFormer赋能YoloV10,视觉检测性能显著提升的创新尝试

摘要 在深度学习的广阔领域中,目标检测作为计算机视觉的基石任务之一,始终吸引着研究者的广泛关注。近期,我们大胆尝试将前沿的PoolFormer主干网络引入经典的目标检测框架YoloV10中,这一创新性融合不仅为YoloV10注入了新的活力,更在检测精度与效率上实现了双重飞跃,成为…

【Linux学习】【Ubuntu入门】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件,点击开启此虚拟机后,等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端,输入命令sudo apt-get install vim安装vim,输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性,让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者,携其革命性的Web端云剪辑解决方案,正重新定义视频创作的边界,让专业级视频剪辑触手可及&#xff…

【Linux】Docker下载与使用-nginx

目录 一、Docker介绍 二、Docker结构 三、下载Daocker 1. 在linux上下载docker,执行以下命令即可: 2. 开启docker 3. 执行以下操作并进行使用 四、在Docker上安装nginx 一、Docker介绍 Docker:是给予Go语言实现的开源项…

深入探讨 Docker:远程登录与镜像管理

深入探讨 Docker:远程登录与镜像管理 走一路,寻索一路。每有胡杨树,我必仔细浏览,驻足长久,如急于兑现一个久远的梦。而更多平常的日子如同荒原本身一样朴实无华,如同岁月一样不露形色,只守着一…

统信服务器操作系统【SSH登录常见问题】解决方案

方案适用于统信服务器操作系统D/E/A版。 文章目录 前言问题及解决方案问题一问题现象问题原因问题方案问题二问题现象问题原因问题方案问题三问题原因问题方案问题四问题现象问题原因问题方案问题五问题现象问题原因问题方案问题六问题现象问题原因问题方案前言 介绍日常使用s…

SPI驱动学习七(SPI_Slave_Mode驱动程序框架)

目录 一、SPI_Slave_Mode驱动程序框架1. Master和Slave模式差别1.1 主设备 (Master)1.2 从设备 (Slave)1.3 示例 2. SPI传输概述2.1 数据组织方式2.2 SPI控制器数据结构 3. SPI Slave Mode数据传输过程4. 如何编写程序4.1 设备树4.2 内核相关4.3 简单的示例代码4.3.1 master和s…

Jenkins本地安装配置与远程访问管理本地服务详细流程

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…

活动报名| 探索存内计算的未来,共话AGI时代

活动日期:2024年09月28日 下午1:00-6:00 活动地点:杭州技术转移中心 三楼路演厅 议程亮点: 存内计算技术架构以及最新趋势AGI开源项目交流存内计算实操上板体验 存内计算 ——突破物理极限的下一代算力技术 直接…

kubernetes存储入门(kubernetes)

实验环境依旧是三个节点拉取镜像,然后在master节点拉取资源清单: 然后同步会话,导入镜像; 存储入门 ConfigMap volume卷--》volumemount(挂载卷) Glusterfs NFS ISCSI HostPath ConfigMap Secret E…

玄机--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容,提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器,提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件,提交文件绝对路径 蚁剑流量特征总结 …

基于SpringBoot+Vue+MySQL的在线酷听音乐系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,网络已成为人们日常生活中不可或缺的一部分。在线音乐服务因其便捷性和丰富性,逐渐成为用户获取音乐内容的主要渠道。然而,传统的音乐播放平台往往存在歌曲资源有限…

SpringCloud 2023各依赖版本选择、核心功能与组件、创建项目(注意事项、依赖)

目录 1. 各依赖版本选择2. 核心功能与组件3. 创建项目3.1 注意事项3.2 依赖 1. 各依赖版本选择 SpringCloud: 2023.0.1SpringBoot: 3.2.4。参考Spring Cloud Train Reference Documentation选择版本 SpringCloud Alibaba: 2023.0.1.0*: 参考Spring Cloud Alibaba选择版本。同时…

C Primer Plus 第7章——第二篇

你该逆袭了 第7章:重点摘录 三、逻辑运算符1、备选拼写:iso646.h 头文件2、优先级3、求值顺序4、范围 四、一个统计单词的程序1、针对代码,提出疑问,第8章节进行讲解2、我结合自己的理解,自己写的代码 五、条件运算符 &#xff1f…

解决macOS MySQL安装后不能远程访问的问题

主要是因为我的后端服务是通过docker部署的, 无法和宿主机的MySQL进行通信. 首先输入 use mysql; 之后输入 update user set host “%” where user “root”; 最后输入 flush privileges; 合起来就是: use mysql;update user set host "%" where user &qu…

TypeScript 基本使用指南【前端 26】

TypeScript 基本使用指南 引言 TypeScript 是 JavaScript 的一个超集,它添加了类型系统和一些其他特性,使得开发大型应用时更加高效和可靠。TypeScript 代码最终会被编译成普通的 JavaScript 代码,这意味着你可以在任何支持 JavaScript 的环…

轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例

目录 文章目录 目录1、简介2、SpringBoot3应用发送日志到Loki2.1、基本介绍2.2、添加依赖2.3、配置文件application.yml2.4、创建logback配置2.5、添加日志示例2.6、运行SpringBoot3 3、在grafana中查看日志3.1、登录grafana3.2、查询日志3.3、查询我们的SpringBoot发送过来的日…

828华为云征文|针对Flexus X实例云服务器的CPU和内存性能测评

目录 一、Flexus X实例云服务器简介 1.1 产品摘要 1.2 产品优势 1.3 本次测评服务器规格 二、CPU性能测试 2.1 操作说明 2.2 操作步骤 2.2 结果分析 三、测试内存负载 3.1 操作说明 3.2 操作步骤 3.3 结果分析 四、测试终评 一、Flexus X实例云服务器简介 1.1 产品…

PostgreSQL数据库与PostGIS在Windows中的部署与运行

本文介绍在Windows电脑中,下载、安装、部署并运行PostgreSQL与PostGIS数据库服务的方法。 PostgreSQL是一种功能强大的开源关系型数据库管理系统(RDBMS),以其稳定性、可靠性和丰富的功能而闻名;其支持多种高级特性&…