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

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

3天内不再提示

一个GPU训练一个130亿参数的模型

工程师邓生 来源:机器之心Pro 作者:蛋酱、张倩 2021-02-11 09:04 次阅读

现在的模型动辄数百、数千亿参数,普通人训不动怎么办?

前不久,谷歌发布了参数量为 1.6 万亿的语言模型Swith Transformer,将 GPT-3 创下的参数量记录(1750 亿)推至新高。这些大模型的出现让普通研究者越发绝望:没有「钞能力」、没有一大堆 GPU 就做不了 AI 研究了吗?

在此背景下,部分研究者开始思考:如何让这些大模型的训练变得更加接地气?也就是说,怎么用更少的卡训练更大的模型?

为了解决这个问题,来自微软、加州大学默塞德分校的研究者提出了一种名为「 ZeRO-Offload 」的异构深度学习训练技术,可以在单个 GPU 上训练拥有 130 亿参数的深度学习模型,让普通研究者也能着手大模型的训练。与 Pytorch 等流行框架相比,ZeRO-Offload 将可训练的模型规模提升了 10 倍,而且不需要数据科学家对模型做出任何改变,也不会牺牲计算效率。

论文链接:https://arxiv.org/pdf/2101.06840.pdf

ZeRO-Offload 通过将数据和计算卸载(offload)至 CPU 来实现大规模模型训练。为了不降低计算效率,它被设计为最小化与 GPU 之间的数据往来,并在尽可能节省 GPU 内存的同时降低 CPU 的计算时间。因此,对于一个参数量为 100 亿的模型,ZeRO-Offload 可以在单个 NVIDIA V100 GPU 上实现 40 TFlops/GPU。相比之下,使用 PyTorch 训练一个参数量为 14 亿的模型仅能达到 30TFlops,这是在不耗尽内存的情况下所能训练的最大模型。ZeRO-Offload 还可以扩展至多 GPU 设置并实现线性加速,最多可在 128 个 GPU 上实现近似线性加速。

此外,ZeRO-Offload 还可以和模型并行一起使用,在一个 DGX-2 box AI 服务器上训练参数量超 700 亿的模型。与单独使用模型并行相比,这一参数量实现了 4.5 倍的规模提升。

在下文中,我们将结合 Medium 博主 LORENZ KUHN 的一篇博客来详细了解这篇论文。

ZeRO-Offload 是什么?

ZeRO-Offload 是一种通过将数据和计算从 GPU 卸载到 CPU,以此减少神经网络训练期间 GPU 内存占用的方法,该方法提供了更高的训练吞吐量,并避免了移动数据和在 CPU 上执行计算导致的减速问题。

借助 ZeRO-offload,使用相同的硬件能训练以往 10 倍大的模型,即使在单个 GPU 上也是如此。比如在一个 32GB RAM 的 V100 GPU 上训练百亿参数的 GPT-2。

此外,ZeRO-offload 还能实现在多 GPU 设置中的近似线性扩展。

对于研究者来说,ZeRO-offload 适用的情况包括:

想训练更大的模型,或者想更快地训练现在的模型,因为 ZeRO-offload 允许训练更大的 batch size;

你正在使用 PyTorch,并且愿意 / 能够使用微软的 DeepSpeed 库(ZeRO-offload 的其他实现形式暂未推出),你也可以尝试根据官方实现自行调整;

愿意接受一些建模时的限制,比如当前版本的 ZeRO-Offload 需要搭配使用 Adam 的混合精度训练。

如何使用?

ZeRO-Offload 在微软的 DeepSpeed 库中实现,官方实现地址:https://github.com/microsoft/DeepSpeed/blob/6e65c2cc084ecfc393c67a2f64639e8d08d325f6/deepspeed/runtime/zero/stage2.py。

在 DeepSpeed 中设置完毕后,使用 ZeRO-Offload 就不需要太多额外的工作了,只需要修改一些标志和配置文件。

目前,Hugging Face 的 transformers 库与 DeepSpeed 进行了实验性集成,使用方法和基准测试结果参见:https://huggingface.co/blog/zero-deepspeed-fairscale。

dfe6624efd1148a7b571982c796e7e36.png

