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

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

3天内不再提示

详解NVIDIA H100 TransformerEngine

jf_pmFSk4VX 来源:GiantPandaCV 作者:zzk 2022-10-24 15:26 次阅读

在H100发布之际,英伟达还带来一个“重磅产品”——Transformer Engine。在Transformer大火之际推出这么一个产品,无疑是炼丹师福音。

当时我还在猜测它会以怎么样的一种形式呈现给用户,直到最近公开了仓库 NVIDIA/TransformerEngine

这其实就是PyTorch的一个拓展,为了利用FP8的特性,针对Transformer里面的Kernel进行了重写,包含了一系列LayerNorm, GeLU, ScaledSoftmax等。

使用方式也是比较简单,使用该拓展额外包的一层Module来搭建网络,即可,最后再包一层混合精度训练作用域:

importtorch
importtransformer_engine.pytorchaste
fromtransformer_engine.commonimportrecipe

#Setdimensions.
in_features=768
out_features=3072
hidden_size=2048

#Initializemodelandinputs.
model=te.Linear(in_features,out_features,use_bias=True)
inp=torch.randn(hidden_size,in_features,device="cuda")

#创建FP8训练的配置
fp8_recipe=recipe.DelayedScaling(margin=0,interval=1,fp8_format=recipe.Format.E4M3)

#FP8的autocast
withte.fp8_autocast(enabled=True,fp8_recipe=fp8_recipe):
out=model(inp)

loss=out.sum()
loss.backward()

本篇博客就简单介绍下Transformer Engine及其对应实现原理

官方文档:https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/index.html

Transfromer Engine 是干啥的?

在各种以Transformer为基础的语言模型如GPT3大火后,语言模型的参数量还在以指数形式增长:

278b1910-51a7-11ed-a3b6-dac502259ad0.png

那么优化Transformer性能就显得格外重要了,其中混合精度训练是一个很实用的技巧

在FP16下,其数据范围还是足够大的,因此在AMP下,我们只在最后的Loss做了一个scaling,这个步骤足以保证在整个模型运算过程中不会产生溢出

而FP8相比FP16减少了更多有效位,因此不能简单地复用FP16下的策略,需要给每个FP8 Tensor单独设置一个合适的scale factor。Transformer Engine 需要动态地对输入范围进行调整,如图所示:

27a042e0-51a7-11ed-a3b6-dac502259ad0.png

上图来自H100白皮书内(当时我还天真的以为有一个专门的硬件做这个处理。。。)

下面我们简单看下其代码和实现原理

Kernel实现

27c18cfc-51a7-11ed-a3b6-dac502259ad0.png

具体到每一个算子实现动态范围调整的原理其实很简单,通过记录历史的abs max值,来去调整最终缩放的范围。

其主要的Kernel实现都放在了 common 目录下,我们以gelu这个kernel为例,最终它会调用到 vectorized_pointwise.h这个文件,我们主要看 unary_kernel

unary_kernel

这个核函数模板跟常规的elementwise向量化模板是类似的。

首先会让每个线程获取到scale值

ComputeTypes=0;
ifconstexpr(is_fp8::value){
//获取scale值
if(scale!=nullptr)s=*scale;
//将scale取倒数写回scale_inv
if(blockIdx.x==0&&threadIdx.x==0&&scale_inv!=nullptr){
reciprocal(scale_inv,s);
}
}

其中在循环里,线程会不断更新他运算结果的最大值,并且最终运算结果要乘上scale值:

//实际运算发生
ComputeTypetemp=OP(val,p);
ifconstexpr(is_fp8::value){
__builtin_assume(max>=0);
max=fmaxf(fabsf(temp),max);

//缩放
temp=temp*s;
}

当Kernel主体运算完毕后,再也warp为单位做一个reduce_max,获取到线程束内的最大值,再通过atomicMax原子操作,不断更新全局最大值:

ifconstexpr(is_fp8::value){
/*warptileamaxreduce*/
max=reduce_max(max,warp_id);

if(threadIdx.x==0&&amax!=nullptr){
static_assert(std::is_same::value);
//更新全局最大值
atomicMaxFloat(amax,max);
}
}

其他layernorm等Kernel也是诸如类似的逻辑,这里就不再展开了

Python API

(1) DelayedScaling

从前面的示例代码我们可以看到一个比较重要的API是DelayedScaling,我们可以根据官方文档查看各个参数含义:

margin 计算scale的偏移量

interval 控制计算scale factor的频率

fp8_format 使用FP8的格式,FP8有E4M3和E5M2,但是现在不支持纯E5M2的格式训练

amax_history_len 记录abs maxval的历史窗口大小

