当前位置:首页 > 天道酬勤 > 正文内容

lightning(代码性能分析工具)

张世龙2021年12月21日 13:39天道酬勤580

机械之心报道

作者:杜伟、bzdbbz

1.0.0版上市不到两个月,grid.ai CEO、纽约大学博士William Falcon制作的PyTorch Lightning近日发布了1.1版。 新版本增加了共享培训功能,在多GPU中培训深度学习(DL )模型时可以节省50%以上的内存,无需丢失性能或更改代码。

与Facebook Research的FairScale团队一起,PyTorch Lightning团队在1.1版中发布了shardedtraining测试版。 在以下博客文章中,PyTorch Lightning团队的研究工程师Sean Narenthiran表示,只需向Lightning训练员添加单个标志,就可以在通过多个GPU训练DL模型时实现内存的大幅减少。

另外,作者还介绍了如何使用NeMo预先训练转换器LM,实现55%的内存提升,以及在训练其他PyTorch Lightning功能模型时进一步降低内存。 除了展示使用NeMO Transformer LM时在NLP中的结果外,作者还分别展示了在语音识别中使用DeepSpeech 2的结果和在计算机视觉中训练SwAV ResNet和iGPT的结果。

PyTorch Lightning团队打算添加新的模型并行化技术,确保鲁棒性,与FairScale团队合作提高所有PyTorch Lightning研究中的模型扩展性能。

更多使用方法参考: https://py torch-lightning.readthedocs.io/en/stable/multi _ GPU.html #多用途-培训

更大的模型,更高的精度

语言建模将成为更大的预训练模式,在下游任务中发挥更好的性能。 OpenAI的GPT-3就是一个很好的例子。 该模型有1750亿个参数,训练需要大量的计算和优化技巧。

对比语言模型的参数随时间变化的曲线,GPT-3继续在规模上超越。 (照片来源:微软)

训练大型模型时,内存很宝贵。 增加模型大小会消耗GPU的内存,从而限制培训模型的大小。 这样,团队就不断尝试更智能的内存管理技术。

照明着色培训

传统的分布式培训vs shard ED培训。 参数(p )在GPU之间进行分割,降低每个GPU的内存开销。 “Sharded Training”分割优化器的状态和坡度。

在microsoftzeroredundancyoptimizer (zero )的启发下,Sharded Training可以减少通过多个GPU训练大型模型所需的内存,并可以进行训练

练过程中在 GPU 之间「切分」模型。Sharding 包括将参数分割到不同的设备上,减少每个设备所需的内存。特别地,优化器状态和梯度可以独立于模型进行切分,并且可以减少所有架构所需的内存。

Sharded Training 是在 FairScale 基础上构建的,与 PyTorch 兼容并得到优化。FairScale 是一个 PyTorch 扩展库,用于高性能以及大规模训练模型和数据并行。除了切分技术之外,它具有层间和层内并行性以及跨多个 GPU 和主机拆分模型。

通过在 GPU 上进行智能梯度和优化器状态 sharding,可以分别将内存成本(基于微软论文《ZeRO: Memory Optimizations Toward Training Trillion Parameter Models》的数据)降低大约 4 倍和 8 倍。这有利于所有模型,在所有模型架构以及训练过程中提供较低的内存使用率。需要注意的是,由于节点之间所需通信量的增加以及缺乏并行性,「naive implementations」导致运行速度急剧下降。

通过与 FairScale 的紧密合作,现在可以在所有 lightning 模块上实现 55% 以上的内存减少,只需通过一个单一的 flag,这意味着更大的机型可以适应内存有限的多张 GPU。

在不更改代码的情况下启用 Sharded Training

为了展示在 Lightning 中使用 Sharded Training 有多简单,使用 NVIDIA 的一个流行库 NeMo 来训练 Lightning 支持的对话 AI 模型。使用 NeMo 中提供的 vanilla Transformer LM 模型,有 12 亿个参数,该模型对训练内存要求很高。在训练大型语言模型时,内存是提高模型大小或提升 GPU 饱和度的宝贵资源。此外使用 WikiText 数据集训练模型。

首先下载数据集并使用 NVIDIA NeMo 提供的处理脚本进行提取,然后在 NeMo 中找到预配置文件定义模型配置,修改数据输入指向自定义数据集。为了进行基准测试,还构建了一个简单的基于单词的词汇表。

在设置模型参数之后,用户只需要将 Sharded 插件 flag 传递给支持 Sharded Traing 的训练器就可以了。用户还可以通过增加 GPU 数量和启用本地混合精度(native mixed precision)来实现内存和速度的进一步提升。分区优化器和 GPU 之间的通信可以在后台自动处理。

下面介绍了使用 Lightning 内置 Sharding 与普通 GPU 扩展时每台设备的内存提升情况,每台设备的内存分配保持不变。不仅如此,Lightning 团队还给出了 SwAW、DeepSpeech 2 和 iGPT 等其他 PyTorch Lightning 支持模型的测试结果。

结果表明,每个 GPU 上最高节省内存 15GiB,从而可以增加模型能力。例如,在硬件一样的情况下,训练 Transformer LM 时模型参数量可以从 12 亿增至 20 亿。

使用 8 个 A100s 时训练 Transformer LM、SwAV Wide ResNet、DeepSpeech2 和 iGPT 时的平均峰值内存比较。

随着 GPU 之间通信的优化,与标准分布式加速器相比,节点内性能的扩展效果更好。请注意,随着向很多节点的扩展,内存降低的效果开始减弱,这是因为其他因素成为了瓶颈。但是,Sharded training 依然带来良好的 throughout 扩展。

在 8 个具有相同超参数和批大小的 A100s 上的平均 Epoch time 比较,越低越好。

博客地址:https://seannaren.medium.com/introducing-pytorch-lightning-sharded-train-sota-models-with-half-the-memory-7bcc8b4484f

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26350.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。