前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计

大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计

作者头像
数据派THU
发布于 2022-04-29 03:40:33
发布于 2022-04-29 03:40:33
64500
代码可运行
举报
文章被收录于专栏:数据派THU数据派THU
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
来源:数学中国本文约3200字,建议阅读5分钟在本综述论文中,研究者解释了不同技术的工作原理、评估和比较,还分析了一些实现这些技术的框架。

现代深度学习人工智能技术的发展涉及使用深度神经网络(DNN)来解决图像、视频、音频、自然语言处理、图像形式的内容生成等各种问题,或生成给定格式主题的文本等任务。

俄罗斯斯科尔科沃科学技术研究所、法国里尔大学、波尔多大学、Inria 等科研机构联合发表了一篇论文《Survey on Large Scale Neural Network Training》,它试图解决的问题是:若给定模型和计算平台的情形下,如何训练才是最有效率的。为了使训练高效,其必须可行,最大程度地利用资源的计算能力,在并行情况下,它不能让信息传输成为瓶颈。训练的效率从根本上取决于计算内核在计算资源(CPU、TPU、GPU)上的有效实现以及 GPU 之间和不同内存之间通信的有效实现。

论文链接:https://arxiv.org/abs/2202.10435

在这两种情况下,人们为优化计算内核的算术强度,及有效实现硬件网络上的通信做了很多工作。对于使用者来说,已存在强大的分析工具来识别硬件瓶颈,并可用于判定本调查中描述哪些策略可用于解决算术强度、内存和控制交换数据量的问题。

该综述研究涵盖了应对这些限制的通用技术。如果由于模型、优化器状态和激活不适合内存而无法先验执行计算,则可以使用内存交换计算(重新实现)或数据转移(激活和权重卸载)。我们还可以通过近似优化器状态和梯度(压缩、修剪、量化)来压缩内存使用。

并行方法(数据并行、模型并行、流水线模型并行)也可以将内存需求分布到多个算力资源上。如果计算的算力强度不足以充分利用 GPU 和 TPU,一般是因为 mini-batch 太小,那么上述技术也可以增加 mini-batch 的大小。最后,如果使用数据并行引起的通信开销昂贵到拖累计算速度,则可以使用其他形式的并行(模型并行、流水线模型并行),梯度压缩也可以限制数据交换的数量。

在本次调查中,研究者解释了这些不同技术是如何工作的,其中描述了评估和比较所提出方法的文献,还分析了一些实施这些技术的框架。

下表 1为文章讨论的不同技术及其对通信、内存和计算效率的影响。

研究者根据目的区分了以下方法:首先讨论减少 GPU 内存使用,随后考虑对不适合 GPU 的模型使用并行训练,最后讨论为训练存储在多个设备上的模型而开发的优化器的设计。

单 GPU 情况下减少内存使用

在前向传播期间,神经网络存储执行反向传播所需的激活。在某些情况下,这些激活会消耗大量内存,让模型无法训练。减少内存使用的主要方法有两种:重新实现(也称为 checkpointing)和卸载。

激活的重新实现

重新实现的策略仅在前向传播期间存储一小部分激活,并在反向传播期间重新计算其余部分。重新实现方法可以通过它们处理的计算图来区分。第一组来自自动微分(AD),它们为同构顺序网络(多层按顺序执行并具有相同计算和内存成本的 DNN)找到最佳调度。第二组专注于过渡模型,例如异构序列网络(可以是由任意复杂模块组成的任何序列神经网络,如 CNN、ResNet、一些 transformer),它将解决方案从 AD 调整为异构设置。

一些方法可以对一般计算图执行重新实现,尽管确切的计算成本可能指数级上升,如下表 2 所示。

激活卸载

卸载(又被称为内存交换)是一种通过在前向传递期间将激活转移到 CPU 内存并将它们预取回 GPU 内存,以进行相应的向后计算来节省 GPU 内存的技术。

由于 CPU 和 GPU 之间 PCI 总线的带宽有限,必须优化选择传输激活,以及何时传输的选择。

