一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

PyTorch教程-13.4. 硬件

jf_pJlTbmA9 ? 來(lái)源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

構(gòu)建具有出色性能的系統(tǒng)需要很好地理解算法和模型以捕獲問(wèn)題的統(tǒng)計(jì)方面。同時(shí),對(duì)底層硬件至少有一點(diǎn)了解也是必不可少的。當(dāng)前部分不能替代有關(guān)硬件和系統(tǒng)設(shè)計(jì)的適當(dāng)課程。相反,它可以作為理解為什么某些算法比其他算法更有效以及如何實(shí)現(xiàn)良好吞吐量的起點(diǎn)。一個(gè)好的設(shè)計(jì)可以很容易地產(chǎn)生一個(gè)數(shù)量級(jí)的差異,反過(guò)來(lái),這可以在能夠訓(xùn)練網(wǎng)絡(luò)(例如,在一周內(nèi))和根本不能(在 3 個(gè)月內(nèi),從而錯(cuò)過(guò)最后期限)之間產(chǎn)生差異). 我們將從查看計(jì)算機(jī)開始。然后我們將放大以更仔細(xì)地查看 CPUGPU。

poYBAGR3JWaAKduVAAOR3U0tpUA128.png

圖 13.4.1每個(gè)程序員都應(yīng)該知道的延遲數(shù)。

不耐煩的讀者可以通過(guò) 圖 13.4.1來(lái)解決。它摘自 Colin Scott 的 互動(dòng)帖子 ,該帖子很好地概述了過(guò)去十年的進(jìn)展。原始數(shù)字來(lái)自 Jeff Dean 2010 年在斯坦福的演講。下面的討論解釋了這些數(shù)字的一些基本原理,以及它們?nèi)绾沃笇?dǎo)我們?cè)O(shè)計(jì)算法。下面的討論是非常高層次和粗略的。它顯然不能替代適當(dāng)?shù)恼n程,而只是為統(tǒng)計(jì)建模人員提供足夠的信息以做出適當(dāng)?shù)脑O(shè)計(jì)決策。對(duì)于計(jì)算機(jī)體系結(jié)構(gòu)的深入概述,我們建議讀者參閱 (Hennessy 和 Patterson,2011 年)或最近關(guān)于該主題的課程,例如Arste Asanovic的課程。

13.4.1。電腦

大多數(shù)深度學(xué)習(xí)研究人員和從業(yè)者都可以使用具有相當(dāng)數(shù)量?jī)?nèi)存、計(jì)算能力、某種形式的加速器(如 GPU)或其倍數(shù)的計(jì)算機(jī)。計(jì)算機(jī)由以下關(guān)鍵部件組成:

能夠執(zhí)行我們給它的程序(除了運(yùn)行操作系統(tǒng)和許多其他東西)的處理器(也稱為 CPU),通常由 8 個(gè)或更多內(nèi)核組成。

內(nèi)存 (RAM),用于存儲(chǔ)和檢索計(jì)算結(jié)果,例如權(quán)重向量和激活以及訓(xùn)練數(shù)據(jù)。

速度范圍為 1 GB/s 到 100 GB/s 的以太網(wǎng)網(wǎng)絡(luò)連接(有時(shí)是多個(gè))。在高端服務(wù)器上可以找到更高級(jí)的互連。

用于將系統(tǒng)連接到一個(gè)或多個(gè) GPU 的高速擴(kuò)展總線 (PCIe)。服務(wù)器有多達(dá) 8 個(gè)加速器,通常以高級(jí)拓?fù)溥B接,而桌面系統(tǒng)有 1 個(gè)或 2 個(gè),具體取決于用戶的預(yù)算和電源的大小。

耐用存儲(chǔ)設(shè)備,例如磁性硬盤驅(qū)動(dòng)器、固態(tài)驅(qū)動(dòng)器,在許多情況下使用 PCIe 總線連接。它提供訓(xùn)練數(shù)據(jù)到系統(tǒng)的高效傳輸,并根據(jù)需要存儲(chǔ)中間檢查點(diǎn)。

poYBAGR9OrKAHOPCAADyP_xu1VQ407.svg

圖 13.4.2計(jì)算機(jī)組件的連接性。

如圖13.4.2所示,大多數(shù)組件(網(wǎng)絡(luò)、GPU 和存儲(chǔ))都通過(guò) PCIe 總線連接到 CPU。它由多個(gè)直接連接到 CPU 的通道組成。例如,AMD 的 Threadripper 3 有 64 個(gè) PCIe 4.0 通道,每個(gè)通道都能夠在兩個(gè)方向上進(jìn)行 16 Gbit/s 的數(shù)據(jù)傳輸。內(nèi)存直連CPU,總帶寬高達(dá)100GB/s。

當(dāng)我們?cè)谟?jì)算機(jī)上運(yùn)行代碼時(shí),我們需要將數(shù)據(jù)混洗到處理器(CPU 或 GPU)、執(zhí)行計(jì)算,然后將結(jié)果從處理器移回 RAM 和持久存儲(chǔ)。因此,為了獲得良好的性能,我們需要確保它可以無(wú)縫運(yùn)行,而不會(huì)有任何一個(gè)系統(tǒng)成為主要瓶頸。例如,如果我們不能足夠快地加載圖像,處理器將無(wú)事可做。同樣,如果我們不能足夠快地將矩陣移動(dòng)到 CPU(或 GPU),它的處理元素就會(huì)餓死。最后,如果我們想通過(guò)網(wǎng)絡(luò)同步多臺(tái)計(jì)算機(jī),后者不應(yīng)該減慢計(jì)算速度。一種選擇是交錯(cuò)通信和計(jì)算。讓我們更詳細(xì)地了解各種組件。

13.4.2。記憶

