TransformerEngine

文章目录

    • 一、关于 TransformerEngine ?
      • 亮点
    • 二、使用示例
      • PyTorch
      • JAX
        • Flax
    • 三、安装
      • 先决条件
      • Docker
      • pip
      • 从源码
      • 使用 FlashAttention-2 编译
    • 四、突破性的变化
      • v1.7: Padding mask definition for PyTorch
    • 五、FP8 收敛
    • 六、集成
    • 七、其它
      • 贡献
      • 论文
      • 视频
      • 最新消息


一、关于 TransformerEngine ?

  • github : https://github.com/NVIDIA/TransformerEngine
  • 官方文档:https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/index.html
  • 示例:https://github.com/NVIDIA/TransformerEngine/tree/main/examples
  • 版本发行说明:https://docs.nvidia.com/deeplearning/transformer-engine/release-notes/index.html

TransformerEngine (TE)是一个库,用于在NVIDIA GPU上加速 Transformer models ,包括在Hopper GPU上使用8位浮点(FP8)精度,以在训练和推理中以较低的记忆利用率提供更好的性能。
TE为流行的 Transformer 架构提供了一组高度优化的构建块,以及一个自动混合精度类API,可以与您的框架特定代码无缝使用。
TE还包括一个与框架无关的C++API,可以与其他深度学习库集成,以启用FP8对 Transformer 的支持。

随着 Transformer models 中参数数量的不断增长,BERT、GPT和T5等架构的训练和推理变得非常记忆和计算密集型。
大多数深度学习框架默认使用FP32进行训练。
然而,要实现许多深度学习模型的全精度,这并不是必不可少的。
在训练模型时,使用混合精度训练(将单精度(FP32)与较低精度(例如FP16)格式相结合),与FP32训练相比,在精度差异最小的情况下,可以显著提高速度。
通过Hopper GPU架构,引入了FP8精度,它提供了优于FP16的性能,而精度没有下降。
尽管所有主要的深度学习框架都支持FP16,但FP8支持在当今的框架中并不存在。

TE通过提供与流行的大型语言模型(LLM)库集成的API来解决FP8支持问题。
它提供了一个由模块组成的Python应用编程接口,可以轻松构建转换器层,以及一个与框架无关的库,C++包括FP8支持所需的结构和内核。
TE内部提供的模块维护了FP8训练所需的缩放因子和其他值,极大地简化了用户的混合精度训练。


亮点

  • 易于使用的模块,用于构建支持FP8的 Transformer 层
  • Transformer models 的优化(例如融合内核)
  • 在 NVIDIA Hopper 和 NVIDIA Ada GPU 上支持FP8
  • 支持 NVIDIA Ampere GPU 架构代及更高版本上所有精度(FP16、BF16)的优化

二、使用示例


PyTorch

import torch
import transformer_engine.pytorch as te
from transformer_engine.common import recipe# Set dimensions.
in_features = 768
out_features = 3072
hidden_size = 2048# Initialize model and inputs.
model = te.Linear(in_features, out_features, bias=True)
inp = torch.randn(hidden_size, in_features, device="cuda")# Create an FP8 recipe. Note: All input args are optional.
fp8_recipe = recipe.DelayedScaling(margin=0, fp8_format=recipe.Format.E4M3)# Enable autocasting for the forward pass
with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe):out = model(inp)loss = out.sum()
loss.backward()

JAX


