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

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

3天内不再提示

FP8模型训练中Debug优化思路

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 2024-09-06 14:36 次阅读

目前,市场上许多公司都积极开展基于 FP8 的大模型训练,以提高计算效率和性能。在此,我们整理并总结了客户及 NVIDIA 技术团队在 FP8 模型训练过程中的 debug 思路和方法,供大家参考。

在讨论之前,建议大家使用我们推荐的 FP8 训练的 Recipe,即使用 Delayed scaling,在 History length 为 1024 的窗口中选取最大的 amax 数值作为计算 scaling factor 的方法。当然,我们也在不断优化这个 Recipe,未来随着更多 FP8 的实践案例,将继续为大家总结和分享,期待共同探索和优化 debug 的思路和方案。

在收集和整理了大量 FP8 训练的案例后,我们发现,FP8 训练中遇到的问题一般可以分成以下三类。

第一类问题:Spike Issue

Spike Issue 其实并不是 FP8 训练所特有的,在 BF16 中也可能会遇到此类问题,并且实际上根据 NVIDIA 技术团队内部训练的一些曲线,可以看到 FP8 的 Spike Issue 要比 BF16 还要小一些。所以,如果遇到了 Spike Issue,很多情况下可以暂时不用特别关注 FP8。另外,这里推荐两篇关于 Spike 的研究,供大家参考。

关于 Adam Optimizer 对 Spike 的影响。

关于使用 SWA 增强训练的稳定性,减少 Spike 出现的情况。

整体上,如果我们遇到的 Spike 和曾经在 BF16 上遇到的差不多,这种情况很可能不是 FP8 的问题。当然,也有例外的情况,比如我们遇到的 Spike 需要很多迭代步才能够恢复正常,那这种情况下可以说明这个 loss 和 BF16 有本质上的差异, 可以考虑是第二类问题。

第二类问题:

FP8 loss 和 BF16 不匹配或者发散

在 Validation loss 曲线上,不论是预训练还是 SFT,如果有 BF16 作为 Baseline,并且可以看到 FP8 和 BF16 有差距,这种情况下应该如何处理?

一般这类问题可以分成两种情况,包括:

情况 1:在训练的初始阶段,不论是 Train from scratch 还是 Continue train,如果刚切换到 FP8 进行训练,一开始就出现了 loss 比较大或者直接跑飞,这种情况下大概率是软件问题造成的,因此建议大家使用 NVIDIA 最新Transformer EngineMegatron Core 的软件栈,这样很多软件的问题可以及时被修复,从而让大家少跑一些弯路。同时还有另外一种情况,在软件不断的更新过程中,为了性能的优化会增加很多新的特性。如果一些特性是刚刚加入的,可能在 FP8 上暂时还没有遇到特殊情况,因此建议,大家如果使用了一些很新的特性,届时可以先尝试关闭掉这些新特性,检查是否是由于这些新特性的实现不够完善造成 loss 的问题。

情况 2:我们已经训练了一段时间,比如已经训练了几百 Billion 的 Tokens,loss 出现了差距,这种情况一般就不是软件问题了。问题可能是给大家推荐的这个 Recipe 并不适用于某些数据集或某些模型结构。这种情况下,可以通过下面的案例去进行拆解

第三类问题:FP8 loss 非常吻合,

但是 Downstream tasks 会有一些差异

训练中,我们的 Validation loss 曲线吻合的非常好,比如 loss 差距的量级大概是在十的负三次方,但是在一些下游任务上打分的方面可能会出现问题,那应该如何处理?这样的问题一般分为两种情况,包括:

情况 1:进行下游任务打分的时候,会进行多任务打分。如果所有的任务和 BF16 baseline 对比,或者和当时上一代的模型对比,打分结果差异很大,这种情况大概率是评估过程中出现了问题。比如,Checkpoint 导出来的格式不对,或者 Scale 没有取对等评估流程的问题。因此我们还需要进行排除,确认是否是导出模型和评估流程出现了问题。

情况 2:另一种情况,如前文提到的“在训练了几百 Billion 的 Token 之后,loss 出现了差距”,和这种情况很相似,此时大部分任务都没问题,只有个别的一两个任务发现跟 BF16 的 Baseline 有明显差距,如 3% 或者 5% 的掉点。这种情况下,建议改变 FP8 训练的 Recipe,默认的 Recipe 是 Delayed scaling,即选用先前迭代步存下来的 scale 值,我们可以替换成 Current scaling,即选用当前迭代步的 scale 值,或者把部分的矩阵做一些回退到 BF16 的操作,具体方法下文会进行介绍。

以下是一个案例,通过这个案例,可以初步了解哪些方法在现阶段可以进行尝试。

wKgZombaox2AA-QIAACNQpC9OX8898.jpg

这是一个类似于 Llama 2 的模型,虽然模型规模较小,但已经训练了 1.1T 个 Tokens,使用了如下推荐的配置,包括:

Pytorch 23.10 版本