在 vDNN [Rhu et al., 2016] 研究中,作者通过仅卸载卷积层的输入来遵循对 CNN 有效的启发式方法,然而它不能很好地推广到一般 DNN 上。另有研究 [Le et al., 2018] 考虑了激活生命周期来选择卸载的内容,并使用图搜索方法来识别插入卸载 / 预取操作的时刻。AutoSwap [Zhang et al., 2019] 通过为每个变量分配优先级分数来决定卸载哪些激活。

权重卸载

前面提到的很多方法也适用于卸载权重,这是因为卸载权重依赖于适用于任何张量的通用技术,比如 TFLMS、AutoSwap 或者 SwapAdvisor。

不适合单个 GPU 的模型的并行性

在模型并行化中,只需要传达激活信息,并且传输只发生在分配给不同处理器的连续层之间。本章节提到的工作如下表 4 所示。

如果多个小批量被 pipeline 化 ,则可以加快模型并行化中的执行速度,从而同时激活了多个训练迭代,具体可见 [Huang et al., 2019]。一旦在所有这些小批量上计算了前向和后向阶段,权重就会更新。这种方法实现起来相当简单,但也导致计算资源大部分处于空置状态。[Narayanan et al., 2019] 中提出的 PipeDream 方法仅强制前向和后向任务针对给定的小批量使用相同的模型权重,改进了这一训练过程。

减少执行更新的频率也已被证明有助于限制权重过期(Narayanan et al., 2021a)。[Yang et al., 2021] 提出的 PipeMare 根据 pipeline 阶段向后调整学习率和模型权重。

对 pipeline 方法中激活导致的存储成本进行建模是一项艰巨的任务(Beaumont et al., 2021b)。例如,[Fan et al., 2021] 中的 DAPPLE 、 [Li and Hoefler, 2021] 中的 Chimera 使用 1F1B(One-Forward-One-Backward)调度来减少与激活相关的内存消耗。1F1B 是一种同步权重更新技术,尽可能早地安排每个微批次的反向传递,以释放激活占用的内存。

有些论文专门处理具有挑战性的拓扑。比如,为了解决高通信成本和异构网络能力的问题,[Zhan and Zhang, 2019] 中的 Pipe-torch 提出了一种更新的动态规划策略,该策略假设计算和通信之间没有重叠。[Park et al., 2020] 中的 Pipe 解决了异构 GPU 的其他问题,采用的方法是将这些异构 GPU 分成虚拟 worker,并在每个虚拟 worker 中运行 pipeline 并行化,同时依赖 worker 之间的数据并行化。

用于跨设备模型训练的优化器 

零冗余优化器

2020 年, Rajbhandari, S. 等人在论文《 ZeRO: Memory Optimizations toward Training Trillion Parameter Models》中提出了零冗余优化器(Zero Redundancy Optimizer, ZeRO),将它作为一种减少内存使用的数据并行化实现。根据在设备上划分的张量,该算法具有三个阶段,即阶段 1 - 优化器状态、阶段 2 - 优化器状态和梯度和阶段 3 - 优化器状态、梯度和模型超参数。

2021 年, Ren, J. 等人在论文《 ZeRO-Offload: Democratizing Billion-Scale Model Training》中将 ZeRO 与 Zero-Offload 内部参数更新的 CPU 端计算统一起来,其中梯度被迁移至存储参数副本的 CPU,更新的权重迁移回 GPU。

低精度优化器

为了进一步减少内存使用,低精度优化器(low-precision optimizer)有了用武之地。这些方法使用低精度格式拉力表示优化器状态以及状态的辅助向量。并且,误差补偿技术可以被用来维持跟踪统计的近似准确率。

2021 年, Dean, J. 等人在论文《Large Scale Distributed Deep Networks》中提出了一种将 Adam 优化器存储在 8-bit 的方法,同时在使用 32-bit 格式时保持整体性能不变。2020 年, Sun, X. 等人在论文《Ultra-Low Precision 4-bit Training of Deep Neural Networks》中提出了更激进的精度降低,其中开发了处理 4-bit 表示的特定路径。

收敛加速

另一种加速大规模深度学习模型的方法是减少节点之间的通信时间以及在适当局部最小值收敛所需的 epoch 数量。

关于通信成本的降低。在将梯度在计算节点之间迁移之前对它们进行压缩已经出现了不同的方法,具体有三类,分别是分裂(sparsification)、量化(quantization)和低秩(low-rank)方法。