Flax
import flax
import jax
import jax.numpy as jnp
import transformer_engine.jax as te
import transformer_engine.jax.flax as te_flax
from transformer_engine.common import recipeBATCH = 32
SEQLEN = 128
HIDDEN = 1024# Initialize RNG and inputs.
rng = jax.random.PRNGKey(0)
init_rng, data_rng = jax.random.split(rng)
inp = jax.random.normal(data_rng, [BATCH, SEQLEN, HIDDEN], jnp.float32)# Create an FP8 recipe. Note: All input args are optional.
fp8_recipe = recipe.DelayedScaling(margin=0, fp8_format=recipe.Format.HYBRID)# Enable autocasting for the forward pass
with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe):model = te_flax.DenseGeneral(features=HIDDEN)def loss_fn(params, other_vars, inp):out = model.apply({'params':params, **other_vars}, inp)return jnp.mean(out)# Initialize models.variables = model.init(init_rng, inp)other_variables, params = flax.core.pop(variables, 'params')# Construct the forward and backward functionfwd_bwd_fn = jax.value_and_grad(loss_fn, argnums=(0, 1))for _ in range(10):loss, (param_grads, other_grads) = fwd_bwd_fn(params, other_variables, inp)

三、安装


先决条件

  • Linuxx86_64
  • 用于 Hopper 的 CUDA 11.8+ 和用于 Ada的CUDA 12.1+
  • 支持 CUDA 11.8 或更高版本的NVIDIA驱动程序
  • cuDNN 8.1或更高版本
  • 对于融合注意力,CUDA 12.1 或更高版本,NVIDIA驱动程序支持 CUDA 12.1 或更高版本,以及 cuDNN 8.9 或更高版本。

Docker

开始使用 TransformerEngine 的最快方法是使用Docker图像 NVIDIA GPU云(NGC)目录。
例如要交互使用NGC PyTorch容器,

docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.10-py3

其中23.10是容器版本。例如,2023年10月发布的23.10。


pip

要安装最新稳定版本的Transform Engine,

pip install git+https://github.com/NVIDIA/TransformerEngine.git@stable

这将自动检测是否安装了任何受支持的深度学习框架,并为它们构建 TransformerEngine 支持。
要显式指定框架,请将环境变量NVTE_FRAMEWORK设置为逗号分隔的列表(例如 NVTE_FRAMEWORK=jax,pytorch)。


从源码

请参阅 安装指南。


使用 FlashAttention-2 编译

Transform Engine 版本 v0.11.0 在PyTorch中增加了对 FlashAttention-2 的支持,以提高性能。

已知问题是 FlashAttention-2 编译是资源密集型的,并且需要大量RAM(参见bug),这可能会导致Transform Engine安装过程中出现内存溢出错误。
请尝试在环境中设置 **MAX_JOBS=1**以规避该问题。

请注意,NGC PyTorch 23.08+ 容器包括 FlashAttention-2。


四、突破性的变化


v1.7: Padding mask definition for PyTorch

为了统一Transform Engine中所有三个框架中注意力掩码的定义和使用,填充掩码已从True含义包含注意力中的相应位置更改为在我们的PyTorch实现中排除该位置。
从v1.7开始,所有注意力掩码类型都遵循相同的定义,其中True表示屏蔽相应位置,False表示在注意力计算中包括该位置。

这种变化的一个例子是,

# for a batch of 3 sequences where `a`s, `b`s and `c`s are the useful tokens
# and `0`s are the padding tokens,
[a, a, a, 0, 0,b, b, 0, 0, 0,c, c, c, c, 0]
# the padding mask for this batch before v1.7 is,
[ True,  True,  True, False, False,True,  True, False, False, False,True,  True,  True,  True, False]
# and for v1.7 onwards it should be,
[False, False, False,  True,  True,False, False,  True,  True,  True,False, False, False, False,  True]

五、FP8 收敛

FP8 已经在不同的模型架构和配置中进行了广泛的测试,我们发现FP8和BF16训练损失曲线之间没有显著差异。
FP8 还在目标端LLM任务(例如LAMBADA和WikiText)上进行了精度验证。
以下是在不同框架中测试模型收敛的示例。

