网易首页 > 网易号 > 正文 申请入驻

使用FP8加速PyTorch训练

0
分享至


现代的人工智能硬件架构(例如,Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中,FP8张量内核能够显著提高每秒浮点运算(FLOPS),以及为人工智能训练和推理工作负载提供内存优化和节能的机会。

在这篇文章中,我们将介绍如何修改PyTorch训练脚本,以利用对Nvidia H100 GPU的FP8数据类型的内置支持。这里主要介绍由Transformer Engine库公开的fp8特定的PyTorch API,并展示如何将它们集成到一个简单的训练脚本中。(我们这里只介绍如何使用FP8,不会介绍FP8具体的理论知识)

随着人工智能模型变得越来越复杂,训练它们所需的机器也越来越复杂。Nvidia H100 GPU据称支持“前所未有的性能和可扩展性”。

在AWS中,H100 gpu是作为AWS EC2 p5实例的一个组件提供的。这些实例声称“与上一代基于gpu的EC2实例相比,可将解决方案的时间加快4倍,并将训练ML模型的成本降低高达40%”。

当涉及到机器学习训练实例时,并不总是越大越好。p5实例族尤其如此。p5可能会比其他实例要快很多,因为H100是无可争议的性能野兽。但是一旦考虑到p5的成本(8-GPU p5.48xlarge实例的成本为每小时98.32美元),你可能会发现其他实例类型更适合。

下面我们将在p5.48xlarge上训练一个相对较大的计算机视觉模型,并将其性能与p4d进行比较。p4d.24xlarge包含8个Nvidia A100 gpu。

模型

我们定义了一个Vision Transformer (ViT)支持的分类模型(使用流行的timm Python包版本0.9.10)以及一个随机生成的数据集。ViT主干有多种形状和大小。我们选择了通常被称为ViT-Huge的配置-具有6.32亿个参数-这样能够更好地利用H100对大型模型的容量。

import torch, time
import torch.optim
import torch.utils.data
import torch.distributed as dist
from torch.nn.parallel.distributed import DistributedDataParallel as DDP
import torch.multiprocessing as mp
# modify batch size according to GPU memory
batch_size = 64
from timm.models.vision_transformer import VisionTransformer
from torch.utils.data import Dataset
# use random data
class FakeDataset(Dataset):
def __len__(self):
return 1000000
def __getitem__(self, index):
rand_image = torch.randn([3, 224, 224], dtype=torch.float32)
label = torch.tensor(data=[index % 1000], dtype=torch.int64)
return rand_image, label
def mp_fn(local_rank, *args):
# configure process
dist.init_process_group("nccl",
rank=local_rank,
world_size=torch.cuda.device_count())
torch.cuda.set_device(local_rank)
device = torch.cuda.current_device()
# create dataset and dataloader
train_set = FakeDataset()
train_loader = torch.utils.data.DataLoader(
train_set, batch_size=batch_size,
num_workers=12, pin_memory=True)
# define ViT-Huge model
model = VisionTransformer(
embed_dim=1280,
depth=32,
num_heads=16,
).cuda(device)
model = DDP(model, device_ids=[local_rank])
# define loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
model.train()
t0 = time.perf_counter()
summ = 0
count = 0
for step, data in enumerate(train_loader):
# copy data to GPU
inputs = data[0].to(device=device, non_blocking=True)
label = data[1].squeeze(-1).to(device=device, non_blocking=True)
# use mixed precision to take advantage of bfloat16 support
with torch.autocast(device_type='cuda', dtype=torch.bfloat16):
outputs = model(inputs)
loss = criterion(outputs, label)
optimizer.zero_grad(set_to_none=True)
loss.backward()
optimizer.step()
# capture step time
batch_time = time.perf_counter() - t0
if step > 10: # skip first steps
summ += batch_time
count += 1
t0 = time.perf_counter()
if step > 50:
break
print(f'average step time: {summ/count}')
if __name__ == '__main__':
mp.spawn(mp_fn,
args=(),
nprocs=torch.cuda.device_count(),
join=True)

我们使用专用PyTorch 2.1 AWS深度学习容器(763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-ec2)在p5.48xlarge和p4d上都训练了这个模型。

p5的性能远远超过了p4d的性能——每步0.199秒比0.41秒——快了两倍多!!这意味着训练大型机器学习模型的时间将减少一半。但是当你考虑到成本的差异(p4d每小时32.77美元,p5每小时98.32美元),p5的性价比比p4d差30% !!

在这一点上,可能会得出两个可能的结论之一。第一种可能性是,尽管有这么多宣传,但p5根本不适合您。第二个是p5仍然是可行的,但是需要对模型进行调整,充分利用它的潜力。

FP8与Transformer Engine的集成

PyTorch(版本2.1)不包括FP8数据类型。为了将我们的脚本编程为使用FP8,我们将使用Transformer Engine (TE),这是一个用于在NVIDIA gpu上加速Transformer模型的专用库。TE(版本0.12)预装在AWS PyTorch 2.1 DL容器中。

使用FP8的机制比16位(float16和bfloat16)要复杂得多。TE库实现向用户隐藏了所有杂乱的细节。有关如何使用TE api的说明(请参阅官方文档)。

为了修改我们的模型以使用TE,我们将TE的专用Transformer层,所以需要我们自己写一个包装器:

import transformer_engine.pytorch as te
from transformer_engine.common import recipe
class TE_Block(te.transformer.TransformerLayer):
def __init__(
self,
dim,
num_heads,
mlp_ratio=4.,
qkv_bias=False,
qk_norm=False,
proj_drop=0.,
attn_drop=0.,
init_values=None,
drop_path=0.,
act_layer=None,
norm_layer=None,
mlp_layer=None
):
super().__init__(
hidden_size=dim,
ffn_hidden_size=int(dim * mlp_ratio),
num_attention_heads=num_heads,
hidden_dropout=proj_drop,
attention_dropout=attn_drop
)

然后修改VisionTransformer初始化自定义块:

model = VisionTransformer(
embed_dim=1280,
depth=32,
num_heads=16,
block_fn=TE_Block
).cuda(device)

到目前为止,还没有做任何针对h100特定的更改-相同的代码可以在我们的a100的p4d实例类型上运行。最后一个修改是用te包裹模型前向传递。Fp8_autocast上下文管理器。此更改需要支持FP8的GPU:

with torch.autocast(device_type='cuda', dtype=torch.bfloat16):
with te.fp8_autocast(enabled=True):
outputs = model(inputs)
loss = criterion(outputs, label)

关于使用FP8的一些注意事项

使用8位浮点表示(相对于16位或32位表示)意味着较低的精度和较低的动态范围。这些可以对模型收敛的可达性和/或速度产生有意义的影响,但不能保证这将适用于所有的模型。所以可能需要调整底层FP8机制(例如,使用TEapi),调整一些超参数,和/或将FP8的应用限制在模型的子模型(一部分)。最坏的可能是尽管进行了所有尝试,模型还是无法与FP8兼容。

结果

在下表中总结了在两个p4d上的实验结果。24xlarge和p5.48xlarge EC2实例类型,使用和不使用TE库。对于p5.48xlarge实验,我们将批处理大小加倍,这样提高80 GB GPU内存的利用率。使用FP8可以减少GPU内存消耗,从而进一步增加批处理大小。

可以看到,使用TE提高了p4d(19%)和p5(32%)的性价比。使用FP8可将p5上的性能额外提高约20%。在TE和FP8优化之后,基于h100的p5.48large的性价比优于基于a100的p4d.xlarge——虽然差距不大(2%)。考虑到训练速度提高了3倍,我们可以有把握地得出结论,p5将是训练优化模型的更好的实例类型。

但是我们也看到了,这是相对较小的性价比提升(远低于p5公告中提到的40%),所以可能还有更多的优化方案,我们需要继续研究。

总结

在这篇文章中,我们演示了如何编写PyTorch训练脚本来使用8位浮点类型。展示了FP8的使用是如何从Nvidia H100中获得最佳性能的关键因素。FP8的可行性及其对训练性能的影响可以根据模型的细节而变化很大。

https://avoid.overfit.cn/post/541a04c656db474d91ee5eb1fa5bc5f8

作者:Chaim Rand

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
砸11亿!青岛山姆店终于要开了,山东人等太久!

砸11亿!青岛山姆店终于要开了,山东人等太久!

GA环球建筑
2026-02-01 18:15:27
山东大学顺利举办“马杜罗思想体系研讨会”

山东大学顺利举办“马杜罗思想体系研讨会”

必记本
2026-02-01 13:12:33
人不会无故大脑萎缩!医生提醒:大脑萎缩的人,多半有这些习惯

人不会无故大脑萎缩!医生提醒:大脑萎缩的人,多半有这些习惯

蜉蝣说
2026-01-29 15:15:16
曾精准预判金价狂飙的人,如何看待这场暴跌

曾精准预判金价狂飙的人,如何看待这场暴跌

新浪财经
2026-02-01 18:13:05
“很晦气,这房子不敢住了!” 杭州夫妻买房2年后得知一个消息,想退房了

“很晦气,这房子不敢住了!” 杭州夫妻买房2年后得知一个消息,想退房了

潇湘晨报
2026-01-31 10:38:17
我娶了县长痴呆25年的女儿,晚上我准备打地铺,她说:不许睡地上

我娶了县长痴呆25年的女儿,晚上我准备打地铺,她说:不许睡地上

千秋文化
2026-01-05 22:15:53
制裁大疆的欧美国家慌了:大疆无人机飞越珠峰,连直升机都做不到

制裁大疆的欧美国家慌了:大疆无人机飞越珠峰,连直升机都做不到

老范谈史
2026-02-01 18:59:30
高市早苗再次为“台湾有事”言论进行解释,称若台湾有事、美军受到袭击,日本不能袖手旁观,国防部回应

高市早苗再次为“台湾有事”言论进行解释,称若台湾有事、美军受到袭击,日本不能袖手旁观,国防部回应

中国基金报
2026-01-30 07:15:19
现场直击|战云笼罩德黑兰

现场直击|战云笼罩德黑兰

新华社
2026-01-31 23:03:02
特朗普回应哈梅内伊

特朗普回应哈梅内伊

扬子晚报
2026-02-02 07:33:05
号称“第一把刀”!许多上海人冲他来南京路!每天能卖500斤!

号称“第一把刀”!许多上海人冲他来南京路!每天能卖500斤!

上海黄浦
2026-02-01 21:50:02
起飞了!“意甲10号”即将加盟中甲:最高身价1100万欧

起飞了!“意甲10号”即将加盟中甲:最高身价1100万欧

邱泽云
2026-02-01 16:11:58
央视怒批,人民日报点名封杀,这5位目无法纪的大网红,彻底凉凉

央视怒批,人民日报点名封杀,这5位目无法纪的大网红,彻底凉凉

一娱三分地
2025-12-04 17:00:33
马年春晚主持天团大洗牌!老面孔调岗新面孔挑梁,这变动太有看头

马年春晚主持天团大洗牌!老面孔调岗新面孔挑梁,这变动太有看头

复转这些年
2026-01-30 23:38:18
敢不敢打?我军重大人事变故后菲律宾南海演习,更像是一种试探

敢不敢打?我军重大人事变故后菲律宾南海演习,更像是一种试探

悦心知足
2026-02-01 00:50:48
发一张教室女生走光图!

发一张教室女生走光图!

果粉之家
2026-01-30 12:23:03
本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机

本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机

明智家庭教育
2026-01-31 10:29:14
阿卡怒喷裁判!澳网决赛屋顶半关惹争议 逆转德约澳网登顶留下话题

阿卡怒喷裁判!澳网决赛屋顶半关惹争议 逆转德约澳网登顶留下话题

劲爆体坛
2026-02-01 21:02:12
国民党中常委选举出炉!陈菁徽最高票,韩国瑜、郑丽文人马也入列

国民党中常委选举出炉!陈菁徽最高票,韩国瑜、郑丽文人马也入列

海峡导报社
2026-01-31 21:50:02
价格大跌,广州市民大批涌入,有人一下花掉36万元购买足金饰品!店员:忙到连轴转

价格大跌,广州市民大批涌入,有人一下花掉36万元购买足金饰品!店员:忙到连轴转

环球网资讯
2026-02-01 17:58:53
2026-02-02 09:51:00
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1908文章数 1446关注度
往期回顾 全部

科技要闻

10亿元宝红包突袭 复刻微信支付还是微视?

头条要闻

牛弹琴:欧洲终于开骂了 特朗普可能会气到咆哮

头条要闻

牛弹琴:欧洲终于开骂了 特朗普可能会气到咆哮

体育要闻

德约大度祝贺阿卡 幽默互动逗笑纳达尔

娱乐要闻

春晚第三次联排阵容曝光:全是实力派

财经要闻

国六货车被迫"换头" 每次收费超200元

汽车要闻

岚图汽车1月交付10515辆 同比增长31%

态度原创

时尚
亲子
家居
旅游
军事航空

普通人衣服没必要买太多,准备好这些单品,简单实用又耐看

亲子要闻

2-5岁孩子如何在家做早教?用好这些小道具,孩子进步超快!

家居要闻

蓝调空舍 自由与个性

旅游要闻

318元买下甘孜“一辈子” 这笔文旅账是怎么算的?|城市经济学

军事要闻

委内瑞拉外长会见美外交使团团长

无障碍浏览 进入关怀版