机械之心编译
作者:Sebastian Raschka
编纂:Panda W
用对于了措施 ,修正行代减速 PyTorch 磨炼,码P磨炼无意也不是倍提那末重大 。
克日 ,速低术关深度学习规模驰名钻研者 、技键Lightning AI 的修正行代首席家养智能教育者 Sebastian Raschka 在 CVPR 2023 上宣告了主题演讲「Scaling PyTorch Model Training With Minimal Code Changes」。
为了能与更多人分享钻研下场 ,码P磨炼Sebastian Raschka 将演讲整理成一篇文章。倍提文章品评辩说了若何在最小代码变更的速低术关情景下扩展 PyTorch 模子磨炼 ,并表明重点是技键运用混合精度(mixed-precision)措施以及多 GPU 磨炼方式 ,而不是修正行代低级机械优化。
文章运用视觉 Transformer(ViT)作为根基模子 ,码P磨炼ViT 模子在一个根基数据集上重新开始 ,倍提经由约 60 分钟的速低术关磨炼,在测试集上取患了 62% 的技键精确率。
GitHub 地址:https://github.com/rasbt/cvpr2023
如下是文章原文:
构建基准
在接下来的部份中,Sebastian 将品评辩说若何在不断止大批代码重构的情景下改善磨炼光阴以及精确率。
想要留意的是,模子以及数据集的详细信息并非这里的主要关注点(它们只是为了尽可能重大 ,以便读者可能在自己的机械上复现 ,而不需要下载以及装置太多的依赖) 。所有在这里分享的示例都可能在 GitHub 找到 ,读者可能探究以及重用残缺的代码。
剧本 00_pytorch-vit-random-init.py 的输入。
不要重新开始磨炼
现如今,重新开始磨炼文本或者图像的深度学习模子艰深为低效的 。咱们个别会运用预磨炼模子,并对于模子妨碍微调 ,以节约光阴以及合计资源,同时取患上更好的建模下场 。
假如思考下面运用的相同 ViT 架构 ,在另一个数据集(ImageNet)上妨碍预磨炼,并对于其妨碍微调 ,就能在更短的光阴内实现更好的预料功能 :20 分钟(3 个磨炼 epoch)内抵达 95% 的测试精确率 。
00_pytorch-vit-random-init.py 以及 01_pytorch-vit.py 的比力 。
提升合计功能
咱们可能看到,相对于从零开始磨炼 ,微调可能大大提升模子功能。下面的柱状图总结了这一点。
00_pytorch-vit-random-init.py 以及 01_pytorch-vit.py 的比力柱状图。
尽管,模子下场可能因数据集或者使命的差距而有所差距。但对于良多文本以及图像使命来说 ,从一个在通用公共数据集上预磨炼的模子开始是值患上的 。
接下来的部份将探究种种能耐,以减速磨炼光阴 ,同时又不舍身预料精确性 。
开源库 Fabric
在 PyTorch 中以最小代码变更来高效扩展磨炼的一种措施是运用开源 Fabric 库,它可能看做是 PyTorch 的一个轻量级包装库 / 接口。经由 pip 装置。
pip install lightning
下面探究的所有技术也可能在纯 PyTorch 中实现。Fabric 的目的是使这一历程愈加利便。
在探究「减速代码的低级技术」以前,先介绍一下将 Fabric 集成到 PyTorch 代码中需要妨碍的小修正 。一旦实现这些修正 ,惟独要修正一行代码 ,就能轻松地运用低级 PyTorch 功能。
PyTorch 代码以及更正后运用 Fabric 的代码之间的差距是重大的 ,只波及到一些细微的更正,如下面的代码所示:
总结一下上图,就能患上到艰深的 PyTorch 代码转换为 PyTorch+Fabric 的三个步骤:
导入 Fabric 并实例化一个 Fabric 工具 。
运用 Fabric 配置模子、优化器以及 data loader 。
损失函数运用 fabric.backward (),而不是 loss.backward ()。
这些重大的修正提供了一种运用 PyTorch 低级特色的道路 ,而无需对于现有代码妨碍进一步重构。
深入品评辩说下面的「低级特色」以前,要确保模子的磨炼运行光阴 、预料功能与以前相同。
01_pytorch-vit.py 以及 03_fabric-vit.py 的比力服从。
正如前面柱状图中所看到的,磨炼运行光阴 、精确率与以前残缺相同,正如预期的那样。其中,任何晃动都可能归因于随机性。
在前面的部份中,咱们运用 Fabric 更正了 PyTorch 代码。为甚么要费这么大的劲呢?接下来将试验低级技术,好比混合精度以及扩散式磨炼 ,惟独变更一行代码 ,把下面的代码
fabric = Fabric(accelerator="cuda")
改为
fabric = Fabric(accelerator="cuda", precision="bf16-mixed")
04_fabric-vit-mixed-precision.py 剧本的比力服从。脚当地址 :https://github.com/rasbt/cvpr2023/blob/main/04_fabric-vit-mixed-precision.py
经由混合精度磨炼,咱们将磨炼光阴从 18 分钟摆布延早退 6 分钟,同时坚持相同的预料功能。这种磨炼光阴的延迟惟独在实例化 Fabric 工具时削减参数「precision="bf16-mixed"」即可实现。
清晰混合精度机制
混合精度磨炼本性上运用了 16 位以及 32 位精度,以确保不会损失精确性 。16 位展现中的合计梯度比 32 位格式快良多 ,而且还节约了大批内存。这种策略在内存或者合计受限的情景下颇为有利。
之以是称为「混合」而不是「低」精度磨炼 ,是由于不是将所有参数以及操作转换为 16 位浮点数。相同,在磨炼历程中 32 位以及 16 位操作之间切换 ,因此称为「混合」精度。
如下图所示,混合精度磨炼波及步骤如下:
将权重转换为较低精度(FP16)以减速合计速率;
合计梯度;
将梯度转换回较高精度(FP32)以坚持数值晃动性;
运用缩放后的梯度更新原始权重。
这种措施在坚持神经收集精确性以及晃动性的同时,实现为了高效的磨炼 。
更详细的步骤如下 :
将权重转换为 FP16 :在这一步中,神经收集的权重(或者参数)初始时用 FP32 格式展现,将其转换为较低精度的 FP16 格式