0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何显著提升Vision Transformer的训练效率

深度学习自然语言处理 来源:GiantPandaCV 作者:GiantPandaCV 2022-05-24 10:46 次阅读

近期MetaAI发布了一篇博客,关于如何显著提升Vision Transformer的训练效率。

原文:[Significantly faster Vision Transformer training]

链接:https://ai.facebook.com/blog/significantly-faster-vision-transformer-training

What the research is

Vision Transformer模型几乎火遍计算机视觉各个领域,其性能随着参数增加和更久的训练过程而得到提升。随着模型越来越大,超过了万亿次浮点运算的规模,该领域达到了瓶颈:训练一个模型往往要一个月,需要几百上千个GPU,导致大部分人无法接触到大规模ViT模型,并进而增加了对加速器的需求。

为了降低门槛,让更多人能够应用ViT,我们开发一系列方法来加速整个训练。我们基于MetaAI的图像分类模型库PyCls实现了一系列优化,这些优化极大的提升了模型训练过程的吞吐量:

d3d58a30-da96-11ec-ba43-dac502259ad0.png

How it works ?

我们首先对代码库进行分析,以定位训练效率低下的原因,最后关注点落在计算类型上:大部分模型都是用FP32进行训练,如果使用FP16训练的话,可以降低显存占用,并提高模型训练速度,但这一做法经常会导致准确率下降

所以我们选了一个折中的方法:自动混合精度。在该方法下,我们用half类型进行计算,以加快训练,减少显存使用。并以fp32类型存储参数,以保证模型准确率。其中我们没有手动将网络各部分转换成half类型,而是应用AMP各种模式(如O1, O2, O3),以寻找一个既能提升速度又不影响精度的平衡点。

FSDP

为了让训练更加高效,我们应用了FSDP训练策略,他能够将参数,梯度,优化器状态分片到各GPU上。在FSDP的帮助下,我们可以用更少的GPU资源构建更大的模型。

FSDP策略可以参考 [数据并行Deep-dive: 从DP 到 Fully Sharded Data Parallel (FSDP)完全分片数据并行] 链接:https://zhuanlan.zhihu.com/p/485208899

MTA Optimizer

前向计算完毕后,优化器需要对各个参数进行修改。而当参数比较多的情况下,对应启动的Optimizer Kernel就会变得很多,通常这些Kernel都比较小,计算负担不大,启动Kernel的开销反而占了大头。

ContiguousParams中,它将模型参数放置到一块连续的显存中进行计算,这样就能减少优化器这部分的时间。下图是Resnet50+SGD是否应用ContiguousParams的比较,可以看到OptimizerStep这部分时间显著减少了。

d4089a74-da96-11ec-ba43-dac502259ad0.png

而NVIDIA的Apex库的做法则是在底层重新实现了一系列MultiTensorOptimizer,如Adam, Adagrad等等。

Apex这种方法比较硬核,普通用户如果想要自己自定义优化器并应用Multi Tensor的优化,就必须改动底层CUDA代码。而最近PyTorch也在计划提供了一系列foreach接口[Replace optimizers in torch.optim with the ones from torch.optim._multi_tensor] 链接:https://github.com/pytorch/pytorch/pull/49039,让用户只需要在Python层即可享受到优化,对应的MultiTensor版Momentum优化器代码如下所示:

torch._foreach_mul_(bufs,momentum)
torch._foreach_add_(bufs,grads,alpha=1-dampening)

Pooled Classifier

原版的ViT是额外加了一个分类token,来输出最后的分类结果。而这里采用平均池化 如:https://github.com/facebookresearch/pycls/blob/main/pycls/core/config.py#L205 处理最后的分类

Batch Second Input Tensor Layout

这里的数据格式与以往不同,将batch维度放在第二维,并在调用nn.MultiheadAttention的时候,设置batch_first=False,以减少不必要的转置

