精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

    文章

    4940

    瀏覽量

    102815
  • 英偉達
    +關注

    關注

    22

    文章

    3747

    瀏覽量

    90833
  • Transformer
    +關注

    關注

    0

    文章

    141

    瀏覽量

    5982
  • pytorch
    +關注

    關注

    2

    文章

    803

    瀏覽量

    13148
  • H100
    +關注

    關注

    0

    文章

    31

    瀏覽量

    282

原文標題:詳解 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 ?2816次閱讀
    <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 ?2293次閱讀
    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 ?1888次閱讀
    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 ?4899次閱讀

    NVIDIA發布最新Hopper架構的H100系列GPU和Grace CPU超級芯片

    今日凌晨,NVIDIA(英偉達)發布了基于最新Hopper架構的H100系列GPU和Grace CPU超級芯片!
    的頭像 發表于 03-26 09:07 ?2827次閱讀

    藍海大腦服務器全力支持NVIDIA H100 GPU

    藍海大腦宣布服務器產品線全力支持最新的 NVIDIA H100 GPU。藍海大腦服務器產品在單機上最多可支持4、8甚至9個H100 GPU,可為多種人工智能場景提供超強算力、靈活的資源調度和成熟的生態支持。
    的頭像 發表于 03-31 11:47 ?1282次閱讀

    NVIDIA H100 CNX構建人工智能系統

      NVIDIA H100 CNX 預計可在今年下半年購買。如果你有一個用例可以從這個獨特而創新的產品中受益,請聯系你最喜歡的系統供應商,詢問他們計劃何時將其與服務器一起提供。
    的頭像 發表于 03-31 14:49 ?1991次閱讀
    用<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 ?2767次閱讀
    利用<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 ?1715次閱讀

    英偉達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 ?1659次閱讀

    揭秘:英偉達H100最強替代者

    目前,用于高端推理的 GPU 主要有三種:NVIDIA A100NVIDIA H100 和新的 NVIDIA L40S。我們將跳過
    的頭像 發表于 11-13 16:13 ?1581次閱讀
    揭秘:英偉達<b class='flag-5'>H100</b>最強替代者