amax_compute_algo 在窗口里选择absmax的算法,'max'则是选择历史窗口里最大值,'most_recent'则是选择近期的值,当然你也可以传一个自定义的函数

相关代码为:

@torch.jit.script
def_default_get_amax(
amax_history:torch.Tensor,
amax_compute_algo:str,
)->Tuple[torch.Tensor,torch.Tensor]:
"""Defaultfunctiontoobtainamaxfromhistory."""
ifamax_compute_algo=="max":
amax=torch.max(amax_history,dim=0).values
else:#amax_compute_algo=="most_recent"
amax=amax_history[0]

amax_history=update_amax_history(amax_history)
returnamax_history,amax

scaling_factor_compute_algo 计算scale factor的算法

@torch.jit.script
def_default_sf_compute(
amax:torch.Tensor,
scale:torch.Tensor,
fp8_max:float,
margin:int,
)->torch.Tensor:
"""Defaultfunctiontoconvertamaxtoscalingfactor."""
exp=torch.floor(torch.log2(fp8_max/amax))-margin
sf=torch.round(torch.pow(2,torch.abs(exp)))
sf=torch.where(amax>0.0,sf,scale)
sf=torch.where(torch.isfinite(amax),sf,scale)
sf=torch.where(exp< 0, 1 / sf, sf)

    return sf

override_linear_precision 由3个bool值,分别控制fprop前向,dgrad,wgrad三个矩阵乘是否用更高的精度来计算,默认都为False

(2) TransformerEngineBaseModule

相关的Kernel除了要完成自己的计算任务,也得实时维护amax这些值,因此也需要对应修改nn.Module,这里TransformerEngine继承了nn.Module,并且增加了一些buffer维护的机制,这些buffer用于存储动态scale的信息

classTransformerEngineBaseModule(torch.nn.Module,ABC):
def__init__(self)->None:
...
self.fp8=False
self.fp8_meta={}
self.fp8_meta["fp8_group"]=None
self.fp8_meta["recipe"]=get_default_fp8_recipe()
deffp8_init(self,num_gemms:int=1)->None:
"""Initializefp8relatedmetadataandtensorsduringfprop."""
#Iffp8isn'tenabled,turnoffandreturn.
ifnotis_fp8_enabled():
self.fp8=False
return

#FP8isalreadyenabledandrecipeisthesame,don'tdoanything.
ifself.fp8andget_fp8_recipe()==self.fp8_meta["recipe"]:
return

#SetFP8,recipe,andotherFP8metadata
self.fp8=True
self.fp8_meta["recipe"]=get_fp8_recipe()
self.fp8_meta["num_gemms"]=num_gemms
self.fp8_meta["fp8_group"]=get_fp8_group()

#SetFP8_MAXpertensoraccordingtorecipe
self.fp8_meta["fp8_max_fwd"]=self.fp8_meta["recipe"].fp8_format.value.max_fwd
self.fp8_meta["fp8_max_bwd"]=self.fp8_meta["recipe"].fp8_format.value.max_bwd

#Allocatescalesandamaxes
self.init_fp8_meta_tensors()

而相关Module如LayerNormMLP继承该Module,并且传入fp8_meta信息更新:

classLayerNormMLP(TransformerEngineBaseModule):

defforward(...):
out=_LayerNormMLP.apply(
...,
self.fp8,
self.fp8_meta,
)

总结

大致浏览完其实思路不复杂,但感觉还是FP8技术的不稳定,整个项目还是加入了很多限制。得益于PyTorch灵活的外部扩展形式,只要不去触碰框架底层运行机制,仅仅在算子层面上的修改还是相当简单。虽然不具备通用性,但是运算主体就这几个算子,为了性能也是可以接受的

审核编辑:汤梓红

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

    关注

    14

    文章

    4929

    浏览量

    102790
  • 英伟达
    +关注

    关注

    22

    文章

    3739

    浏览量

    90789
  • Transformer
    +关注

    关注

    0

    文章

    141

    浏览量

    5980
  • pytorch
    +关注

    关注

    2

    文章

    803

    浏览量

    13142
  • H100
    +关注

    关注

    0

    文章

    31

    浏览量

    280

