在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解NVIDIA H100 TransformerEngine

jf_pmFSk4VX ? 來源:GiantPandaCV ? 作者:zzk ? 2022-10-24 15:26 ? 次閱讀

在H100發(fā)布之際,英偉達還帶來一個“重磅產(chǎn)品”——Transformer Engine。在Transformer大火之際推出這么一個產(chǎn)品,無疑是煉丹師福音。

當時我還在猜測它會以怎么樣的一種形式呈現(xiàn)給用戶,直到最近公開了倉庫 NVIDIA/TransformerEngine

這其實就是PyTorch的一個拓展,為了利用FP8的特性,針對Transformer里面的Kernel進行了重寫,包含了一系列LayerNorm, GeLU, ScaledSoftmax等。

使用方式也是比較簡單,使用該拓展額外包的一層Module來搭建網(wǎng)絡(luò),即可,最后再包一層混合精度訓(xùn)練作用域:

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")

#創(chuàng)建FP8訓(xùn)練的配置
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及其對應(yīng)實現(xiàn)原理

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

Transfromer Engine 是干啥的?

在各種以Transformer為基礎(chǔ)的語言模型如GPT3大火后,語言模型的參數(shù)量還在以指數(shù)形式增長:

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

那么優(yōu)化Transformer性能就顯得格外重要了,其中混合精度訓(xùn)練是一個很實用的技巧

在FP16下,其數(shù)據(jù)范圍還是足夠大的,因此在AMP下,我們只在最后的Loss做了一個scaling,這個步驟足以保證在整個模型運算過程中不會產(chǎn)生溢出

而FP8相比FP16減少了更多有效位,因此不能簡單地復(fù)用FP16下的策略,需要給每個FP8 Tensor單獨設(shè)置一個合適的scale factor。Transformer Engine 需要動態(tài)地對輸入范圍進行調(diào)整,如圖所示:

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

上圖來自H100白皮書內(nèi)(當時我還天真的以為有一個專門的硬件做這個處理。。。)

下面我們簡單看下其代碼和實現(xiàn)原理

Kernel實現(xiàn)

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

具體到每一個算子實現(xiàn)動態(tài)范圍調(diào)整的原理其實很簡單,通過記錄歷史的abs max值,來去調(diào)整最終縮放的范圍。

其主要的Kernel實現(xiàn)都放在了 common 目錄下,我們以gelu這個kernel為例,最終它會調(diào)用到 vectorized_pointwise.h這個文件,我們主要看 unary_kernel

unary_kernel

這個核函數(shù)模板跟常規(guī)的elementwise向量化模板是類似的。

首先會讓每個線程獲取到scale值

ComputeTypes=0;
ifconstexpr(is_fp8::value){
//獲取scale值
if(scale!=nullptr)s=*scale;
//將scale取倒數(shù)寫回scale_inv
if(blockIdx.x==0&&threadIdx.x==0&&scale_inv!=nullptr){
reciprocal(scale_inv,s);
}
}

其中在循環(huán)里,線程會不斷更新他運算結(jié)果的最大值,并且最終運算結(jié)果要乘上scale值:

//實際運算發(fā)生
ComputeTypetemp=OP(val,p);
ifconstexpr(is_fp8::value){
__builtin_assume(max>=0);
max=fmaxf(fabsf(temp),max);

//縮放
temp=temp*s;
}

當Kernel主體運算完畢后,再也warp為單位做一個reduce_max,獲取到線程束內(nèi)的最大值,再通過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,我們可以根據(jù)官方文檔查看各個參數(shù)含義:

margin 計算scale的偏移量

interval 控制計算scale factor的頻率

fp8_format 使用FP8的格式,F(xiàn)P8有E4M3和E5M2,但是現(xiàn)在不支持純E5M2的格式訓(xùn)練

amax_history_len 記錄abs maxval的歷史窗口大小

amax_compute_algo 在窗口里選擇absmax的算法,'max'則是選擇歷史窗口里最大值,'most_recent'則是選擇近期的值,當然你也可以傳一個自定義的函數(shù)

相關(guān)代碼為:

@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

