如何使用加速PyTorrch2.0變異器和新推出的變異器irch. combile 。以下列示例為例加速大語言模型的方法納米gptGPT模式在Andrej Karpropt的 Andrej Karpathy 中采用,采用新的規(guī)?;?dot 產(chǎn)品關(guān)注量操作員通過加速PT2變換器,我們選擇閃光點定制內(nèi)核,并實現(xiàn)每個批次(用Nvidia A100 GPUs測量)更快的培訓(xùn)時間,從~143ms/批量基線到~113ms/批量基準(zhǔn),此外,利用SDPA操作員加強實施提供更好的數(shù)字穩(wěn)定性。最后,利用加插投入進一步優(yōu)化,如果加插投入與加插關(guān)注相結(jié)合,導(dǎo)致~87ms/批量。
最近,在日常生活中大量采用大型語言模式(LLMs)和創(chuàng)性AI,在時間和硬件利用方面,與這些不斷增長的模式緊密結(jié)合,培訓(xùn)成本不斷增加。加速變壓器(以前稱為“更好的變換器”)和JIT 匯編PyTorch 2.0 點火2.0.
在博客文章中,我們探索了利用SDPA的定制內(nèi)核實施(也稱“縮放點產(chǎn)品關(guān)注”)獲得的培訓(xùn)優(yōu)化,這是變壓器模型中的一個關(guān)鍵層。SDPA的定制內(nèi)核用一個全球優(yōu)化的內(nèi)核取代了若干獨立的連續(xù)操作,避免分配大量的CUDA中間內(nèi)存。這個方法提供了許多優(yōu)勢,包括但不限于:通過減少記憶帶寬瓶頸,減少記憶足跡以支持較大批量尺寸,提高SDPA的性能計算,減少記憶足跡以支持較大批量尺寸,以及最終通過預(yù)先縮放輸入壓強器增加數(shù)字穩(wěn)定性。 這些優(yōu)化在NameGPT上展示,這是Andrej Karpath公司對GPT的開放源實施。
背景
擴大對點產(chǎn)品的關(guān)注是多頭公司關(guān)注的基本構(gòu)件,正如在2002年“注意是你們所需要的一切”并在LLM和產(chǎn)生性AI模型中廣泛應(yīng)用。
圖1:以“注意是你們所需要的一切”使用新的PyTorrch SDPA操作員,多點關(guān)注由投射線層、SDPA操作員和投射線層有效實施。
使用新的縮放的多位元產(chǎn)品注意操作器,多頭關(guān)注可以僅僅在三個步驟中進行:投射線性層、SDPA和投射線性層。
PyTorrch 2. 支持為特定用途案例優(yōu)化的多個不同內(nèi)核,并有具體要求。內(nèi)核拾取器為特定輸入參數(shù)組合選擇最佳內(nèi)核。如果不為特定輸入?yún)?shù)組合優(yōu)化“自定義內(nèi)核 ” , 內(nèi)核拾取器將選擇一個能夠處理所有輸入組合的普通內(nèi)核。
PyTorch 2.0 點火2.0號發(fā)射裝置為SDPA操作員安裝了3個裝置:
用于執(zhí)行函數(shù)中SDPA的數(shù)學(xué)方程式的通用內(nèi)核sdpa_math 地圖 ()
基于文件的優(yōu)化內(nèi)核“閃電注意”支持對SDPA進行評價,在計算SM80結(jié)構(gòu)(A100)時采用16位浮點數(shù)據(jù)類型。
基于文件的優(yōu)化內(nèi)核“不需要O(n%2) 內(nèi)存執(zhí)行,并落實:舊前,它支持了范圍更廣的建筑結(jié)構(gòu)(SM40和以后的SM40)上的32和16位浮數(shù)據(jù)類型。效率( mem) 效率( P)內(nèi)核
請注意,兩個優(yōu)化的內(nèi)核(上面列出兩個和三個)都支持一個鍵嵌入面罩,并將支持的注意面罩限制為因果注意。 今天加速的 PyTorch 2.0 點火2.0 變換器只在指定使用因 - 因 - 因 - 因 - 原因當(dāng)指定掩罩時,將選擇通用內(nèi)核,因為分析所提供掩罩的內(nèi)容太昂貴,無法確定它是否為因果遮罩。PT2 加速變換器博客.
使用納米GPPT的快速加速變換器
SDPA操作員是GPT模型的關(guān)鍵組成部分,我們確定開放源碼納米GPT模型是展示PyTorch 2.0 點火2.0加速變異器實施方便和效益的絕佳候選者。 以下展示了加速變異器在NAMGPT上啟用的確切過程。
這一過程主要圍繞取代現(xiàn)有的SDPA實施程序,由新加入的F.scald_dot_product_product_access 運營商取代。功能.py。這個程序可以很容易地調(diào)整,使操作員能夠進入許多其他LLMs?;蛘?用戶可以選擇調(diào)用 F. multi_head_attention_forward () 或酌情直接使用 nn. Multi HeadAtention 模塊。以下代碼片斷從 Karpathy 的 N納米GPT 倉庫中修改。
第1步:確定現(xiàn)有的SDPA執(zhí)行情況
就納米GPT而言,SDPA是在模型中實施的。以因果自 心類別。在撰寫本報告時,為該員額對最初執(zhí)行部分作如下調(diào)整。
第2步:用火炬取代縮放_ dot_ product_ 注意
目前,我們可以注意到以下幾點:
第36至42行界定我們正在取代的SDPA的數(shù)學(xué)實施
39號線上應(yīng)用的面具不再相關(guān),因為我們使用的是縮放_dot_product_product_product_acceptions因 - 因 - 因 - 因 - 原因旗幟。
第41行使用的輟學(xué)層現(xiàn)在也沒有必要。
換掉SDPA 的火炬( 縮放為_ dot_ product_ product_ attention), 并刪除多余的代碼, 產(chǎn)生以下效果 。
或者,也可以將原始面罩傳遞到attn-mask 縮略圖然而,由于上述內(nèi)核限制,將執(zhí)行限制在只支持通用sdpa_math 地圖內(nèi)核
第3步(邦斯):用墊板更快的墊板
除了SDPA的性能改善之外,我們的分析還取得了良好的附帶勝利。 在Andrej的“迄今為止對納米GPT(~25%的加速率)最戲劇化的優(yōu)化 ” , 就是簡單地將鱷魚的體積從50257個增加到50304個(接近64個的倍數(shù) ) 。 ”
vocab 大小決定了 GPT 輸出層的 matmuls 尺寸, 這些尺寸太大, 以至于它們正在使用占多數(shù)整個訓(xùn)練循環(huán)的時間點。 我們發(fā)現(xiàn),他們的表現(xiàn)大大低于A100GPU上可以達到的最高量。NVIDIA的制表文件64 元素對齊將產(chǎn)生更好的效果。 事實上, 掛貼這些配制板可以實現(xiàn)近3x加速 。 根本原因是不對齊的內(nèi)存存存取大大降低了效率。 更深入的分析可見于此推特線索.
通過這種優(yōu)化,我們進一步縮短了每批培訓(xùn)時間,從~113毫斯(利用閃光關(guān)注)減少到~87毫斯。
結(jié)果結(jié)果結(jié)果 結(jié)果 結(jié)果
下圖顯示了利用Pytorch定制內(nèi)核取得的性能。
基準(zhǔn)線(執(zhí)行NanoGPT):~14 300米
sdpa_math 地圖( generic): ~ 134ms (6. 71% 更快)
效率( mem) 效率( P)內(nèi)核:~119米(快20.16%)
閃閃注意內(nèi)核:~113米(26.54%更快)
閃光- 注意加插 vocab:~ 8700米(64.37%更快)
所有代碼都運行在80GB HBM[A100 SXM4 80GB]的8x NVIDIA Corporation A100服務(wù)器上,為試驗?zāi)康?將這一輟學(xué)率設(shè)為0。
圖2:使用定制內(nèi)核和火炬的量級點產(chǎn)品注意和定制內(nèi)核和火炬。納米gpt在此顯示 。
加強數(shù)字模型穩(wěn)定
除了速度更快之外,PyTorrch的實施工作通過避免許多執(zhí)行方案失去準(zhǔn)確性,提高了數(shù)字穩(wěn)定性。在這里,但基本上PyTollch 實施規(guī)模的查詢和關(guān)鍵矩陣之前由于SDPA的合并定制內(nèi)核結(jié)構(gòu),這一縮放在計算關(guān)注結(jié)果時不會增加間接費用,相比之下,個別計算組成部分的實施需要分別進行預(yù)先縮放,按額外費用計算。
改進內(nèi)存消耗
然而,使用SDPA火炬內(nèi)核的另一個大優(yōu)點是記憶足跡減少,從而可以使用較大的批量尺寸。下圖比較了經(jīng)過一小時的閃光關(guān)注培訓(xùn)和因果關(guān)注基線實施后的最佳驗證損失。從可以看出,基線因果關(guān)注實施(在8x NVIDIA Corporation A100服務(wù)器上,有80GB HBM, 80 GB HBM)實現(xiàn)的最大批量規(guī)模為24個,大大低于以閃光關(guān)注實現(xiàn)的最大數(shù)量,即39個。
圖3:使用 " 閃電注意 " 使得能夠使用較大批量的批量,使用戶在經(jīng)過一小時培訓(xùn)后獲得較低的驗證損失(越小越好)。
結(jié) 結(jié) 結(jié) 結(jié)
新推出的PyTorrch SDPA運營商為培訓(xùn)變異器模型提供了更好的性能,對昂貴的大型語言模型培訓(xùn)特別有價值。
與固定批量規(guī)模的基準(zhǔn)相比,培訓(xùn)速度加快26%以上
與基準(zhǔn)量相比,用加插詞匯表實現(xiàn)進一步加快速度,使總優(yōu)化率達到約64%
額外數(shù)字穩(wěn)定性
附錄A:分析注意數(shù)字穩(wěn)定
我們在本節(jié)更深入地解釋前文提到的通過預(yù)估SDPA輸入矢量而獲得的增強數(shù)字穩(wěn)定性。 下面是納米GPT數(shù)學(xué)應(yīng)用SDPA的簡化版本。 這里需要指出的是,查詢在不縮放的情況下進行矩陣倍增。
# 納米gpt implementation of SDPA # notice q (our query vector) is not scaled ! att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1))) att = att.masked_fill(self.bias[:,:,:T,:T] == 0, float('-inf')) att = F.softmax(att, dim=-1) # Dropout is set to 0, so we can safely ignore this line in the implementation# att = self.attn_dropout(att) y_ nanogpt 識別器( y_ nanogpt) = att @ v # (B, nh, T, T) x (B, nh, T, hs) -> (B, nh, T, hs)
以下是火炬中等量的數(shù)學(xué)執(zhí)行情況。縮放_ dot_ product_ 注意.
調(diào)
在數(shù)學(xué)方面,兩種方法應(yīng)當(dāng)相等,然而,我們的實驗表明,在實踐中,我們從每一種方法得到的結(jié)果不同。
使用上述方法,我們核實了y 之前的 y_ 縮數(shù)(_S)匹配使用縮放_ dot_ product_ 注意方法時y_ nanogpt 識別器( y_ nanogpt)沒有。
排火炬聯(lián)盟具體地說,我們表明:
y_dpa = cherch.nn. 功能._ scald_dot_ product_atunited( q, k, v, attn-mask 縮略圖=self. bias) [, : : : , T, : T] ! = 0, diut_ p= 0.0, 需要_ attn_ weights = False, 原因=False, ) toch.allclose( y_ sdpa, y_ nanogpt)
附錄B:復(fù)制實驗結(jié)果
試圖復(fù)制這些結(jié)果的研究人員應(yīng)首先從Andrej納米GPT存儲庫的以下承諾開始:b3c17c6c6a363357623f2223aaa4a8b1e89d0a465。在測量每批量速度改進時,這一承諾被用作基準(zhǔn)。對于包括添加詞匯優(yōu)化(按批量速度進行最大改進)在內(nèi)的結(jié)果,使用以下承諾:77e7e04c26577846df30c1ca2d9f7cbb93ddeab。從任一取出中,選擇實驗的內(nèi)核與使用該內(nèi)核相比是微不足道的。
可以通過上下文管理器選擇想要的內(nèi)核 :
火炬. 后端. cuda. sdp_ 內(nèi)核( 啟用_ math = False, 啟用_ flash = False, 啟用_ mem_ valid = true): 火車( 模型)
審核編輯:彭菁
-
變壓器
+關(guān)注
關(guān)注
159文章
7532瀏覽量
136502 -
GPT
+關(guān)注
關(guān)注
0文章
361瀏覽量
15540 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13383
發(fā)布評論請先 登錄
相關(guān)推薦
評論