最基本的內(nèi)存用于存儲(chǔ)需要隨時(shí)訪問(wèn)的數(shù)據(jù)。目前 CPU RAM 通常是 DDR4類型,每個(gè)模塊提供 20–25 GB/s 的帶寬。每個(gè)模塊都有一個(gè) 64 位寬的總線。通常使用成對(duì)的內(nèi)存模塊來(lái)允許多個(gè)通道。CPU 有 2 到 4 個(gè)內(nèi)存通道,即它們有 4 0GB/s 到 100 GB/s 的峰值內(nèi)存帶寬。每個(gè)通道通常有兩個(gè)庫(kù)。例如 AMD 的 Zen 3 Threadripper 有 8 個(gè)插槽。

盡管這些數(shù)字令人印象深刻,但它們確實(shí)只說(shuō)明了部分情況。當(dāng)我們想從內(nèi)存中讀取一部分時(shí),我們首先需要告訴內(nèi)存模塊在哪里可以找到信息。也就是說(shuō),我們首先需要將地址發(fā)送到RAM。完成此操作后,我們可以選擇只讀取單個(gè) 64 位記錄或一長(zhǎng)串記錄。后者稱為突發(fā)讀取. 簡(jiǎn)而言之,向內(nèi)存發(fā)送地址并設(shè)置傳輸大約需要 100 ns(具體取決于所使用的內(nèi)存芯片的具體時(shí)序系數(shù)),隨后的每次傳輸僅需 0.2 ns。簡(jiǎn)而言之,第一次閱讀的成本是后續(xù)閱讀的 500 倍!請(qǐng)注意,我們每秒最多可以執(zhí)行 10,000,000 次隨機(jī)讀取。這表明我們盡可能避免隨機(jī)內(nèi)存訪問(wèn),而是使用突發(fā)讀取(和寫入)。

當(dāng)我們考慮到我們有多家銀行時(shí),事情就有點(diǎn)復(fù)雜了。每個(gè)銀行都可以在很大程度上獨(dú)立地讀取內(nèi)存。這意味著兩件事。一方面,隨機(jī)讀取的有效數(shù)量高達(dá) 4 倍,前提是它們均勻分布在內(nèi)存中。這也意味著執(zhí)行隨機(jī)讀取仍然是一個(gè)壞主意,因?yàn)橥话l(fā)讀取也快了 4 倍。另一方面,由于內(nèi)存對(duì)齊到 64 位邊界,最好將任何數(shù)據(jù)結(jié)構(gòu)對(duì)齊到相同的邊界。 當(dāng)設(shè)置了適當(dāng)?shù)臉?biāo)志時(shí),編譯器幾乎會(huì) 自動(dòng)執(zhí)行此操作。我們鼓勵(lì)好奇的讀者復(fù)習(xí)一下關(guān)于 DRAM 的講座,例如Zeshan Chishti的講座。

GPU 內(nèi)存需要滿足更高的帶寬要求,因?yàn)樗鼈兊奶幚碓乇?CPU 多得多??偟膩?lái)說(shuō),有兩種選擇可以解決這些問(wèn)題。首先是使內(nèi)存總線顯著變寬。例如,NVIDIA 的 RTX 2080 Ti 具有 352 位寬的總線。這允許同時(shí)傳輸更多信息。其次,GPU 使用特定的高性能內(nèi)存。消費(fèi)級(jí)設(shè)備,例如 NVIDIA 的 RTX 和 Titan 系列通常使用GDDR6 總帶寬超過(guò) 500 GB/s 的芯片。另一種方法是使用 HBM(高帶寬內(nèi)存)模塊。它們使用非常不同的接口,并直接與專用硅晶圓上的 GPU 連接。這使得它們非常昂貴,而且它們的使用通常僅限于高端服務(wù)器芯片,例如 NVIDIA Volta V100 系列加速器。不出所料,GPU 內(nèi)存通常比 CPU 內(nèi)存小得多,因?yàn)榍罢叩某杀据^高。就我們的目的而言,它們的性能特征大體上相似,只是速度快得多。出于本書的目的,我們可以安全地忽略細(xì)節(jié)。它們僅在調(diào)整 GPU 內(nèi)核以實(shí)現(xiàn)高吞吐量時(shí)才重要。

13.4.3。貯存

我們看到 RAM 的一些關(guān)鍵特性是帶寬和 延遲。存儲(chǔ)設(shè)備也是如此,只是差異可能更加極端。

13.4.3.1。硬盤驅(qū)動(dòng)器

硬盤驅(qū)動(dòng)器(HDD) 已經(jīng)使用了半個(gè)多世紀(jì)。簡(jiǎn)而言之,它們包含許多帶有磁頭的旋轉(zhuǎn)盤片,可以定位以在任何給定軌道上讀取或?qū)懭?。高端磁盤在 9 個(gè)盤片上最多可容納 16 TB。HDD 的主要優(yōu)點(diǎn)之一是它們相對(duì)便宜。它們的眾多缺點(diǎn)之一是它們通常的災(zāi)難性故障模式和相對(duì)較高的讀取延遲。

要理解后者,請(qǐng)考慮 HDD 以大約 7,200 RPM(每分鐘轉(zhuǎn)數(shù))旋轉(zhuǎn)的事實(shí)。如果它們快得多,它們就會(huì)因施加在盤片上的離心力而破碎。在訪問(wèn)磁盤上的特定扇區(qū)時(shí),這有一個(gè)主要的缺點(diǎn):我們需要等到盤片旋轉(zhuǎn)到位(我們可以移動(dòng)磁頭但不能加速實(shí)際磁盤)。因此,在請(qǐng)求的數(shù)據(jù)可用之前,它可能需要 8 毫秒以上的時(shí)間。一種常見的表達(dá)方式是 HDD 可以以大約 100 IOP(每秒輸入/輸出操作)的速度運(yùn)行。這個(gè)數(shù)字在過(guò)去二十年中基本保持不變。更糟糕的是,增加帶寬同樣困難(大約為 100–200 MB/s)。畢竟,每個(gè)磁頭都讀取一條比特軌道,因此,比特率僅與信息密度的平方根成比例。因此,HDD 正迅速降級(jí)為非常大的數(shù)據(jù)集的歸檔存儲(chǔ)和低級(jí)存儲(chǔ)。