ifself.batch_firstandis_batched:
returnattn_output.transpose(1,0),attn_output_weights
else:
returnattn_output,attn_output_weights

总感觉这个实现怪怪的

其他优化

我们在采取560大小的batchsize下,达到了1.51倍的加速比,进一步的我们将batchsize设置为384,并将图片大小增大到256,达到了1.86倍加速比。在全FP16运算下,能够达到2.18倍加速比,尽管这偶尔会降低准确率(在实验中,准确率降低不到10%)。

d451532c-da96-11ec-ba43-dac502259ad0.png

使用上述优化,我们将Imagenet1K数据集每epoch训练时间从0.65小时降低到0.43小时

d4786106-da96-11ec-ba43-dac502259ad0.png

我们还研究了不同GPU配置对训练速度的影响,在不同配置下我们都实现了比DDP baseline更高的吞吐量。随着GPU增加,吞吐量会因为设备之间的通信开销略微下降。然而即使在64块GPU下,我们仍然比DDP基线快1.83倍

d4c4af7a-da96-11ec-ba43-dac502259ad0.png

文中链接

PyCls :https://github.com/facebookresearch/pycls

ContiguousParams:https://github.com/PhilJd/contiguous_pytorch_params

Adam:https://github.com/NVIDIA/apex/blob/master/csrc/multi_tensor_adam.cu

审核编辑 :李倩



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 加速器
    +关注

    关注

    2

    文章

    745

    浏览量

    36600
  • Vision
    +关注

    关注

    1

    文章

    145

    浏览量

    17676