原文标题:详解 NVIDIA H100 TransformerEngine

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    英伟达a100h100哪个强?英伟达A100H100的区别

    英伟达a100h100哪个强? 就A100H100这两个产品来说,它们虽然都是英伟达公司的高性能计算产品,但是面向的市场和应用场景不同,所以不能简单地说哪个更强。
    的头像 发表于 08-09 17:31 4.6w次阅读

    NVIDIA发布新一代产品—NVIDIA H100

    NVIDIA发布新一代产品—NVIDIA H100H100是一款超大的芯片,采用TSMC 4N工艺,具有800亿个晶体管,也是首款采用HBM3标准的GPU。
    的头像 发表于 03-23 17:21 2813次阅读
    <b class='flag-5'>NVIDIA</b>发布新一代产品—<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b>

    GTC2022大会黄仁勋:NVIDIA H100的5项突破性创新

    GTC2022大会黄仁勋:NVIDIA H100的5项突破性创新,拥有强大的性能,新的Tensor处理格式:FP8等,是首个实现性能扩展至700瓦的GPU。
    的头像 发表于 03-23 17:37 2288次阅读
    GTC2022大会黄仁勋:<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b>的5项突破性创新

    GTC2022大会亮点:NVIDIA发布全新AI计算系统—DGX H100

    GTC2022大会亮点:NVIDIA发布全新AI计算系统—DGX H100,借助NVLink连接,DGX使八块H100成为了一个巨型GPU。
    的头像 发表于 03-24 15:06 1883次阅读
    GTC2022大会亮点:<b class='flag-5'>NVIDIA</b>发布全新AI计算系统—DGX <b class='flag-5'>H100</b>

    NVIDIA发布DGX H100系统 罗德与施瓦茨提供O-RAN无线电单元方案

    NVIDIA 近日宣布推出第四代 NVIDIA® DGX™ 系统,这是世界上第一个使用全新NVIDIA H100 Tensor Core GPU 构建的 AI 平台。
    的头像 发表于 03-25 11:44 4890次阅读

    NVIDIA发布最新Hopper架构的H100系列GPU和Grace CPU超级芯片

    今日凌晨,NVIDIA(英伟达)发布了基于最新Hopper架构的H100系列GPU和Grace CPU超级芯片!
    的头像 发表于 03-26 09:07 2822次阅读

    蓝海大脑服务器全力支持NVIDIA H100 GPU

    蓝海大脑宣布服务器产品线全力支持最新的 NVIDIA H100 GPU。蓝海大脑服务器产品在单机上最多可支持4、8甚至9个H100 GPU,可为多种人工智能场景提供超强算力、灵活的资源调度和成熟的生态支持。
    的头像 发表于 03-31 11:47 1277次阅读

    NVIDIA H100 CNX构建人工智能系统

      NVIDIA H100 CNX 预计可在今年下半年购买。如果你有一个用例可以从这个独特而创新的产品中受益,请联系你最喜欢的系统供应商,询问他们计划何时将其与服务器一起提供。
    的头像 发表于 03-31 14:49 1985次阅读
    用<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b> CNX构建人工智能系统

    利用NVIDIA HGX H100加速计算数据中心平台应用

    HGX H100 8- GPU 是新一代 Hopper GPU 服务器的关键组成部分。它拥有八个 H100 张量核 GPU 和四个第三代 NV 交换机。每个 H100 GPU 都有多个第四代
    的头像 发表于 04-20 10:54 2761次阅读
    利用<b class='flag-5'>NVIDIA</b> HGX <b class='flag-5'>H100</b>加速计算数据中心平台应用

    关于NVIDIA H100 GPU的问题解答

    今年的 GTC22 上 NVIDIA 发布其首款基于 Hopper 架构的 GPU —NVIDIA H100
    的头像 发表于 07-18 10:35 1705次阅读

    英伟达a100h100哪个强?

    英伟达a100h100哪个强? 英伟达A100H100更强。英伟达A100在处理大型模型和数据集时可能比V
    的头像 发表于 08-07 17:32 1.5w次阅读

    英伟达A100H100的区别

    英伟达A100H100的区别 英伟达A100H100是两种不同的产品。A100是英伟达在2020年推出的一款基于Ampere架构的数据中
    的头像 发表于 08-07 18:06 2.9w次阅读

    英伟达h800和h100的区别

    不足,反而更贵。 NVIDIA H100 的中国版本就是:NVIDIA H800。        H800的的带宽仅为
    的头像 发表于 08-08 16:06 4.5w次阅读
    英伟达<b class='flag-5'>h</b>800和<b class='flag-5'>h100</b>的区别

    传英伟达新AI芯片H20综合算力比H100降80%

    但据悉,三种新型AI芯片不是“改良型”,而是“缩小型”。用于ai模型教育的hgx h20的带宽和计算速度是有限的。整体计算能力理论上比nvidiah100 gpu芯片低80%左右。h
    的头像 发表于 11-13 09:41 1654次阅读

    揭秘:英伟达H100最强替代者

    目前,用于高端推理的 GPU 主要有三种:NVIDIA A100NVIDIA H100 和新的 NVIDIA L40S。我们将跳过
    的头像 发表于 11-13 16:13 1564次阅读
    揭秘:英伟达<b class='flag-5'>H100</b>最强替代者