13.4.3.2。固態(tài)硬盤

固態(tài)硬盤 (SSD) 使用閃存來(lái)持久存儲(chǔ)信息。這允許更快地訪問(wèn)存儲(chǔ)的記錄?,F(xiàn)代 SSD 可以以 100,000 到 500,000 IOP 的速度運(yùn)行,即比 HDD 快 3 個(gè)數(shù)量級(jí)。此外,它們的帶寬可以達(dá)到 1–3GB/s,即比 HDD 快一個(gè)數(shù)量級(jí)。這些改進(jìn)聽起來(lái)好得令人難以置信。實(shí)際上,由于 SSD 的設(shè)計(jì)方式,它們具有以下警告。

SSD 以塊(256 KB 或更大)的形式存儲(chǔ)信息。它們只能作為一個(gè)整體來(lái)寫,這會(huì)花費(fèi)大量時(shí)間。因此,SSD 上的按位隨機(jī)寫入性能非常差。同樣,寫入數(shù)據(jù)通常會(huì)花費(fèi)大量時(shí)間,因?yàn)楸仨氉x取、擦除塊,然后用新信息重寫。到目前為止,SSD 控制器和固件已經(jīng)開發(fā)出算法來(lái)緩解這種情況。盡管如此,寫入速度可能會(huì)慢得多,尤其是對(duì)于 QLC(四級(jí)單元)SSD。提高性能的關(guān)鍵是維護(hù)一個(gè) 操作隊(duì)列,盡可能在大塊中優(yōu)先讀取和寫入。

SSD 中的存儲(chǔ)單元磨損相對(duì)較快(通常在幾千次寫入后就已經(jīng)磨損)。磨損級(jí)保護(hù)算法能夠?qū)⑼嘶瘋鞑サ皆S多單元上。也就是說(shuō),不建議將 SSD 用于交換文件或日志文件的大量聚合。

最后,帶寬的大幅增加迫使計(jì)算機(jī)設(shè)計(jì)人員將 SSD 直接連接到 PCIe 總線。能夠處理此問(wèn)題的驅(qū)動(dòng)器稱為 NVMe(增強(qiáng)型非易失性內(nèi)存),最多可使用 4 個(gè) PCIe 通道。在 PCIe 4.0 上這相當(dāng)于高達(dá) 8GB/s。

13.4.3.3。云儲(chǔ)存

云存儲(chǔ)提供可配置的性能范圍。也就是說(shuō),存儲(chǔ)分配給虛擬機(jī)是動(dòng)態(tài)的,無(wú)論是數(shù)量還是速度,都由用戶選擇。我們建議用戶在延遲太高時(shí)增加 IOP 的配置數(shù)量,例如,在使用許多小記錄進(jìn)行訓(xùn)練期間。

13.4.4。處理器

中央處理器 (CPU) 是任何計(jì)算機(jī)的核心部件。它們由許多關(guān)鍵組件組成:能夠執(zhí)行機(jī)器代碼的處理器內(nèi)核、連接它們的總線(特定拓?fù)湓谔幚砥餍吞?hào)、代數(shù)和供應(yīng)商之間有很大差異),以及允許更高帶寬和更低延遲內(nèi)存的緩存訪問(wèn)比從主存儲(chǔ)器讀取可能的訪問(wèn)。最后,幾乎所有現(xiàn)代 CPU 都包含矢量處理單元,以輔助高性能線性代數(shù)和卷積,因?yàn)樗鼈冊(cè)诿襟w處理和機(jī)器學(xué)習(xí)中很常見。

pYYBAGR9OrWASbCGAAUP5l63rlw559.svg

圖 13.4.3 Intel Skylake 消費(fèi)者四核 CPU。

圖 13.4.3描繪了 Intel Skylake 消費(fèi)級(jí)四核 CPU。它有一個(gè)集成的 GPU、緩存和連接四個(gè)內(nèi)核的環(huán)形總線。以太網(wǎng)、WiFi、藍(lán)牙、SSD 控制器和 USB 等外圍設(shè)備要么是芯片組的一部分,要么直接連接 (PCIe) 到 CPU。

13.4.4.1。微架構(gòu)

每個(gè)處理器內(nèi)核都包含一組相當(dāng)復(fù)雜的組件。雖然各代和供應(yīng)商之間的細(xì)節(jié)有所不同,但基本功能幾乎是標(biāo)準(zhǔn)的。前端加載指令并嘗試預(yù)測(cè)將采用哪條路徑(例如,用于控制流)。然后將指令從匯編代碼解碼為微指令。匯編代碼通常不是處理器執(zhí)行的最低級(jí)別代碼。相反,復(fù)雜的指令可以被解碼成一組更底層的操作。這些然后由實(shí)際執(zhí)行核心處理。通常后者能夠同時(shí)執(zhí)行許多操作。例如, 圖 13.4.4的 ARM Cortex A77 核心能夠同時(shí)執(zhí)行多達(dá) 8 個(gè)操作。

pYYBAGR9OriAbuwOAAN_sGZV9l4040.svg

圖 13.4.4 ARM Cortex A77 微架構(gòu)。

這意味著高效的程序可能能夠在每個(gè)時(shí)鐘周期執(zhí)行多條指令,前提是它們可以獨(dú)立執(zhí)行。并非所有單位生而平等。一些專注于整數(shù)指令,而另一些則針對(duì)浮點(diǎn)性能進(jìn)行了優(yōu)化。為了增加吞吐量,處理器還可以在分支指令中同時(shí)遵循多個(gè)代碼路徑,然后丟棄未采用的分支的結(jié)果。這就是為什么分支預(yù)測(cè)單元(在前端)很重要,以至于只追求最有希望的路徑。