Facebook 研究院的 fairscale 有 ZeRO 的部分实现,ZeRO-Offload 正是基于 ZeRO 这一多 GPU 内存优化方法构建的。目前还不支持 CPU 卸载。

ZeRO-Offload 的工作原理

ZeRO-Offload 是基于 Zero Redundancy Optimizer (ZeRO) 构建的。ZeRO 是微软在 2020 年 2 月提出的一种万亿级模型参数训练方法,用于数据并行和模型并行训练中的内存优化,其中梯度、参数和优化器状态分布在多 GPU 内存中,没有任何冗余。这使得 GPU 之间的通信开销保持在比较低的状态。

25f1777e01a6434bbe47b894c9556628.jpeg

与标准数据并行基准相比,ZeRO 在三个阶段中节省的内存和通信用量。

让我们来回顾一下 ZeRO:

为了解决数据并行和模型并行存在的问题,ZeRO 提供了三阶段的优化方法,分别为优化器状态分割、梯度分割、参数分割,三个阶段按顺序实施。

在优化器分割状态:ZeRO 降低了 3/4 的内存,通信量和数据并行相同;

加入梯度分割:降低了 7/8 的内存,通信量和数据并行相同;

加入参数分割:内存减少与数据并行度呈线性关系。例如,在 64 个 GPU 上进行分割的时候,可以将内存降至 1/64。在通信量上有 50% 的提升。

在去年 9 月份的博客中,微软这么介绍 ZeRO-Offload:

ZeRO-Offload 继承了 ZeRO-2 的优化器状态和梯度分割。但与 ZeRO-2 不同的是,ZeRO-Offload 不在每块 GPU 上保持优化器状态和梯度的分割,而是将二者卸载至主机 CPU 内存。在整个训练阶段,优化器状态都保存在 CPU 内存中;而梯度则在反向传播过程中在 GPU 上利用 reduce-scatter 进行计算和求均值,然后每个数据并行线程将属于其分割的梯度平均值卸载到 CPU 内存中(参见下图 g offload),将其余的抛弃。一旦梯度到达 CPU,则每个数据并行线程直接在 CPU 上并行更新优化器状态分割(参见下图 p update)。

之后,将参数分割移回 GPU,再在 GPU 上执行 all-gather 操作,收集所有更新后的参数(参见下图 g swap)。ZeRO-Offload 还利用单独的 CUDA 流来穷尽通信与计算中的重叠,从而最大化训练效率。

6caa771fed244038ae13d21e6a536154.jpeg

ZeRO-Offload 概览。

值得注意的是,ZeRO-Offload 专为使用 Adam 的混合精度训练而设计。也就是说,当前版本的 ZeRO-Offload 使用 Adam 的优化版本 DeepCPUAdam。其主要原因是避免 CPU 计算成为整个过程中的瓶颈。DeepCPUAdam 的速度是 Adam PyTorch 实现的 6 倍。

实验结果

最后来看一下 ZeRO-Offload 论文中提供的一些实验结果。

下图 7 展示了利用 ZeRO-Offload 技术在 1 个、4 个或 16 个 GPU(一个 DGX-2)上可以训练的最大模型情况。

e1f97bcaae694e619797ef17897d3849.jpeg

下图 11 展示了每个 GPU 的吞吐量随 GPU 数量增加而呈现的变化情况。可以看出,在 GPU 数量逐渐增加至 128 个的过程中,ZeRO-Offload 几乎可以实现吞吐量的线性加速。

f4aa51269d0344e1b8bf675e716f208e.jpeg

下图 8 展示了使用 PyTorch、L2L 和 ZeRO-Offload 实现的每个 GPU 吞吐量差异。从中可以看出,利用 ZeRO-Offload 实现的每个 GPU 吞吐量比 L2L 平均高出 14%(最多高出 22%)。

99478603f46d497ab241fbb1abe9d3c3.jpeg

责任编辑:PSY

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

    关注

    27

    文章

    4417

    浏览量

    126670
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47681
  • 模拟训练系统

    关注

    0

    文章

    5

    浏览量

    10040
