当前位置: 首页 > article >正文

PyTorch 自动混合精度库背后的谜团

原文towardsdatascience.com/the-mystery-behind-the-pytorch-automatic-mixed-precision-library-d9386e4b787e?sourcecollection_archive---------4-----------------------#2024-09-17如何通过三行代码实现 2 倍速度提升的模型训练https://mengliuz.medium.com/?sourcepost_page---byline--d9386e4b787e--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--d9386e4b787e-------------------------------- 孟流赵·发布于Towards Data Science ·阅读时长 8 分钟·2024 年 9 月 17 日–你是否曾希望你的深度学习模型能够更快运行GPU 昂贵数据集庞大训练过程似乎没有尽头你有一百万个实验要运行还有一个截止日期要赶——所有这些都是你期望某种形式的训练加速的充分理由。但该选择哪个呢已经有许多关于模型训练性能调优的优秀参考资料来自于PyTorch、HuggingFace和Nvidia包括异步数据加载、缓冲区检查点、分布式数据并行和自动混合精度。在这篇文章中我将介绍自动混合精度技术。我将从简要介绍 Nvidia 的张量核心设计开始然后介绍 2018 年在 ICLR 上发表的开创性论文《混合精度训练》最后通过一个简单的示例展示如何在 FashionMNIST 上训练 ResNet50并通过加载 2 倍批量大小实现 2 倍的训练速度提升同时只需增加三行代码。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c4fce0287d310bd6839f85ae33144b2a.png图片来源pxhere.com/en/photo/872846硬件基础 — Nvidia 张量核心首先让我们回顾一下 GPU 设计的一些基本知识。Nvidia GPU 中最受欢迎的商业产品之一是 Volta 系列例如 V100 GPU基于 GV100 GPU 设计。因此我们将基于 GV100 架构展开讨论。对于 GV100**流多处理器SM**是计算的核心设计。每个 GPU 包含 6 个 GPU 处理集群GPC和 84 个 SMV100 为 80 个 SM。整体设计如下图所示。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dbf7020857a40f17d2576b5ced5b5123.pngVolta GV100 GPU 设计。每个 GPU 包含 6 个 GPC图形处理集群每个 GPC 包含 14 个 SM流多处理器。图像来源arxiv.org/pdf/1803.04014对于每个 SM它包含两种类型的核心CUDA 核心和 Tensor 核心。CUDA 核心是 Nvidia 在 2006 年推出的原始设计是 CUDA 平台的核心部分。CUDA 核心可以分为三种类型FP64 核心/单元、FP32 核心/单元和 Int32 核心/单元。每个 GV100 SM 包含 32 个 FP64 核心64 个 FP32 核心和 64 个 Int32 核心。Tensor 核心是在 Volta/Turing2017系列 GPU 中引入的与之前的 Pascal2016系列 GPU 区别开来。每个 GV100 SM 包含 8 个 Tensor 核心。V100 GPU 的详细规格请参见这里。下面是 SM 设计的详细图示。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e200f32cb2b5c8c316fddbb749d81e98.png流处理器SM的子波段。每个 SM 包含四个子波段。图像来源arxiv.org/pdf/1903.03640为什么是 Tensor 核心Nvidia 的 Tensor 核心专门用于执行通用矩阵乘法GEMM和半精度矩阵乘法与累加HMMA操作。简而言之GEMM 执行 A*B C 的矩阵运算而 HMMA 将操作转换为半精度格式。详细讨论请参见这里。由于深度学习在训练过程中大量涉及 MMATensor 核心在当今的模型训练和加速中至关重要。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/79b6bd3fc6116e9b9ae38ea680529295.pngGEMM 操作示例。对于 HMMAA 和 B 通常转换为 FP16而 C 和 D 可以是 FP16 或 FP32。图像来源arxiv.org/pdf/1811.08309当然在切换到混合精度训练时始终检查您使用的 GPU 的规格。只有最新的 GPU 系列支持 Tensor 核心并且混合精度训练仅能在这些机器上使用。数据格式基础 — 单精度FP32与半精度FP16现在让我们更仔细地了解 FP32 和 FP16 格式。FP32 和 FP16 是 IEEE 格式分别使用 32 位和 16 位二进制存储表示浮动数值。这两种格式都包含三个部分a符号位b指数位c尾数位。FP32 和 FP16 的区别在于分配给指数和尾数的位数这导致了不同的值范围和精度。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/215ad72e4c2afa8517c0686351fff244.pngFP16IEEE 标准、BF16Google Brain 标准、FP32IEEE 标准和 TF32Nvidia 标准之间的差异。图片来源en.wikipedia.org/wiki/Bfloat16_floating-point_format如何将 FP16 和 FP32 转换为实际值根据 IEEE-754 标准FP32 的十进制值 (-1)^(符号位) × 2^(十进制指数 —127) ×隐含的前导 1 十进制尾数其中 127 是偏置指数值。对于 FP16公式变为(-1)^(符号位) × 2^(十进制指数 — 15) ×隐含的前导 1 十进制尾数其中 15 是相应的偏置指数值。更多关于偏置指数值的详细信息请参见此处。在这个意义上FP32 的数值范围大约是[-2¹²⁷, 2¹²⁷] ~[-1.71e38, 1.71e38]而 FP16 的数值范围大约是[-2¹⁵, 2¹⁵][-32768, 32768]。注意FP32 的十进制指数范围在 0 到 255 之间我们排除了最大值 0xFF因为它表示 NAN。因此最大的十进制指数是 254–127 127。FP16 也适用类似的规则。对于精度注意到指数和尾数都对精度限制有贡献这也叫做非标准化参见详细讨论因此 FP32 可以表示精度达到 2(-23)*2(-126)2^(-149)而 FP16 的精度可以达到 2¹⁰*2(-14)2(-24)。FP32 和 FP16 表示的差异带来了混合精度训练的关键问题因为深度学习模型的不同层/操作对数值范围和精度的敏感度不同需要分别处理。混合精度训练现在我们已经了解了 MMA 的硬件基础、Tensor 核心的概念以及 FP32 与 FP16 之间的关键区别接下来可以进一步讨论混合精度训练的细节。混合精度训练的概念最早出现在 2018 年 ICLR 论文“混合精度训练”中该论文在训练过程中将深度学习模型转换为半精度浮点数而不会损失模型精度或修改超参数。如前所述由于 FP32 和 FP16 之间的主要区别是数值范围和精度论文详细讨论了FP16 如何导致梯度消失以及如何通过损失缩放解决该问题。此外论文还提出了使用 FP32 主权重副本和在特定操作如归约和向量点积累加中使用 FP32 等技巧。损失缩放。论文中给出了使用 FP32 精度训练 Multibox SSD 检测器网络的示例如下所示。如果不进行任何缩放FP16 梯度的指数范围将≥2^(-24)低于此值的部分将变为零这相较于 FP32 来说是不够的。然而通过实验发现只需将梯度缩放 2³8 倍即可将半精度训练的准确度恢复至与 FP32 相匹配。从这个角度看作者认为[2^(-27), 2^(-24)]之间的少数梯度仍然在训练过程中很重要而低于 2^(-27)的值则不重要。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7a45fe75b18cd7c86e9d63a193f9f30d.png在 Multibox SSD 训练示例中使用 FP32 精度时梯度值的范围。请注意值范围在[2^(-27), 2^(-24)]之间超出了 FP16 的非正规化范围仅占总梯度的几百分比但在整体训练中仍然很重要。图片来源arxiv.org/pdf/1710.03740解决这一缩放差异的方法是应用损失缩放。根据链式法则缩放损失将确保所有梯度都按相同的比例进行缩放。在最终的权重更新之前需要将梯度恢复为原始尺度。自动混合精度训练Nvidia 最早开发了自动混合精度训练作为一个名为 APEX 的 PyTorch 扩展后来被 PyTorch、TensorFlow、MXNet 等主流框架广泛采用。有关详细信息请参阅 Nvidia 的文档。为简便起见我们将仅介绍 PyTorch 的自动混合精度库pytorch.org/docs/stable/amp.html。amp 库可以自动处理大多数混合精度训练技术例如 FP32 主权重复制。用户主要接触到操作自动转换和梯度/损失缩放。操作自动转换。尽管我们提到过张量核心可以大幅提升 GEMM 操作的性能但某些操作并不适合使用半精度表示。amp 库提供了一个CUDA 操作列表列出了可用于半精度的操作。大多数矩阵乘法、卷积和线性激活都可以通过 amp.autocast 完全覆盖但是对于归约/求和、softmax 和损失计算这些计算仍然在 FP32 精度下进行因为它们对数据范围和精度更为敏感。梯度/损失缩放。amp 库提供了自动梯度缩放技术因此用户在训练过程中无需手动调整缩放。有关缩放因子的更详细算法可以在这里找到。一旦梯度被缩放必须在梯度裁剪和正则化之前进行缩放回原值。更多细节可以在这里找到。一个 FashionMNIST 训练示例torch.amp 库相对容易使用只需要三行代码就能将训练速度提升 2 倍。我们从一个非常简单的任务开始在 FashionMNIST 数据集上训练 ResNet50 模型MIT 许可证使用 FP32我们可以看到十个 Epoch 的训练时间为 333 秒https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aa7d6413a871ff3c3b806bff458fcddd.pngResNet50 在 FashionMNIST 上的训练。图像由作者提供。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/35c410a68cae78f6b83badcb647fa49e.png小于 2**(-24) 的梯度与总梯度的比值。我们可以看到FP16 会将几乎四分之一的总梯度归零。图像由作者提供。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aa65d416e3eb94c05cc56ef30eab8e1e.png评估结果。图像由作者提供。现在我们使用了 amp 库。amp 库只需要额外三行代码来进行混合精度训练。我们可以看到训练在 141 秒内完成比 FP32 训练速度提升了 2.36 倍同时精度、召回率和 F1-score 保持不变。scalertorch.cuda.amp.GradScaler()# start your training code# ...withtorch.autocast(device_typecuda):# training code# wrapping loss and optimizerscaler.scale(loss).backward()scaler.step(optimizer)scaler.update()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/130adb13d32d608790dbc8b828d9ea5f.png使用 amp 的训练代码。图像由作者提供。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d6afd6d8ec261110cf753fb45cfdbea1.png训练中的缩放因子。缩放因子仅在第一步发生变化并保持不变。图像由作者提供。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/60a8df649cc72aa64cdad00e012f89f2.png最终结果与 FP32 训练结果可比。图像由作者提供。上面的代码的 GitHub 链接在这里。总结混合精度训练是加速深度学习模型训练的一个宝贵技术。它不仅加速了浮点运算还节省了 GPU 内存因为训练批次可以转换为 FP16从而节省了一半的 GPU 内存。通过 PyTorch 的 amp 库额外的代码可以减少为三行因为权重复制、损失缩放、操作类型转换等都由库内部处理。然而混合精度训练并没有真正解决 GPU 内存问题特别是在模型权重大小远大于数据批量时。一方面只有模型的某些层被转换为 FP16其余部分仍以 FP32 计算其次权重更新仍然需要 FP32 副本这仍然占用大量 GPU 内存第三像 Adam 这样的优化器的参数在训练过程中会占用大量 GPU 内存而混合精度训练保持优化器参数不变。从这个角度来看更先进的技术如 DeepSpeed 的 ZERO 算法是必要的。参考文献Micikevicius 等人《混合精度训练》。ICLR 2018PyTorch AMP 库:pytorch.org/tutorials/recipes/recipes/amp_recipe.htmlNvidia CUDA 浮点运算:docs.nvidia.com/cuda/floating-point/index.html