原文标题:如何更快地训练Vision Transformer

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    工业触摸显示屏在提升生产效率、降低成本等方面具有显著优势

     工业触摸显示屏在提升生产效率、降低成本等方面发挥着显著的作用。具体来说,其主要优势体现在以下几个方面。
    的头像 发表于 04-23 10:16 97次阅读

    景嘉微AI训练等领域智算模块及整机研发成功,速度提升显著

    据悉,景嘉微此举旨在大范围地拓展AI推理、训练以及科学计算等业务,显著提升自身核心竞争力,稳固在相关领域内的市场地位。除此之外,新产品的发布还被公司视为推动实施长远发展战略的重要步骤。
    的头像 发表于 03-14 15:19 333次阅读

    蚂蚁集团AI研发部门开源AI Infra技术,助力大模型训练效率提升

    蚂蚁集团AI创新研发部门NextEvo近日宣布,他们将全面开源AI Infra技术,以推动AI研发效率提升。该技术框架名为DLRover,目标在于实现大规模分布式训练的智能化。
    的头像 发表于 02-04 10:01 453次阅读

    Transformer压缩部署的前沿技术:RPTQ与PB-LLM

    随着人工智能技术的迅速发展,Transformer在自然语言处理、机器翻译、问答系统等领域取得了显著的性能提升
    的头像 发表于 01-24 14:05 398次阅读
    <b class='flag-5'>Transformer</b>压缩部署的前沿技术:RPTQ与PB-LLM

    探索Transformer Block精简的方式

    作者对Transformer Block移除了各种参数,减少了15%参数量,提高了15%的训练速度,各个环节都有做充分的实验,但一些经验性得到的结论也并没有直接回答一些问题(如LN为什么影响收敛速度)。
    发表于 12-06 09:58 267次阅读
    探索<b class='flag-5'>Transformer</b> Block精简的方式

    LLM的Transformer是否可以直接处理视觉Token?

    多种LLM Transformer都可以提升Visual Encoding。例如用LLaMA和OPT的不同Transformer层都会有提升,而且不同层之间也会体现不同的规律。
    发表于 11-03 14:10 252次阅读
    LLM的<b class='flag-5'>Transformer</b>是否可以直接处理视觉Token?

    Cadence推出全新HiFi和Vision DSP,为Tensilica IP产品阵容再添新成员,面向普适智能和边缘AI推理

    AI 增强功能和 Tensilica Xtensa LX8 平台能力实现显著性能提升,能源效率高居业内前列   //   中国上海,2023 年 10 月 30 日——楷登电子(美国 Cadence
    的头像 发表于 10-30 11:35 571次阅读

    使用 Vision Transformer 和 NVIDIA TAO,提高视觉 AI 应用的准确性和鲁棒性

    Vision Transformer(ViT)正在席卷计算机视觉领域,提供令人难以置信的准确性、复杂现实场景下强大的解决方案,以及显著提升的泛化能力。这些算法对于推动计算机视觉应用的发
    的头像 发表于 08-04 17:40 368次阅读
    使用 <b class='flag-5'>Vision</b> <b class='flag-5'>Transformer</b> 和 NVIDIA TAO,提高视觉 AI 应用的准确性和鲁棒性

    如何计算transformer模型的参数量

    参数规模大,训练数据规模大。以GPT3为例,GPT3的参数量为1750亿,训练数据量达到了570GB。进而,训练大规模语言模型面临两个主要挑战:显存效率和计算
    的头像 发表于 07-10 09:13 7423次阅读
    如何计算<b class='flag-5'>transformer</b>模型的参数量

    2D Transformer 可以帮助3D表示学习吗?

    训练的2D图像或语言Transformer:作为基础Transformer模型,具有丰富的特征表示能力。作者选择了先进的2D Transformer模型作为基础模型,例如
    的头像 发表于 07-03 10:59 445次阅读
    2D <b class='flag-5'>Transformer</b> 可以帮助3D表示学习吗?

    类GPT模型训练提速26.5%,清华朱军等人用INT4算法加速神经网络训练

    使用 INT4 算法实现所有矩阵乘法的 Transformer 训练方法。 模型训练得快不快,这与激活值、权重、梯度等因素的要求紧密相关。 神经网络训练需要一定计算量,使用低精度算法(
    的头像 发表于 07-02 20:35 451次阅读
    类GPT模型<b class='flag-5'>训练</b>提速26.5%,清华朱军等人用INT4算法加速神经网络<b class='flag-5'>训练</b>

    Transformer在下一个token预测任务上的SGD训练动态

    ,对Transformer工作原理的相关研究仍然十分有限。 其中最大谜团在于,Transformer为什么仅依靠一个「简单的预测损失」就能从梯度训练动态(gradient training dynamics)中涌现出
    的头像 发表于 06-12 10:11 515次阅读
    <b class='flag-5'>Transformer</b>在下一个token预测任务上的SGD<b class='flag-5'>训练</b>动态

    PyTorch教程-11.9. 使用 Transformer 进行大规模预训练

    11.9. 使用 Transformer 进行大规模预训练¶ Colab [火炬]在 Colab 中打开笔记本 Colab [mxnet] Open the notebook
    的头像 发表于 06-05 15:44 987次阅读
    PyTorch教程-11.9. 使用 <b class='flag-5'>Transformer</b> 进行大规模预<b class='flag-5'>训练</b>

    PyTorch教程11.9之使用Transformer进行大规模预训练

    电子发烧友网站提供《PyTorch教程11.9之使用Transformer进行大规模预训练.pdf》资料免费下载
    发表于 06-05 15:07 0次下载
    PyTorch教程11.9之使用<b class='flag-5'>Transformer</b>进行大规模预<b class='flag-5'>训练</b>

    基于Transformer做大模型预训练基本的并行范式

    在之前的内容中,我们已经介绍过流水线并行、数据并行(DP,DDP和ZeRO)。 今天我们将要介绍最重要,也是目前基于Transformer做大模型预训练最基本的并行范式:来自NVIDIA的张量模型
    的头像 发表于 05-31 14:38 1712次阅读
    基于<b class='flag-5'>Transformer</b>做大模型预<b class='flag-5'>训练</b>基本的并行范式