算法(“燃料”):大多數(shù)深度學(xué)習(xí)算法在基本形式上自20世紀(jì)80年代以來就已存在,如深度神經(jīng)網(wǎng)絡(luò)、卷積網(wǎng)絡(luò)和使用隨機(jī)梯度下降和反向傳播進(jìn)行訓(xùn)練的方法。
數(shù)據(jù)(“空氣”):大型標(biāo)記數(shù)據(jù)集一直存在,特別是對于無監(jiān)督學(xué)習(xí)所需的數(shù)據(jù)。對于監(jiān)督學(xué)習(xí),像Pascal和ImageNet這樣的大型標(biāo)記數(shù)據(jù)集自2000年代初就已存在。
計算(“火花”):點燃算法和數(shù)據(jù)需要足夠的計算能力,即在合理的時間內(nèi),使用足夠多的數(shù)據(jù)來訓(xùn)練一個足夠大的模型。
當(dāng)前人工智能的復(fù)興,包括生成式AI如ChatGPT在內(nèi),可歸因于深度學(xué)習(xí)的進(jìn)步?;谏疃葘W(xué)習(xí)的系統(tǒng)如今在語音識別、物體分類以及諸如象棋等游戲中的表現(xiàn)已經(jīng)超越了人類能力。
深度學(xué)習(xí)的成功得益于強大且高效的計算硬件。盡管深度學(xué)習(xí)的算法自上世紀(jì)80年代就存在,但直到最近十年,隨著強大GPU的問世,這項技術(shù)才變得實用。深度學(xué)習(xí)的進(jìn)展現(xiàn)在受到硬件性能的限制。在過去的十年中,GPU上深度學(xué)習(xí)推理的效率提高了1000倍。其中很大一部分增益歸功于數(shù)據(jù)表示的改進(jìn),從Kepler一代GPU的FP32開始,并在Hopper一代中擴(kuò)展到Int8和FP8。
本次演講將回顧這一歷史,并討論數(shù)字表示的進(jìn)一步改進(jìn),包括對數(shù)表示、最佳剪裁和每向量量化。
簡介:
Bill Dally于2009年1月加入NVIDIA擔(dān)任首席科學(xué)家,此前在斯坦福大學(xué)任職12年,擔(dān)任計算機(jī)科學(xué)系主任。Dally及其斯坦福團(tuán)隊開發(fā)了系統(tǒng)架構(gòu)、網(wǎng)絡(luò)架構(gòu)、信號傳輸、路由和同步技術(shù),在今天的大多數(shù)大型并行計算機(jī)中都可以找到。Dally此前曾在麻省理工學(xué)院從事研究,從1986年到1997年,在那里他和他的團(tuán)隊建造了J-Machine和M-Machine,這是實驗性的并行計算機(jī)系統(tǒng),開創(chuàng)了機(jī)制與編程模型的分離,并展示了非常低的開銷同步和通信機(jī)制。
從1983年到1986年,他在加州理工學(xué)院(CalTech)設(shè)計了MOSSIM模擬引擎和Torus路由芯片,開創(chuàng)了“蟲洞”路由和虛擬通道流控制。他是美國國家工程院的院士,美國藝術(shù)與科學(xué)學(xué)院的院士,IEEE和ACM的會士,并獲得了ACM Eckert-Mauchly獎,IEEE Seymour Cray獎和ACM Maurice Wilkes獎。他發(fā)表了250多篇論文,擁有120多項授予的專利,并是四本教科書的作者。Dally獲得了弗吉尼亞理工大學(xué)電氣工程學(xué)士學(xué)位,斯坦福大學(xué)電氣工程碩士學(xué)位和加州理工學(xué)院計算機(jī)科學(xué)博士學(xué)位。他曾是Velio Communications和Stream Processors的聯(lián)合創(chuàng)始人。
-----
現(xiàn)在,身為一名計算機(jī)架構(gòu)師,致力于深度學(xué)習(xí),這確實是一個令人心潮澎湃的時刻。
我將嘗試與大家分享一些事情。就像現(xiàn)在的大多數(shù)人一樣,當(dāng)我準(zhǔn)備這場演講時,我首先讓ChatGPT為我草擬了一份講稿。因此,這就是演講的初稿。
那么,如何構(gòu)建一個關(guān)于深度學(xué)習(xí)硬件的演講呢?這讓我相當(dāng)困惑。于是我說,好吧,這不行。一切都得依靠工程指導(dǎo)。我不得不思考,Bill Dally可能會對深度學(xué)習(xí)硬件有何見解。這或許是一個合理的演講主題,但并非我所要探討的內(nèi)容。然而,我覺得這個想法很有趣。
如果你想更深入地了解——我總是喜歡在演講中穿插一些最新的資料——這是昨天《華爾街日報》上的一篇文章,是我與該報記者進(jìn)行的一次訪談,內(nèi)容關(guān)于我們?nèi)绾卫^續(xù)推動深度學(xué)習(xí)的發(fā)展。這確實是本次演講的核心議題。但我會比記者更深入地探討一些技術(shù)細(xì)節(jié)。
順便一提,這是我們的Grace Hopper超級芯片的照片。左邊是H100 GPU,右邊是Hopper多核CPU。實際上,它們的結(jié)合非常出色,盡管我作為一名并行計算的信徒,這款CPU的主要目的是為GPU提供更多的高帶寬內(nèi)存。它是一個出色的內(nèi)存控制器。
當(dāng)我們研究像現(xiàn)在每個人都在使用的大型語言模型這樣的技術(shù)時,我認(rèn)為,他們真正在做的是將數(shù)據(jù)提煉成價值,這確實是——計算機(jī)科學(xué)的主要目標(biāo)之一。
我們通常從大量數(shù)據(jù)出發(fā)。人們往往會利用他們可以從互聯(lián)網(wǎng)上搜集到的所有信息來訓(xùn)練這些模型。這些數(shù)據(jù)集包含高達(dá)10的12次方個token——一個token大致相當(dāng)于一個單詞——當(dāng)通過分詞器處理它時,通常會得到1.5到2個token對應(yīng)一個單詞的比例——以及可能達(dá)到十億級別的圖像數(shù)量。這就是數(shù)據(jù)集規(guī)模。我們希望從中提取價值。這種價值體現(xiàn)在能夠回答問題、提升工作效率,比如通過擁有教學(xué)助手來幫助老師給予學(xué)生更多個性化關(guān)注,或者輔助醫(yī)生做出更準(zhǔn)確的診斷。大型語言模型正廣泛應(yīng)用于這些領(lǐng)域。
思考這個問題的方式就像是在考慮如何將學(xué)生送入大學(xué)。這就是你擁有萬億級別token數(shù)據(jù)集的意義所在。實際上,我之前做過類似的幻燈片?,F(xiàn)在,大型模型的訓(xùn)練已經(jīng)涉及10萬億甚至更多的token。對于萬億token數(shù)據(jù)集,需要在AWS上投入相當(dāng)可觀的資金來購買計算時間。
順便提一下,購買GPU也是一筆不小的開銷。在AWS上,這些費用是資本化的,即使只租用三個月并付清了費用,他們也不會將GPU轉(zhuǎn)讓給你。然后運行一個訓(xùn)練作業(yè)?,F(xiàn)在,擁有了一個訓(xùn)練有素的模型。
這是一個在本科教育階段接受過廣泛訓(xùn)練的大型語言模型,相當(dāng)于對互聯(lián)網(wǎng)上的所有標(biāo)記都有了一個基礎(chǔ)的文科教育背景。但在實際應(yīng)用中,你可能希望模型更加專業(yè)化,比如專門用于醫(yī)學(xué)或教學(xué)領(lǐng)域。這時,就需要將模型送入研究生院進(jìn)行深造。在研究生院,你可以進(jìn)行一系列的組合操作,其中之一就是所謂的預(yù)訓(xùn)練(pretuning),即在特定數(shù)據(jù)集上繼續(xù)訓(xùn)練模型。
在NVIDIA內(nèi)部,我們使用的模型名為ChipNeMo,它旨在提高我們的硬件設(shè)計師的工作效率。NeMo是我們的通用大型語言模型,而ChipNeMo則是在240億個標(biāo)記上進(jìn)行了預(yù)訓(xùn)練,這些標(biāo)記主要來源于自1990年代中期以來我們設(shè)計GPU的架構(gòu)文檔、Verilog代碼、腳本等。ChipNeMo最顯著的應(yīng)用是幫助高級設(shè)計師節(jié)省時間,因為高級設(shè)計師通常需要花費大量時間回答初級設(shè)計師的問題,例如“紋理單元是如何工作的?”等。通過向ChipNeMo提問,高級設(shè)計師可以得到準(zhǔn)確且有力的答案,因為ChipNeMo已經(jīng)閱讀了所有相關(guān)的架構(gòu)文檔。
在預(yù)訓(xùn)練之后,你還需要進(jìn)行微調(diào),使模型更加符合人們的喜好。這通常是通過讓模型生成多個查詢回復(fù),并讓人類對這些回復(fù)進(jìn)行評分來實現(xiàn)的。通過收集人類的反饋,你可以不斷優(yōu)化模型,使其生成的回復(fù)更符合人們的口味。在這個過程中,人類的參與至關(guān)重要,因為他們的反饋是提升模型質(zhì)量的關(guān)鍵。
有意思的是,盡管開始時對模型進(jìn)行文科教育的成本很高,但人們可以通過微調(diào)來降低這一成本。據(jù)我估算,微調(diào)的費用大約在10萬到100萬美元之間。盡管這個數(shù)字可能很高,但人們已經(jīng)通過利用僅花費幾千美元的GPU時間,完成了非常有效的微調(diào)工作。因此,一旦擁有了專業(yè)模型,就可以開始實際應(yīng)用了。
從長遠(yuǎn)來看,深度學(xué)習(xí)的大部分計算都集中在推理階段。在深度學(xué)習(xí)探索的早期階段,訓(xùn)練工作確實非常繁重,因為人們需要進(jìn)行大量的實驗。然而,一旦他們找到了合適的模型,他們就可以定期重新訓(xùn)練這些模型,并在模型上進(jìn)行推理。這個過程可能會持續(xù)幾個月甚至更長時間,然后再重新進(jìn)行整個訓(xùn)練過程。因此,大量的工作實際上是在推理階段完成的。即使每個查詢可能只需要一秒鐘的GPU時間,但當(dāng)進(jìn)行足夠多的查詢時,這實際上會占據(jù)訓(xùn)練階段花費的幾個月的時間。
這張幻燈片的最新補充部分,我稍微插入了關(guān)于檢索增強生成的內(nèi)容。這是近四五個月來非常流行的一種做法。在運行大型語言模型和進(jìn)行推理之前,我們會使用查詢來查詢數(shù)據(jù)庫,提取所有相關(guān)文檔。對于ChipNeMo模型,我們回到了最初的240億個標(biāo)記文檔數(shù)據(jù)庫,提取了所有相關(guān)的架構(gòu)文檔,然后將它們與原始查詢一起輸入到模型的輸入窗口中,然后運行推理代碼。這種做法可以防止大型語言模型使用虛構(gòu)的信息,因為它主要基于實際文檔進(jìn)行操作。它可以為我們提供真實文檔的引用,并大大提高準(zhǔn)確性。
接下來,我將先介紹一些動機(jī),然后我們將討論我們是如何走到這一步的。而講座中最令人興奮的部分將是我們接下來將走向何方。
讓我們從一些動機(jī)和歷史背景開始探討。當(dāng)前的深度學(xué)習(xí)革命是由硬件推動的。我喜歡將深度學(xué)習(xí)視為由三個要素構(gòu)成的。它們分別是算法、數(shù)據(jù)和計算能力,這可以類比為燃料、空氣和火花。
首先,算法是這里的“燃料”。大多數(shù)這些算法,至少在它們的基本形式上,自20世紀(jì)80年代以來就已經(jīng)存在了。深度神經(jīng)網(wǎng)絡(luò)、卷積網(wǎng)絡(luò),以及使用隨機(jī)梯度下降和反向傳播進(jìn)行訓(xùn)練的方法,這些都在80年代就已經(jīng)出現(xiàn)——在某些情況下,甚至更早。
接下來是“空氣”,即數(shù)據(jù)。大型標(biāo)記數(shù)據(jù)集一直存在,特別是對于無監(jiān)督學(xué)習(xí)所需的數(shù)據(jù)。而對于監(jiān)督學(xué)習(xí),像Pascal和ImageNet這樣的大型標(biāo)記數(shù)據(jù)集自2000年代初就已經(jīng)存在了,所以在真正的“火花”點燃之前至少有10年的時間。
然而,點燃這種燃料和空氣混合物的“火花”是足夠的計算能力。這指的是在合理的時間內(nèi),使用足夠多的數(shù)據(jù)來訓(xùn)練一個足夠大的模型。以最初的ImageNet數(shù)據(jù)集為例,它大約包含1000萬張圖像。而足夠大的模型則是AlexNet。我稍后會展示這個訓(xùn)練對下一張幻燈片的要求。當(dāng)時,訓(xùn)練這樣一個模型需要花費兩周的時間,實際上是在一對采用Fermi架構(gòu)的GPU上完成的。
自那時起,深度學(xué)習(xí)的進(jìn)展受限于我們能夠應(yīng)用的計算力??紤]到AlexNet的訓(xùn)練時間,它基本上是每秒千億次浮點運算的百分之一——也就是說,如果我們有一臺每秒千億次的機(jī)器,你會花費百分之一的時間在上面。我估算這大約是一個小時的四分之一,即15分鐘,在每秒千億次的機(jī)器上。在2012年至2016年的ConvNet時期,我們提高了大約兩個數(shù)量級的計算力。因此,當(dāng)我們達(dá)到ResNet時,我們大約擁有了每秒千億次的計算能力。
自2018年開始使用BERT進(jìn)行大型語言模型的訓(xùn)練以來,我們每年大約提高了一個數(shù)量級的計算力。對于GPT-4,雖然OpenAI沒有發(fā)布該模型的詳細(xì)信息,但根據(jù)網(wǎng)絡(luò)上的各種傳言,我估算在2023年訓(xùn)練GPT-4大約需要100萬臺每秒千億次的機(jī)器。在大約十年的時間里,最先進(jìn)的深度學(xué)習(xí)模型的計算需求增加了10的8次方倍。我們付出了巨大的努力,個體GPU的性能提高了約1000倍,另外的10的6次方倍增加來自于GPU數(shù)量的擴(kuò)展和訓(xùn)練時間的增加。
接下來,讓我稍微談?wù)剼v史。這是我想稱之為“黃氏定律”的曲線,以我們的創(chuàng)始人、NVIDIA的Jensen Huang命名。在深度學(xué)習(xí)領(lǐng)域,我們的推理性能在過去十年基本上每年翻一番,從大約四開始。這是Kepler世代單芯片推理中的INT8 TOPS,而在Hopper世代中則達(dá)到了4000。在10年內(nèi),性能增加了1000倍。如果每年翻一番,那么應(yīng)該是1024倍。那么我們是如何實現(xiàn)這一壯舉的呢?實際上,我將在下一張幻燈片中為你揭曉。
主要的收益按照其貢獻(xiàn)程度列在這里。其中最大的收益來自于使用更小的數(shù)字。以Kepler為例,它原本并非專為深度學(xué)習(xí)設(shè)計,而是為科學(xué)計算打造,支持FP64和FP32圖形處理。因此,在推理過程中,人們使用INT8在FP32環(huán)境中完成操作,導(dǎo)致數(shù)字需要放大四倍。然而,昂貴的算術(shù)運算是乘法,其成本與比特數(shù)的平方成正比,因此成本實際上增加了16倍,而非4倍。
在2017年的ISCA會議上,Dave Patterson發(fā)表了關(guān)于Google TPU V1的演講,聲稱其比NVIDIA GPU更高效。然而,TPU V1的整體性能優(yōu)勢——更確切地說是能源效率優(yōu)勢——主要歸功于其執(zhí)行INT8操作的能力。Patterson將TPU V1與Kepler進(jìn)行比較,盡管當(dāng)時他本可以將其與更先進(jìn)的Volta甚至Turing進(jìn)行比較。Kepler是五年前的產(chǎn)品,主要支持FP32。因此,這一切都與這16倍的成本增加有關(guān)。
接下來的主要收益來自于執(zhí)行復(fù)雜指令。我將為此展示一張幻燈片,并詳細(xì)介紹相關(guān)內(nèi)容。即使在GPU的簡化管道中,不進(jìn)行分支預(yù)測和亂序執(zhí)行,執(zhí)行一條指令的成本仍然比該指令中的算術(shù)運算的成本高出約20倍。在更低的精度下,情況更糟,尤其是針對FP16。為了分?jǐn)傔@一成本,需要用一條指令完成更多的工作。因此,添加復(fù)雜指令成為了一個重要的優(yōu)化方向。我們從Kepler世代的最大指令FMA轉(zhuǎn)變?yōu)镻ascal世代的四元素點積DP4,再到我們的矩陣乘法指令,如HMMA用于半精度矩陣乘積累加和IMMA用于8位整數(shù)矩陣乘積累加。這些指令的引入分?jǐn)偭艘恍╅_銷,為我們帶來了額外的12.5倍性能提升。
這里展示了四代工藝技術(shù),它們以顏色進(jìn)行區(qū)分——黑色、綠色、藍(lán)色等。Kepler和Maxwell采用了28納米工藝,而Pascal、Volta和Turing則采用了16納米工藝。Ampere是7納米工藝,而Hopper更是達(dá)到了5納米工藝。然而,從28納米到5納米的巨大躍遷只為我們帶來了大約2.5倍的性能提升。我內(nèi)部有一個電子表格,一直在跟蹤這些數(shù)據(jù)。因此,我們并沒有從傳統(tǒng)的工藝技術(shù)提升中獲得太多好處,主要的提升來自于更先進(jìn)的架構(gòu)。另一個重要的架構(gòu)貢獻(xiàn)是稀疏性。當(dāng)我展望未來時,我相信稀疏性將為我們帶來更多的性能收益。目前,我們僅在權(quán)重上利用了2比1的稀疏性,但我們可以實現(xiàn)更高級別的稀疏性,并將其應(yīng)用于激活上。
此外,我還想提到,算法領(lǐng)域的進(jìn)步也非常顯著。我認(rèn)為,僅通過多年來模型效率的提升,我們就已經(jīng)實現(xiàn)了另外1000倍的性能增長。以ConvNet時代為例,當(dāng)大家都在ImageNet競賽上競爭時,從VGGNet到GoogleNet的轉(zhuǎn)變就是一個很好的例子。GoogleNet是一個更高效的網(wǎng)絡(luò),它去掉了完全連接的后端,采用了可分離卷積和旁路等技術(shù),使網(wǎng)絡(luò)效率提高了數(shù)個數(shù)量級。因此,他們能夠在不增加太多操作的情況下,實現(xiàn)性能上的巨大提升。這樣的模型還有很多。
讓我們來談?wù)剰?fù)雜指令及其重要性。正如我之前提到的,即使對于具有非常簡化管道的GPU,執(zhí)行指令的開銷因子也約為20。而對于執(zhí)行復(fù)雜、亂序CPU操作的CPU,比如執(zhí)行FP16操作,這個開銷因子更接近1000。這也是為什么我們不希望在CPU上進(jìn)行深度學(xué)習(xí)的原因之一,除非我們?nèi)渴褂肕MX指令進(jìn)行。
如果我們的工作僅限于融合乘加運算,那么我們實際上在執(zhí)行兩個算術(shù)運算。這意味著,我們的大部分能量都消耗在了開銷上,就像一個大公司運營的成本。但如果我們能夠至少執(zhí)行八個操作——比如,一個點積運算就需要四次乘法和四次加法,總共八個操作——那么有效負(fù)載的能量就會增加到六。盡管開銷能量保持不變,但開銷相對于有效負(fù)載的比例會下降到五倍。盡管如此,我們?nèi)匀辉陂_銷上花費的能量比在實際操作上花費的要多。
在Volta世代,我們引入了一個被市場人員稱為張量核心的功能,它實際上是一個專門用于執(zhí)行矩陣乘法的指令。HMMA,即半精度矩陣乘積累加,能夠接收兩個FP16的4x4矩陣,并執(zhí)行矩陣乘法。這意味著你需要將每個元素與另一個矩陣的每個元素相乘,這是一個n的三次方操作,即4x4x4,總共64次乘法。然后,你需要將這些結(jié)果全部加起來,并存儲到一個FP32的4x4矩陣中。這樣,總共進(jìn)行了128次操作。盡管操作的總能量是110,但現(xiàn)在的開銷比例已經(jīng)降低到了22%。
到了Turing世代,我們又引入了整數(shù)版本的該操作,即IMMA。它接收兩個8x8的INT8矩陣,進(jìn)行乘法運算并求和。而在Hopper世代,我們更進(jìn)一步,引入了四分之一精度矩陣乘加法,使用FP8進(jìn)行運算。需要強調(diào)的是,一旦我們擁有了這些大型指令,我們的完全可編程GPU在深度學(xué)習(xí)方面的效率就可以與硬連線的加速器,如TPU或其它專用芯片相媲美。因為這些專用芯片也并非毫無開銷。它們同樣需要移動數(shù)字,而不僅僅是進(jìn)行矩陣乘法運算。它們的開銷可能也在15%到20%左右。因此,在這個時間點上,我們的效率與專用加速器相當(dāng),同時我們還擁有可編程引擎的所有優(yōu)勢,背后是一個成熟的編程系統(tǒng)和幾十年來積累的庫支持。
聽眾:這是能源開銷方面的討論,對吧?還有其它的嗎?
Bill Dally:沒錯,能源確實是一個很好的衡量標(biāo)準(zhǔn)。
那么,我們目前進(jìn)展到了什么階段呢?如今,我們有了Hopper。它具備一千萬億次的TensorFloat-32運算能力。根據(jù)數(shù)據(jù)的稠密程度或稀疏程度,它的FP16或BF16運算能力為1到2千萬億次,而FP8或INT8的運算能力為2到4千萬億次。它的內(nèi)存帶寬超過3TB/s,高達(dá)94TB,這里的94是準(zhǔn)確的,配備了96GB的HBM3內(nèi)存。此外,它還擁有18個NVLink端口,為我們提供了900GB/s的帶寬,而整個芯片的功耗為700瓦。不過,有一點需要指出的是,將這個部件運往中國是違法的,這種做法其實并不明智,因為對這種部件的出口限制只會促使中國的程序員為華為部件編寫代碼,這對美國并無益處。
這個部件擁有一些令人印象深刻的功能。事實上,我親自為這個部件中的動態(tài)規(guī)劃指令撰寫了建議書,以加速生物信息學(xué)代碼的運行。因此,如果你需要進(jìn)行動態(tài)規(guī)劃來進(jìn)行基因序列匹配,這個部件將會表現(xiàn)出極高的運算速度。
關(guān)于比值——當(dāng)我分享我們在加速器上所做的一些實驗時,我會詳細(xì)解釋這一點——它達(dá)到了每瓦9兆次的運算性能。這是基于INT8或FP8數(shù)學(xué)運算的結(jié)果。這也是我們評估不同深度學(xué)習(xí)解決方案效率的一種方式。盡管我們已經(jīng)實現(xiàn)了1000倍的性能提升,但我們還需要達(dá)到10的8次方倍的目標(biāo)。那么,剩下的性能提升從哪里來呢?答案在于使用多個GPU。事實上,你必須使用多個GPU,因為單一的GPU無法容納像GPT-4這樣規(guī)模高達(dá)1.2萬億參數(shù)的模型。在進(jìn)行訓(xùn)練時,每個參數(shù)大約需要20字節(jié)的存儲空間,這不僅包括了參數(shù)本身,還包括了動量系數(shù)、訓(xùn)練算法以及其它一些開銷。因此,要保存一個GPT-4的完整副本,我們需要大約20個GPU。
因此,我們將工作劃分為兩個維度的并行化。
首先是張量并行,這涉及多個GPU協(xié)同工作在一個模型副本上。具體來說,我們將單個矩陣進(jìn)行切片處理,通常只在一個維度上進(jìn)行切片,例如將矩陣切分成列條。然后,我們進(jìn)行相應(yīng)操作,并將結(jié)果匯總。
另一個維度是管道并行,我們將網(wǎng)絡(luò)的不同層分別部署在不同的GPU上,并將結(jié)果逐層傳遞。值得注意的是,早期的層并不會閑置,而是在處理后續(xù)數(shù)據(jù)批次的同時,開始處理下一批訓(xùn)練數(shù)據(jù)。隨著規(guī)模的進(jìn)一步擴(kuò)大,我們還會采用數(shù)據(jù)并行策略。這意味著我們將運行模型的不同副本,并將一個訓(xùn)練數(shù)據(jù)批次分割到這些副本中,使它們各自進(jìn)行訓(xùn)練。之后,它們會交換權(quán)重更新,以確保在下一次迭代中每個副本都擁有相同的權(quán)重集。
為了實現(xiàn)這些并行化策略,我們設(shè)計了一系列硬件。首先是DGX服務(wù)器,它配備了8個H100 GPU和四個我們的NV交換機(jī)。這些交換機(jī)負(fù)責(zé)連接從H100 GPU引出的NVLink互連。盡管我不能詳細(xì)介紹每個細(xì)節(jié),但這款服務(wù)器具備32 petaFLOPS的計算能力,功耗為11千瓦,背板輸出達(dá)到900GB/s。
除了上述的四個NV交換機(jī)外,為了連接更多這樣的服務(wù)器,我們還設(shè)計了一個類似披薩盒的裝置。這個盒子里裝有兩個NV交換機(jī),通過它和使用主動光纜,可以構(gòu)建更大規(guī)模的系統(tǒng)。
因此,通常向客戶提供的解決方案看起來像這樣:一個DGX超級機(jī)架。在這個機(jī)架中,每個小金色前面板板子上都裝有一個HGX100,它集成了8個GPU??梢允褂肗VLink將多個這樣的機(jī)架連接起來,或者在某些情況下,采用InfiniBand網(wǎng)絡(luò)——中間那些是InfiniBand量子交換機(jī)——并將所有這些設(shè)備整合在一起。
這樣做的好處有很多。首先,軟件是預(yù)配置的。因此,當(dāng)從NVIDIA購買這樣的機(jī)器,并在你的數(shù)據(jù)中心中將其連接好,插入所有主動光纜后,只需簡單地開機(jī),便可以在一小時內(nèi)開始訓(xùn)練深度學(xué)習(xí)模型。相反,如果嘗試從頭開始配置所有網(wǎng)絡(luò)設(shè)置并進(jìn)行調(diào)整,那可能需要耗費一個月的時間。我過去曾與Cray和其它公司合作構(gòu)建了許多超級計算機(jī)。但通常情況下,從我們在洛斯阿拉莫斯或橡樹嶺等地將這些機(jī)器完全組裝并放置在地板上,到它們能夠運行一個有用的問題,往往需要六個月的時間。這是因為啟動和調(diào)整過程需要花費大量時間。而通過使用預(yù)配置的系統(tǒng),我們已經(jīng)解決了這些問題。可以簡單地開機(jī),它就能立即投入工作。這并不是因為硬件存在故障,而是需要花費大量時間來準(zhǔn)備和調(diào)整軟件。
觀眾:那么這臺機(jī)器是否更側(cè)重于訓(xùn)練任務(wù)呢?
Bill Dally:其實它同樣適用于推理任務(wù)。此外,還可以根據(jù)自己的需求配置所需的帶寬。機(jī)器內(nèi)部的帶寬是預(yù)配置的,有八個GPU通過NV交換機(jī)連接在一起。但在背板上,可以選擇是否將所有GPU都連接起來。同時,我們還提供了PCIe插槽,用于安裝InfiniBand網(wǎng)卡。因此,可以根據(jù)實際需要決定連接多少網(wǎng)卡。這樣,可以為每個盒子提供所需的帶寬。
對于訓(xùn)練任務(wù)來說,另一個突出的優(yōu)點是,無論是NVLink網(wǎng)絡(luò)還是InfiniBand網(wǎng)絡(luò)都支持網(wǎng)絡(luò)集合功能。這意味著在進(jìn)行數(shù)據(jù)并行訓(xùn)練時,每個GPU都需要交換權(quán)重。通過網(wǎng)絡(luò)集合功能,你只需發(fā)送你的權(quán)重并接收總和,而無需進(jìn)行逐個交換和相加的操作。這極大地提高了數(shù)據(jù)并行訓(xùn)練的有效網(wǎng)絡(luò)帶寬。
接下來,讓我們來談?wù)勡浖矫娴囊恍﹥?nèi)容。
有時我想說,關(guān)于深度學(xué)習(xí)的一點是,雖然任何人都可以構(gòu)建一個矩陣乘法器,但真正讓它變得有用的是軟件。在NVIDIA,我們從2010年開始致力于深度學(xué)習(xí)軟件的研發(fā)。當(dāng)時,在早餐時我遇到了我的斯坦福同事Andrew Ng,他正在跟我分享關(guān)于在互聯(lián)網(wǎng)上找貓的事情。我一聽就覺得,天哪,GPU在這方面比CPU更擅長。于是我指派了一位NV研究部的同事——實際上是一個名叫Bryan Catanzaro的編程語言研究員——與Andrew一起工作,去尋找互聯(lián)網(wǎng)上的貓。他編寫的軟件后來演變成了cuDNN。當(dāng)然,后來Andrew挖走了Bryan,讓他在百度工作了一段時間。不過Bryan最終又回到了NVIDIA。從那時起,我們就一直在構(gòu)建大量的軟件。
這是我們的軟件堆棧的不同層次。我們擁有三個主要的軟件堆棧——AI堆棧、HPC堆棧,以及我們稱之為Omniverse的圖形堆棧。在此基礎(chǔ)上,我們還建立了許多垂直領(lǐng)域,涵蓋了從Clara的醫(yī)療診斷到Modulus的物理模擬,再到Drive的自動駕駛汽車技術(shù)等各種領(lǐng)域。這里涉及到的軟件工作量可能高達(dá)成千上萬人年。這種努力在MLPerf基準(zhǔn)測試中得到了真正的體現(xiàn)。
我認(rèn)為MLPerf是一個非常好的衡量標(biāo)準(zhǔn)——我喜歡查看它以了解競爭對手的情況,也了解整個深度學(xué)習(xí)社區(qū)的發(fā)展?fàn)顩r。這真的很棒。
我的意思是,在CPU領(lǐng)域,當(dāng)我在80年代和90年代從事CPU架構(gòu)工作時,有SPECmark基準(zhǔn)測試,大家都會在這個基準(zhǔn)上進(jìn)行競爭。但隨著時間的推移,它們變得有些不自然了。我認(rèn)為MLPerf基準(zhǔn)測試真正出色的地方在于,它們定期推出新的基準(zhǔn)測試?,F(xiàn)在他們有一個LLM基準(zhǔn)測試,還有一個很好的推薦基準(zhǔn)測試。他們緊跟行業(yè)發(fā)展的步伐,幾乎沒有延遲。
我想通過這張幻燈片傳達(dá)的觀點并不是Hopper比H100剛推出時快6.7倍。事實上,當(dāng)H100首次推出時,與首次推出的Ampere相比,它的性能提高了2.5倍。這是硬件的進(jìn)步,更是Ampere軟件的改進(jìn)以及龐大的軟件基礎(chǔ)所帶來的優(yōu)勢。人們可以構(gòu)建出非常出色的矩陣乘法器,但除非他們在深度學(xué)習(xí)軟件上投入了成千上萬人年的努力,否則很難在競爭中脫穎而出。這一點在MLPerf的結(jié)果中得到了體現(xiàn)。
這里只是我剪輯的一些文章標(biāo)題。最近的一篇是昨天——11月8日。雖然你可能需要仔細(xì)閱讀文章,才能找到稱贊NVIDIA的部分,但在其它文章中,我都強調(diào)了NVIDIA在這些方面的優(yōu)勢。
現(xiàn)在的情況就像是電影中的場景,主角們在跑步,后面緊跟著蒙古軍隊和一大群野獸。他們必須拼命地跑才能保持領(lǐng)先。這就像是現(xiàn)在的NVIDIA,因為每個人和他們的狗都在嘗試構(gòu)建AI硬件,因為他們認(rèn)為這是下一個淘金熱的機(jī)會。我們試圖保衛(wèi)我們的領(lǐng)先地位,不是通過阻礙他們的方式,而是試圖比他們跑得更快。然而,尷尬的是,他們中的大多數(shù)人都會絆倒摔倒,但只需要一個人繼續(xù)奔跑。如果我們絆倒了,結(jié)果就不會好。
那么我們該如何保持領(lǐng)先,就像在古代戰(zhàn)爭中超越蒙古軍隊一樣,確保我們在AI硬件領(lǐng)域的領(lǐng)先地位呢?
一個很好的方法是繪制一張圖表,展示推理過程中能量的流向。在這張圖表中,我們可以看到數(shù)學(xué)、數(shù)據(jù)路徑和數(shù)學(xué)占據(jù)了47%的比例,這意味著我們有一半的能量用于進(jìn)行數(shù)學(xué)計算。為了改進(jìn)這一點,我們需要進(jìn)行更高效的數(shù)學(xué)計算,這可以通過采用更好的數(shù)字表示或利用稀疏性來減少計算量來實現(xiàn)。
接下來,我們看到圖表中的另一個大塊是內(nèi)存,包括累積緩沖區(qū)、輸入緩沖區(qū)、權(quán)重緩沖區(qū)和累積收集器,還有6%的能量用于數(shù)據(jù)傳輸。這主要涉及到將數(shù)據(jù)從片外存儲器傳輸?shù)狡洗鎯ζ鳎约皬拇蟮钠洗鎯ζ鱾鬏數(shù)捷^小的片上存儲器。
那么,我們應(yīng)該如何改進(jìn)呢?在數(shù)字表示方面,我們可以采取多種策略。這里,我將討論其中幾種。我們學(xué)到的一個重要經(jīng)驗是,我們應(yīng)該使用我們能夠應(yīng)對的最經(jīng)濟(jì)的數(shù)字表示。為了實現(xiàn)這一點,我們需要將數(shù)字精確地縮放到該數(shù)字表示的動態(tài)范圍內(nèi)。接下來,我會分享一些我們發(fā)現(xiàn)的有效方法。
此外,我對長數(shù)字特別感興趣,并會介紹一些使長數(shù)字加法變得更容易的技巧,因為通常來說,乘法相對容易,因為它們可以轉(zhuǎn)化為加法,但加法卻更復(fù)雜,因為它們需要轉(zhuǎn)換回整數(shù)。
目前,我們主要在權(quán)重上使用稀疏性。然而,我們還可以考慮在激活上使用稀疏性,并利用其它低密度特性來利用稀疏性。為了減少那6%的數(shù)據(jù)移動,我們可以優(yōu)化平鋪策略——基本上是一種更好的循環(huán)調(diào)度方式,以最大限度地減少移動并提高重用率。
在電路方面,我們也做了很多工作??紤]到內(nèi)存消耗了大約一半的能量,我們可以通過一些簡單的方法來提高內(nèi)存效率。例如,我們發(fā)現(xiàn)這些內(nèi)存通常是“一次寫入,多次讀取”的。因此,在寫入時使它們在能源上相對昂貴是可以接受的。一種利用這一點的方法是使用每個單元格具有一個位線的設(shè)計。這樣,你可以寫入單元格,然后激活該位線,內(nèi)存的輸出就會輸出。這種方法使得寫入操作變得非常節(jié)能。這只是我們正在考慮的一項改進(jìn)。我們還有許多其它的改進(jìn)方案,我會在接下來的部分繼續(xù)介紹。
針對我們接下來的計劃,我們將持續(xù)聚焦于優(yōu)化數(shù)學(xué)計算和內(nèi)存使用,以確保我們的硬件在處理深度學(xué)習(xí)任務(wù)時達(dá)到更高的效率。此外,我們還將不斷探索新的數(shù)字表示技術(shù)和稀疏性利用方法,以進(jìn)一步降低能量消耗并提升性能??偠灾?,我們的目標(biāo)是維持在AI硬件領(lǐng)域的領(lǐng)先地位,持續(xù)創(chuàng)新和改進(jìn),以滿足不斷增長的深度學(xué)習(xí)需求。
沒錯吧?那么,當(dāng)你在進(jìn)行讀取操作時,你所做的就是從位于乘法器前面的一大堆位線中選擇一個,這個讀取過程幾乎不消耗能量。相反,寫入操作是能量消耗的主要環(huán)節(jié)。因此,你就不需要在每次讀取時都切換位線。你只需要進(jìn)行一次寫入操作。情況會有所不同。但在讀取時,你只需要切換乘法器的輸入即可。
優(yōu)化通信電路可以帶來諸多好處。如果讓我指導(dǎo)一個電路專業(yè)的學(xué)生來設(shè)計一種從芯片一端到另一端傳遞位的信號方式,并鼓勵他們盡可能多地消耗能量,他們很可能會采用我們現(xiàn)今的常規(guī)做法——利用邏輯電平,其中電源代表1,地線代表0。但實際上,只需稍微增加一些晶體管面積,你就不再需要1伏特的電壓來表示1或0了。那么高的電壓簡直是浪費,且可能對設(shè)備造成損害。實際上,你只需要確保足夠的能量使Eb/N0達(dá)到大約20分貝,就足以保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性了——可能僅需50毫伏的電壓就足夠了。因此,通過改進(jìn)通信電路,我們可以實現(xiàn)很多優(yōu)化。
我想分享一件令我非常興奮的事情,我們正在為此付出巨大的努力,那就是通過直接在GPU上方堆疊DRAM來擴(kuò)大我們的內(nèi)存帶寬,并同時降低內(nèi)存的能量消耗。但我們必須承認(rèn),這個過程中存在許多技術(shù)難題需要我們?nèi)ソ鉀Q,可能需要幾代人的努力才能最終實現(xiàn)。
讓我們從數(shù)字表示開始討論。
當(dāng)你問一個數(shù)字系統(tǒng)有多好時,實際上你關(guān)心的有兩個方面。首先是準(zhǔn)確性,即實際數(shù)字與理論數(shù)字之間的差距。在數(shù)字系統(tǒng)中,數(shù)字必須覆蓋整個數(shù)字線,因此準(zhǔn)確性主要關(guān)注的是在將任意數(shù)字轉(zhuǎn)換為數(shù)字系統(tǒng)時可能產(chǎn)生的最大誤差,因為我們通常需要對數(shù)字進(jìn)行四舍五入以匹配可表示的值。另一方面是動態(tài)范圍,即數(shù)字系統(tǒng)可以表示的數(shù)字范圍有多大。這既涉及到準(zhǔn)確性,也涉及到成本。數(shù)字位數(shù)是一個關(guān)鍵因素。在存儲和傳輸數(shù)據(jù)時,存儲器和線路并不關(guān)心這些位的具體值,而是關(guān)心你引用了多少位。因此,理論上使用的位數(shù)越少越好。但同時,我們還要考慮執(zhí)行操作的成本,比如進(jìn)行乘積累加時所需的資源消耗。
接下來,我會簡要介紹一些代表性的數(shù)字。使用整數(shù),事實上,其準(zhǔn)確性并不理想。原因在于其誤差與數(shù)值大小無關(guān)。不論處理的是小數(shù)還是大數(shù),誤差都是一個半最低有效位。稍后我會在下一張幻燈片上通過圖表來展示這一點。因此,它們在最壞情況下的誤差達(dá)到了33%。這是1.5和1之間的差異,因為我們必須將1.5四舍五入到2或1。這相當(dāng)于從1中取走了一半,顯然并不理想。相比之下,浮點數(shù)的表現(xiàn)要好得多,對數(shù)的表現(xiàn)也更好。我應(yīng)該選擇使用對數(shù)8和FP8,但我稍后會通過圖表來展示這一點。
關(guān)于符號,它的表現(xiàn)相當(dāng)不錯。那么,符號具體是什么呢?事實證明,你可以使用反向傳播和隨機(jī)梯度下降來訓(xùn)練各種模型。例如,我和宋曾在ICLR上發(fā)表了一篇論文,大約是在2015年,我們訓(xùn)練了一個16條目的碼本,以獲取代表我們所擁有的權(quán)重分布的最佳16個權(quán)重。這是一個很好的方法,因為如果你只限于使用16個值,或者64個、256個值,這取決于你使用的位數(shù),這就是你能找到的最佳方式來代表那些權(quán)重。這將有助于最小化存儲和移動的能量消耗。然而,在實際執(zhí)行數(shù)學(xué)運算時,你必須表示你選擇的那些點。這意味著你需要在表中進(jìn)行高精度的查找,而這本身就是一個相當(dāng)耗時的過程。接下來,我們進(jìn)行了16位數(shù)學(xué)運算。最終,我們用這些4位符號進(jìn)行了16位數(shù)學(xué)運算,這完全抵消了我們在能量消耗方面的任何優(yōu)勢。這個想法雖然巧妙,但并不實用。
接著,我們來看尖峰表示。我之所以要提到它,是因為如果要從所有能源效率極低的表示方法中挑選一個,尖峰表示無疑是首選。在CMOS技術(shù)中,什么會消耗能量呢?答案是線路切換。假設(shè)我需要表示一個介于1和128之間的整數(shù)。在尖峰表示中,如果平均表示,比如在64這個數(shù)值上,我必須切換這條線路64次。然而,如果我選擇使用7位整數(shù)來表示0到128,我擁有7個位,其中大約一半會發(fā)生翻轉(zhuǎn),而不是切換。這樣一來,就只需要翻轉(zhuǎn)3.5次。比較一下,這就是1.75次切換與64次切換的差距。因此,尖峰表示與整數(shù)表示相比,能量開銷高達(dá)32倍,這顯然不是一個理想的選擇。
再來看模擬表示。關(guān)于模擬表示,我有一整套的論述來解釋為什么它在執(zhí)行單個操作時表現(xiàn)良好,但在系統(tǒng)級別上卻不盡如人意。不過,為了簡潔起見,我就不深入探討了。簡而言之,無論是存儲還是移動模擬信號,通常都需要將其轉(zhuǎn)換為數(shù)字信號。然而,這種轉(zhuǎn)換會消除你從模擬操作中獲得的任何優(yōu)勢,因為并沒有簡單直接的方法來存儲或移動模擬信號。
現(xiàn)在,讓我們來談?wù)劚硎竞头植?。如果你對網(wǎng)絡(luò)進(jìn)行剪枝,或者利用稀疏性,你可能會得到一個雙峰分布。這實際上是我2015年那篇ICLR論文中的權(quán)重分布圖。如果你選擇線性量化,也就是基本上只使用整數(shù)表示,并且你有16個值,它們將會出現(xiàn)在X所在的位置。你可以看到我在這里有很多取樣點,而那里幾乎沒有什么。在整個分布的葉下,我只有像三個X這樣的點。因此,我將會得到非常高的誤差。然而,如果我訓(xùn)練碼本,我得到的小紅點將會更加集中,我基本上會把所有的點都放在它們表現(xiàn)良好的地方。事實上,這樣做是最優(yōu)的。你訓(xùn)練碼本就是為了達(dá)到這樣的效果。雖然有一個k均值聚類步驟,但除此之外,你基本上是在使用隨機(jī)梯度下降來將這些碼本條目移動到最佳位置。這就是你想要達(dá)到的目標(biāo)。
如果你不進(jìn)行剪枝,你往往會得到這樣的分布。這里要理解的重要事情是,你大部分的值都接近零。因此,非常重要的是要很好地表示小值。因為小值的誤差往往比大值的誤差權(quán)重更大,因為小值的數(shù)量并不多。
接下來,我們談?wù)剬?shù)表示法。
對于我們這一代人來說,上大學(xué)時,我們可能是在這樣的工具上進(jìn)行數(shù)學(xué)計算的。這就是計算尺,它主要進(jìn)行對數(shù)運算。上面刻的小線代表了對數(shù)間隔。例如,我要計算1.12乘以1.2,只需將1.12放在這里,移動到1.2的位置,然后讀出答案。實際上,我將乘法運算轉(zhuǎn)化為了加法運算。我計算的是線性距離,同時利用刻度線上編碼的對數(shù)表進(jìn)行數(shù)學(xué)計算。與整數(shù)或浮點數(shù)表示法相比,對數(shù)表示法具有出色的特性。
如果我選擇對數(shù)表示法——這里,我正在使用我所說的8位對數(shù)4.3表示法。其中包含一個符號位,7個指數(shù)位,其中4位在二進(jìn)制點的左側(cè),3位在右側(cè)。這意味著,如果你將這些位串聯(lián)起來,你實際上是在計算2的某個冪次除以8。在二進(jìn)制點的右側(cè)需要有一些數(shù)值,因為如果只考慮2的冪次,它們之間的間隔會過大。你的數(shù)字系統(tǒng)需要更細(xì)致的分級。通過移動二進(jìn)制點,你可以在精度和動態(tài)范圍之間找到平衡。
與FP8相比,我選擇了E4M3,即4位指數(shù),然后取相同的3位,但不是擴(kuò)展的指數(shù),而是尾數(shù)值。在這里,我們擁有相同的動態(tài)范圍,因為我基本上選擇了相同的指數(shù)。但我的最差情況準(zhǔn)確性提高了50%。稍后我會給你一個圖表來展示這一點。基本上,我是按塊值來縮放誤差的。每個具有相同指數(shù)的塊具有相同的誤差,然后跳到一個更大的誤差,而對數(shù)表示法則是對每個值都進(jìn)行了縮放。因此,最小數(shù)字的誤差非常小。
這里是對數(shù)表示與整數(shù)表示的比較。你可以清晰地看到,對數(shù)表示法的優(yōu)勢在于表示較小的數(shù)字,而這恰恰是我們最為關(guān)心的部分,因為大多數(shù)權(quán)重都集中在這個范圍內(nèi),其誤差非常小。在1.5左右的最大誤差,無論是向上還是向下調(diào)整,都大約是9%。這是使用4位對數(shù)2.2(無符號位)時的情況。而使用4位整數(shù)表示時,這里的最大誤差高達(dá)33%,因為誤差的絕對值是一樣的。在任何位置,誤差都是0.5。所以,在1.5或15.5這樣的數(shù)值上,誤差同樣是0.5。這意味著,在我們真正關(guān)心的區(qū)域,整數(shù)表示法會帶來非常大的誤差,而且這種誤差是不成比例的。
浮點數(shù)在某種程度上可以被視為一種不那么理想的對數(shù)表示。這里我們比較了浮點數(shù)2.2與對數(shù)2.2的誤差。你可以看到,誤差增加了一半,從9增加到了13。這是因為,在使用浮點數(shù)時,你對前四個步驟使用了相同的步長,接著對接下來的四個步驟也是如此。而在使用對數(shù)表示時,你在每個元素中都增加了步長。因此,你最終得到的誤差更小,這在表示最小值時尤為重要。
對數(shù)數(shù)字系統(tǒng)有哪些特性呢?首先,乘法運算變得非常高效,因為只需進(jìn)行加法運算。實際上,與在整數(shù)或浮點數(shù)系統(tǒng)中進(jìn)行乘法相比,加法運算的成本要低得多。在整數(shù)或浮點數(shù)系統(tǒng)中,乘法是一種二次成本的操作,而加法則是一種線性成本的操作——與位數(shù)成比例。然而,加法在對數(shù)數(shù)字系統(tǒng)中并不容易實現(xiàn),因為通常需要進(jìn)行查找操作。所以,具體性能還取決于綠色區(qū)域(EI和EF)的轉(zhuǎn)換效率。
EI只是一個簡單的移位操作。你取得那個指數(shù),它告訴你需要移位多遠(yuǎn)。然而,EF則需要一個查找操作。你必須在八個值中查找一個,這些值都是2的冪——2的0次方很簡單,就是1。但接下來是2的1/8次方、2的1/4次方、2的3/8次方、2的1/2次方等等。你需要查找這些值的二進(jìn)制表示,并用足夠的位數(shù)來表示它們以保持準(zhǔn)確性。然后,根據(jù)EI的數(shù)量進(jìn)行移位操作,再進(jìn)行加法。如果每次加法都這樣做,那將是一個非常耗時的操作。但想象一下你在深度學(xué)習(xí)系統(tǒng)中做的事情。你通常在進(jìn)行大量的乘法運算,并將所有結(jié)果相加來計算新的激活值——實際上,通常是成千上萬次的乘法,然后將它們?nèi)肯嗉印?/p>
這里有一個來自某個美國專利申請的圖。數(shù)字在下方,展示了如何以低成本進(jìn)行這種操作。你需要做的是將這個表查找操作移到這10,000個元素的外部。假設(shè)我有10,000個元素要相加,每個元素都有EI和EF。我根據(jù)EF對它們進(jìn)行排序,EF可能是2的1/8、2/8、3/8或1/4。我需要在最后乘以它們嗎?我取所有這些元素,并將它們的整數(shù)部分相加在一起,這很簡單。然后,如果我取余數(shù)部分,也就是EF部分,并在排序單元中選擇——假設(shè)它是三位——我將指向由商部分確定的八個輸出之一。在典型的應(yīng)用中,不是每個周期處理一個元素,通常是每個周期處理8或16個元素。然后,我傳遞符號和EI,我取得符號位,并將其移位到商。接著,我將這些累加器相加。這是一個熱和求和的過程,你可以利用它,因為你只翻轉(zhuǎn)了一個位。如果你足夠聰明,你可以利用這一點來提高能效。我將所有這些元素相加,直到我完成整個張量的計算。
完成了10,000次加法運算——平均每個區(qū)間大約1,000次。然后,我進(jìn)行一次查找操作。實際上,這不是真正的查找操作。它是硬連線的。我將那個常數(shù)硬連線到這里。我用這個硬連線的數(shù)字進(jìn)行最后的乘法運算,取出部分總和,然后將它們相加?,F(xiàn)在,我得到了整數(shù)形式的值。而且,有一種非常簡單的方法可以將其轉(zhuǎn)換回對數(shù)形式。這就是對數(shù)數(shù)字系統(tǒng)的運作原理。
接下來,我們將討論如何最優(yōu)地裁剪你的數(shù)字。
這實際上是一個關(guān)于如何選擇適當(dāng)?shù)膭討B(tài)范圍的問題。不論你采用哪種表示方式,無論是整數(shù)、對數(shù)還是浮點數(shù),關(guān)鍵的操作是如何確定一組數(shù)字的可表示范圍的居中位置。簡單來說,你必須表示分布。
讓我介紹兩種可能的做法。
首先是大多數(shù)人目前采用的方法。你基本上會掃描——假設(shè)我有一堆權(quán)重或激活值。我掃描我的權(quán)重或激活值,并且可以在不同的粒度上執(zhí)行此操作。稍后我會談到這一點,通常是對每一層進(jìn)行一次操作。所以,我會選擇網(wǎng)絡(luò)的一層,掃描所有權(quán)重,比如找到最小權(quán)重-0.8和最大權(quán)重0.8。然后,我會調(diào)整我可表示范圍的數(shù)字——在這種情況下,它是一個整數(shù)表示,因為它是均勻分布的——以便我可以精確地表示最大值和最小值。這樣,你就不會遇到任何剪輯噪聲。通過限制較大的數(shù)字,我不會產(chǎn)生任何噪聲。但我的量化噪聲會非常大。這些紅色條之間的間隔非常大。
另一方面,我可以選擇進(jìn)行裁剪。我可以選擇說,與其表示0.8,我將我的最大可表示數(shù)字設(shè)為0.2。這意味著我必須將這里的任何數(shù)字都限制在0.2以下。這將引入剪輯噪聲,降低這些數(shù)字的值。但我的量化噪聲會小得多。
在某次會議上,我提出了一個有趣的問題,我認(rèn)為這個問題很難回答,那就是是否存在一種方法可以找到設(shè)置這個剪輯因子的最佳位置,以便獲得最小的均方誤差。雖然這并不是你真正想要的,但它是一個很好的代理,也是一個可以明確表述的問題。你真正想要的是神經(jīng)網(wǎng)絡(luò)中的最小誤差,但那是一項更具挑戰(zhàn)性的任務(wù)。
然而,我們團(tuán)隊中最近加入的一位員工在一個小時內(nèi)就解決了這個積分問題。他告訴我:“是的,你只需要解決這個積分?!蔽覍Υ烁械较喈?dāng)震驚。
聽眾問:GPT-4或? Bill Dally:不,這是在GPT-4之前。他實際上親手解決了這個數(shù)學(xué)問題。我必須說,這真的令人印象深刻。解決那個積分是相當(dāng)困難的,你可能不會希望每次針對變化的激活函數(shù)都這樣做。
然而,有了這個迭代方程,我們可以近似這個積分,而他在大約一天后就給出了結(jié)果。如果你進(jìn)行2或3次迭代,它可以為你提供一個非常接近真實積分的值。這個方程還給出了上下裁剪點。直觀地來說,讓我們看看這個例子。這是一個特定的層,我們正在查看的網(wǎng)絡(luò)的第13層。假設(shè)我使用四位數(shù)字來表示。如果我的裁剪比例尺在這里,那就意味著我沒有進(jìn)行任何裁剪。我可以表示直到4.2或其它最大可表示的值。因此,當(dāng)我開始裁剪時,我的噪聲會減少,因為我大大降低了量化噪聲。而且,我實際上沒有引入太多的裁剪噪聲,因為在這個范圍內(nèi)幾乎沒有權(quán)重,直到我移動到大約這里的這一點。在這一點上,我達(dá)到了一個最小值。如果我再降低裁剪比例,裁剪噪聲開始變得足夠大,以至于實際上使整體的均方誤差增加。但這就是我想要的位置。如果我查看誤差的點,我這里沒有5位數(shù)線的具體數(shù)據(jù),但實際上我最終得到的誤差遠(yuǎn)低于5位數(shù)線的頂部。事實上,如果我沒有進(jìn)行任何裁剪,我的誤差幾乎達(dá)到了6位數(shù)線。因此,在減少均方誤差方面,這樣做是非常值得的。所以,最重要的不是按照你認(rèn)為的方式進(jìn)行縮放,而是找到最優(yōu)的縮放方式來最小化均方誤差。
聽眾:這個假設(shè)是基于一個預(yù)先訓(xùn)練好的網(wǎng)絡(luò),你進(jìn)行裁剪。如果在訓(xùn)練循環(huán)中,你實際上假設(shè)在訓(xùn)練期間有一定數(shù)量的表示形式,那么這個答案會不會有很大的變化?
Bill Dally:這是一個很有深度的問題。實際上,我并不確定它是否會有很大的變化。如果能夠訓(xùn)練裁剪因子,那將會是非常理想的情況。
聽眾:好吧,為了得到可能最簡單的結(jié)果,這里確實有很多需要權(quán)衡的地方。
Bill Dally:我很高興你這么認(rèn)為,因為我自己之前也沒有深入考慮過這個問題。但我認(rèn)為,理論上講,我們是可以訓(xùn)練裁剪因子的,只需要將反向傳播應(yīng)用到裁剪因子上。然后,其它的權(quán)重將會根據(jù)裁剪因子進(jìn)行調(diào)整。目前,我們是在訓(xùn)練完成后再進(jìn)行這個操作的。實際上,我們并沒有用剪輯重新訓(xùn)練網(wǎng)絡(luò),盡管這樣做也是可能的,而且可能會得到更好的效果。
聽眾:我想更廣泛地探討一下,是否可以選擇最簡單的數(shù)字表示形式,以便在可能的任何合理動態(tài)范圍內(nèi),以及你所描述的分布中的任何極端特性下,都能得到理想的效果?我假設(shè)這是你目前唯一可用的數(shù)學(xué)方法,所以—— Bill Dally:我們?nèi)匀恍枰x擇一個scale factor。關(guān)鍵在于,你不僅僅是使用表示形式本身,而是結(jié)合一個scale factor來使用它。這個scale factor的選擇變得尤為關(guān)鍵。
因此,讓我再深入談?wù)勏蛄靠s放。實際上,向量縮放可能是這次演講的核心信息。在通常的實踐中,我們都會進(jìn)行縮放。當(dāng)我們開始縮放時,需要兩個縮放因子,一個用于前向傳播,另一個用于反向傳播。這是因為兩者最終使用的值可能會有很大的差異,特別是在反向傳播中,你需要乘以一個學(xué)習(xí)率,這會使返回的數(shù)字變得更小。然后,我們會逐層進(jìn)行縮放。如果你發(fā)現(xiàn)某種方法有效并改善了結(jié)果,你可能會想是否可以進(jìn)一步優(yōu)化?
于是,我們轉(zhuǎn)向了更細(xì)粒度的縮放。這進(jìn)一步提升了效果。于是,我們提出了一個問題:如果我們不是按層進(jìn)行縮放,而是按矢量進(jìn)行縮放,效果會如何呢?這里的‘矢量’指的是包含16、32或64個元素的集合。由于每個矢量都有一個非常緊湊的分布,我們可以對其進(jìn)行縮放,從而獲得非常出色的結(jié)果。這實際上相當(dāng)于增加了額外的精度位數(shù)。
因此,我們的思考方式是,在常規(guī)操作中,你會按照這里展示的方式處理ConvNet。我們有一個維度為高度乘以寬度乘以通道數(shù)的張量,即 H、W 和 C。接著,我們通過 R 乘以 S 進(jìn)行卷積,這里的 R 和 S 是卷積核的大小。但在通道維度上,我們會使用對應(yīng)通道的權(quán)重進(jìn)行點乘操作。
假設(shè)我選取一個在通道維度上長度為32的矢量元素,并與該元素進(jìn)行點乘,我可以獨立地對這個32元素矢量進(jìn)行縮放,而不影響張量的其它部分。為了實現(xiàn)這一點,我最終在我的 MAC 單元中添加了一個小單元。在輸出端,完成所有權(quán)重與激活函數(shù)的乘法運算以將其轉(zhuǎn)換回預(yù)縮放數(shù)字之后,我必須乘以兩個縮放因子——一個用于權(quán)重,一個用于激活函數(shù),即 sw 和 sa。
從圖形化的角度來看,我們可以這樣想象:這個大藍(lán)色塊代表整個層的分布,而這條線的小范圍則代表我的矢量的范圍。因此,現(xiàn)在基本上我在對一個更小的矢量進(jìn)行縮放。
如果我對這個更小的矢量進(jìn)行最優(yōu)裁剪,我可以獲得更好的效果。因此,這個方法在實際應(yīng)用中表現(xiàn)非常出色。接下來,我將展示我們構(gòu)建的一款加速器的一些實驗結(jié)果。
讓我先談?wù)勏∈栊浴?/p>
這張圖來自我和宋于2015年在NeurIPS(當(dāng)時稱為NIPS)上發(fā)表的一篇論文。在這篇論文中,我們展示了一個實驗:取一個神經(jīng)網(wǎng)絡(luò)——這里展示的是一個多層感知器——刪除其中一部分權(quán)重,然后使用掩碼重新訓(xùn)練它。這個掩碼的作用是保持被刪除的權(quán)重不變。最終,我們幾乎得到了與原始網(wǎng)絡(luò)相同的準(zhǔn)確性。
實際上,對于多層感知器,我們可以刪除高達(dá)90%的權(quán)重而仍能保持相同的準(zhǔn)確性。而對于卷積神經(jīng)網(wǎng)絡(luò)(ConvNets),這個數(shù)字通常更接近30%。也就是說,你可以刪除60%到70%的權(quán)重,使網(wǎng)絡(luò)的密度保持在30%到40%,同時仍然保持相同的準(zhǔn)確性。我們覺得這一發(fā)現(xiàn)非常有趣。
為了進(jìn)一步驗證這一發(fā)現(xiàn),我們實際上設(shè)計了一個小型測試條帶,名為“高效推斷引擎”。這個引擎的目的是展示我們?nèi)绾卧趯嶋H應(yīng)用中實現(xiàn)稀疏計算,并且這種計算方式是高效的。與標(biāo)量引擎相比,我們的高效推斷引擎具有更高的效率。為了實現(xiàn)這一點,我們使用了專用硬件來遍歷CSR結(jié)構(gòu),從而能夠在50%的密度下有效地進(jìn)行稀疏計算。
我記得原始論文的一個審稿人曾經(jīng)評論說,這只是學(xué)術(shù)上的好奇,因為大家都知道,如果使用稀疏矩陣包,那么矩陣的密集度必須非常低,比如不超過0.1%,否則直接運行它會更快。確實,如果全部在軟件中進(jìn)行稀疏計算,那么審稿人的觀點是正確的。但我們的方法有所不同。我們基本上為CSR指針分配了單獨的內(nèi)存數(shù)組。我們還設(shè)計了特殊的硬件來遍歷這些內(nèi)存數(shù)組。因此,我們的稀疏計算幾乎沒有額外的開銷。
問題是,實際上沒有多少人愿意去做標(biāo)量計算。為了進(jìn)行比較,我們構(gòu)建了一些最先進(jìn)的加速器,它們配備了并行向量單元。這些加速器基本上可以同時執(zhí)行16個長向量的運算,每個周期可以完成256次乘法?,F(xiàn)在,我們面臨的挑戰(zhàn)是如何在稀疏情況下使它們高效工作。
自2015年以來,我一直在努力解決這個問題。我不斷嘗試提出新的想法,看起來都非常不錯,直到我們實際去合成邏輯。然后,我發(fā)現(xiàn)了一個問題:如果我想對兩個稀疏向量進(jìn)行點積運算,并在最后一刻篩選出非零元素并將它們送入MAC單元,這會產(chǎn)生大量的閃爍。這是因為多路復(fù)用器在實時嘗試判斷哪些數(shù)字是0。它會不斷選擇這個數(shù)字,然后說:“不,這個數(shù)字在這里是非零的,但在另一邊它是0,所以讓我們把向量移到下一個位置?!弊詈?,為了每個計算,它們會切換數(shù)學(xué)單元5次,這極大地消耗了我們的能源。
因此,我們一直在尋找消除閃爍的方法,因為這成為了許多稀疏運算的瓶頸。在Ampere和Hopper中,我們都找到了一個有效的方法,我們稱之為“結(jié)構(gòu)化稀疏性”。原來,稀疏性之所以難以處理,是因為它是不規(guī)則的。當(dāng)數(shù)據(jù)不規(guī)則時,我們需要花費大量精力去整理它們,使它們到達(dá)正確的位置。
我們的解決方案是避免不規(guī)則性。我們強制使稀疏性具有某種規(guī)律模式。具體的方法是,和所有與稀疏性相關(guān)的工作一樣,我們密集地訓(xùn)練網(wǎng)絡(luò)。即使對于所有的稀疏性,大部分的訓(xùn)練也是在稠密的情況下進(jìn)行的推理。但是,在訓(xùn)練完網(wǎng)絡(luò)之后,我們會找到最低的權(quán)重并將它們刪除。但在這里,我們會以結(jié)構(gòu)化的方式進(jìn)行刪除,即我們堅持要求每四個中最多只有兩個是非零的。如果你做不到這一點,那么你可能只能進(jìn)行密集計算。但是,如果你能剔除四分之二的權(quán)重,這通常是可以做到的,特別是當(dāng)處理MLP時,你可以剔除10個中的9個。那么,剔除四分之二應(yīng)該就很容易了。
我們將這些權(quán)重刪除,然后使用掩碼重新訓(xùn)練網(wǎng)絡(luò),使其它部分在某種程度上補償消失的部分。接著,我們通過僅存儲非零權(quán)重和一些元數(shù)據(jù)來壓縮模型,這些元數(shù)據(jù)告訴我們哪些權(quán)重被保留了。由于元數(shù)據(jù)是靜態(tài)的,不會頻繁變動,我們將其輸入多路復(fù)用器,用于選擇輸入激活。具體來說,如果我們有八個輸入激活,而元數(shù)據(jù)告訴我們其中四個是非零的,我們就選擇這四個并將其饋送到乘法器中。這樣,我們得到了一種規(guī)則性很強的計算方式,效率幾乎翻倍。目前,我們正在研究如何將這種方法擴(kuò)展到激活函數(shù)上,以及如何結(jié)合兩種稀疏模式,同時保持計算的可預(yù)測性。
接下來,我簡要談?wù)劶铀倨骱图铀倨髋cGPU之間的關(guān)系。
我們在NVIDIA開發(fā)了一系列加速器,其中EIE是與斯坦福大學(xué)合作完成的,而Joe Lemar則在NVIDIA與麻省理工學(xué)院合作完成了另一項工作。我們還開發(fā)了用于稀疏卷積神經(jīng)網(wǎng)絡(luò)的SCNN加速器,以及多芯片模塊等。
這些加速器之所以能獲得出色的性能,主要有五種原因。
首先,它們采用了特殊的數(shù)據(jù)類型和操作符。這與我們從GPU中借鑒的經(jīng)驗有關(guān)。我們針對數(shù)據(jù)類型進(jìn)行了專門化設(shè)計。以Hopper為例,它采用了FP8數(shù)據(jù)類型,并使用QMMA專門處理FP8的8x8矩陣乘法。通過這種方式,我們基本上用一個周期完成了原本需要數(shù)十或數(shù)百個周期才能完成的工作。因此,QMMA和IMMA都能在單個指令周期內(nèi)完成1024次操作。
其次,這些加速器具備大規(guī)模的并行性。我們追求的是1000倍的性能提升,因此希望大量的計算單元能夠并行工作。在構(gòu)建加速器時,優(yōu)化存儲器是非常重要的。主存儲器訪問成本高昂,如果頻繁地從主存儲器中讀取數(shù)據(jù),性能將會受到限制。由于深度學(xué)習(xí)涉及多個層次的讀取,我們可以通過使用小的暫存區(qū)來實現(xiàn)良好的數(shù)據(jù)重用。
當(dāng)我們?yōu)樯镄畔W(xué)設(shè)計了一個加速器,并在Hopper中實現(xiàn)了動態(tài)規(guī)劃指令時,我們首先考慮了生物信息學(xué)算法——Minimap,這是廣泛使用的算法。我們提出了一個問題:如果只為這個算法設(shè)計專用硬件,我們能獲得多少加速效果?答案大約是4倍。就在我們準(zhǔn)備放棄并轉(zhuǎn)向其它項目時,我們想到,如果重新設(shè)計算法呢?這引出了算法、架構(gòu)和代碼協(xié)同設(shè)計的挑戰(zhàn)。
事實證明,生物信息學(xué)家認(rèn)為動態(tài)規(guī)劃計算成本高昂,因此他們花費大量時間在種子階段,試圖找到好的候選項以進(jìn)行對準(zhǔn)。而我們采取了不同的策略:我們使對準(zhǔn)階段變得非常高效,因為我們的對準(zhǔn)引擎比CPU上的對準(zhǔn)操作快150,000倍。而種子階段相對昂貴,因為它需要主存儲器訪問。因此,我們顛倒了這一策略,設(shè)計了一個非常經(jīng)濟(jì)的種子階段,其中可能產(chǎn)生大量誤報輸入到對準(zhǔn)階段。但由于對準(zhǔn)速度極快,它能夠自我過濾,最終我們實現(xiàn)了大約4000倍的總體加速。
然而,關(guān)鍵在于優(yōu)化內(nèi)存訪問。你不能一直依賴主存儲器進(jìn)行引用并期望獲得良好的性能。此外,減少操作的平均開銷也很重要。對于簡單的操作,與CPU相比,我們的加速器可以實現(xiàn)10000倍的加速。
我一直在從事這方面的研究,從1985年開始的快速加速器設(shè)計。我最初是從事仿真加速器的設(shè)計,之后涉及信號處理,最近則是神經(jīng)網(wǎng)絡(luò)和SAT求解器。
我想強調(diào)操作開銷的重要性。這是一篇關(guān)于簡單ARM亂序核的論文中的數(shù)據(jù),盡管它是相對簡單的核之一。我忘記了具體是哪個型號——可能是某種A型號,我以為我在這里寫下來了。然而,與我們今天擁有的更先進(jìn)的核心相比,例如Grace芯片中的Neoverse核心,這是一個非常高效的CPU。但即使如此,執(zhí)行一個CPU指令的成本仍然很高。即使那個指令是一個空操作,獲取指令、解碼、進(jìn)行分支表查找以及在寄存器文件中進(jìn)行亂序操作的成本是250皮秒焦耳。而執(zhí)行一個16位整數(shù)加法的成本是32飛秒焦耳。所以,大部分開銷都來自于指令執(zhí)行的輔助操作。因此,我認(rèn)為在設(shè)計和優(yōu)化硬件時,需要密切關(guān)注這些開銷,并努力減少它們。
在乘法運算方面,存在二次擴(kuò)展現(xiàn)象。一個32位乘法的成本并不僅僅是8位乘法的4倍,而是比8倍還要貴,實際上是貴了16倍。浮點數(shù)的情況稍微復(fù)雜一些,但大致相同。其中還涉及到一個特殊的歸一化階段。你會發(fā)現(xiàn),從內(nèi)存中讀取數(shù)據(jù)的成本比所有這些操作都要昂貴,甚至比32位乘法還要貴。讀取一個相對較小的8k字節(jié)內(nèi)存的成本更高。讀取內(nèi)存的距離越遠(yuǎn),情況就會變得更糟。
我喜歡使用這種數(shù)量級的方式來描述,例如,如果我讀取一個本地的8k字節(jié)內(nèi)存,每個字的成本是5皮焦耳。如果我必須穿過芯片并讀取,基本上是數(shù)百兆字節(jié)的內(nèi)存,每個字的成本是50皮焦耳,但其中的內(nèi)存部分仍然是5。你使用小內(nèi)存陣列來構(gòu)建大內(nèi)存。因此,我們基本上有一個內(nèi)存陣列大小,我們傾向于用于所有東西,因為在一個位線上,你只能有那么多位單元,在一個字線上,你只能有那么多單元。所以這是你的基本陣列大小。超過這個大小的任何東西都要使用多個陣列。所以另外的45皮焦耳是通信能量。這是將地址傳送到內(nèi)存陣列并將數(shù)據(jù)傳送回來的成本。然后,如果你離開芯片,情況就會糟糕得多。LPR,這是你能得到的最節(jié)能的DRAM——實際上與HBM相當(dāng)?,F(xiàn)在,它大約是——我在試著回憶——大約是每比特5皮焦耳。讀取32位字,這就是為什么這樣,是640皮焦耳。
接下來,讓我來談?wù)勎覀冏罱囊粋€最新加速器項目。我們從一個程序開始,實際上,它搜索加速器的設(shè)計空間。我們基本上給它我們的目標(biāo)神經(jīng)網(wǎng)絡(luò),然后我們說,對于加速這個神經(jīng)網(wǎng)絡(luò),最好的加速器是什么?它搜索一堆參數(shù)——有多少處理單元。我們有這個向量MAC。我們有一堆向量MAC的通道。所以這是一個二維的東西,有很多向量和很多向量元素和很多通道——不同緩沖區(qū)的大小將會是多少。因此,它在搜索有限的設(shè)計空間。我們有一個有點風(fēng)格化的東西,但它在變化所有的參數(shù)。它實際上可以將多個級別放入我們通過的scratchpad層次結(jié)構(gòu)中。
在ICCAD的論文中,我們實現(xiàn)了大約每瓦特20萬億次的8位操作,你會意識到——這在技術(shù)上比Hopper落后一代。我認(rèn)為是在12納米工藝,而Hopper是在5納米工藝——實際上,所以它是兩代技術(shù)之后。但我們?nèi)匀蛔龅帽容^好,因為我們優(yōu)化了很多東西,并且我們可以將這些應(yīng)用到Hopper上。
更進(jìn)一步的是,我們今年在JSSC上發(fā)表了一篇論文,而去年則是在VLSI電路研討會上發(fā)表了關(guān)于Magnetic BERT的研究成果。因此,我們完成了兩項工作。我們計劃將其應(yīng)用于LLM,因為它正成為當(dāng)下的熱門話題,而非ConvNets,MAGNe真正優(yōu)化了這一點。另一方面,我們也想應(yīng)用我們所有關(guān)于最佳裁剪和向量級別縮放的學(xué)習(xí)成果。因此,它支持向量級別的縮放。我們增加了額外的兩組乘法器,用于乘以激活和權(quán)重,以及縮放因子,使其能夠在基于32個元素的向量上運行。這使得我們能夠運行一種特殊的量化方法,我們稱之為VS-Quant INT4,而且可以在不損失精度的情況下運行BERT和BERT Large。因此,我們能夠通過最佳縮放實現(xiàn)4位量化的推理。
在這個圖表中,真正重要的數(shù)字——雖然我不會詳細(xì)解釋——是每特拉操作95.6瓦的能耗。因此,我們幾乎每瓦能夠達(dá)到100萬億次操作,比Hopper的效率提高了約10倍。而且這是在相同的工藝下實現(xiàn)的。順便提一下,我們在NVIDIA進(jìn)行原型制作的方式是,等待有人發(fā)送這些大型800平方毫米芯片之一,然后我們會說:“好吧,你有800平方毫米的空間。顯然,我們可以從你那里借用一個毫米的角落?!边@有點像坐在那里向別人借你的杯子用一下。我們會問:“我可以要一個毫米的空間嗎?”他們通常都會同意。因此,我們最終在一個大型GPU上啟動了這種實驗之一,我相信這是Hopper交換芯片,并回來——這些是實驗室的數(shù)據(jù)——效果非常好。我們能夠在上面運行BERT并取得出色的結(jié)果。因此,我認(rèn)為這是我們希望在未來一些GPU中投入的原型,并顯示出我們有另一個比Hopper高10倍的因素要追求。
好的,讓我總結(jié)一下,并回答一些問題。
深度學(xué)習(xí)是通過硬件實現(xiàn)的,并且受到硬件的制約。算法和數(shù)據(jù)在之前的幾年里已經(jīng)存在,它們就像是GPU的火花所需的燃料-空氣混合物。它擁有足夠的能量和馬力,在足夠大的數(shù)據(jù)集上以合理的時間訓(xùn)練出足夠大的模型。
從那時起,我們的訓(xùn)練需求增長了10的8次方倍,在petaFLOP天數(shù)方面,從AlexNet的10的負(fù)2次方增長到了GPT-4的10的6次方。為了應(yīng)對這一挑戰(zhàn),我們不得不提高GPU的性能。在過去的10年里,GPU性能提升了1000倍,而剩下的10的6次方倍的增長則來自于時間和GPU數(shù)量的增加?,F(xiàn)在,人們使用近10萬個GPU的集群來訓(xùn)練這些大型模型,并花費了幾個月的時間。這確實是一個巨大的投資,但人們正在獲得證明其價值的結(jié)果。
那么,我們將從哪里繼續(xù)前進(jìn)呢?我之前已經(jīng)提到了一些內(nèi)容,盡管我沒有過多地討論稀疏性,因為我們對稀疏性還沒有一個明確的答案。然而,我仍然認(rèn)為,未來最大的收益將來自于找到如何比我們現(xiàn)在從稀疏性中獲得的2比1更好的方法。當(dāng)然,在數(shù)字方面還有很多工作要做。我談到了對數(shù)數(shù)字,它們在本質(zhì)上比整數(shù)或浮點數(shù)更具優(yōu)勢。雖然浮點數(shù)很接近,但對數(shù)數(shù)字通常具有最壞情況誤差,這種誤差比FP的最壞情況誤差要小約33%,因為每一步都經(jīng)過了縮放。
最佳剪裁是一個巨大的收益。在選擇scale factor時,需要非常謹(jǐn)慎。我不知道最小均方誤差是否真的是最佳的度量標(biāo)準(zhǔn),但它是一種容易量化和應(yīng)用的度量標(biāo)準(zhǔn),并且我們在此基礎(chǔ)上取得了良好的結(jié)果。當(dāng)進(jìn)行縮放時,需要選擇縮放的粒度。為每32或64個元素分配一個scale factor并不會帶來太大的成本。然后,可以縮放更小的數(shù)字組,使范圍更加緊湊,從而減少誤差。
接下來,我們構(gòu)建了一系列加速器來驗證這些想法。我分享了其中的兩個:MAGNe和Magnetic BERT。Magnetic BERT的表現(xiàn)非常出色。它在BERT和BERT Large上實現(xiàn)了每瓦近100萬億次的操作,而且準(zhǔn)確度幾乎可以忽略不計。這對我們來說實際上是一個驗證場,充分展示了向量縮放和最佳剪裁技術(shù)的優(yōu)勢。在進(jìn)行這種算法硬件協(xié)同設(shè)計時,這種驗證過程非常有益。我們正在努力探索如何——這總是需要一些時間和努力的。你設(shè)計了一個加速器,它只能完成一項任務(wù)?,F(xiàn)在,我面臨的問題是,如何將這個設(shè)計轉(zhuǎn)化為未來一代GPU的指令?
----- 聽眾:你提到了稀疏性,我對目前正在使用哪些技術(shù)來優(yōu)化網(wǎng)絡(luò)大小很感興趣。
Bill Dally:對,這實際上是一個不同的問題。對于網(wǎng)絡(luò)大小的優(yōu)化,我們有一個團(tuán)隊專門負(fù)責(zé)進(jìn)行神經(jīng)架構(gòu)搜索。他們會在各種參數(shù)上進(jìn)行搜索,例如層數(shù)、每層的通道數(shù)、層的大小以及它們之間的連接等。他們試圖找到一個在某種優(yōu)化定義下最優(yōu)的模型。當(dāng)然,模型越大,通常準(zhǔn)確性就越高。但如果受到執(zhí)行時間或功耗的限制,他們通常會嘗試找到最小的模型以達(dá)到一定的準(zhǔn)確度。這就是他們進(jìn)行神經(jīng)架構(gòu)搜索的目的。
與此同時,他們還會進(jìn)行網(wǎng)絡(luò)修剪,這是另一個軟件部分。我們實際上使用了幾種不同的技術(shù)。最簡單且被廣泛使用的方法是掃描一層中的權(quán)重,并根據(jù)權(quán)重的大小進(jìn)行修剪。如果你希望達(dá)到某個層的密度,它會進(jìn)行直方圖統(tǒng)計,找到那個點,并將所有低于該點的權(quán)重設(shè)為0。
我們還嘗試了一種更復(fù)雜但效果更好的方法,盡管它更昂貴。這種方法試圖計算每個權(quán)重的敏感度。它不僅關(guān)注權(quán)重的值,還關(guān)注與該權(quán)重連接的其它值對輸出的影響。通過查看敏感度,它能夠找到最不敏感的權(quán)重進(jìn)行修剪。
這就是目前我們廣泛使用的兩種技術(shù)。
聽眾:我對于復(fù)雜的指令很感興趣。你提到了節(jié)省了很多能量,這包括了提取和解碼能量的節(jié)省,以及操作數(shù)加載的節(jié)省。我想知道你對這兩者之間的能量分配有什么看法,以及。..
Bill Dally:我目前沒有具體的分配數(shù)字。但我認(rèn)為,在大多數(shù)情況下,提取和解碼的能量節(jié)省可能會占據(jù)主導(dǎo)地位。不過,我需要進(jìn)一步查找和確認(rèn)這些數(shù)字。
聽眾:關(guān)于縱橫交錯的體系結(jié)構(gòu),Google的TPU與NVIDIA之間在這方面的設(shè)計確實存在許多人工差異。
聽眾:NVIDIA沒有采用系統(tǒng)陣列來進(jìn)行矩陣運算,是嗎?
Bill Dally: 我們進(jìn)行的是規(guī)模較小的矩陣乘法。當(dāng)我們使用FP16或BF16時,我們的核心元素是一個4乘4的矩陣,而Google的TPU則傾向于進(jìn)行規(guī)模較大的矩陣乘法。我不記得具體的尺寸了,但其中一個尺寸是128乘128。我們沒有選擇這種做法的原因之一是,它會導(dǎo)致碎片化問題。如果你選擇了一個非常大的矩陣乘法作為基本元素,那么自然大小的矩陣可能并不是一個2的冪的整數(shù)倍。這可能會導(dǎo)致一些奇怪的情況。例如,如果你有一個4乘4的矩陣,你可能需要在某個地方四舍五入到3來適應(yīng)它。但如果你有一個128乘128的矩陣,你可能會最終四舍五入到127,這將會非常耗費資源。然而,就矩陣乘法操作的效率而言,我認(rèn)為我們做得更好一些。盡管我們沒有使用系統(tǒng)陣列,但這并不重要。因為我們在進(jìn)行矩陣乘法時,幾乎所有的能量都消耗在數(shù)學(xué)單元中。實際上,只有一小部分,大約幾個百分點,不在數(shù)學(xué)單元中。所以,采用系統(tǒng)陣列的方式并不會帶來任何好處。問題在于,向矩陣乘法輸入數(shù)據(jù)的能量成本是多少?我們可能會因為進(jìn)行較小的矩陣乘法而有一些額外的成本。我們從寄存器文件中為矩陣乘法器提供輸入。每次進(jìn)行4乘4的運算時,我們都會進(jìn)行一個264的寄存器提取——兩個4乘4的矩陣。然后得到結(jié)果,再進(jìn)行下一個4乘4的運算,依此類推。我們在進(jìn)行更大的矩陣運算時,可能會有一些額外的洗牌開銷,因為我們是以較小的顆粒度進(jìn)行的。但即使這樣,我認(rèn)為這只是噪聲,對總體性能的影響在10%左右。而Google仍然需要——他們?nèi)匀恍枰苿訑?shù)據(jù)。他們必須將數(shù)據(jù)從任何地方移動到系統(tǒng)陣列的輸入端。如果他們的成本低于10%,我會感到非常驚訝。他們還有控制開銷。他們有一些小微控制器來告訴它,現(xiàn)在進(jìn)行矩陣乘法運算,這也不是零成本。
聽眾:我想快速回到你之前提到的訓(xùn)練模型部分,你提到了查看數(shù)字和權(quán)重的分布,并對這些數(shù)字進(jìn)行剪裁。我可能錯過了一些細(xì)節(jié),但我不太確定是因為硬件的改進(jìn)使你能進(jìn)行剪裁,還是因為軟件或者像FPGA這樣的可編程硬件。所以,在整個技術(shù)堆棧中。..
Bill Dally: 不,這幾乎完全是軟件實現(xiàn)的。我們已經(jīng)有了可以使用的scale factor。這些scale factor讓我們能夠?qū)?shù)字縮放到適應(yīng)我們數(shù)字系統(tǒng)表示的動態(tài)范圍。傳統(tǒng)的方法是選擇一個scale factor,以便能夠表示最大和最小的數(shù)字。通過剪裁,你只需要選擇一個更大的scale factor?;旧希銓⒚總€數(shù)字乘以一個較大的量。然后,當(dāng)你將其轉(zhuǎn)換為較低精度時,一些數(shù)字會被剪裁。我們使用飽和算術(shù),所以這些數(shù)字會被限制在最大可表示的值。這主要是一種軟件技術(shù)。唯一涉及到硬件的部分——而我們無論如何都需要它,因為我們在進(jìn)行——如果你進(jìn)行縮放,你必須要有——在右上角的那個小乘法器,表示sw乘以sa,將兩個scale factor相乘,四舍五入,然后第二個乘法器——所以這兩個乘法器必須被添加進(jìn)去,每當(dāng)你進(jìn)行縮放時。但一旦你進(jìn)行了縮放,你可以選擇是否進(jìn)行剪裁,以及任何你想要的粒度。你只需要為額外的scale factor的表示付費,如果你以更小的粒度進(jìn)行縮放的話。
-
DRAM
+關(guān)注
關(guān)注
40文章
2349瀏覽量
185670 -
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124587 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5561瀏覽量
122815
原文標(biāo)題:NVIDIA首席科學(xué)家Bill Dally:深度學(xué)習(xí)硬件趨勢
文章出處:【微信號:算力基建,微信公眾號:算力基建】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
GTC中國大會:NVIDIA首席科學(xué)家介紹AI研究的最新進(jìn)展
NVIDIA首席科學(xué)家談3D芯片、中國崛起
NVIDIA深度學(xué)習(xí)平臺
GPU如何引爆AI時代
百度徐偉宣布入職地平線 擔(dān)任通用AI首席科學(xué)家
NVIDIA首席科學(xué)家Bill Dally公布了一個開源呼吸機(jī)設(shè)計
NVIDIA首席科學(xué)家Bill Dally將于GTC 中國線上大會首日發(fā)表主題演講
NVIDIA預(yù)測:GPU將推動AI性能逐步增長
NVIDIA將在中國多地設(shè)立研發(fā)實驗室
因優(yōu)秀人才多,NVIDIA有意在中國建立研究室
始于硬件卻也被硬件所限的深度學(xué)習(xí)
NVIDIA 首席科學(xué)家 Bill Dally 入選硅谷工程協(xié)會名人堂
NVIDIA 首席科學(xué)家 Bill Dally 將在 Hot Chips 大會發(fā)表主題演講
聚焦黃氏定律:NVIDIA 首席科學(xué)家 Bill Dally 介紹推動 GPU 性能提升的關(guān)鍵因素

評論