相关文章:

PyTorch 自动混合精度库背后的谜团

原文:towardsdatascience.com/the-mystery-behind-the-pytorch-automatic-mixed-precision-library-d9386e4b787e?sourcecollection_archive---------4-----------------------#2024-09-17 如何通过三行代码实现 2 倍速度提升的模型训练 https://mengliuz.medium.…...

HC32L110(三) 从零构建:基于GCC与VSCode的轻量级ARM开发工作流

1. 为什么选择GCCVSCode开发HC32L110 第一次接触HC32L110这款MCU时,我像大多数嵌入式开发者一样,本能地打开了Keil和IAR这些传统IDE。但很快发现,这些"重量级选手"在资源受限的HC32L110开发中显得格外笨重——动辄几个GB的安装包、…...

用 TensorFlow Estimator 实现 用户行为预测 的正确姿势

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 用 TensorFlow Estimator 实现用户行为预测的正确姿势:从数据工程到生产部署的全流程实践指南目录用 TensorFlow Est…...

AI 高性能笔记本电脑高效紧凑型功率 MOSFET 完整选型方案

随着 AI 算力在笔记本电脑中的爆发式增长(如本地大模型、智能温控、性能调度),电源架构对功率 MOSFET 提出严苛要求:超高电流密度、极低损耗、超小封装、逻辑电平驱动。微碧半导体(VBsemi)基于先进的 Trenc…...