收藏 人收藏

    评论

    相关推荐

    模型训练为什么不能用4090显卡,GPU训练性能和成本对比

    为什么?一般有 tensor parallelism、pipeline parallelism、data parallelism 几种并行方式,分别在模型的层内、模型的层间、训练数据三个维度上对
    发表于 09-15 11:16 1.5w次阅读
    大<b class='flag-5'>模型</b><b class='flag-5'>训练</b>为什么不能用4090显卡,<b class='flag-5'>GPU</b><b class='flag-5'>训练</b>性能和成本对比

    【飞腾派4G版免费试用】仙女姐姐的嵌入式实验室之五~LLaMA.cpp及3B“小模型”OpenBuddy-StableLM-3B

    训练是MetaAI研究人员认为的种降低模型使用成本的方式。为了更好的效果,即便是LLaMA最小的70亿参数的版本,其
    发表于 12-22 10:18

    Pytorch模型训练实用PDF教程【中文】

    及优化器,从而给大家带来清晰的机器学习结构。通过本教程,希望能够给大家带来清晰的模型训练结构。当模型
    发表于 12-21 09:18

    医疗模型训练系统是什么?

    医疗模型训练系统是为满足广大医学生的需要而设计的。我国现代医疗模拟技术的发展处于刚刚起步阶段,大部分仿真系统产品都源于国外,虽然对于模拟人仿真已经出现些产品,但那些产品只是就模拟人的某
    发表于 08-19 08:32

    深度融合模型的特点

    深度融合模型的特点,背景深度学习模型训练完成之后,部署并应用在生产环境的这步至关重要,毕竟训练出来的
    发表于 07-16 06:08

    用S3C2440训练神经网络算法

    好了做成了API库就可以到处移植转化使用了,就像驱动程序。但是训练好的深度学习模型直接用
    发表于 08-17 08:51

    pytorch训练出来的模型参数保存为嵌入式C语言能够调用形式的方法

    在深度学习算法嵌入式开发应用中,如何把在pytorch下训练得到的模型参数,提取出来保存成C语言能够调用的数组形式,是嵌入式应用开发的重要步骤。以下介绍
    发表于 12-15 06:57

    如何建立simulink模型

    模型转嵌入式代码流程,害怕以后忘记了,特记录下来。Step1:建立simulink模型Step2:设置求解器参数:2.1选择离散型,固定
    发表于 12-17 07:58

    Nvidia GPU风扇和电源显示ERR怎么解决

    问题最近在Ubuntu上使用Nvidia GPU训练模型的时候,如果机器锁屏段时间再打开的时候鼠标非常卡顿,或者说显示界面非常卡顿,使用nvidia-smi查看发现,
    发表于 12-30 06:44

    在Ubuntu上使用Nvidia GPU训练模型

    问题最近在Ubuntu上使用Nvidia GPU训练模型的时候,没有问题,过会再训练出现非常卡顿,使用nvidia-smi查看发现,显示
    发表于 01-03 08:24

    Mali GPU支持tensorflow或者caffe等深度学习模型

    Mali GPU 支持tensorflow或者caffe等深度学习模型吗? 好像caffe2go和tensorflow lit可以部署到ARM,但不知道是否支持在GPU运行?我希望把训练
    发表于 09-16 14:13

    探索种降低ViT模型训练成本的方法

    (1 GPU)和时间(24小时)资源下从头开始训练ViT模型。首先,提出了种向ViT架构添加局部性的有效方法。其次,开发了种新的图像大小
    发表于 11-24 14:56

    GPU如何训练大批量模型?方法在这里

    内存时,在单个或多个 GPU 服务器上训练模型。 分布式计算 2018 年的大部分时间我都在试图训练神经网络时克服 GPU 极限。无论是在
    发表于 12-03 17:24 696次阅读

    NVIDIA GPU助力提升模型训练和推理性价比

    ,其中的模型数量达数千个,日均调用服务达到千亿级别。无量推荐系统,在模型训练和推理都能够进行海量Embedding和DNN模型GPU计算,
    的头像 发表于 08-23 17:09 4538次阅读

    天数智芯天垓100率先完成百亿级参数模型训练

    的Aquila语言基础模型,使用代码数据进行继续训练,稳定运行19天,模型收敛效果符合预期,证明天数智芯有支持百亿级参数模型
    的头像 发表于 06-12 15:23 614次阅读
    天数智芯天垓100率先完成百亿级<b class='flag-5'>参数</b>大<b class='flag-5'>模型</b><b class='flag-5'>训练</b>