TE Commit 为 d76118d

FP8 format:hybird

History Length:1024

Algo:Max

FP8 Wgrad Override:True

我们发现,比较接近 loss 末尾的时候,差异就会随之出现,并且显然已经不是十的负三次方的量级,这种情况下,可以考虑以下的步骤进行问题的排查。

wKgaombaZZWADmmKAAB_pnXO4Qo355.jpg

第一步:Sequence Parallel off

在软件前期的时候,首先尽可能尝试关闭一些根据经验判断可能有问题的特性。比如在引入 FP8 初期,软件上的 Sequence Paralleism(SP)经常会引起一些问题,因此可以先尝试进行关闭,如果发现关闭后并没有问题,可以初步判断 loss 不是由软件引起的,从而大概率可以推断是 Recipe 不够完善造成的。

第二步:我们可以做一个恢复性实验

尝试看一下当前训练出现问题的 FP8 的 Checkpoint,比如最后一个点,把这个 Checkpoint 切换到 BF16 训练,查看是否可以恢复到 BF16 的 Baseline。我们目前遇到的大多数情况都是可以恢复的。因此在这个基础的情况下,可以继续尝试下一步 debug 的方法。

第三步:三类矩阵的问题排查

大多数情况下,整个模型跑在 FP8 上并不多见。对于 Transformer layer 的每个 Gemm 来说,整个训练过程中,有三类矩阵跑在 FP8 上,包括它的前向 Fprop,以及反向 Wgrad 和 Dgrad,因此现在需要判断三类矩阵的哪个矩阵出了问题,当然,更细致一些应该判断具体是哪一个 Transformer layer 的矩阵出了问题。不过,这个特性还在开发过程中,目前还是一个比较初步的判断,需要检查是前向的矩阵还是反向的两个矩阵其中之一出现了差错。因此这一步中,可以首先把这三类矩阵全部转成 BF16 训练。不过,我们做的是一个 Fake quantization,通俗的解释就是使用 BF16 进行训练,但是在做 BF16 计算之前,会先把它的输入 Cast 成 FP8,然后再 Cast back 回到 BF16。这个时候,其实数据表示它已经是 FP8 表示范围内的值了, 自然这个 scaling 使用的就是 Current scaling,或者说没有 Scaling。这种情况下,会发现把三类矩阵全部都切回 Fake quantization 进行训练的时候,此时的 loss 曲线是可以贴近 BF16 Baseline 的。因此,下面需要一个矩阵一个矩阵的进行排除。

wKgZombaozmAF7h-AAFeySPfF5M564.jpg

三类矩阵包括前向的 Fprop,以及反向的 Wgrad 和 Dgrad。因此我们可以遵循一个相对简单的思路——逐一尝试,就是每次训练把其中一个矩阵设置为 BF16 计算, 经我们尝试后,可以看到:

在 Fprop 矩阵上面做 BF16 计算,会发现对 loss 的影响并不是很大。

在 Wgrad 矩阵上面做 BF16 计算,影响也非常小。

在 Dgrad 矩阵上面做 BF16 计算,即只有 Dgrad 计算执行在 BF16,而 Fprop 和 Wgrad 全部执行在 FP8,此时会发现 loss 会回到 BF16 的 Baseline。

现在我们已经定位到了有问题的矩阵是 Dgrad,是否还有方法再做进一步的挽救从而避免性能损失太多?这种情况下,可以去进行以下尝试。

wKgZombao0iAU4iCAADVLDYd6mA643.jpg

在 Transformer Engine (TE) 的后续版本中,计划支持用户使用 Current scaling,即还是使用 FP8 去做 Gemm 的运算。但是我们不用前面给大家推荐的这个 Delayed scaling recipe,而是使用当前输入的 scale 值,虽然会损失一点性能,但是相比于把整个 Gemm 回退到 BF16 做计算,它的性能损失会小很多。

当对 Dgrad 使用了 Current scaling 之后,会发现 loss 曲线已经和 BF16 的 Baseline 吻合了。

以上就是一个相对完整的 debug 的思路,供大家参考和讨论。

关于作者

高慧怡

NVIDIA 深度学习解决方案架构师,2020 年加入 NVIDIA 解决方案架构团队,从事深度学习应用在异构系统的加速工作,目前主要支持国内 CSP 客户在大语言模型的训练加速工作。

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

    关注

    14

    文章

    4793

    浏览量

    102419
  • 模型
    +关注

    关注

    1

    文章

    3029

    浏览量

    48344
  • DEBUG
    +关注

    关注

    3

    文章

    89

    浏览量

    19769