分裂方法只迁移完整梯度元素的一些子集,并在参数向量中更新相应的元素。这种近似方法能够显著降低通信成本,同时保持训练模型的性能,代表工作有 2017 年 Aji, A. F. 和 Heafield, K 的论文《 Sparse Communication for Distributed Gradient Descent 》和 2019 年 Alistarh, D. 等的论文《The Convergence of Sparsified Gradient Methods》。

另一种方法是基于迁移梯度的量化,该方法只迁移一定数量的 bit、从这些 bit 中重建整个梯度向量并更新参数向量的所有元素。这种方法对于一些神经网络架构和实验设置得到了不错的结果,代表工作有 Alistarh, D. 等人 2017 年的论文《QSGD: Communication-Efficient SGD via Gradient Quantization and Encoding》。

最后一种降低通信成本的方法是低秩方法,其中在更新参数向量之前构建、迁移和使用梯度的低秩近似来恢复完整格式的梯度。低秩近似可以通过块能量(block power)方法或者最小化策略来构建,各自的代表工作分别是 Vogels et al., 2019 和

Cho et al., 2019。

大批量训练。另一种加速优化器收敛的方法是针对每个批使用大量的样本。这种训练设置可以减少每个 epoch 中的迭代次数,并提升 GPU 的利用率。在 Goyal, P 等人 2017 年的论文《Accurate, Large Minibatch SGD》中,研究者提出使用线性缩放规则来更新学习率和批大小。这一设置可以稳定优化过程,并将模型的最终性能收敛至相同。

编辑:文婧

代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
单点登录说明(单点登录流程)
  什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分