13.4.4.2。矢量化

深度學(xué)習(xí)非常需要計(jì)算。因此,要使 CPU 適合機(jī)器學(xué)習(xí),需要在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行許多操作。這是通過(guò)矢量單元實(shí)現(xiàn)的。它們有不同的名稱:在 ARM 上它們被稱為 NEON,在 x86 上它們(最近一代)被稱為 AVX2 單元。一個(gè)共同點(diǎn)是它們能夠執(zhí)行 SIMD(單指令多數(shù)據(jù))操作。圖 13.4.5顯示了在 ARM 上如何在一個(gè)時(shí)鐘周期內(nèi)添加 8 個(gè)短整數(shù)。

pYYBAGR9OrqAbeUuAAEB8P3on_M294.svg

圖 13.4.5 128 位 NEON 矢量化。

根據(jù)體系結(jié)構(gòu)的選擇,此類寄存器的長(zhǎng)度可達(dá) 512 位,最多可組合 64 對(duì)數(shù)字。例如,我們可能將兩個(gè)數(shù)字相乘并將它們與第三個(gè)數(shù)字相加,這也稱為融合乘加。英特爾的 OpenVino使用這些在服務(wù)器級(jí) CPU 上實(shí)現(xiàn)深度學(xué)習(xí)的可觀吞吐量。但請(qǐng)注意,這個(gè)數(shù)字與 GPU 能夠?qū)崿F(xiàn)的目標(biāo)相比完全相形見絀。例如,NVIDIA 的 RTX 2080 Ti 擁有 4,352 個(gè) CUDA 核心,每個(gè)核心都可以隨時(shí)處理這樣的操作。

13.4.4.3。緩存

考慮以下情況:如上圖 13.4.3所示,我們有一個(gè)普通的 4 核 CPU 核,運(yùn)行頻率為 2 GHz。此外,假設(shè)我們的 IPC(每時(shí)鐘指令數(shù))計(jì)數(shù)為 1,并且這些單元啟用了 256 位寬度的 AVX2。我們進(jìn)一步假設(shè)至少有一個(gè)用于 AVX2 操作的寄存器需要從內(nèi)存中檢索。這意味著 CPU 消耗 4×256bit=128bytes每個(gè)時(shí)鐘周期的數(shù)據(jù)。除非我們能夠轉(zhuǎn)移 2×109×128=256×109每秒向處理器發(fā)送的字節(jié)數(shù),處理元素將餓死。不幸的是,這種芯片的內(nèi)存接口僅支持 20–40 GB/s 的數(shù)據(jù)傳輸,即低一個(gè)數(shù)量級(jí)。解決方法是盡可能避免從內(nèi)存加載新數(shù)據(jù),而是將其緩存在 CPU 本地。這是緩存派上用場(chǎng)的地方。通常使用以下名稱或概念:

寄存器嚴(yán)格來(lái)說(shuō)不是緩存的一部分。他們幫助階段性指示。也就是說(shuō),CPU 寄存器是 CPU 可以以時(shí)鐘速度訪問(wèn)而不會(huì)造成任何延遲損失的內(nèi)存位置。CPU 有幾十個(gè)寄存器。有效地使用寄存器取決于編譯器(或程序員)。例如 C 編程語(yǔ)言有一個(gè)register關(guān)鍵字。

L1 緩存是抵御高內(nèi)存帶寬需求的第一道防線。L1 緩存很小(典型大小可能為 32–64 KB)并且通常分為數(shù)據(jù)和指令緩存。當(dāng)在一級(jí)緩存中找到數(shù)據(jù)時(shí),訪問(wèn)速度非???。如果在那里找不到它們,搜索將沿著緩存層次結(jié)構(gòu)向下進(jìn)行。

二級(jí)緩存是下一站。根據(jù)體系結(jié)構(gòu)設(shè)計(jì)和處理器大小,它們可能是獨(dú)占的。它們可能只能由給定的核心訪問(wèn)或在多個(gè)核心之間共享。L2 緩存比 L1 更大(通常每個(gè)內(nèi)核 256–512 KB)并且更慢。此外,要訪問(wèn) L2 中的某些內(nèi)容,我們首先需要檢查以了解數(shù)據(jù)不在 L1 中,這會(huì)增加少量的額外延遲。

L3 緩存在多個(gè)內(nèi)核之間共享,并且可能非常大。AMD 的 Epyc 3 服務(wù)器 CPU 擁有分布在多個(gè)小芯片上的高達(dá) 256 MB 的緩存。更典型的數(shù)字在 4–8 MB 范圍內(nèi)。

預(yù)測(cè)接下來(lái)需要哪些存儲(chǔ)元件是芯片設(shè)計(jì)中的關(guān)鍵優(yōu)化參數(shù)之一。例如,建議以正向遍歷內(nèi)存,因?yàn)榇蠖鄶?shù)緩存算法將嘗試提前讀取而不是向后讀取。同樣,將內(nèi)存訪問(wèn)模式保持在本地是提高性能的好方法。

