產(chǎn)生性人工智能的近期進(jìn)展大部分來自去除傳播模型,這些模型能夠從文本提示中產(chǎn)生高質(zhì)量的圖像和視頻。 這個(gè)家族包括圖像、 DALLE、 延遲傳播等。 但是,這個(gè)家族的所有模型都有一個(gè)共同的缺點(diǎn): 生成速度相當(dāng)緩慢, 因?yàn)樯蓤D像的取樣過程具有迭接性。 這使得優(yōu)化取樣圈內(nèi)運(yùn)行的代碼非常重要 。
我們以開放源實(shí)施流行文本到圖像傳播模式作為起點(diǎn),利用PyTorrch 2:編集和快速關(guān)注實(shí)施中的兩種優(yōu)化方法加快其生成速度,同時(shí)對(duì)代碼進(jìn)行少量的記憶處理改進(jìn),這些優(yōu)化使原實(shí)施速度比原實(shí)施速度加快49%。舊前和 39% 的推論比方使用舊前的原始代碼(不包括編譯時(shí)間)的速度加快,這取決于 GPU 架構(gòu)和批量大小。重要的是,加速不需要安裝 舊前 或其他任何額外依賴關(guān)系。
下表顯示從安裝了舊前的最初實(shí)施到我們以PyTorch集成內(nèi)存高效關(guān)注(最初為PyTorch集成內(nèi)存有效關(guān)注開發(fā)并在舊前圖書館)和PyTorrch匯編,不包括匯編時(shí)間。
與原x格式相比,運(yùn)行時(shí)間改善%%
見“基準(zhǔn)設(shè)定和成果摘要”一節(jié)中的絕對(duì)運(yùn)行時(shí)間數(shù)字。
GPU | 批量大小 1 | 批量大小 2 | 批量大小 4 |
p100 p100 (p100)(沒有匯編) | -3.8 -3.8 | 0.44 | 5.47 5.47 |
T4 | 2.12 2.2.12 | 10.51 婦女 10.51 | 14.2 女14.2 |
A10 | -2.34 | 8.99 | 10.57 10.57 |
v100 (v100) | 18.63 | 6.39 | 10.43 |
a100 (a100) | 38.5 | 20.33 | 12.17 12.17 |
人們可以注意到以下情況:
對(duì)于a100 (a100)和v100 (v100)等強(qiáng)大的GPU等強(qiáng)大的GPU來說,這些改進(jìn)是顯著的。 對(duì)于這些GPU來說,第1批的改進(jìn)最為顯著。
對(duì)于功率較小的GPUs,我們觀察到較弱的GPUs,我們觀察到較小的超速超速(或兩種情況下略有倒退 ) 。 這里的批量規(guī)模趨勢(shì)被逆轉(zhuǎn):較大批量的改進(jìn)更大
在以下各節(jié)中,我們介紹應(yīng)用優(yōu)化,并提供詳細(xì)的基準(zhǔn)數(shù)據(jù),將生成時(shí)間與不同最佳運(yùn)行/關(guān)閉功能進(jìn)行比較。
具體而言,我們以5個(gè)配置基準(zhǔn)和下面的地塊為基準(zhǔn),比較其不同GPU和批量大小的絕對(duì)性性能,這些配置的定義見“基準(zhǔn)設(shè)置和結(jié)果”一節(jié)。
優(yōu)化優(yōu)化
這里我們將更詳細(xì)地介紹在模式代碼中引入的優(yōu)化。 這些優(yōu)化依賴于最近發(fā)布的PyTorrch 2.0的特征。
優(yōu)化關(guān)注
我們優(yōu)化的代碼的一部分就是對(duì)點(diǎn)產(chǎn)品的關(guān)注比例。人們知道,注意是一個(gè)繁重的操作:天真地執(zhí)行會(huì)影響關(guān)注矩陣,導(dǎo)致時(shí)間和記憶的復(fù)雜二次序列長度。擴(kuò)散模型使用關(guān)注是常見的( 通常使用關(guān)注的 ) ( ) 。相互注意))作為U-Net多個(gè)部分的變換元塊的一部分。由于U-Net運(yùn)行在每個(gè)取樣步驟,這成為優(yōu)化的關(guān)鍵點(diǎn)。多頭目,PyTorrch 2 中優(yōu)化了關(guān)注執(zhí)行的功能, 并被納入其中。 這種優(yōu)化的示意圖可歸結(jié)為以下偽代碼 :
類交叉注意( nn. module): def __ initt_( 自 己, ) :
替換為
類交叉注意(nn.Module): def __initt_( 本身, ......): 自我. mmha = nn. Multihead 注意 (...) def 前進(jìn)( 自己, x, 上下文): 返回自我. mmha (x, 上下文, 上下文)
PyTorrch 1.13中已經(jīng)提供了最佳的注意落實(shí)(見在這里和廣泛通過(例如,見A/CN.9/WG.III/WP.Huggging 紙面變壓器庫示例特別是,它吸收了《公約》和《公約》的記憶有效關(guān)注。舊前和閃閃著的注意http://arxiv.org/abs/2205.14135PyTorrch 2.0將這一功能擴(kuò)大到更多的關(guān)注功能,如交叉關(guān)注和為進(jìn)一步加速而定制的內(nèi)核,使之適用于擴(kuò)散模型。
在計(jì)算能力為SM 7.5或SM 8.x的GPU上可提供閃光關(guān)注,例如,在T4、A10和a100 (a100)上可提供閃光關(guān)注,這些都包括在我們的基準(zhǔn)中(你可以檢查每個(gè)NVIDIA GPU的計(jì)算能力)。在這里然而,在我們對(duì)a100 (a100)a100 (a100)的測(cè)試中,由于關(guān)注頭和小批量數(shù)量少,因此對(duì)擴(kuò)散模型特定案例的記憶有效關(guān)注比對(duì)傳播模型的閃光關(guān)注效果的注意效果好于對(duì)傳播模型的具體案例的閃光關(guān)注效果。在這里為了充分控制注意力后端(模擬有效關(guān)注、閃光關(guān)注、“香草數(shù)學(xué)”或任何未來數(shù)學(xué)),電力用戶可以在上下文管理員的幫助下手動(dòng)啟用和禁用這些后端。后端... cudda. sdp_ 內(nèi)核.
compilation
匯編是PyTorrch 2. 0 的新特性,從而能夠以非常簡(jiǎn)單的用戶經(jīng)驗(yàn)實(shí)現(xiàn)巨大的超速。要援引默認(rèn)行為,只需將一個(gè) PyTorch 模塊或函數(shù)包成I. 火炬燃燒器:
模型 = 火炬. combile( 模型)
PyTorrch 編譯器然后將 Python 代碼轉(zhuǎn)換成一套指令, 可以在沒有 Python 管理費(fèi)的情況下高效執(zhí)行。 該編譯器在代碼首次被執(zhí)行時(shí)動(dòng)態(tài)發(fā)生。 在默認(rèn)行為下, 在使用的 PyTorrch 頭罩下核電廠匯編代碼和火焚化器以進(jìn)一步優(yōu)化它。此教義以獲取更多細(xì)節(jié)。
雖然上面的單班條足以進(jìn)行編譯, 但對(duì)代碼的某些修改可以壓縮更大的速度。 特別是, 人們應(yīng)該避免所謂的圖形分解, 即PyTorrch無法編譯的代碼中的位置。 與先前的 PyTorrch 編譯方法( 如 火炬Script ) 相比, PyTorrch 2 編譯器在此情況下不會(huì)中斷。 相反, 它會(huì)回到急切的執(zhí)行中 - 所以代碼運(yùn)行, 但性能下降 。 我們對(duì)模式代碼做了一些小小改動(dòng), 以刪除圖形分解器 。 這包括刪除編譯器不支持的圖書館的功能, 比如 。檢查職能和電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電離電。 看看這個(gè)doc學(xué)習(xí)更多關(guān)于圖表分解和如何消除這些分解的信息。
從理論上講,可以適用I. 火炬燃燒器然而,在實(shí)踐中,僅僅匯編U-Net就足夠了。I. 火炬燃燒器還沒有環(huán)形分析器,因此將重新拼湊取樣循環(huán)的每一次迭代的代碼。 此外,已編譯的樣本代碼可能會(huì)生成圖形折斷符 — — 因此,如果人們想從已編譯的版本中獲得良好的性能,就需要調(diào)整它。
注意該匯編requires GPU compute capability >= SM 7.0以非傾向模式運(yùn)行。這涵蓋了我們基準(zhǔn)中的所有 GPU ----T4, v100 (v100), A10, a100 (a100) - p100 p100 (p100) 除外(見完整列表).
其他優(yōu)化
此外,我們通過消除一些常見的陷阱提高了GPU內(nèi)存操作的效率,例如直接在GPU上創(chuàng)建高壓GPU,而不是直接在CPU上創(chuàng)建高壓GPU,然后轉(zhuǎn)移到GPU,因此我們提高了GPU內(nèi)存操作的效率。火焰圖.
制定基準(zhǔn)和成果摘要
我們有兩種版本的代碼可以比較:原原件和優(yōu)化優(yōu)化除此以外,還可以打開/關(guān)閉若干優(yōu)化功能(舊前、PyTorrch內(nèi)存高效關(guān)注、編譯)。
沒有 舊前 的原始代碼
舊前 的原始代碼
與香草數(shù)學(xué)關(guān)注后端和無編譯的 香草數(shù)學(xué)關(guān)注優(yōu)化代碼
最優(yōu)化代碼, 包含內(nèi)存高效關(guān)注后端, 沒有編譯
具有內(nèi)存高效注意后端和編譯功能的優(yōu)化代碼
作為原文原版我們采用了使用PyTorrch 1. 12的代碼版本,并按慣例執(zhí)行了關(guān)注標(biāo)準(zhǔn)。優(yōu)化版用途nn. 多頭目?jī)?nèi)相互注意PyTerch 2.0.0.dev20230111 cu117。 在與PyTerch有關(guān)的代碼中,它還有其他一些微小的優(yōu)化。
下表顯示每個(gè)版本代碼的運(yùn)行時(shí)間以秒計(jì),與舊前原版相比的百分比改進(jìn)百分比。 _ 匯編時(shí)間不包括在內(nèi)。
1. 括號(hào) -- -- " 原件與 x Formers " 行相對(duì)改進(jìn)
配置配置配置 | p100 p100 (p100) | T4 | A10 | v100 (v100) | a100 (a100) |
沒有格式的原件 | 30.4s (19.3%) | 29.8s(-77.3%) | 13.0(-83.9%) | 10.9s(-33.1%) | 8.0s (19.3%) |
原件與 舊前 | 25.5秒(0%) | 16.8s (0.00%) | 7.1s 7.1s 7.1s 7.1s(0%) | 8.2s(0.00%) | 6.7s(0.00%) |
最優(yōu)化的香草數(shù)學(xué)關(guān)注, 沒有編譯 | 27.3s (--7.0%) | 19.9s (18.7%) | 13.2% (87.2%) | 7.5s(8.7%) | 5.7s(15.1%) |
高效率的注意,沒有匯編。 | 26.5%(-3.8%) | 16.8s (0.2%) | 7.1s 7.1s 7.1s 7.1s(-0.8%) | 6.9s (16.0%) | 5.3s(20.6%) |
高效關(guān)注和匯編 | - 帶 | 16.4.4s 16.4.4s(2.1%) | 7.2(-2.3%) | 6.6.6s(18.6%) | 4.1s 4.1s(38.5%) |
批量規(guī)模 2 的運(yùn)行時(shí)間
配置配置配置 | p100 p100 (p100) | T4 | A10 | v100 (v100) | a100 (a100) |
沒有格式的原件 | 58.0s (21.6%) | 57.6歲(84.0%) | 24.4s (95.2%) | 18.6秒 (-63.0%) | 12.0s (-50.6%) |
原件與 舊前 | 47.7s(0.00%) | 31.3s (0.00%) | 12.5s (0.00%) | 11.4秒 (0.00%) | 8.0s(0.00%) |
最優(yōu)化的香草數(shù)學(xué)關(guān)注, 沒有編譯 | 49.3%(-3.5%) | 37.9s (-21.0%) | 17.8s (-4.2.2%) | 12.7s (10.7%) | 7.8s(1.8%) |
高效率的注意,沒有匯編。 | 47.5s 47.5s(0.4%) | 31.2% (0.5%) | 12.2% (2.6%) | 11.5%(-0.7%) | 7.0s (12.6%) |
高效關(guān)注和匯編 | - 帶 | 28.0秒(10.5%) | 11.4秒(9.0%) | 10.7s 10.7s(6.4%) | 6.4.4s(20.3%) |
批量大小 4 的批量運(yùn)行時(shí)間
配置配置配置 | p100 p100 (p100) | T4 | A10 | v100 (v100) | a100 (a100) |
沒有格式的原件 | 117.9s(-20.00%) | 112.4s (-81.8%) | 47.2s (-101.7 %) | 35.8s (-71.9%) | 22.8s (-78.9%) |
原件與 舊前 | 98.3s(0.00%) | 61.8s(0.00%) | 23.4s(0.00%) | 20.8s (0.00%) | 12.7s (0.00%) |
最優(yōu)化的香草數(shù)學(xué)關(guān)注, 沒有編譯 | 101.1s (-2.9%) | 73.0s(1.8.0%) | 28.3s (-21.0%) | 23.3s(11.9%) | 14.5s (13.9%) |
高效率的注意,沒有匯編。 | 92.9秒(5.5%) | 61.1s(1.2%) | 23.9s(-1.9%) | 20.8s (-0.1%) | 12.8s (-0.9%) |
高效關(guān)注和匯編 | - 帶 | 53.1s 53.1s(14.2%) | 20.9秒(10.6%) | 18.6秒(10.4%) | 11.2. 11.2(12.2%) |
為了盡量減少對(duì)基準(zhǔn)代碼性能的波動(dòng)和外部影響,我們逐個(gè)運(yùn)行了代碼的每個(gè)版本,然后又重復(fù)了10次這個(gè)序列:A、B、C、D、E、A、B.......因此典型運(yùn)行的結(jié)果將看起來像下面的圖片。請(qǐng)注意,人們不應(yīng)該依賴對(duì)不同圖表之間絕對(duì)運(yùn)行時(shí)間的比較,但是對(duì)內(nèi)部運(yùn)行時(shí)間的比較是相當(dāng)可靠的,這要?dú)w功于我們的基準(zhǔn)設(shè)置。
每卷文字到圖像生成腳本都產(chǎn)生幾批數(shù),其數(shù)量受CLI參數(shù)管制--niter --niter。在我們使用的基準(zhǔn)中n標(biāo)準(zhǔn)=2,但引入了額外的“暖化”迭代,這對(duì)運(yùn)行時(shí)間沒有幫助。 這對(duì)編譯運(yùn)行是必要的,因?yàn)榫幾g發(fā)生在代碼運(yùn)行的第一次,因此第一次迭代的時(shí)間比后來的都要長。 為了比較公平,我們還將這種額外的“暖化”迭代引入了所有其他運(yùn)行。
上表中的數(shù)字是迭代數(shù)2(加上“暖熱一號(hào)”),即時(shí)“A”照片,種子1,PLMS取樣器,自動(dòng)打開。
基準(zhǔn)使用p100 p100 (p100)、v100 (v100)、a100 (a100)、A10和T4GPUs完成,T4基準(zhǔn)在Google Colab Pro完成,A10基準(zhǔn)在G5.4xmall AWS實(shí)例中與1GPU完成。
結(jié)論和下一步步驟
我們已經(jīng)表明,PyTorrch 2 - 編譯者和優(yōu)化關(guān)注實(shí)施的新特點(diǎn) -- -- 使性能改進(jìn)超過或與以前要求安裝的外部依賴(舊前)的功能相仿;PyTorrch特別通過將舊前的內(nèi)存有效關(guān)注納入代碼庫來實(shí)現(xiàn)這一點(diǎn),這是對(duì)用戶經(jīng)驗(yàn)的重大改進(jìn),因?yàn)榕f前是一家最先進(jìn)的圖書館,在許多情形中,需要定制的安裝過程和長期建筑。
這項(xiàng)工作可以繼續(xù)往幾個(gè)自然方向發(fā)展:
我們?cè)谶@里所實(shí)施和描述的優(yōu)化只是為迄今為止的文字到圖像的推斷基準(zhǔn),有興趣了解它們?nèi)绾斡绊懪嘤?xùn)績(jī)效。 PyTorch匯編可以直接應(yīng)用于培訓(xùn);PyTorch優(yōu)化關(guān)注的扶持培訓(xùn)正在路線圖中。
我們有意盡量減少對(duì)原示范守則的修改。 進(jìn)一步的定性和優(yōu)化可能帶來更多的改進(jìn)。
目前,匯編工作只適用于取樣器內(nèi)部的U-Net模型。由于在U-Net之外發(fā)生了很多事情(例如,在取樣環(huán)中直接作業(yè)),匯編整個(gè)取樣器將是有益的。然而,這需要對(duì)匯編過程進(jìn)行分析,以避免在每一取樣步驟中進(jìn)行重新匯編。
當(dāng)前代碼僅在PLMS取樣器內(nèi)應(yīng)用編譯程序,但將其擴(kuò)展至其他取樣器則微不足道。
除了文字到圖像生成外,還應(yīng)用推廣模型來進(jìn)行其他任務(wù) -- -- 圖像到圖像和油漆。
審核編輯:彭菁
-
模型
+關(guān)注
關(guān)注
1文章
3261瀏覽量
48914 -
代碼
+關(guān)注
關(guān)注
30文章
4801瀏覽量
68735 -
編譯程序
+關(guān)注
關(guān)注
0文章
13瀏覽量
4142 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13249
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論