模型框架来源
T5-770MJAX/T5xhttps://github.com/NVIDIA/JAX-Toolbox/tree/main/rosetta/rosetta/projects/t5x#convergence-and-performance
MPT-1.3BMosaic Composerhttps://www.mosaicml.com/blog/coreweave-nvidia-h100-part-1
GPT-5BJAX/Paxmlhttps://github.com/NVIDIA/JAX-Toolbox/tree/main/rosetta/rosetta/projects/pax#h100-results
GPT-5BNeMo框架可应要求提供
LLama2-7BAlibaba Paihttps://mp.weixin.qq.com/s/NQT0uKXLbXyh5031zBdeBQ
T5-11BJAX/T5x可应要求提供
MPT-13BMosaic Composerhttps://www.databricks.com/blog/turbocharged-training-optimizing-databricks-mosaic-ai-stack-fp8
GPT-22BNeMo框架可应要求提供
LLama2-70BAlibaba Paihttps://mp.weixin.qq.com/s/NQT0uKXLbXyh5031zBdeBQ
GPT-175BJAX/Paxmlhttps://github.com/NVIDIA/JAX-Toolbox/tree/main/rosetta/rosetta/projects/pax#h100-results

六、集成

Transform Engine已与流行的LLM框架集成,例如:

  • DeepSpeed
  • Hugging Face Accelerate
  • Lightning
  • MosaicML Composer
  • NVIDIA JAX Toolbox
  • NVIDIA Megatron-LM
  • NVIDIA NeMo Framework
  • Amazon SageMaker Model Parallel Library
  • Levanter
  • Hugging Face Nanotron - Coming soon!
  • Colossal-AI - Coming soon!
  • PeriFlow - Coming soon!
  • GPT-NeoX - Coming soon!

七、其它

贡献

我们欢迎对 TransformerEngine 的贡献!要为 TransformerEngine 做出贡献并提出拉取请求, 遵循CONTRIBUTING. rst指南中概述的指南。


论文

  • Attention original paper
  • Megatron-LM tensor parallel
  • Megatron-LM sequence parallel
  • FP8 Formats for Deep Learning

视频

  • TransformerEngine 和FP8 训练的新功能 | GTC 2024
  • 使用 TransformerEngine 进行FP8训练 | GTC 2023
  • 用于深度学习的FP8 | GTC 2023
  • Hopper 架构内部


最新消息

  • [03/2024]涡轮增压训练:使用FP8优化Database ricks Mosaic AI堆栈
  • [03/2024]SageMaker模型并行库中的FP8训练支持
  • [12/2023]新的NVIDIA NeMo框架功能和NVIDIA H200

H200

  • [11/2023]拐点2:下一步
  • [11/2023]利用NVIDIA TransformerEngine 释放 Transformer 的力量
  • [11/2023]使用FP8加速PyTorch训练工作负载
  • [09/2023] TransformerEngine 添加到AWS DL容器中用于PyTorch培训
  • [06/2023]使用NVIDIA H100 GPU打破MLPerf训练记录
  • [04/2023]使用CoreWeave在NVIDIA H100 GPU上对大型语言模型进行基准测试(第1部分)

2024-07-26(五)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267947.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

traefik 2

不在白名单里的,就不能访问 允许谁访问,就把它加进来 traefik 高级应用 1. 负载均衡 关键在ingressroute 添加多个 svc 验证 就是找一台,配好host, 然后 两个svc 权重都是1,改一下就成了灰度分布 2. 灰度发布 关键在于…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植,并不对sfud的移植再进行过多的讲解了哦,所以如果想了解sfud的移植过程,请参考我的另外一篇文章:传送门 正文开始咯 首先我们需要先准备资料准备好,这里对于fatfs的…

Chapter 10 Python数据容器:字符串

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、字符串的定义二、字符串的下标索引三、字符串的常用操作(方法)四、字符串的遍历 前言 在 Python 中,数据容器是组织和管理数据的…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 求给定二叉树…

com.mysql.cj.jdbc.Driver 爆红

出现这样的问题就是pom.xml文件中没有添加数据库依赖坐标 添加上这个依赖即可,添加完后重新加载一下Maven即可。 如果感觉对你有用就点个赞!!!