添加緩存是一把雙刃劍。一方面,它們確保處理器內(nèi)核不會(huì)缺少數(shù)據(jù)。同時(shí),它們?cè)黾恿诵酒叽?,占用了本?lái)可以用于提高處理能力的面積。此外,高速緩存未命中的代價(jià)可能很高??紤]最壞的情況,錯(cuò)誤共享,如圖13.4.6所示。當(dāng)處理器 1 上的線程請(qǐng)求數(shù)據(jù)時(shí),內(nèi)存位置緩存在處理器 0 上。為了獲得它,處理器 0 需要停止它正在做的事情,將信息寫回主內(nèi)存,然后讓處理器 1 從內(nèi)存中讀取它。在此操作期間,兩個(gè)處理器都在等待。這樣的代碼很可能運(yùn)行 得更慢與高效的單處理器實(shí)現(xiàn)相比,在多個(gè)處理器上。這是緩存大小存在實(shí)際限制(除了它們的物理大?。┑牧硪粋€(gè)原因。

poYBAGR9OryAdqZbAAHxhIg-NsU869.svg

圖 13.4.6虛假共享(圖片由英特爾提供)。

13.4.5。GPU 和其他加速器

可以毫不夸張地說(shuō),如果沒有 GPU,深度學(xué)習(xí)就不會(huì)成功。出于同樣的原因,GPU 制造商的財(cái)富因深度學(xué)習(xí)而大幅增加的說(shuō)法也十分合理。硬件和算法的這種共同進(jìn)化導(dǎo)致了這樣一種情況,即無(wú)論好壞,深度學(xué)習(xí)都是更可取的統(tǒng)計(jì)建模范例。因此,有必要了解 GPU 和相關(guān)加速器(如 TPU)的具體優(yōu)勢(shì) (Jouppi等人,2017 年)。

值得注意的是在實(shí)踐中經(jīng)常出現(xiàn)的區(qū)別:加速器針對(duì)訓(xùn)練或推理進(jìn)行了優(yōu)化。對(duì)于后者,我們只需要計(jì)算網(wǎng)絡(luò)中的前向傳播。反向傳播不需要存儲(chǔ)中間數(shù)據(jù)。此外,我們可能不需要非常精確的計(jì)算(FP16 或 INT8 通常就足夠了)。另一方面,在訓(xùn)練期間,所有中間結(jié)果都需要存儲(chǔ)以計(jì)算梯度。此外,累積梯度需要更高的精度以避免數(shù)值下溢(或溢出)。這意味著 FP16(或與 FP32 的混合精度)是最低要求。所有這些都需要更快、更大的內(nèi)存(HBM2 與 GDDR6)和更強(qiáng)的處理能力。例如,英偉達(dá)的 圖靈 T4 GPU 針對(duì)推理進(jìn)行了優(yōu)化,而 V100 GPU 更適合訓(xùn)練。

回憶一下圖 13.4.5中所示的矢量化。將矢量單元添加到處理器內(nèi)核使我們能夠顯著提高吞吐量。例如,在圖 13.4.5的示例中,我們能夠同時(shí)執(zhí)行 16 個(gè)操作。首先,如果我們添加不僅優(yōu)化向量之間的操作而且優(yōu)化矩陣之間的操作會(huì)怎樣?這種策略導(dǎo)致了張量核(稍后將介紹)。其次,如果我們添加更多的內(nèi)核會(huì)怎樣?簡(jiǎn)而言之,這兩種策略總結(jié)了 GPU 中的設(shè)計(jì)決策。 圖 13.4.7給出基本處理塊的概述。它包含 16 個(gè)整數(shù)和 16 個(gè)浮點(diǎn)單元。除此之外,兩個(gè)張量核心可加速一小部分與深度學(xué)習(xí)相關(guān)的附加操作。每個(gè)流式多處理器由四個(gè)這樣的塊組成。

pYYBAGR3JWuARwwKAAFmtm5KuyI085.png

圖 13.4.7 NVIDIA 圖靈處理塊(圖片由 NVIDIA 提供)。

接下來(lái),將 12 個(gè)流式多處理器組合成圖形處理集群,組成高端 TU102 處理器。充足的內(nèi)存通道和 L2 緩存補(bǔ)充了設(shè)置。圖 13.4.8 有相關(guān)的細(xì)節(jié)。設(shè)計(jì)這種設(shè)備的原因之一是可以根據(jù)需要添加或刪除單個(gè)塊,以允許更緊湊的芯片并處理良率問(wèn)題(有故障的模塊可能不會(huì)被激活)。幸運(yùn)的是,在 CUDA 和框架代碼層下,對(duì)此類設(shè)備進(jìn)行編程對(duì)于隨意的深度學(xué)習(xí)研究人員來(lái)說(shuō)是隱藏的。特別是,如果有可用資源,多個(gè)程序可能會(huì)在 GPU 上同時(shí)執(zhí)行。盡管如此,了解設(shè)備的局限性以避免選擇不適合設(shè)備內(nèi)存的模型是值得的。

pYYBAGR3JXOAEFz_AAyOeA3dddM168.png

圖 13.4.8 NVIDIA 圖靈架構(gòu)(圖片由 NVIDIA 提供)

最后一個(gè)值得更詳細(xì)地提及的方面是張量核。它們是最近趨勢(shì)的一個(gè)例子,即添加對(duì)深度學(xué)習(xí)特別有效的更優(yōu)化電路。例如,TPU 添加了一個(gè)脈動(dòng)陣列( Kung, 1988 )用于快速矩陣乘法。那里的設(shè)計(jì)是為了支持極少數(shù)(第一代 TPU 中的一個(gè))大型操作。張量核在另一端。它們針對(duì)涉及之間的小型操作進(jìn)行了優(yōu)化4×4和16×16 矩陣,取決于它們的數(shù)值精度。 圖 13.4.9給出了優(yōu)化的概覽。

poYBAGR3JXeAcSrPAAczDIsm_8k221.jpg

圖 13.4.9圖靈中的 NVIDIA 張量核心(圖片由 NVIDIA 提供)。

顯然,在優(yōu)化計(jì)算時(shí),我們最終會(huì)做出某些妥協(xié)。其中之一是 GPU 不太擅長(zhǎng)處理中斷和稀疏數(shù)據(jù)。雖然也有明顯的例外,例如 Gunrock (Wang等人,2016 年),但稀疏矩陣和向量的訪問(wèn)模式并不適合 GPU 擅長(zhǎng)的高帶寬突發(fā)讀取操作。匹配這兩個(gè)目標(biāo)是一個(gè)活躍的研究領(lǐng)域。參見例如DGL,這是一個(gè)為圖形深度學(xué)習(xí)而調(diào)整的庫(kù)。

13.4.6。網(wǎng)絡(luò)和總線

每當(dāng)單個(gè)設(shè)備不足以進(jìn)行優(yōu)化時(shí),我們需要將數(shù)據(jù)傳輸?shù)剿驈乃鼈鬏敂?shù)據(jù)以同步處理。這就是網(wǎng)絡(luò)和總線派上用場(chǎng)的地方。我們有許多設(shè)計(jì)參數(shù):帶寬、成本、距離和靈活性。一方面,我們的 WiFi 范圍很廣,非常易于使用(畢竟沒有電線),價(jià)格便宜,但它提供的帶寬和延遲相對(duì)一般。頭腦正常的機(jī)器學(xué)習(xí)研究人員不會(huì)使用它來(lái)構(gòu)建服務(wù)器集群。在下文中,我們將重點(diǎn)關(guān)注適合深度學(xué)習(xí)的互連。