TensorFlow GPU内存分配失败怎么办?教你一招避坑

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TensorFlow GPU内存分配失败的终极解决方案:一招避坑指南 目录 TensorFlow GPU内存分配失败的终极解决方案&#xff1…...

AMOS实战:从模型绘制到结果解读,手把手完成验证性因子分析

1. AMOS入门:验证性因子分析基础 第一次接触AMOS做验证性因子分析时,我盯着软件界面发呆了半小时——那些复杂的图标和术语让人望而生畏。但实际用起来你会发现,AMOS就像个"可视化计算器",把统计公式变成了拖拽操作。验…...

2026年AI文字做海报工具横评:6款实测对比,设计小白也能5分钟出图

摘要 2026年,AI做海报已经不是新鲜事,但"输入文字就能出海报"和"出一张能用的海报"之间,差距大得离谱。 我测了6款主流的可以AI文字做海报的工具,有的生成速度很快但排版像模板套娃,有的效果惊艳…...

B-CAST: 瓶颈交叉注意力机制如何重塑视频动作识别的时空建模

1. 视频动作识别的核心挑战 视频动作识别一直是计算机视觉领域的重要研究方向。与静态图像识别不同,视频理解需要模型同时具备空间和时间两个维度的分析能力。想象一下,当我们要判断视频中的人是在"放下奶酪"还是"放下番茄酱"时&…...