全栈程序员站长
2022/07/30
2.7K0
单点登录说明(单点登录流程)
一文搞懂单点登录三种情况的实现方式
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一
@超人
2021/07/05
7.2K0
一文搞懂单点登录三种情况的实现方式
CAS单点登录(一)——初识SSO
前言:其实好早就想把CAS的这一套知识整合一下,在工作上也应用到了这块,只是最近才在工作上接触到CAS,所以刚好把这些知识总结一下。这块可能是一个比较大的模块知识点,所以会有多篇文章进行逐一展开,笔者会尽量抽空更新,当然如果文章中存在错误,期望大家指出。
全栈程序员站长
2022/06/26
4.7K0
CAS单点登录(一)——初识SSO
单点登录实现原理(SSO)
局部会话存在,全局会话一定存在;全局会话存在,局部会话不一定存在;全局会话销毁,局部会话必须销毁 如果在校验令牌过程中发现客户端令牌和服务器端令牌不一致或者令牌过期的话,则用户之前的登录就过期了,用户需要重新登录 关于令牌可参考:基于跨域单点登录令牌的设计与实现
lin_zone
2018/08/15
1.7K0
单点登录实现原理(SSO)
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
认证(Authentication) 认证是指应用软件(身份信息使用方)通过采用某种方法来确认当前请求的用户是谁。基于密码的认证过程可以细分为三步: (1)认证服务器(身份信息提供方)从客户端获取用户账密。 (2)认证服务器将拿到的账密与数据库中保存的账密进行比较,确认正确后,生成用户身份信息。 (3)使用方从提供方处获取用户身份信息。
全栈程序员站长
2022/09/27
7.1K0
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
单点登录与授权登录业务指南
单点登录(SSO)是一种用户身份验证过程,允许用户使用单一的登录凭据来访问多个应用程序或服务。它减少了需要记忆多个用户名和密码的需求,提高了安全性和用户体验。SSO在企业环境中尤为重要,因为它简化了对多个内部和外部服务的访问过程。
JanYork_简昀
2024/03/05
1.5K0
单点登录与授权登录业务指南
大厂都在用!一款开源社区60k stars的极致轻量级权限认证框架
1000+优质开源项目推荐进度:2/1000。如需更多类型优质项目推荐,请在文章后留言。
IT学习日记
2024/12/19
2340
大厂都在用!一款开源社区60k stars的极致轻量级权限认证框架
单点登录 SSO 的前世今生
HTTP是无状态协议,浏览器的每一次请求,服务器都会独立处理,不与之前或之后的请求产生关联,所以,任何用户都可以通过浏览器访问服务器资源。
业余草
2020/04/24
6570
单点登录 SSO 的前世今生
SpringCloud-基于Oauth2的SSO单点登录原理解析与实现
单点登录(SSO)是一种身份验证过程,允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理,并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例,我们将展示SSO的工作机制和优势,帮助开发者更好地理解和应用这一技术。
Damon小智
2024/05/28
2.3K1
SpringCloud-基于Oauth2的SSO单点登录原理解析与实现
从SSO出发谈谈登录态保护
抛砖引玉 在文章开始前,先看看一个常见的情况👇 在集团内进行开发时,通常会遇到不同组之间的合作,如果是同一个组的前后端,因为交互请求都是在同一个「域」内发生的,所以一般不会存在跨域问题。但如果未做处理,直接从 a.alibaba.com 请求 b.alibaba.com 的接口,就会出现跨域的问题,这是因为浏览器对于不同域请求的限制问题,其实跨域的问题很好解,只要设置了正确的请求头即可,具体的可以参考我的这篇文章 👉《一次跨域问题的分析》 但这是访问不需要登录的接口,那如果是从 a.alibaba.com
出其东门
2021/09/03
1.1K0
从SSO出发谈谈登录态保护
长文慎入!大厂架构演进实战之手写 CAS 单点登录
单点登录在大型网站里使用得非常频繁,那么什么是单点登录?一句话解释:一处登录,处处登录。
南风
2020/09/21
1.4K0
长文慎入!大厂架构演进实战之手写 CAS 单点登录
单点登录原理及CAS实现【面试+工作】
单点登录原理及实现sso【面试+工作】 WEB的登录那些事 说道账户登录和注册,其实我们每天都在亲身感受着,像微博、知乎还有简书等等。我们总是需要定期的去重新登录一下,对于这种认证机制,我们都能说出来两个名词,Cookie、Session。的确没错,Cookie和Session是实现这一切的核心。 为什么会有Cookie和Session?区别是什么? 引入这两个概念的根本原因是因为Http协议是无状态的,也就是说它不能建立起多次请求之间的关系。所以需要引入一个能有浏览器或服务器保存的一个上下文状态,也就是C
Java帮帮
2018/04/17
2.1K0
单点登录原理及CAS实现【面试+工作】
单点登录实现原理
单点登录(Single Sign-On,SSO)是一种用户认证方式,用户在多个应用系统中只需要登录一次,就可以访问所有相互信任的应用系统。SSO 的实现原理涉及身份认证、令牌管理、会话管理等多个方面,下面将详细介绍其实现原理和常用的实现方式。
小马哥学JAVA
2024/07/04
4270
单点登录sso的实现原理(单点登录原理)
单点登录可以做到在不记录用户密码的情况下,实现不同系统之间的资源共享,自动登录不安全,单点登录,一处登录,处处都可用,不用做多余的登录操作 引用一个很经典的案例
全栈程序员站长
2022/07/30
1.6K0
单点登录sso的实现原理(单点登录原理)
松哥手把手教你入门 Spring Boot + CAS 单点登录
在微服务以及分布式系统中,单点登录变得越来越普遍,松哥之前也有两篇文章和大家介绍过单点登录的方案:
江南一点雨
2020/06/04
1.6K0
xxl-sso单点登录
我们知道单点登录系统:出名的有apereo的cas和OAuth2、JWT等。通常认证有两个方案:
路行的亚洲
2023/02/28
1.2K0
xxl-sso单点登录
什么是单点登录(SSO)
在前阵子有个读者来我这投稿,是使用JWT实现单点登录的(但是文章中并没有介绍什么是单点登录),所以我觉得是时候来整理一下了。
Java3y
2019/05/17
1.6K0
【JavaP6大纲】功能设计篇:单点登录
用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
Java廖志伟
2021/04/08
3200
单点登录
SSO英文全称Single Sign On,单点登录; SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
周杰伦本人
2022/10/25
1.4K0
单点登录
什么是单点登录(SSO)
比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。
Java团长
2019/05/17
1.1K1
推荐阅读
相关推荐
单点登录说明(单点登录流程)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验