PCIe是一種專用總線,用于每條通道的超高帶寬點(diǎn)對(duì)點(diǎn)連接(在 16 通道插槽中的 PCIe 4.0 上高達(dá) 32 GB/s)。延遲大約為個(gè)位數(shù)微秒 (5 μs)。PCIe 鏈接很寶貴。處理器數(shù)量有限:AMD 的 EPYC 3 有 128 條通道,Intel 的 Xeon 每個(gè)芯片最多有 48 條通道;在桌面級(jí) CPU 上,數(shù)字分別為 20 (Ryzen 9) 和 16 (Core i9)。由于 GPU 通常有 16 條通道,這限制了可以全帶寬連接到 CPU 的 GPU 數(shù)量。畢竟,它們需要與存儲(chǔ)和以太網(wǎng)等其他高帶寬外圍設(shè)備共享鏈路。就像 RAM 訪問(wèn)一樣,由于減少了數(shù)據(jù)包開銷,大容量傳輸更可取。

以太網(wǎng)是最常用的計(jì)算機(jī)連接方式。雖然它比 PCIe 慢得多,但它非常便宜且安裝靈活,并且覆蓋的距離更長(zhǎng)。低檔服務(wù)器的典型帶寬為 1 GBit/s。高端設(shè)備(例如,云中的C5 實(shí)例)提供 10 到 100 GBit/s 的帶寬。與之前的所有情況一樣,數(shù)據(jù)傳輸具有顯著的開銷。請(qǐng)注意,我們幾乎從不直接使用原始以太網(wǎng),而是使用在物理互連之上執(zhí)行的協(xié)議(例如 UDP 或 TCP/IP)。這進(jìn)一步增加了開銷。與 PCIe 一樣,以太網(wǎng)旨在連接兩個(gè)設(shè)備,例如計(jì)算機(jī)和交換機(jī)。

交換機(jī)允許我們以任意一對(duì)設(shè)備可以同時(shí)執(zhí)行(通常是全帶寬)點(diǎn)對(duì)點(diǎn)連接的方式連接多個(gè)設(shè)備。例如,以太網(wǎng)交換機(jī)可能以高截面帶寬連接 40 臺(tái)服務(wù)器。請(qǐng)注意,交換機(jī)并不是傳統(tǒng)計(jì)算機(jī)網(wǎng)絡(luò)所獨(dú)有的。甚至可以 切換PCIe 通道。這發(fā)生在例如將大量 GPU 連接到主機(jī)處理器時(shí),如P2 實(shí)例的情況。

在超高帶寬互連方面,NVLink是 PCIe 的替代方案。它提供每條鏈路高達(dá) 300 Gbit/s 的數(shù)據(jù)傳輸速率。服務(wù)器 GPU (Volta V100) 有六個(gè)鏈接,而消費(fèi)級(jí) GPU (RTX 2080 Ti) 只有一個(gè)鏈接,以降低的 100 Gbit/s 速率運(yùn)行。我們建議使用 NCCL來(lái)實(shí)現(xiàn) GPU 之間的高數(shù)據(jù)傳輸。

13.4.7。更多延遲數(shù)字

第 13.4.7 節(jié)和 第 13.4.7 節(jié)中的摘要來(lái)自Eliot Eshelman,他將數(shù)字的更新版本維護(hù)為GitHub 要點(diǎn)。