加密货币换法拉利!BTC和ETH可买超跑,满足加密富豪需求!未来继续扩张全球市场!

全球知名的意大利豪华跑车制造商法拉利(Ferrari)正在跟随时代潮流,加速在全球范围内推广其加密货币支付系统。这一举措旨在进一步满足加密货币持有者对奢侈品的需求,并拥抱日益普及的数字资产。 2023年10月,法拉利在美…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法,不过多介绍,是基于深度学习的目标检测算法中最出名、发展最好的检测器,没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程,详细技术细节不过多介绍,只提及改进点,适合初学者…

美团大众点评字符验证码

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(…

昇思MindSpore学习入门-高阶自动微分

mindspore.ops模块提供的grad和value_and_grad接口可以生成网络模型的梯度。grad计算网络梯度,value_and_grad同时计算网络的正向输出和梯度。本文主要介绍如何使用grad接口的主要功能,包括一阶、二阶求导,单独对输入或网络权重求导&#xff…

宠物空气净化器是不是智商税?央视推荐狗毛空气净化器分享

宠物空气净化器是不是智商税?是众多宠物主人在考虑是否购置宠物空气净化器时心中最大的疑问。作为呼吸科医生,我建议,在保护呼吸健康方面,任何投资都是值得的。特别是对于养有猫狗的家庭来说,宠物所带来的各种污染物和…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时,这通常意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。为了一次性解决这个问题,可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL:确保网站地址以“https://”开头,而非“http://”…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【Linux C | 网络编程】进程池小文件传输的实现详解(二)

上一篇实现了一个最基本的进程池&#xff1a;客户端读取标准输入&#xff0c;发送给服务端&#xff0c;服务端回复一个相同的内容。 【Linux C | 网络编程】简易进程池的实现详解&#xff08;一&#xff09; 这篇内容在上篇进程池的基础上实现小文件的传输。 文件传输的本质…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

力扣高频SQL 50 题(基础版)第三题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题1148.文章浏览题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题 1148.文章浏览 题目说明 Views 表&#xff1a; ---------------------- | Colu…

昇思25天学习打卡营第1天|简单深度学习

前言 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边…

数据传输安全--SSL VPN

目录 IPSEC在Client to LAN场景下比较吃力的表现 SSL VPV SSL VPN优势 SSL协议 SSL所在层次 SSL工作原理 SSL握手协议、SSL密码变化协议、SSL警告协议三个协议作用 工作过程 1、进行TCP三次握手、建立网络连接会话 2、客户端先发送Client HELLO包&#xff0c;下图是包…

平安养老险深圳分公司:参加献血志愿者活动,点亮生命之光

7月23日&#xff0c;“热血传万里&#xff0c;家家共平安”2024年中国平安无偿献血志愿者活动启动&#xff0c;其深圳站活动于当日在深圳市福田区平安金融中心北广场举行&#xff0c;平安养老险深圳分公司积极响应活动号召参与献血&#xff0c;用行动诠释责任&#xff0c;以爱心…

Nginx 配置与优化:常见问题全面解析

文章目录 Nginx 配置与优化:常见问题全面解析一、Nginx 安装与配置问题1.1 Nginx 安装失败问题描述解决方法1.2 Nginx 配置文件语法错误问题描述解决方法二、Nginx 服务启动与停止问题2.1 Nginx 无法启动问题描述解决方法2.2 Nginx 服务无法停止问题描述解决方法三、Nginx 性能…

[Mysql-DDL数据操作语句]

目录 DDL语句操作数据库 库&#xff1a; 查看&#xff1a;show 创建&#xff1a;creat 删除&#xff1a;drop 使用(切换)&#xff1a;use 表&#xff1a; 查看&#xff1a;desc show 创建&#xff1a;create 表结构修改 rename as add drop modify change rename as …