相關(guān)的Kernel除了要完成自己的計算任務(wù),也得實時維護amax這些值,因此也需要對應(yīng)修改nn.Module,這里TransformerEngine繼承了nn.Module,并且增加了一些buffer維護的機制,這些buffer用于存儲動態(tài)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()

而相關(guān)Module如LayerNormMLP繼承該Module,并且傳入fp8_meta信息更新:

classLayerNormMLP(TransformerEngineBaseModule):

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

總結(jié)

大致瀏覽完其實思路不復(fù)雜,但感覺還是FP8技術(shù)的不穩(wěn)定,整個項目還是加入了很多限制。得益于PyTorch靈活的外部擴展形式,只要不去觸碰框架底層運行機制,僅僅在算子層面上的修改還是相當簡單。雖然不具備通用性,但是運算主體就這幾個算子,為了性能也是可以接受的

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4994

    瀏覽量

    103180
  • 英偉達
    +關(guān)注

    關(guān)注

    22

    文章

    3780

    瀏覽量

    91217
  • Transformer
    +關(guān)注

    關(guān)注

    0

    文章

    143

    瀏覽量

    6017
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    808

    瀏覽量

    13239
  • H100
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    294

原文標題:詳解 NVIDIA H100 TransformerEngine

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    英偉達a100h100哪個強?英偉達A100H100的區(qū)別

    英偉達a100h100哪個強? 就A100H100這兩個產(chǎn)品來說,它們雖然都是英偉達公司的高性能計算產(chǎn)品,但是面向的市場和應(yīng)用場景不同,所以不能簡單地說哪個更強。
    的頭像 發(fā)表于 08-09 17:31 ?4.7w次閱讀

    NVIDIA發(fā)布新一代產(chǎn)品—NVIDIA H100

    NVIDIA發(fā)布新一代產(chǎn)品—NVIDIA H100H100是一款超大的芯片,采用TSMC 4N工藝,具有800億個晶體管,也是首款采用HBM3標準的GPU。
    的頭像 發(fā)表于 03-23 17:21 ?2875次閱讀
    <b class='flag-5'>NVIDIA</b>發(fā)布新一代產(chǎn)品—<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b>

    GTC2022大會黃仁勛:NVIDIA H100的5項突破性創(chuàng)新

    GTC2022大會黃仁勛:NVIDIA H100的5項突破性創(chuàng)新,擁有強大的性能,新的Tensor處理格式:FP8等,是首個實現(xiàn)性能擴展至700瓦的GPU。
    的頭像 發(fā)表于 03-23 17:37 ?2337次閱讀
    GTC2022大會黃仁勛:<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b>的5項突破性創(chuàng)新

    GTC2022大會亮點:NVIDIA發(fā)布全新AI計算系統(tǒng)—DGX H100

    GTC2022大會亮點:NVIDIA發(fā)布全新AI計算系統(tǒng)—DGX H100,借助NVLink連接,DGX使八塊H100成為了一個巨型GPU。
    的頭像 發(fā)表于 03-24 15:06 ?1926次閱讀
    GTC2022大會亮點:<b class='flag-5'>NVIDIA</b>發(fā)布全新AI計算系統(tǒng)—DGX <b class='flag-5'>H100</b>

    NVIDIA發(fā)布DGX H100系統(tǒng) 羅德與施瓦茨提供O-RAN無線電單元方案

    NVIDIA 近日宣布推出第四代 NVIDIA? DGX? 系統(tǒng),這是世界上第一個使用全新NVIDIA H100 Tensor Core GPU 構(gòu)建的 AI 平臺。
    的頭像 發(fā)表于 03-25 11:44 ?4948次閱讀

    NVIDIA發(fā)布最新Hopper架構(gòu)的H100系列GPU和Grace CPU超級芯片

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

    藍海大腦服務(wù)器全力支持NVIDIA H100 GPU

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

    NVIDIA H100 CNX構(gòu)建人工智能系統(tǒng)

      NVIDIA H100 CNX 預(yù)計可在今年下半年購買。如果你有一個用例可以從這個獨特而創(chuàng)新的產(chǎn)品中受益,請聯(lián)系你最喜歡的系統(tǒng)供應(yīng)商,詢問他們計劃何時將其與服務(wù)器一起提供。
    的頭像 發(fā)表于 03-31 14:49 ?2041次閱讀
    用<b class='flag-5'>NVIDIA</b> <b class='flag-5'>H100</b> CNX構(gòu)建人工智能系統(tǒng)

    利用NVIDIA HGX H100加速計算數(shù)據(jù)中心平臺應(yīng)用

    HGX H100 8- GPU 是新一代 Hopper GPU 服務(wù)器的關(guān)鍵組成部分。它擁有八個 H100 張量核 GPU 和四個第三代 NV 交換機。每個 H100 GPU 都有多個第四代
    的頭像 發(fā)表于 04-20 10:54 ?2850次閱讀
    利用<b class='flag-5'>NVIDIA</b> HGX <b class='flag-5'>H100</b>加速計算數(shù)據(jù)中心平臺應(yīng)用

    關(guān)于NVIDIA H100 GPU的問題解答

    今年的 GTC22 上 NVIDIA 發(fā)布其首款基于 Hopper 架構(gòu)的 GPU —NVIDIA H100
    的頭像 發(fā)表于 07-18 10:35 ?1830次閱讀

    英偉達a100h100哪個強?

    英偉達a100h100哪個強? 英偉達A100H100更強。英偉達A100在處理大型模型和數(shù)據(jù)集時可能比V
    的頭像 發(fā)表于 08-07 17:32 ?1.5w次閱讀

    英偉達A100H100的區(qū)別

    英偉達A100H100的區(qū)別 英偉達A100H100是兩種不同的產(chǎn)品。A100是英偉達在2020年推出的一款基于Ampere架構(gòu)的數(shù)據(jù)中
    的頭像 發(fā)表于 08-07 18:06 ?3w次閱讀

    英偉達h800和h100的區(qū)別

    不足,反而更貴。 NVIDIA H100 的中國版本就是:NVIDIA H800。 ? ? ? ?H800的的帶寬僅為
    的頭像 發(fā)表于 08-08 16:06 ?4.6w次閱讀
    英偉達<b class='flag-5'>h</b>800和<b class='flag-5'>h100</b>的區(qū)別

    傳英偉達新AI芯片H20綜合算力比H100降80%

    但據(jù)悉,三種新型AI芯片不是“改良型”,而是“縮小型”。用于ai模型教育的hgx h20的帶寬和計算速度是有限的。整體計算能力理論上比nvidiah100 gpu芯片低80%左右。h
    的頭像 發(fā)表于 11-13 09:41 ?1768次閱讀

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

    目前,用于高端推理的 GPU 主要有三種:NVIDIA A100NVIDIA H100 和新的 NVIDIA L40S。我們將跳過
    的頭像 發(fā)表于 11-13 16:13 ?1724次閱讀
    揭秘:英偉達<b class='flag-5'>H100</b>最強替代者
    主站蜘蛛池模板: 一级片在线免费| 久久国产乱子伦精品免费看| 毛片一区| 欧美 日韩 中文字幕| 美女被啪到哭网站在线观看| 久青草国产高清在线视频| 玖玖色视频| 国产色网站| 在线视频一本| 天天干天天舔天天射| 久久看精品| 欧美极品xxxxⅹ另类| 性过程很黄的小说男男| 成人亚洲欧美综合| 婷婷丁香综合| 色福利视频| 两性午夜欧美高清做性| 妇少香港三日本三级视频| 午夜影院日韩| 久久国产成人午夜aⅴ影院| 大色综合色综合资源站| 中文成人在线| 永久网站色视频在线观看免费| 天堂网a| 日本.www| 国产精品伦子一区二区三区| 亚洲免费黄色网| 黄色日比| 视频一区二区在线观看| 亚洲欧美色中文字幕| 人碰人操| 成人欧美一区二区三区视频不卡 | 男男宿舍高h炒肉bl| 亚洲va久久久噜噜噜久久男同| 日本黄a| 成人网在线| 免费看片你懂的| 亚洲一卡2卡3卡4卡5卡乱码| 亚洲网站www| 女人张开双腿让男人桶爽免 | 四虎.com|