行動(dòng) 時(shí)間 筆記
一級(jí)緩存引用/命中 1.5納秒 4個(gè)周期
浮點(diǎn)加法/乘法/FMA 1.5納秒 4個(gè)周期
L2 緩存引用/命中 5納秒 12 ~ 17 周期
分支預(yù)測(cè)錯(cuò)誤 6納秒 15 ~ 20 次循環(huán)
L3 緩存命中(非共享緩存) 16納秒 42個(gè)周期
L3緩存命中(在另一個(gè)核心共享) 25納秒 65個(gè)周期
互斥鎖定/解鎖 25納秒
L3緩存命中(在另一個(gè)核心修改) 29納秒 75個(gè)周期
L3 緩存命中(在遠(yuǎn)程 CPU 插槽上) 40納秒 100 ~ 300 次循環(huán) (40 ~ 116 ns)
QPI 跳到另一個(gè) CPU(每跳) 40納秒
64MB 內(nèi)存參考。(本地 CPU) 46納秒 Broadwell E5-2690v4 上的 TinyMemBench
64MB 內(nèi)存參考。(遠(yuǎn)程 CPU) 70 納秒 Broadwell E5-2690v4 上的 TinyMemBench
256MB 內(nèi)存參考。(本地 CPU) 75 納秒 Broadwell E5-2690v4 上的 TinyMemBench
英特爾傲騰隨機(jī)寫入 94納秒 UCSD 非易失性系統(tǒng)實(shí)驗(yàn)室
256MB 內(nèi)存參考。(遠(yuǎn)程 CPU) 120納秒 Broadwell E5-2690v4 上的 TinyMemBench
英特爾傲騰隨機(jī)讀取 305納秒 UCSD 非易失性系統(tǒng)實(shí)驗(yàn)室
通過(guò) 100 Gbps HPC 結(jié)構(gòu)發(fā)送 4KB 1微秒 基于 Intel Omni-Path 的 MVAPICH2
使用 Google Snappy 壓縮 1KB 3微秒
通過(guò) 10 Gbps 以太網(wǎng)發(fā)送 4KB 10微秒
隨機(jī)寫入 4KB 到 NVMe SSD 30微秒 DC P3608 NVMe SSD(QOS 99%為500μs)
向/從 NVLink GPU 傳輸 1MB 30微秒 在 NVIDIA 40GB NVLink 上約為 33GB/s
向/從 PCI-E GPU 傳輸 1MB 80微秒 在 PCIe 3.0 x16 鏈路上約為 12GB/s
從 NVMe SSD 隨機(jī)讀取 4KB 120微秒 DC P3608 NVMe SSD (QOS 99%)
從 NVMe SSD 順序讀取 1MB 208微秒 ~4.8GB/s DC P3608 NVMe SSD
隨機(jī)寫入 4KB 到 SATA SSD 500微秒 DC S3510 SATA 固態(tài)硬盤 (QOS 99.9%)
從 SATA SSD 隨機(jī)讀取 4KB 500微秒 DC S3510 SATA 固態(tài)硬盤 (QOS 99.9%)
同一數(shù)據(jù)中心內(nèi)的往返 500微秒 單向 ping 約為 250μs
從 SATA SSD 順序讀取 1MB 2 毫秒 ~550MB/s DC S3510 SATA SSD
從磁盤順序讀取 1MB 5 毫秒 ~200MB/s 服務(wù)器硬盤
隨機(jī)磁盤訪問(wèn)(查找+旋轉(zhuǎn)) 10 毫秒
發(fā)包 CA->Netherlands->CA 150 毫秒

表:常見的延遲數(shù)字。

行動(dòng) 時(shí)間 筆記
GPU 共享內(nèi)存訪問(wèn) 30納秒 30~90 個(gè)周期(bank 沖突增加延遲)
GPU 全局內(nèi)存訪問(wèn) 200納秒 200~800次循環(huán)
在 GPU 上啟動(dòng) CUDA 內(nèi)核 10微秒 主機(jī) CPU 指示 GPU 啟動(dòng)內(nèi)核
向/從 NVLink GPU 傳輸 1MB 30微秒 在 NVIDIA 40GB NVLink 上約為 33GB/s
向/從 PCI-E GPU 傳輸 1MB 80微秒 ~12GB/s 在 PCI-Express x16 鏈路上

表:NVIDIA Tesla GPU 的延遲數(shù)。

13.4.8。概括

設(shè)備有操作開銷。因此,重要的是要針對(duì)少量的大額轉(zhuǎn)賬而不是許多小額轉(zhuǎn)賬。這適用于 RAM、SSD、網(wǎng)絡(luò)和 GPU。

矢量化是性能的關(guān)鍵。確保您了解加速器的特定功能。例如,某些 Intel Xeon CPU 特別適合 INT8 運(yùn)算,NVIDIA Volta GPU 擅長(zhǎng) FP16 矩陣-矩陣運(yùn)算,而 NVIDIA Turing 在 FP16、INT8 和 INT4 運(yùn)算方面表現(xiàn)出色。

由于小數(shù)據(jù)類型導(dǎo)致的數(shù)值溢出可能是訓(xùn)練期間的一個(gè)問(wèn)題(并且在推理期間的程度較?。?。

別名會(huì)顯著降低性能。例如,64 位 CPU 上的內(nèi)存對(duì)齊應(yīng)該按照 64 位邊界進(jìn)行。在 GPU 上,保持卷積大小對(duì)齊是個(gè)好主意,例如,與張量核心對(duì)齊。

將您的算法與硬件相匹配(例如,內(nèi)存占用和帶寬)。當(dāng)將參數(shù)裝入緩存時(shí),可以實(shí)現(xiàn)很大的加速(數(shù)量級(jí))。

我們建議您在驗(yàn)證實(shí)驗(yàn)結(jié)果之前先在紙上勾勒出新算法的性能。數(shù)量級(jí)或更多的差異是令人擔(dān)憂的原因。

使用分析器調(diào)試性能瓶頸。

訓(xùn)練和推理硬件在價(jià)格和性能方面有不同的優(yōu)勢(shì)。

13.4.9。練習(xí)

編寫C代碼測(cè)試訪問(wèn)相對(duì)于外部存儲(chǔ)器接口對(duì)齊或未對(duì)齊的內(nèi)存是否存在速度差異。提示:注意緩存效果。

測(cè)試按順序訪問(wèn)內(nèi)存或以給定步幅訪問(wèn)內(nèi)存之間的速度差異。

您如何測(cè)量 CPU 上的高速緩存大???

您將如何在多個(gè)內(nèi)存通道中布置數(shù)據(jù)以獲得最大帶寬?如果你有很多小線程,你會(huì)如何布局?

企業(yè)級(jí) HDD 的轉(zhuǎn)速為 10,000 rpm。HDD 在讀取數(shù)據(jù)之前需要花費(fèi)最壞情況的絕對(duì)最短時(shí)間是多少(您可以假設(shè)磁頭幾乎是瞬間移動(dòng))?為什么 2.5 英寸 HDD 越來(lái)越受商業(yè)服務(wù)器歡迎(相對(duì)于 3.5 英寸和 5.25 英寸驅(qū)動(dòng)器)?

假設(shè) HDD 制造商將存儲(chǔ)密度從每平方英寸 1 Tbit 提高到每平方英寸 5 Tbit。您可以在 2.5 英寸 HDD 的環(huán)上存儲(chǔ)多少信息??jī)?nèi)軌和外軌有區(qū)別嗎?