初次接触Taotoken的新手从注册到成功发起第一次API调用的全过程记录

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次接触Taotoken的新手从注册到成功发起第一次API调用的全过程记录 作为一名刚开始接触大模型开发的工程师,我最近在寻…...

32dB增益+79%效率:HT20340S在工业射频能源中的高能效设计

HT20340S:400W LDMOS宽带射频功率放大器在大功率射频能量应用、工业加热、等离子体激励以及宽带通信等领域,功率放大器(PA)的性能直接决定了系统的发射效率与作用距离。当需要在10MHz至300MHz的宽带范围内实现数百瓦的连续波输出时…...

别让拼写检查器坑了你的代码!Visual Studio中自定义排除字典(exclusion.dic)的完整用法

深度定制Visual Studio拼写检查:打造团队专属的exclusion.dic解决方案 当你在Visual Studio中看到熟悉的红色波浪线时,第一反应可能是代码出现了语法错误。但仔细一看,却发现是拼写检查器在提醒你"Hint"不是一个有效的英文单词。这…...

告别刺耳噪音!ESP32 PWM驱动无源蜂鸣器,从调频到调占空比的音效实战

ESP32音效魔法:PWM驱动无源蜂鸣器的进阶实战指南 从刺耳噪音到悦耳旋律的蜕变之旅 当无源蜂鸣器发出刺耳的"滴滴"声时,很多创客的第一反应是降低音量或缩短发声时间。但真正的解决方案藏在ESP32的PWM(脉冲宽度调制)模块…...

ARM ETM10硬件追踪系统设计与信号完整性优化

1. ARM ETM10硬件追踪系统设计精要在嵌入式系统开发领域,ARM ETM10(Embedded Trace Macrocell)作为一款高性能硬件追踪模块,为开发者提供了处理器指令和数据流的实时可视性。不同于软件调试工具,ETM10通过在芯片内部直…...

XNBCLI终极指南:如何轻松解包打包星露谷物语XNB文件

XNBCLI终极指南:如何轻松解包打包星露谷物语XNB文件 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli 想要深度定制星露谷物语游戏体验吗?…...

W5500 TCP客户端实战:从寄存器配置到网络调试助手,一步步打通你的第一个物联网连接

W5500 TCP客户端实战:从寄存器配置到网络调试助手,一步步打通你的第一个物联网连接 在嵌入式物联网开发中,网络通信模块的选择往往决定了项目的稳定性和开发效率。W5500作为一款全硬件TCP/IP协议栈芯片,以其稳定的性能和简单的开发…...

基于ADuCM4050 EZ-KIT的物联网原型快速开发实战指南

1. 项目概述:从一块评估板到物联网原型的高效跃迁如果你正在寻找一款能够快速将物联网想法转化为实际产品的微控制器平台,那么ADI的ADuCM4050 EZ-KIT™开发板及其丰富的支持附件,绝对值得你花时间深入了解。这不仅仅是一块简单的评估板&#…...

全志T113-i音视频编解码测试:从环境搭建到问题排查全流程

1. 项目概述与核心价值最近在调试一块基于全志T113-i芯片的开发板,核心任务是对其音视频编解码能力进行全面的功能与性能验证。这听起来像是一个标准的硬件测试流程,但如果你真的上手做过,就会知道从拿到一块“裸板”到能稳定播放1080P视频、…...

创业团队如何利用taotoken管理多项目ai调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用Taotoken管理多项目AI调用成本 对于同时推进多个AI应用原型开发的创业团队而言,一个常见的挑战是如何…...

C语言入门实战:从开发环境搭建到核心语法精讲