原文标题:探索 FP8 训练中 Debug 思路与技巧

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何才能高效地进行深度学习模型训练

    分布式深度学习框架,包括数据/模型切分、本地单机优化算法训练、通信机制、和数据/模型聚合等模块。现有的算法一般采用随机置乱切分的数据分配方
    的头像 发表于 07-09 08:48 1.4w次阅读
    如何才能高效地进行深度学习<b class='flag-5'>模型</b><b class='flag-5'>训练</b>?

    深层神经网络模型训练:过拟合优化

    为了训练出高效可用的深层神经网络模型,在训练时必须要避免过拟合的现象。过拟合现象的优化方法通常有三种。
    的头像 发表于 12-02 14:17 2572次阅读
    深层神经网络<b class='flag-5'>模型</b>的<b class='flag-5'>训练</b>:过拟合<b class='flag-5'>优化</b>

    【大语言模型:原理与工程实践】大语言模型的预训练

    大语言模型的核心特点在于其庞大的参数量,这赋予了模型强大的学习容量,使其无需依赖微调即可适应各种下游任务,而更倾向于培养通用的处理能力。然而,随着学习容量的增加,对预训练数据的需求也相应
    发表于 05-07 17:10

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

    本教程以实际应用、工程开发为目的,着重介绍模型训练过程中遇到的实际问题和方法。在机器学习模型开发,主要涉及三大部分,分别是数据、模型和损失
    发表于 12-21 09:18

    分享一种用于神经网络处理的新8位浮点交换格式

    ,以便更好地匹配值(权重、激活,渐变等)被处理,而不是仅仅依赖于 FP8 格式。此外,模型可以在与 FP8 相同的格式下进行训练和部署,而定点格式,特别是 int
    发表于 09-15 15:15

    如何跳过SPL的ddr训练

    我正在优化启动速度,ddr 训练在 SPL 需要 360ms,所以我想跳过它。 我厌倦了在 ddr 训练后注意 ddrphy_trained_csr[] 和 g_cdd_max[],
    发表于 06-01 08:16

    推断FP32模型格式的速度比CPU上的FP16模型格式快是为什么?

    在 CPU 上推断出 FP32 模型格式和 FP16 模型格式。 FP32 模型格式的推断速度
    发表于 08-15 08:03

    小米在预训练模型的探索与优化

    大家带来小米在预训练模型的探索与优化。 01 预训练简介 预训练与词向量的方法一脉相承。词向量是从任务无关和大量的无监督语料中学习到词的分布
    的头像 发表于 12-31 10:17 2471次阅读
    小米在预<b class='flag-5'>训练</b><b class='flag-5'>模型</b>的探索与<b class='flag-5'>优化</b>

    Multilingual多语言预训练语言模型的套路

    Facebook在Crosslingual language model pretraining(NIPS 2019)一文中提出XLM预训练多语言模型,整体思路基于BERT,并提出了针对多语言预
    的头像 发表于 05-05 15:23 2813次阅读

    介绍几篇EMNLP&apos;22的语言模型训练方法优化工作

    来自:圆圆的算法笔记 今天给大家介绍3篇EMNLP 2022语言模型训练方法优化的工作,这3篇工作分别是: 针对检索优化语言
    的头像 发表于 12-22 16:14 860次阅读

    使用OpenVINO优化并部署训练好的YOLOv7模型

    在《英特尔锐炫 显卡+ oneAPI 和 OpenVINO 实现英特尔 视频 AI 计算盒训推一体-上篇》一文,我们详细介绍基于英特尔 独立显卡搭建 YOLOv7 模型训练环境,并完成了 YOLOv7
    的头像 发表于 08-25 11:08 1301次阅读
    使用OpenVINO<b class='flag-5'>优化</b>并部署<b class='flag-5'>训练</b>好的YOLOv7<b class='flag-5'>模型</b>

    训练大语言模型带来的硬件挑战

    生成式AI和大语言模型(LLM)正在以难以置信的方式吸引全世界的目光,本文简要介绍了大语言模型训练这些模型带来的硬件挑战,以及GPU和网络行业如何针对
    的头像 发表于 09-01 17:14 1384次阅读
    <b class='flag-5'>训练</b>大语言<b class='flag-5'>模型</b>带来的硬件挑战

    【AI简报20231103期】ChatGPT参数揭秘,中文最强开源大模型来了!

    训练扩展模型大小,节约训练成本的最关键技术之一。相比于当前的 16 位和 32 位浮点混合精度训练,使用
    的头像 发表于 11-03 19:15 1320次阅读
    【AI简报20231103期】ChatGPT参数揭秘,中文最强开源大<b class='flag-5'>模型</b>来了!

    NVIDIA GPU架构下的FP8训练与推理

    FP8 训练利用 E5M2/E4M3 格式,具备与 FP16 相当的动态范围,适用于反向传播与前向传播。
    的头像 发表于 04-25 10:01 532次阅读
    NVIDIA GPU架构下的<b class='flag-5'>FP8</b><b class='flag-5'>训练</b>与推理

    深度学习模型训练过程详解

    深度学习模型训练是一个复杂且关键的过程,它涉及大量的数据、计算资源和精心设计的算法。训练一个深度学习模型,本质上是通过优化算法调整
    的头像 发表于 07-01 16:13 460次阅读