從 8 位到 16 位數(shù)據(jù)類型增加了大約四倍的硅數(shù)量。為什么?為什么 NVIDIA 會(huì)在其 Turing GPU 中添加 INT4 運(yùn)算?

通過(guò)內(nèi)存向前閱讀與向后閱讀相比快多少?這個(gè)數(shù)字在不同的計(jì)算機(jī)和 CPU 供應(yīng)商之間是否不同?為什么?編寫 C 代碼并進(jìn)行試驗(yàn)。

你能測(cè)量你的磁盤的緩存大小嗎?典型的 HDD 是什么?SSD 需要緩存嗎?

測(cè)量通過(guò)以太網(wǎng)發(fā)送消息時(shí)的數(shù)據(jù)包開銷。查看 UDP 和 TCP/IP 連接之間的區(qū)別。

直接內(nèi)存訪問(wèn)允許 CPU 以外的設(shè)備直接寫入(和讀?。﹥?nèi)存。為什么這是個(gè)好主意?

查看 Turing T4 GPU 的性能數(shù)據(jù)。為什么當(dāng)您從 FP16 到 INT8 和 INT4 時(shí),性能“僅”翻了一番?

在舊金山和阿姆斯特丹之間往返,一個(gè)包裹最短需要多長(zhǎng)時(shí)間?提示:您可以假設(shè)距離為 10,000 公里。

Discussions

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

    關(guān)注

    11

    文章

    3484

    瀏覽量

    67495
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

    13960
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    無(wú)法下載13.4 ISE Design Suite

    嗨,我試圖從頁(yè)面下載ISE 13.4 for linux。http://www.xilinx.com/support/answers/45752.htm但是瀏覽器找不到
    發(fā)表于 11-28 15:07

    可以使用vivado 2016許可證到ise webpack 13.4嗎?

    warpboard without paid license, so can help me to use vivado paid license for ise 13.4.
    發(fā)表于 12-26 11:29

    可以下載ISE 13.4的累積補(bǔ)丁嗎?

    嗨,可以下載ISE 13.4的累積補(bǔ)丁嗎?謝謝。secureasm以上來(lái)自于谷歌翻譯以下為原文Hi, It is possible download a cumulative patch for ISE 13.4 ? Thanks. secureasm
    發(fā)表于 02-15 13:19

    Pytorch自動(dòng)求導(dǎo)示例

    Pytorch自動(dòng)微分的幾個(gè)例子
    發(fā)表于 08-09 11:56

    Windows 10 Xilinx ISE 13.4錯(cuò)誤

    你好,我的Xilinx ISE 13.4(Webpack)有問(wèn)題,最近我將我的電腦從Windows 7專業(yè)版升級(jí)到Windows 10,當(dāng)我試圖打開ISE 13.4時(shí),它給了我一個(gè)錯(cuò)誤,程序沒有了。錯(cuò)誤是_pn.exe已停止工作。請(qǐng)給我一只手..緊急!!
    發(fā)表于 04-17 09:57

    Pytorch入門之的基本操作

    Pytorch入門之基本操作
    發(fā)表于 05-22 17:15

    PyTorch如何入門

    PyTorch 入門實(shí)戰(zhàn)(一)——Tensor
    發(fā)表于 06-01 09:58

    PyTorch10的基礎(chǔ)教程

    PyTorch 10 基礎(chǔ)教程(4):訓(xùn)練分類器
    發(fā)表于 06-05 17:42

    Pytorch AI語(yǔ)音助手

    想做一個(gè)Pytorch AI語(yǔ)音助手,有沒有好的思路呀?
    發(fā)表于 03-06 13:00

    如何安裝TensorFlow2 Pytorch

    如何安裝TensorFlow2 Pytorch?
    發(fā)表于 03-07 07:32

    如何往星光2板子里裝pytorch?

    如題,想先gpu版本的pytorch只安裝cpu版本的pytorch,pytorch官網(wǎng)提供了基于conda和pip兩種安裝方式。因?yàn)樵凼莚isc架構(gòu)沒對(duì)應(yīng)的conda,而使用pip安裝提示也沒有
    發(fā)表于 09-12 06:30

    蘋果發(fā)布了iOS 13.4版iPhone可以當(dāng)汽車鑰匙了

    2月6日上午消息,蘋果公司今天推出了iOS 13.4及和iPadOS 13.4的第一個(gè)開發(fā)者測(cè)試版本,分別對(duì)應(yīng)iPhone及iPad硬件產(chǎn)品,這是一次大版本升級(jí),加入了一些新功能,例如iPhone或Apple Watch可以當(dāng)作
    的頭像 發(fā)表于 02-06 17:21 ?5292次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch簡(jiǎn)單知識(shí)

    本文參考PyTorch官網(wǎng)的教程,分為五個(gè)基本模塊來(lái)介紹PyTorch。為了避免文章過(guò)長(zhǎng),這五個(gè)模塊分別在五篇博文中介紹。 Part1:PyTorch簡(jiǎn)單知識(shí) Part2:PyTorch
    的頭像 發(fā)表于 02-16 15:20 ?2506次閱讀

    PyTorch教程13.4硬件

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程13.4硬件.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 14:49 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>13.4</b>之<b class='flag-5'>硬件</b>

    英特爾加入PyTorch基金會(huì),通過(guò)PyTorch*推動(dòng)AI普及

    與創(chuàng)新,在加速AI發(fā)展方面發(fā)揮關(guān)鍵作用。加入PyTorch基金會(huì),進(jìn)一步彰顯了英特爾致力于通過(guò)技術(shù)支持并培育其生態(tài)系統(tǒng)以加速機(jī)器學(xué)習(xí)框架的演進(jìn)。 英特爾自2018年起為PyTorch提供支持,旨在通過(guò)豐富的硬件和開放的軟件推動(dòng)A
    的頭像 發(fā)表于 08-19 11:15 ?782次閱讀