1. 从零开始:为什么是C语言,以及我们该如何开始如果你对编程世界充满好奇,或者想从最坚实的地基开始构建你的技术大厦,那么选择C语言作为起点,绝对是一个明智且充满挑战的决定。这不是一个轻松的选择,但它的…...

Matlab 2020a老版本用户福音:手把手教你配置MinGW 6.3.0并集成第三方EXR工具

Matlab 2020a兼容性解决方案:MinGW 6.3.0与EXR工具链深度整合指南 对于长期依赖Matlab 2020a进行科研或工程开发的用户来说,遇到需要处理EXR图像文件的需求时往往会陷入两难——既无法放弃经过验证的稳定开发环境,又需要扩展功能支持。本文将…...

32位寄存器全解析:逆向分析与系统底层开发的基石

1. 从零开始:为什么32位寄存器是逆向分析的基石如果你刚开始接触逆向工程或者系统底层开发,面对一堆以E开头的寄存器缩写,是不是感觉有点头大?EAX、EBP、ESP……这些看起来神秘的代号,其实是理解程序如何“思考”和“行…...

从U-Net到DocUNet:一个图像分割经典架构如何“跨界”解决文档矫正难题?

从U-Net到DocUNet:经典分割架构如何重塑文档图像矫正技术 当你在咖啡馆随手拍下一张皱巴巴的收据时,是否想过手机镜头捕捉的二维图像如何还原成平整的文档?这个看似简单的需求背后,隐藏着计算机视觉领域一个极具挑战性的几何变换问…...

知网维普万方 AIGC 算法差异详解!TOP5 降 AI 软件帮你 3 个平台一次合格

知网维普万方 AIGC 算法差异详解!TOP5 降 AI 软件帮你 3 个平台一次合格 很多同学不知道——同一篇论文送知网、维普、万方测出来的 AI 率可能差 20-30 个点。3 个检测平台的算法逻辑完全不一样。 这篇文章把 3 个平台的算法差异拆给你看 TOP5 工具对位推荐——TOP…...

ABB机器人通过Socket实现ModbusTCP通信:Float浮点数解析与PLC数据交换实战

1. ABB机器人与PLC通信的基础原理 在工业自动化领域,设备间的数据交换是核心需求之一。ABB机器人作为客户端与PLC(可编程逻辑控制器)进行通信时,最常用的方式就是ModbusTCP协议。但这里有个关键点需要注意:ABB机器人的…...

Anaconda安装后必做的两件事:快速配置清华镜像源和验证环境(附常用conda命令清单)

Anaconda安装后的高效配置指南:镜像加速与环境验证全攻略 当你第一次打开Anaconda Prompt时,那种面对全新工具既兴奋又忐忑的心情我深有体会。作为Python数据科学领域的瑞士军刀,Anaconda的强大功能背后隐藏着许多新手容易忽略的配置细节。本…...

别再手动改端口了!用这个OrCAD小补丁,3分钟搞定原理图端口标准化

告别混乱设计:OrCAD端口标准化高效解决方案 在复杂的电子设计项目中,原理图的整洁与规范程度直接影响着团队协作效率和后期维护成本。当多位工程师共同参与同一项目时,端口类型和朝向的不统一往往成为困扰PCB设计团队的常见问题。这种看似微小…...

JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建保姆级避坑指南(CentOS 8.5 + VMware)

JDK 17 Hadoop 3.3.5 Spark 3.3.2 集群搭建实战避坑手册 当你第一次尝试在本地环境搭建大数据集群时,是否曾被各种兼容性问题、配置错误和莫名其妙的报错折磨得焦头烂额?本文将带你完整走一遍从零开始搭建基于JDK 17、Hadoop 3.3.5和Spark 3.3.2的集群…...

面试题目总结

面试心态 越是置自己于低位,就越难获得面试官的青睐。面试官其实更喜欢逻辑清晰,不卑不亢,带点锋芒的应聘者。 不要以通过面试为目的,不然很难摆脱被凝视的状态。要以自我成长与提升为中心。要记住,每一次面试不是成功…...

强化学习入门:用Python实现Q-Learning算法

在软件测试领域,随着AI技术的不断渗透,掌握强化学习相关知识,能够帮助测试从业者更好地理解智能测试工具的底层逻辑,甚至开发出更高效的自动化测试方案。Q-Learning作为强化学习的经典入门算法,以其简洁的原理和广泛的…...

体验Taotoken低延迟与高稳定性的模型API调用服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验Taotoken低延迟与高稳定性的模型API调用服务 对于依赖大模型API进行应用开发的团队而言,服务的稳定性和响应速度是…...