【深度学习】谷歌工程师万字好文:我们为何追求高性能深度学习?如何实现?...
原文:High Performance Deep Learning
作者:Gaurav Menghani(谷歌研究院 | 軟件工程師)
譯者:青蘋果
深度學(xué)習(xí)技術(shù)的突破性進(jìn)展彰顯了其令人難以置信的潛力,提供了讓人興奮的新的 AI 增強(qiáng)軟件和系統(tǒng)。
但是,從財(cái)政、計(jì)算再到環(huán)境等幾個(gè)角度上考慮,訓(xùn)練最強(qiáng)大的模型是極其昂貴的。
提高這些模型的效率會(huì)在很多領(lǐng)域產(chǎn)生深遠(yuǎn)的影響,因此,基于這一需求,未來所開發(fā)的模型只會(huì)有助于進(jìn)一步擴(kuò)大深度學(xué)習(xí)所提供的范圍、適用性和價(jià)值。
本文將基于 arxiv 論文?Efficient Deep Learning: A Survey on Making Deep Learning Models Smaller, Faster, and Better,首先展示深度學(xué)習(xí)領(lǐng)域模型的快速增長,及其在繼續(xù)擴(kuò)大規(guī)模的階段激發(fā)了對(duì)效率和性能的需求。隨后將給出一個(gè)基本框架,介紹實(shí)現(xiàn)高效深度學(xué)習(xí)的可用工具和技術(shù),并進(jìn)一步為每個(gè)重點(diǎn)領(lǐng)域提供詳細(xì)的示例,盤點(diǎn)工業(yè)界和學(xué)術(shù)界迄今為止的重要探索。
深度學(xué)習(xí)模型的快速增長
如今,無數(shù)應(yīng)用中都有著機(jī)器學(xué)習(xí)的身影。過去十年中,采用神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)一直是訓(xùn)練新機(jī)器學(xué)習(xí)模型的主要方法。
它的崛起通常要?dú)w功于 2012 年舉辦的 ImageNet 競(jìng)賽。就在同年,多倫多大學(xué)的一支團(tuán)隊(duì)提交了一個(gè)名為 AlexNet (以首席開發(fā)人員 Alex Krizhevsky 命名)的深度卷積網(wǎng)絡(luò)(deep convolutional network),比接下來提交的最好成績還要高出 41%。
在此之前,人們?cè)鴩L試過深度和卷積的網(wǎng)絡(luò),但不知為何從未兌現(xiàn)承諾。
90 年代,卷積層的概念最早由 LeCun 等人提出。類似地,若干神經(jīng)網(wǎng)絡(luò)也在 80 年代、90 年代陸續(xù)地進(jìn)入大眾視野。究竟是何原因讓深度網(wǎng)絡(luò)花費(fèi)如此長的時(shí)間才超越手工調(diào)優(yōu)的特征工程(feature-engineered)模型呢?
這其中結(jié)合了多種因素:
1. 計(jì)算(Compute):AlexNet 是早期依賴圖形處理單元(GPU, Graphics Processing Units)進(jìn)行訓(xùn)練的模型之一。
2. 算法(Algorithms):采用 ReLU 作為激活函數(shù),使得梯度反向傳播地更深。先前的深度網(wǎng)絡(luò)迭代采用的是 Sigmoid 或 Tanh 激活函數(shù),除了很小的輸入范圍外,在 1.0 或 - 1.0 處達(dá)到飽和。因此,改變輸入變量會(huì)導(dǎo)致非常微小的梯度,而當(dāng)存在很多層時(shí),梯度基本上就消失了。三個(gè)激活函數(shù)的圖像如下所示:
簡言之,ReLU 不會(huì)出現(xiàn)梯度消失的問題,而且從計(jì)算的角度上看,Sigmoid 和 Tanh 激活函數(shù)均需要計(jì)算指數(shù),復(fù)雜度高,而 ReLU 通過簡單的閾值便可得到激活值。
3. 數(shù)據(jù)(Data):ImageNet(全球最大的圖像識(shí)別數(shù)據(jù)庫)包含有 > 1M 的數(shù)千個(gè)類型、數(shù)百張有標(biāo)注的圖像。隨著互聯(lián)網(wǎng)產(chǎn)品的出現(xiàn),從用戶行為中收集標(biāo)注數(shù)據(jù)的成本也不斷降低。
鑒于這一開拓性的工作,人們競(jìng)相使用越來越多的參數(shù)來創(chuàng)建更深層的網(wǎng)絡(luò)。如 VGGNet、Inception,、ResNet 等模型架構(gòu),在隨后的幾年里相繼打破了以往 ImageNet 的競(jìng)賽記錄。如今,這些模型也已在現(xiàn)實(shí)世界中進(jìn)行了部署。
我們?cè)谧匀徽Z言理解(NLU, Natural Language Understanding)領(lǐng)域也看到了類似的效果,Transformer 架構(gòu)在 GLUE 任務(wù)上顯著優(yōu)于之前的基準(zhǔn)測(cè)試。
隨后,BERT 和 GPT 模型都演示了在 NLP 相關(guān)任務(wù)上的改進(jìn),并且 BERT 衍生了幾個(gè)相關(guān)的模型架構(gòu),對(duì)其各個(gè)方面進(jìn)行了優(yōu)化。而 GPT-3 只需要給定的提示便可續(xù)寫生動(dòng)逼真的故事,作為最強(qiáng)的文本生成模型成功地引發(fā)了人們的關(guān)注。
上述兩個(gè)模型都已部署到現(xiàn)實(shí)的生產(chǎn)中。
在谷歌搜索引擎(Google Search)中使用 BERT 可以提高結(jié)果的相關(guān)性,而 GPT-3 可作為 API 供感興趣的用戶使用。
可以推斷,深度學(xué)習(xí)研究一直關(guān)注于改善現(xiàn)有的技術(shù)水平,因此,我們看到了在圖像分類、文本分類等基準(zhǔn)上的不斷優(yōu)化。神經(jīng)網(wǎng)絡(luò)的每一次新突破都會(huì)導(dǎo)致網(wǎng)絡(luò)復(fù)雜性、參數(shù)數(shù)量、訓(xùn)練網(wǎng)絡(luò)所需的訓(xùn)練資源數(shù)量以及預(yù)測(cè)延遲等方面的增加。
現(xiàn)在,諸如 GPT-3 的自然語言模型僅訓(xùn)練一次迭代都要花費(fèi)數(shù)百萬美元,而且其中還不包括嘗試不同的超參組合(微調(diào))或手動(dòng) / 自動(dòng)運(yùn)行調(diào)試模型架構(gòu)的成本。毫不夸張地說,這些模型的參數(shù)數(shù)量高達(dá)數(shù)十億甚至數(shù)萬億。
與此同時(shí),這些模型令人難以置信的性能也催生出將其應(yīng)用于新任務(wù)的需求,力求突破現(xiàn)有的技術(shù)瓶頸。這就產(chǎn)生了一個(gè)有趣的問題,這些模型的傳播速度會(huì)受其效率的限制。
更具體地說,隨著深度學(xué)習(xí)新時(shí)代的到來,以及模型變得越來越大并在不同的領(lǐng)域傳播,我們難免會(huì)面臨著以下問題:
1. 可持續(xù)的服務(wù)器端擴(kuò)展(Sustainable Server-Side Scaling):訓(xùn)練和部署大型深度學(xué)習(xí)模型的成本很高。雖然訓(xùn)練可能只是一次性成本(如果使用預(yù)訓(xùn)練的模型可能是免費(fèi)的),但是部署和讓推理持續(xù)很長時(shí)間段仍可能很昂貴。此外,對(duì)用于培訓(xùn)和部署這些大型模型的數(shù)據(jù)中心的碳足跡(carbon footprint),也是一種非常現(xiàn)實(shí)的擔(dān)憂。像谷歌、Facebook、亞馬遜等大型組織每年在其數(shù)據(jù)中心上的資本支出高達(dá)數(shù)十億美元。因此,任何效率的提高都是非常顯著的。
2. 啟用設(shè)備部署(Enabling On-Device Deployment):隨著智能手機(jī)和物聯(lián)網(wǎng)設(shè)備(IoT devices)的出現(xiàn),其上部署的應(yīng)用程序必須是實(shí)時(shí)的。因此,對(duì)設(shè)備上的 ML 模型便產(chǎn)生了一定的需求(其中模型推理直接發(fā)生在設(shè)備上),這就使得優(yōu)化它們將要運(yùn)行設(shè)備的模型成為當(dāng)務(wù)之急。
3. 隱私和數(shù)據(jù)敏感性(Privacy & Data Sensitivity):當(dāng)用戶數(shù)據(jù)可能對(duì)處理 / 受到各種限制(如歐洲 GDPR 法律)敏感時(shí),能夠使用少量數(shù)據(jù)進(jìn)行訓(xùn)練是至關(guān)重要的。因此,用一小部分?jǐn)?shù)據(jù)有效地訓(xùn)練模型就意味著需要更少的數(shù)據(jù)收集。類似地,啟用設(shè)備上的模型意味著模型推理可以完全在用戶的設(shè)備上運(yùn)行,而無需再將輸入數(shù)據(jù)發(fā)送到服務(wù)器端。
4. 新應(yīng)用程序(New Applications):效率還可以啟用在現(xiàn)有資源約束下無法執(zhí)行的應(yīng)用程序。
5. 模型爆炸(Explosion of Models):通常,在同一設(shè)備上可能并發(fā)地提供多個(gè) ML 模型。這便進(jìn)一步減少了單個(gè)模型的可用資源。這可能發(fā)生在服務(wù)器端,其中多個(gè)模型可能位于同一臺(tái)機(jī)器上,也可能位于用于不同功能的不同模型的應(yīng)用程序中。
高效深度學(xué)習(xí)
我們所確定的核心挑戰(zhàn)是效率。效率可能是一個(gè)看似寬泛的術(shù)語,我們此處明確了需要重點(diǎn)調(diào)查研究的兩個(gè)方面。
1. 推理效率(Inference Efficiency):這主要處理部署用于推理的模型(依據(jù)給定輸入計(jì)算模型輸出)的人可能會(huì)提及的問題。比如,這種模型小嗎?快不快?具體來說,這個(gè)模型包含多少參數(shù)?磁盤大小、推理階段的 RAM 消耗、推理延遲各為多少呢?
2. 訓(xùn)練效率(Training Efficiency):這涉及到訓(xùn)練模型的人可能提問的問題,比如模型訓(xùn)練需要多長時(shí)間?訓(xùn)練需要多少設(shè)備?模型能適應(yīng)內(nèi)存嗎?此外,還可能包括以下問題,模型需要多少數(shù)據(jù)才能在給定任務(wù)上實(shí)現(xiàn)預(yù)期的性能呢?
如果在給定的任務(wù)上有兩個(gè)同樣出色的模型,可能想要選擇其中一個(gè)更好地、更為理想的模型,在上述兩個(gè)方面都可以做到最佳。
如果要在推理受到限制的設(shè)備(如移動(dòng)和嵌入式設(shè)備)或昂貴的設(shè)備(云服務(wù)器)上部署模型,則需要注意推理效率。同樣地,如果一個(gè)人要用有限或昂貴的訓(xùn)練資源上從頭開始訓(xùn)練一個(gè)大型模型,那么開發(fā)旨在提高訓(xùn)練效率的模型將會(huì)有所幫助。
無論優(yōu)化的目標(biāo)是什么,我們都希望達(dá)到最佳效果。這意味著,選擇的任何模型對(duì)于所關(guān)注的權(quán)衡而言都是最好的。作為圖 2 中的一個(gè)例子,綠點(diǎn)表示帕累托最優(yōu)(pareto-optimal)模型,其中沒有其他模型(紅點(diǎn))在相同推理延遲或相反的情況下獲得更高的準(zhǔn)確性。與此同時(shí),帕累托最優(yōu)模型(綠點(diǎn))形成所謂的帕累托邊界。根據(jù)定義,帕累托邊界模型比其他模型更有效,因?yàn)樗鼈冊(cè)诮o定的權(quán)衡下表現(xiàn)最好。因此,當(dāng)尋求效率時(shí),更應(yīng)該將帕累托相關(guān)的最新發(fā)現(xiàn)和進(jìn)展放在考慮范圍之內(nèi)。
反過來,高效的深度學(xué)習(xí)可被定義為一組算法、技術(shù)、工具和基礎(chǔ)結(jié)構(gòu)的集合,它們可以協(xié)同工作,允許用戶訓(xùn)練和部署帕累托最優(yōu)模型,這些模型只需花費(fèi)更少的資源來訓(xùn)練和 / 或部署,同時(shí)實(shí)現(xiàn)類似的結(jié)果。
那么,影響深度學(xué)習(xí)效率的關(guān)鍵所在又是哪些?
深度學(xué)習(xí)模型效率的核心領(lǐng)域之一:建模 4 大支柱
在關(guān)注模型質(zhì)量的同時(shí),其效率方面也不容忽視。當(dāng)一個(gè)組織開始考慮構(gòu)建高效的深度學(xué)習(xí)模型,以通過方案提高交付能力時(shí),這些執(zhí)行方案所需的軟件和硬件工具便是實(shí)現(xiàn)高性能的基礎(chǔ)。
接下來,本文將大致分為以下兩部分進(jìn)行介紹:首先是建模技術(shù)的四大支柱 ——?壓縮技術(shù)(Compression Techniques)、學(xué)習(xí)技巧(Learning Techniques)、自動(dòng)化(Automation)、高效模型的架構(gòu)和層(Efficient Model Architectures & Layers),然后是已有的基礎(chǔ)設(shè)施與硬件基礎(chǔ)。
1、壓縮技術(shù)
如先前所述,壓縮技術(shù)作為通用技術(shù)可以幫助神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)一層或多層的更有效表示,但可能會(huì)在質(zhì)量上有所取舍。效率可以來自于改進(jìn)一個(gè)或多個(gè)足跡指標(biāo),如模型大小、推理延遲、收斂所需的訓(xùn)練時(shí)間等,以盡可能換取少的質(zhì)量損失。通常,模型可能被過度參數(shù)化(over-parameterized)。在這種情況下,這些技術(shù)還有助于改進(jìn)對(duì)未知數(shù)據(jù)的泛化。
(1)剪枝(Pruning):這是一種流行的壓縮技術(shù),我們可以對(duì)無關(guān)緊要的網(wǎng)絡(luò)連接進(jìn)行剪枝,從而使網(wǎng)絡(luò)變得稀疏。LeCun 等人在其所發(fā)表的題為 “最優(yōu)腦損傷”(OBD, Optimal Brain Damage)的論文中,將神經(jīng)網(wǎng)絡(luò)中的參數(shù)(層間連接)減少了 4 倍,同時(shí)還提高了推理速度和泛化能力。
Hassibi 等人和 Zhu 等人在 OBD 方法的基礎(chǔ)上提出了 Optimal Brain Surgeon 工作,這是一種性能較好的網(wǎng)絡(luò)剪枝技術(shù),利用誤差函數(shù)的二次導(dǎo)數(shù)信息,解析預(yù)測(cè)權(quán)值擾動(dòng)對(duì)函數(shù)的影響程度,以自頂向下的方式削弱或消除部分連接權(quán),實(shí)現(xiàn)網(wǎng)絡(luò)的結(jié)構(gòu)化。這些方法采用預(yù)訓(xùn)練到合理質(zhì)量的網(wǎng)絡(luò),然后迭代刪除顯著性得分最低的參數(shù),顯著性得分用于衡量特定連接的重要性,這樣對(duì)驗(yàn)證損失的影響就會(huì)最小化。一旦剪枝結(jié)束,網(wǎng)絡(luò)就會(huì)用剩余的參數(shù)進(jìn)行微調(diào)。重復(fù)這個(gè)過程,直到網(wǎng)絡(luò)被剪枝到所需的級(jí)別。
在剪枝的各種工作中,差異主要體現(xiàn)在以下幾個(gè)方面:
l 顯著性(Saliency):這是決定應(yīng)該剪枝哪個(gè)連接的啟發(fā)式方法。這可以基于連接權(quán)相對(duì)于損失函數(shù)的二階導(dǎo)數(shù),連接權(quán)的大小等等。
l 非結(jié)構(gòu)化 v/s 結(jié)構(gòu)化(Unstructured v/s Structured):非結(jié)構(gòu)化剪枝是剪枝方法中最靈活的一種,對(duì)于所有給定的參數(shù)都是 “一視同仁”。而在結(jié)構(gòu)化剪枝中,參數(shù)在 size> 1 的塊中進(jìn)行修剪(例如在權(quán)矩陣中進(jìn)行 row-wise 修剪或在卷積濾波器中進(jìn)行 channel-wise 修剪)。結(jié)構(gòu)化剪枝允許在大小和延遲方面更容易地利用推理時(shí)間,因?yàn)檫@些修剪后的參數(shù)塊可以被智能地跳過以進(jìn)行存儲(chǔ)和推理。
l 分布(Distribution):可以在每層設(shè)置相同的剪枝預(yù)算,或者在每層的基礎(chǔ)上進(jìn)行分配。經(jīng)驗(yàn)直覺告訴我們,某些層相對(duì)來說更容易剪枝一些。例如,通常情況下,前幾層如果足夠小,則無法容忍顯著的稀疏。
l 調(diào)度(Scheduling):然而,額外的標(biāo)準(zhǔn)是該剪枝多少以及何時(shí)進(jìn)行呢?我們是想在每輪中修剪等量的參數(shù),還是在剪枝開始時(shí)較快,然后逐漸放慢呢?
l 再生(Regrowth):在某些情況下,允許網(wǎng)絡(luò)再生剪枝的連接,這樣網(wǎng)絡(luò)就會(huì)以相同百分比的連接剪枝不斷運(yùn)行。
就實(shí)際使用而言,具備有意義的塊大小的結(jié)構(gòu)化剪枝可以輔助提高延遲。在保留相同 Top-1 精度的情況下,Elsen 等人構(gòu)建的稀疏卷積網(wǎng)絡(luò)使用約 66% 的參數(shù),比稠密網(wǎng)絡(luò)高出 1.3 - 2.4 倍。他們通過其庫將 NHWC(輸入數(shù)據(jù)格式:channels-last)標(biāo)準(zhǔn)密集表示轉(zhuǎn)換為特殊的 NCHW(channels-first)“塊壓縮稀疏行” (BCSR, Block Compressed Sparse Row)表示,這適用于使用其高速內(nèi)核在 ARM 設(shè)備、WebAssembly(相對(duì) JavaScript 而言的另一種可以在瀏覽器中執(zhí)行的編程語言)等上的進(jìn)行快速推理。盡管他們也引入了一些約束以限制可加速的稀疏網(wǎng)絡(luò)類型,但總的來說,這是朝著實(shí)際改進(jìn)剪枝網(wǎng)絡(luò)的足跡指標(biāo)邁出的有希望的一步。
(2)量化(Quantization):量化是另一種非常流行的壓縮技術(shù)。它沿用了這樣一種思路,即典型網(wǎng)絡(luò)中幾乎所有權(quán)值都是 32 位浮點(diǎn)值,如果我們?cè)敢饨档鸵恍┠P唾|(zhì)量的話,如準(zhǔn)確率、精度、召回率等指標(biāo),便可實(shí)現(xiàn)以較低精度的格式(16 位、8 位、4 位等)來存儲(chǔ)這些值。
例如,當(dāng)模型持久化時(shí),以將權(quán)值矩陣(weight matrix)中的最小值映射為 0,而將最大值映射為(其中 b 是精度位數(shù)),并線性地將它們之間的所有值外推(extrapolate)為整數(shù)。通常,這足以減少模型的大小。例如,如果 b = 8,則將 32 位浮點(diǎn)權(quán)值映射為 8 位無符號(hào)整數(shù)(unsigned integers),該操作可以將空間減少 4 倍。在進(jìn)行推理(計(jì)算模型預(yù)測(cè))時(shí),我們可以使用數(shù)組的量化值和最小 & 最大浮點(diǎn)值恢復(fù)原始浮點(diǎn)值(由于舍入誤差)的有損表示(lossy representation)。鑒于要量化模型的權(quán)重,于是此步被稱為權(quán)重量化(Weight Quantization)。
由于大量的參數(shù),有損表示和舍入誤差對(duì)于內(nèi)置冗余的大型網(wǎng)絡(luò)可能問題不大,但對(duì)于小型網(wǎng)絡(luò)而言,由于其對(duì)誤差的敏感性強(qiáng),可能會(huì)降低精度。
可以以實(shí)驗(yàn)的方式模擬訓(xùn)練過程中權(quán)重量化的舍入行為來解決這個(gè)問題。通過在模型訓(xùn)練圖中添加節(jié)點(diǎn)來量化和反量化(dequantize)激活函數(shù)和權(quán)重矩陣,這樣神經(jīng)網(wǎng)絡(luò)操作的訓(xùn)練時(shí)間輸入看起來與推理階段相同。這種節(jié)點(diǎn)稱為偽量化(Fake Quantization)節(jié)點(diǎn)。這種訓(xùn)練方式使得網(wǎng)絡(luò)對(duì)推理模式下的量化行為具有更強(qiáng)的魯棒性。請(qǐng)注意,現(xiàn)在正在訓(xùn)練中進(jìn)行激活量化(Activation Quantization)和權(quán)重量化。Jacob 等人和 krishnamoori 等人詳細(xì)描述了訓(xùn)練時(shí)間模擬量化這一步驟。
由于權(quán)值和激活都是在模擬的量化模式下運(yùn)行的,這意味著所有層接收的輸入都可以以較低的精度表示,在模型經(jīng)過訓(xùn)練后,它應(yīng)該具備很強(qiáng)的魯棒性,能夠直接在低精度下執(zhí)行數(shù)學(xué)運(yùn)算。例如,如果我們訓(xùn)練模型在 8 位域中復(fù)制量化,則可以部署該模型對(duì) 8 位整數(shù)執(zhí)行矩陣乘法和其他操作。
在諸如移動(dòng)、嵌入式和物聯(lián)網(wǎng)設(shè)備之類的資源受限的設(shè)備上,使用 GEMMLOWP 等庫可以將 8 位操作提速 1.5 - 2 倍,這些庫依賴于硬件支持,如 ARM 處理器上的 Neon intrinsic。此外,Tensorflow Lite 等框架允許用戶直接使用量化操作,而不必為底層實(shí)現(xiàn)而煩惱。
除了剪枝和量化,還有其他一些技術(shù),如低秩矩陣分解、K-Means 聚類、權(quán)值共享等等,這些技術(shù)在模型壓縮領(lǐng)域也十分活躍。
總的來說,壓縮技術(shù)可以用來減少模型的足跡(大小、延遲等),同時(shí)換取一些質(zhì)量(準(zhǔn)確性、精度、召回率等)的提升。
2、學(xué)習(xí)技巧
(1)蒸餾(Distillation):如前所述,學(xué)習(xí)技術(shù)嘗試以不同的方式訓(xùn)練模型,以獲得最佳性能。例如,Hinton 等人在其開創(chuàng)性工作中探索了如何教會(huì)小型網(wǎng)絡(luò)從大型網(wǎng)絡(luò) / 大型網(wǎng)絡(luò)的集合中提取暗知識(shí)(dark knowledge| Hinton said: “Dark knowledge is the most of what deep learning methods actually learn”)。他們使用一個(gè)更大的教師模型(teacher model)在現(xiàn)有標(biāo)簽數(shù)據(jù)生成軟標(biāo)簽。
軟標(biāo)簽為原始數(shù)據(jù)中的每個(gè)可能的類別分配概率,而不是硬二進(jìn)制值。直覺上,這些軟標(biāo)簽捕獲了模型可以學(xué)習(xí)的不同類之間的關(guān)系。例如,卡車更像汽車而非蘋果,這一模型可能無法直接從硬標(biāo)簽中學(xué)習(xí)。學(xué)生網(wǎng)絡(luò)(student network)學(xué)習(xí)最小化這些軟標(biāo)簽的交叉熵?fù)p失(cross-entropy loss),以及原始真實(shí)的硬標(biāo)簽。損失函數(shù)的每個(gè)權(quán)重可以根據(jù)實(shí)驗(yàn)結(jié)果進(jìn)行縮放。
Hinton 等人曾在論文中表示,能夠用一個(gè)蒸餾模型來接近 10 個(gè)模型集成的語音識(shí)別任務(wù)的準(zhǔn)確性。其他綜合研究表明,小型模型質(zhì)量有著顯著提高。簡單舉個(gè)例子,Sanh 等人能夠蒸餾一個(gè)學(xué)生模型,該模型保留了 BERT-Base 97% 的性能,同時(shí)在 CPU 上的占用率要少 40%,而速度上快約 60%。
(2)數(shù)據(jù)增強(qiáng)(Data Augmentation):通常對(duì)于大型模型和復(fù)雜任務(wù)來說,擁有的數(shù)據(jù)越多,改進(jìn)模型性能的機(jī)會(huì)就越大。然而,常常采用 “人在回路”(human in the loop)的解決辦法,所以獲取高質(zhì)量的標(biāo)記數(shù)據(jù)通常既緩慢又昂貴。監(jiān)督學(xué)習(xí)就是從這些人工標(biāo)注的數(shù)據(jù)中學(xué)習(xí)。當(dāng)有資源支付標(biāo)注費(fèi)用的時(shí)候,它非常有效,但我們能夠且應(yīng)該做得更好。
數(shù)據(jù)增強(qiáng)主要指在計(jì)算機(jī)視覺領(lǐng)域中對(duì)圖像進(jìn)行數(shù)據(jù)增強(qiáng),從而彌補(bǔ)訓(xùn)練圖像數(shù)據(jù)集不足,達(dá)到對(duì)訓(xùn)練數(shù)據(jù)擴(kuò)充的目的,進(jìn)而提升模型的性能。通常,它涉及到對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,這樣就不需要重新標(biāo)注,該過程成為標(biāo)簽不變轉(zhuǎn)換(label-invariant transformations)。例如,如果您正在教神經(jīng)網(wǎng)絡(luò)對(duì)包含狗或貓的圖像進(jìn)行分類,旋轉(zhuǎn)圖像將不會(huì)改變標(biāo)簽。此外,其他的轉(zhuǎn)換形式還有水平 / 垂直翻轉(zhuǎn)、拉伸、裁剪、添加高斯噪聲等。類似地,如果您正在檢測(cè)給定文本的情感傾向性,引入拼寫錯(cuò)誤可能不會(huì)改變標(biāo)簽。
這種標(biāo)簽不變轉(zhuǎn)換已經(jīng)在流行的深度學(xué)習(xí)模型中廣泛使用。當(dāng)您有大量的類和 / 或特定類的示例很少時(shí),它們尤其方便。
還有其他轉(zhuǎn)換方式,如 Mixup,它以加權(quán)的方式混合來自兩個(gè)不同類的輸入,并將標(biāo)簽視為兩個(gè)類的類似加權(quán)組合。其思想是,模型應(yīng)該能夠提取出與這兩個(gè)類相關(guān)的特性。
這些技術(shù)將數(shù)據(jù)效率引入到 pipeline 中。這和教孩子在不同的上下文中識(shí)別現(xiàn)實(shí)生活中的物體實(shí)質(zhì)上沒有太大的區(qū)別。
(3)自監(jiān)督學(xué)習(xí)(Self-Supervised Learning):在鄰近的領(lǐng)域有了快速的進(jìn)展,我們可以學(xué)習(xí)一些通用模型,這些模型完全不需要使用標(biāo)注來從數(shù)據(jù)中提取意義。采用對(duì)比學(xué)習(xí)(contrastive learning)這樣的方法,我們可以訓(xùn)練一個(gè)模型,使它學(xué)習(xí)輸入的表示,這樣類似的輸入將有類似的表示,而不相關(guān)的輸入會(huì)生成明顯差異的表示。其中,這些表示是 n 維向量(embeddings),在我們可能沒有足夠的數(shù)據(jù)來從頭訓(xùn)練模型的其他任務(wù)中,它可以作為有用的特征。我們可以把使用未標(biāo)注數(shù)據(jù)的第一步看作是預(yù)訓(xùn)練,下一步視為微調(diào)。
這種對(duì)未標(biāo)注數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練和對(duì)標(biāo)注數(shù)據(jù)進(jìn)行微調(diào)的兩步過程也迅速得到了 NLP 社區(qū)的認(rèn)可。ULMFiT 率先提出了訓(xùn)練通用語言模型的想法,該模型學(xué)習(xí)如何解決預(yù)測(cè)給定句子中的下一個(gè)單詞的任務(wù)。
我們發(fā)現(xiàn),使用大量預(yù)處理但未標(biāo)注的數(shù)據(jù),如 WikiText-103(源自英文維基百科頁面),是預(yù)訓(xùn)練步驟的一個(gè)不錯(cuò)的選擇。這就足以讓模型學(xué)習(xí)語言的一般屬性。此外,對(duì)于二進(jìn)制分類問題,微調(diào)這種預(yù)訓(xùn)練模型只需要 100 個(gè)標(biāo)注示例,而相比之下,其他情況則需要 10000 個(gè)標(biāo)注的示例。
該想法也在 BERT 模型中進(jìn)行了探索,其中預(yù)訓(xùn)練步驟涉及學(xué)習(xí)雙向掩碼語言模型(Masked Language Model),使得模型必須在句子中預(yù)測(cè)缺失的單詞。
總的來說,學(xué)習(xí)技術(shù)有助于我們?cè)诓挥绊懽阚E的情況下提高模型質(zhì)量。這可以用于改進(jìn)部署的模型質(zhì)量。如果原始模型的質(zhì)量令人滿意的話,你還可以通過簡單地減少網(wǎng)絡(luò)中的參數(shù)數(shù)量來交換新獲得的質(zhì)量收益,以改進(jìn)模型大小和延遲,直到回到最低可行的模型質(zhì)量。
有了正確的軟件、硬件和技術(shù)以后,有效地開發(fā)高性能模型的能力,現(xiàn)在取決于如何利用自動(dòng)化來加速實(shí)驗(yàn)過程,并構(gòu)建最高效的數(shù)據(jù)模型架構(gòu)。
3、自動(dòng)化
如果讓自動(dòng)化幫助網(wǎng)絡(luò)設(shè)計(jì)和調(diào)優(yōu),它將大大減少人類的參與成本和隨之而來的偏見。然而,其隨之而來的代價(jià)是計(jì)算成本增加。
(1)超參數(shù)優(yōu)化(Hyper-Parameter Optimization):屬于此類工作的常用方法之一是超參數(shù)優(yōu)化(HPO, Hyper-Parameter Optimization)。調(diào)整超參數(shù)(如初始學(xué)習(xí)率,權(quán)值衰減等)對(duì)于加快收斂速度至關(guān)重要。當(dāng)然,還有一些決定網(wǎng)絡(luò)架構(gòu)的參數(shù),比如全連接層的數(shù)量,卷積層中的過濾器數(shù)量等等。雖然我們可以通過實(shí)驗(yàn)建立直覺思維,但找到最佳超參數(shù)值需要手動(dòng)搜索能夠優(yōu)化給定目標(biāo)函數(shù)的準(zhǔn)確值,往往是驗(yàn)證集上的損失值。
如果用戶之前對(duì)超參數(shù)調(diào)優(yōu)有經(jīng)驗(yàn),那么可以使用網(wǎng)格搜索算法(Grid Search,也稱為參數(shù)掃描)來自動(dòng)化 HPO。在這種情況下,根據(jù)用戶提供的每個(gè)參數(shù)的有效范圍搜索給定超參數(shù)的所有獨(dú)特且有效的組合。例如,如果學(xué)習(xí)率(lr, learning rate)的可能值為 {0.01,0.05},權(quán)重衰減(weight decay)的可能值為 {0.1,0.2},則有 4 種可能的組合:{lr=0.01, decay=0.1}、{lr=0.01, decay=0.2}、{lr=0.05, decay=0.1} 和 {lr=0.05, decay=0.2}。
以上每種組合都是一次試驗(yàn),然后每次試驗(yàn)都可以并行運(yùn)行。一旦所有試驗(yàn)完成,超參數(shù)的最優(yōu)組合便被找到。由于該方法會(huì)嘗試所有可能的組合,嘗試總數(shù)增長非常快,因此遭受維度的詛咒。
另一種方法是隨機(jī)搜索(Random Search),其中從用戶提供的可能值范圍所構(gòu)建的搜索空間中進(jìn)行隨機(jī)采樣試驗(yàn)。類似于網(wǎng)格搜索,每個(gè)試驗(yàn)仍然是獨(dú)立并行運(yùn)行。然而,鑒于試驗(yàn)獨(dú)立同分布(iid, ?independently and identically distributed)的特點(diǎn),隨機(jī)搜索很容易根據(jù)可用的計(jì)算能力進(jìn)行擴(kuò)展,從而找到最優(yōu)試驗(yàn)的可能性隨著試驗(yàn)次數(shù)的增加而增加。如果到目前為止最好的試驗(yàn)足夠好,這就允許預(yù)先搜索。整個(gè)超參搜索的過程可視為一個(gè)在有限資源限制下的優(yōu)化問題,在資源分配方面,類似于隨機(jī)搜索的典型算法有 SHA(succession Halving)和 HyperBand,可以把更多的資源分配給精度更高或者優(yōu)化速度更快的算法。
基于貝葉斯優(yōu)化(BO, Bayesian Optimization)的搜索是一種更好的調(diào)優(yōu)方法,它保留了一個(gè)單獨(dú)的模型以用于預(yù)測(cè)給定的試驗(yàn)是否有可能改進(jìn)到目前為止發(fā)現(xiàn)的最佳試驗(yàn)。該模型學(xué)會(huì)根據(jù)過去試驗(yàn)的表現(xiàn)來預(yù)測(cè)可能性。BO 優(yōu)于隨機(jī)搜索,因?yàn)榍罢呔哂幸欢ǖ膶?dǎo)向性。因此,需要更少的試驗(yàn)就可以達(dá)到最佳。由于試驗(yàn)的選擇依賴于過去試驗(yàn)的結(jié)果,因此該方法是順序的。然而,與純粹邏輯的 BO 相比,可以在同一時(shí)間并行地產(chǎn)生多個(gè)試驗(yàn)(基于相同的估計(jì)),這可能引發(fā)更快的收斂,其代價(jià)可能是一些浪費(fèi)的試驗(yàn)。
在實(shí)際使用方面,HPO 可以通過幾個(gè)軟件工具包提供給用戶,這些工具包包括算法本身以及一個(gè)易于使用的界面(指定超參數(shù)及其范圍),包括 Vizier [8](一個(gè)內(nèi)部谷歌工具,也可以通過谷歌云進(jìn)行黑箱調(diào)優(yōu))。亞馬遜提供了 Sagemaker,其功能類似,也可以作為 AWS(Amazon Web Services)服務(wù)訪問。NNI、Tune 和 Advisor 是其他可以在本地使用的開源 HPO 軟件包。這些工具包為不樂觀的早期停止策略提供了一個(gè)選項(xiàng)。Vizier 使用中位數(shù)停止規(guī)則,如果一個(gè)試驗(yàn)在時(shí)間步長 t 上的性能低于所有試驗(yàn)運(yùn)行到該時(shí)間點(diǎn)的中位數(shù)性能,則終止試驗(yàn)。
(2)神經(jīng)架構(gòu)搜索(NAS, Neural Architecture Search):可以把 NAS 看作是 HPO 的擴(kuò)展版本,在其中搜索改變網(wǎng)絡(luò)架構(gòu)本身的參數(shù)。NAS 可考慮由以下部分組成:
丨搜索空間(Search Space):卷積、全連接、池化等操作及其相互連接是圖中允許的神經(jīng)網(wǎng)絡(luò)操作。這都是由用戶提供的。
丨搜索算法和狀態(tài)(Search Algorithm & State):這是控制架構(gòu)搜索本身的算法。通常,適用于 HPO 的標(biāo)準(zhǔn)算法(網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化和進(jìn)化算法等)也同樣可用于 NAS,以及強(qiáng)化學(xué)習(xí)(Reinforcement Learning)和梯度下降(Gradient Descent)。
丨評(píng)估策略(Evaluation Strategy):這定義了用于評(píng)估模型適合的度量指標(biāo)。它可以是簡單的常規(guī)度量,如驗(yàn)證損失(validation loss)、準(zhǔn)確性(accuracy)等;或者也可以是一個(gè)復(fù)合度量(compound metric),如 MNasNet,可以根據(jù)精度和模型延遲創(chuàng)建單一的定制度量指標(biāo)。
具有搜索空間和狀態(tài)的搜索算法可被視為生成樣本候選網(wǎng)絡(luò)的 “控制器”。評(píng)估階段對(duì)生成的候選進(jìn)行適合的訓(xùn)練和評(píng)估,然后將這個(gè)適應(yīng)值(fitness value)作為反饋傳遞給搜索算法,該算法將使用它來生成更好的候選對(duì)象。
Zoph 等人在 2016 年發(fā)表的論文中證明,端到端神經(jīng)網(wǎng)絡(luò)架構(gòu)可以通過強(qiáng)化學(xué)習(xí)生成。在這種情況下,控制器本身就是一個(gè)遞歸神經(jīng)網(wǎng)絡(luò)(RNN, Recurrent Neural Network),它一次生成一層前饋網(wǎng)絡(luò)的架構(gòu)超參數(shù),如濾波器數(shù)量、步幅、濾波器大小等。訓(xùn)練控制器本身很昂貴(需要 22400 個(gè) GPU 小時(shí)),因?yàn)檎麄€(gè)候選網(wǎng)絡(luò)必須從頭開始訓(xùn)練,才能實(shí)現(xiàn)單一的梯度更新。在后續(xù)論文中,作者改進(jìn)了搜索空間以搜索單元(cells):一個(gè) “正常單元”(Normal Cell),可以接收輸入,處理并返回相同空間維度的輸出。“縮減單元”(Reduction Cell)處理其輸入并返回其空間維度按比例縮小 2 倍的輸出。每個(gè)單元都是????塊的組合。控制器的 RNN 每次生成一個(gè)塊,它選擇過去兩個(gè)塊的輸出,分別進(jìn)行操作并將其組合為單個(gè)輸出。正常和縮減單元堆積以交替的方式堆疊,用于構(gòu)建 CIFAR-10 和 ImageNet 的端到端網(wǎng)絡(luò)。
與中的端到端網(wǎng)絡(luò)搜索相比,單獨(dú)學(xué)習(xí)這些單元而不是學(xué)習(xí)整個(gè)網(wǎng)絡(luò)似乎可以將搜索時(shí)間提高 7 倍,同時(shí)擊敗當(dāng)時(shí) CIFAR-10 的最先進(jìn)的搜索技術(shù)。
其他方法,如進(jìn)化技術(shù)(evolutionary techniques)、可區(qū)分架構(gòu)搜索(differentiable architecture search)、漸進(jìn)式搜索(progressive search)、,參數(shù)共享(parameter sharing)等,這些方法的共同之處在于試圖降低架構(gòu)搜索的成本。
在評(píng)估候選網(wǎng)絡(luò)時(shí),不僅要關(guān)注質(zhì)量,還要關(guān)注模型大小、延遲等內(nèi)存占用指標(biāo)。架構(gòu)搜索可以輔助實(shí)現(xiàn)多目標(biāo)搜索和優(yōu)化。例如,MNasNet 將模型在目標(biāo)移動(dòng)設(shè)備上的延遲直接合并到目標(biāo)函數(shù)中,如下所示:
其中,????是候選模型,????????????是準(zhǔn)確率指標(biāo),????????????給定模型在設(shè)備上的延遲,????表示目標(biāo)延遲。????的取值建議設(shè)為?0.07。
概括來說,自動(dòng)化對(duì)模型的效率起著至關(guān)重要的作用。HPO 現(xiàn)在是訓(xùn)練模型的自然步驟,可以提取顯著的質(zhì)量改進(jìn),同時(shí)最大限度地減少人工參與。而且 HPO 也可以在獨(dú)立的軟件庫以及云服務(wù)中使用。類似地,NAS 的最新進(jìn)展也使得以學(xué)習(xí)的方式構(gòu)建體系結(jié)構(gòu)成為可能,同時(shí)對(duì)質(zhì)量和內(nèi)存空間都有限制。假設(shè) NAS 運(yùn)行完成需要 GPU 的運(yùn)行時(shí)長達(dá)數(shù)百小時(shí),并且在領(lǐng)先的云計(jì)算服務(wù)上,GPU 每小時(shí)的成本約為 3 美元,這使得使用 NAS 方法完全經(jīng)濟(jì)可行,并且在針對(duì)多個(gè)目標(biāo)進(jìn)行優(yōu)化時(shí),成本上與模型體系結(jié)構(gòu)的手動(dòng)實(shí)驗(yàn)不同。
4、高效架構(gòu)(模型 & 層)
另一個(gè)常見主題是重新設(shè)計(jì)比基線更好的高效層和模型,這些層和模型可以用于特定任務(wù)或作為一般的黑盒。
(1)視覺(Vision):視覺領(lǐng)域中高效層的經(jīng)典示例之一是使用了卷積層,它改進(jìn)了視覺模型中的全連接(FC, Fully Connected)層。不過,FC 層存在兩個(gè)主要問題:
丨 FC 層忽略輸入像素的空間信息。直觀地說,很難通過孤立地觀察單個(gè)像素值來構(gòu)建對(duì)給定輸入的理解。此外,還忽略了鄰域的空間局部性。
丨使用 FC 層還會(huì)在處理中等大小的輸入時(shí)導(dǎo)致參數(shù)數(shù)量的激增。一個(gè) 100 × 100 的 RGB 圖像有 3 個(gè)通道,第一層的每個(gè)神經(jīng)元有 3 × 104 個(gè)連接,這使得網(wǎng)絡(luò)也容易過度擬合(overfitting)。
卷積層通過學(xué)習(xí)過濾器來避免這種情況,每個(gè)過濾器都是固定大小的 3D 權(quán)重矩陣(33, 55 等),第三維與輸入通道的數(shù)量相同。每個(gè)過濾器都對(duì)輸入進(jìn)行卷積操作,生成給定過濾器的特征映射。每個(gè)過濾器都可以學(xué)習(xí)檢測(cè)邊緣等特征(水平、垂直、對(duì)角線等),從而在特征映射中發(fā)現(xiàn)該特征存在的更高值。總的來說,單個(gè)卷積層的特征映射可以從圖像中提取有意義的信息。堆疊在上面的卷積層將使用前一層生成的特征映射作為輸入,逐步學(xué)習(xí)更復(fù)雜的特征。
卷積層效率背后的核心思想是,在圖像的任何位置都使用相同的過濾器,不論應(yīng)用在哪。讓我們?cè)倩氐綆?3 個(gè)通道的 100×100 RGB 圖像的例子,5 × 5 濾波器意味著總共有 75 個(gè)(5 × 5 × 3)參數(shù)。每一層都可以學(xué)習(xí)多個(gè)獨(dú)特的過濾器,并且仍處在非常合理的參數(shù)預(yù)算之內(nèi)。這還具有正則化的效果,其中參數(shù)數(shù)量的顯著減少,可以更容易的優(yōu)化和更好的泛化。
(2)深度可分離卷積層(Depth-Separable Convolutional Layers):在卷積操作中,每個(gè)濾波器用于在兩個(gè)空間維度和第三通道維度上進(jìn)行卷積。由此看來,每個(gè)過濾器的大小是?×??× input_channels,其中和通常是相等的。針對(duì)每個(gè)濾波器都是同樣的操作,因此卷積操作同時(shí)發(fā)生在 x 和 y 維度的空間,并在 z 維度中向縱深處進(jìn)行。
深度可分離卷積將此劃分為兩個(gè)步驟:
丨 用 1 x 1 個(gè)過濾器進(jìn)行逐點(diǎn)卷積(point-wise convolution),這樣得到的特征映射現(xiàn)在達(dá)到 output_channels 的深度。
丨在和維度中使用??×?過濾器進(jìn)行空間卷積。
這兩種操作堆疊在一起(有任何中間非線性激活)會(huì)得到與常規(guī)卷積相同形狀的輸出,但參數(shù)要少得多。類似地,計(jì)算量減少了一個(gè)數(shù)量級(jí),因?yàn)橹瘘c(diǎn)卷積對(duì)每個(gè)輸入通道的深度卷積要便宜得多。Xception 模型架構(gòu)演示了在 Inception 體系結(jié)構(gòu)中使用深度可分離卷積,允許在保持參數(shù)數(shù)量相同的情況下,實(shí)現(xiàn)更快地收斂,并在 ImageNet 數(shù)據(jù)集上獲取更高的精度。
MobileNet 模型架構(gòu)是為移動(dòng)和嵌入式設(shè)備設(shè)計(jì)的,它也使用深度可分離層而不是常規(guī)的卷積層。這有助于減少 7-10 倍的參數(shù)數(shù)量和乘法運(yùn)算,并允許在移動(dòng)端部署計(jì)算機(jī)視覺(CV, Computer Vision)任務(wù)。用戶可以預(yù)期 10-100 毫秒之間的延遲,只不過具體還得取決于模型。MobileNet 還通過深度倍增器(depth multiplier)提供了一個(gè)旋鈕(knob),用于擴(kuò)展網(wǎng)絡(luò),使用戶能夠在準(zhǔn)確性和延遲之間進(jìn)行權(quán)衡。
(3)注意力機(jī)制(Attention Mechanism):在自然語言方面,我們也看到了快速的進(jìn)步。對(duì)于序列到序列(sequence-to-sequence)模型,一個(gè)持久存在的問題是信息瓶頸(information-bottleneck)。這些模型通常由編碼器(Encoder)和解碼器(Decoder)構(gòu)成。其中,編碼器對(duì)應(yīng)輸入序列,負(fù)責(zé)將信息編碼到上下文向量中;而解碼器對(duì)應(yīng)輸出序列,響應(yīng)生成上下文的輸出序列。這類任務(wù)的一個(gè)典型例子是機(jī)器翻譯,其中輸入序列是源語言中的句子,輸出序列是目標(biāo)語言中的句子。
傳統(tǒng)的做法是在編碼器和解碼器中都使用 RNN。然而,第一個(gè)解碼器層只能看到最終編碼器步驟的隱藏狀態(tài)。這就造成了一種 “瓶頸”,因?yàn)榻獯a器的第一步必須從最終隱藏狀態(tài)中提取所有信息。
Bahdanau 等人最初在機(jī)器翻譯中引入了注意力機(jī)制,使解碼器能夠看到編碼器的所有狀態(tài),目前已成為神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的重要組成部分。這是一種根據(jù)序列與另一向量(即 query vector)的相似性來突出輸入序列的相關(guān)部分并將輸入序列壓縮為上下文向量的方法。在機(jī)器翻譯等序列到序列任務(wù)中,這允許基于所有編碼器狀態(tài)(表示為 keys 和 values)和解碼器以前的隱藏狀態(tài)(query vector)來裁剪(tailoring)解碼器的輸入。上下文向量是基于解碼器先前隱藏狀態(tài)的編碼器狀態(tài)的加權(quán)和。由于 Attention 創(chuàng)建了編碼器狀態(tài)的加權(quán)和,因此權(quán)重也可以用于可視化網(wǎng)絡(luò)的行為。
(4)Transformer & Friends:Transformer 架構(gòu)是 Google 于 2017 年在發(fā)布的經(jīng)典文章 “Attention is all you need” 中提出,該模型致力于解決 sequence to sequence 問題,掀起了對(duì)解碼器和編碼器的重點(diǎn)關(guān)注。在編碼器中,它們采用自注意機(jī)制(self-attention),其中鍵、值和查詢向量都是從前面的編碼器層派生而來。更重要的是,Transformer 網(wǎng)絡(luò)的訓(xùn)練成本比可與之媲美的替代方案要低兩個(gè)數(shù)量級(jí)。
另一個(gè)核心思想是,self-attention 允許并行化獲取輸入序列中 tokens 之間關(guān)系的過程。RNN 固有地迫使過程一步一步地發(fā)生。例如,在 RNN 中,token 的上下文可能只有在處理了整個(gè)序列之后才能完全理解。而有了注意力,所有的 tokens 都被一起處理,并且可以學(xué)習(xí)成對(duì)的關(guān)系。這就使得利用優(yōu)化的訓(xùn)練設(shè)備(如 GPUs 和 TPUs)變得更容易。
正如在上文所介紹的,BERT 模型架構(gòu)在幾個(gè) NLU 基準(zhǔn)測(cè)試中擊敗了最先進(jìn)的水平。BERT 的網(wǎng)絡(luò)架構(gòu)使用的就是多層的 Transformer 結(jié)構(gòu),通過注意力機(jī)制有效的解決了 NLP 中棘手的長期依賴問題,更徹底的捕捉語句中的雙向關(guān)系。當(dāng)然,它也可以用作通用編碼器,更好地處理其他任務(wù)。與之相類似的模型,如 GPT 家族也在許多 NLU 任務(wù)上得到了廣泛的應(yīng)用。
現(xiàn)有基礎(chǔ)設(shè)施
在介紹完上述的四個(gè)重點(diǎn)領(lǐng)域(壓縮技術(shù)、學(xué)習(xí)方法、自動(dòng)化和高效架構(gòu))之后,本文將以對(duì)訓(xùn)練和部署高性能模型至關(guān)重要的基礎(chǔ)設(shè)施簡介作為結(jié)束。
為了能夠有效地訓(xùn)練和運(yùn)行推理,必須有強(qiáng)大的軟件和硬件基礎(chǔ)設(shè)施基礎(chǔ)。。
1、軟件生態(tài)系統(tǒng)
(1)Tensorflow 生態(tài)系統(tǒng):
Tensorflow (TF) 是一種流行的機(jī)器學(xué)習(xí)框架,已被許多大型企業(yè)用于實(shí)際的生產(chǎn)過程。它為模型效率提供了最廣泛的軟件支持。
Tensorflow Lite for On-Device Use Cases:Tensorflow Lite (TFLite) 是一組工具和庫,旨在用于邊緣設(shè)備等低資源環(huán)境中的推理。
TensorflowJS (TF.JS) 是 TF 生態(tài)系統(tǒng)中的一個(gè)庫,可用于在瀏覽器中或使用 Node.js 訓(xùn)練和運(yùn)行神經(jīng)網(wǎng)絡(luò)。這些模型也可以通過 WebGL 接口通過 GPU 加速 。它既支持導(dǎo)入在 TF 中訓(xùn)練的模型,也支持在 TF.JS 中從頭開始創(chuàng)建新模型。還有 TF 模型優(yōu)化工具包 ,它提供在模型圖中添加量化、稀疏性、權(quán)重聚類等。
用于服務(wù)器端加速的 XLA:XLA(加速線性代數(shù))是一種圖形編譯器,它可以通過為圖形定制的操作(內(nèi)核)生成新的實(shí)現(xiàn)來優(yōu)化模型中的線性代數(shù)計(jì)算。
(2)PyTorch 生態(tài)系統(tǒng):?
PyTorch 是學(xué)術(shù)界和工業(yè)界都在使用的另一個(gè)流行的機(jī)器學(xué)習(xí)平臺(tái),它在可用性和功能方面可以與 Tensorflow 相媲美。
設(shè)備上用例:PyTorch 還具有一個(gè)輕量級(jí)解釋器,可以在移動(dòng)設(shè)備上運(yùn)行 PyTorch 模型。PyTorch 還提供訓(xùn)練后量化和其他圖優(yōu)化。
通用模型優(yōu)化:PyTorch 提供了即時(shí) (JIT) 編譯工具,用于從 TorchScript 中的代碼生成模型的可序列化中間表示,TorchScript 是 Python 的一個(gè)子集,并添加了類型等功能 - 檢查。它幫助在用于研究和開發(fā)的靈活 PyTorch 代碼與可部署用于生產(chǎn)推理的表示之間建立橋梁。這是在移動(dòng)設(shè)備上執(zhí)行 PyTorch 模型的主要方式。
PyTorch 中 ,XLA 的替代品似乎是 Glow 和 TensorComprehension 編譯器。它們有助于生成從更高級(jí)別的 IR(如 TorchScript)派生的較低級(jí)別的中間表示 (IR)。
PyTorch 還提供了一個(gè)模型調(diào)整指南,其中詳細(xì)介紹了 ML 從業(yè)者可以使用的各種方法。其中的一些核心思想是:
丨使用 PyTorch JIT 融合逐點(diǎn)運(yùn)算(加、減、乘、除等)。
丨啟用緩沖區(qū)檢查點(diǎn)允許僅將某些層的輸出保留在內(nèi)存中,并在向后傳遞期間計(jì)算其余層。這特別有助于廉價(jià)計(jì)算具有大輸出(如激活)的層。
丨啟用特定于設(shè)備的優(yōu)化,例如 cuDNN 庫和使用 NVIDIA GPU 的混合精度訓(xùn)練(在 GPU 小節(jié)中解釋)。
丨 Train with Distributed Data Parallel Training,適用于數(shù)據(jù)量大,有多個(gè) GPU 進(jìn)行訓(xùn)練的情況。
(3)硬件優(yōu)化庫
可以通過優(yōu)化運(yùn)行神經(jīng)網(wǎng)絡(luò)的硬件的軟件堆棧來進(jìn)一步提高效率。例如,ARM 的 Cortex 系列處理器支持 SIMD(單指令多數(shù)據(jù))指令,該指令允許使用 Neon 指令集對(duì)操作(處理批量數(shù)據(jù))進(jìn)行矢量化。QNNPACK 和 XNNPACK ?庫針對(duì)移動(dòng)和嵌入式設(shè)備的 ARM Neon 以及 x86 SSE2、AVX 架構(gòu)等進(jìn)行了優(yōu)化。前者用于 PyTorch 的量化推理模式,后者支持 32 位浮點(diǎn) - 點(diǎn)模型和 TFLite 的 16 位浮點(diǎn)。同樣,還有其他低級(jí)庫,如 Accelerate for iOS 和 NNAPI for Android,它們?cè)噲D從更高級(jí)別的 ML 框架中抽象出硬件級(jí)加速?zèng)Q策。
2、硬件?
GPU:圖形處理單元 (GPU) 雖然最初設(shè)計(jì)用于加速計(jì)算機(jī)圖形,但在 2007 年之后, CUDA 庫的可用性擴(kuò)大。AlexNet 在 2012 年贏得了 ImageNet 競(jìng)賽標(biāo)準(zhǔn)化 GPU 在深度學(xué)習(xí)模型中的使用。從那以后,英偉達(dá)發(fā)布了多次迭代的 GPU 微架構(gòu),越來越關(guān)注深度學(xué)習(xí)性能。它還引入了 Tensor Cores,這是一種專用的執(zhí)行單元,支持一系列精度(fp32、TensorFloat32、fp16、bfloat16、int8、int4)的訓(xùn)練和推理。
降低精度乘法累加 (MAC) 操作:B x C 是一項(xiàng)昂貴的操作,因此它以降低的精度完成。
Tensor Cores 優(yōu)化了標(biāo)準(zhǔn)的乘法累加 (MAC) 操作,A = (B × C) + D。其中,B 和 C 的精度降低(fp16、bfloat16、TensorFloat32),而 A 和 D 的精度為 fp32 . 根據(jù)模型架構(gòu)和所選 GPU,NVIDIA 報(bào)告稱,通過這種降低精度的 MAC 操作,訓(xùn)練速度提高了 1 到 15 倍。
NVIDIA 最新的 Ampere 架構(gòu) GPU 中的 Tensor Cores 還支持更快的稀疏推理。他們展示了推理時(shí)間高達(dá) 1.5 倍的加速,以及單個(gè)層高達(dá) 1.8 倍的加速。除此之外,NVidia 還提供了 cuDNN 庫 ,其中包含標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)操作的優(yōu)化版本,例如完全連接、卷積、激活等等。
在 GPU 和 TPU 上訓(xùn)練和推理期間使用的數(shù)據(jù)類型。bfloat16 起源于 TPU,僅 NVidia GPU 支持 Tensor Float 32。
TPU:TPU 是專用集成電路 (ASIC),由谷歌設(shè)計(jì)用于使用 Tensorflow 加速深度學(xué)習(xí)應(yīng)用程序,并經(jīng)過微調(diào)以并行化和加速線性代數(shù)運(yùn)算。TPU 架構(gòu)支持使用 TPU 進(jìn)行訓(xùn)練和推理,并可通過其 Google Cloud 服務(wù)向公眾開放。
TPU 芯片的核心架構(gòu)利用了 Systolic Array 設(shè)計(jì),其中將大量計(jì)算拆分為網(wǎng)狀拓?fù)?#xff0c;每個(gè)單元計(jì)算部分結(jié)果并將其按順序傳遞給下一個(gè)單元,每個(gè)時(shí)鐘 - step(以類似于心臟收縮節(jié)律的有節(jié)奏方式),無需將中間結(jié)果存儲(chǔ)在內(nèi)存中。
每個(gè) TPU 芯片有兩個(gè) Tensor Cores,每個(gè)都有一個(gè)脈動(dòng)陣列網(wǎng)格。一塊 TPU 板上有 4 個(gè)相互連接的 TPU 芯片。為了進(jìn)一步擴(kuò)展訓(xùn)練和推理,可以在網(wǎng)狀拓?fù)渲羞B接更多數(shù)量的 TPU 板以形成 “pod”。根據(jù)公開發(fā)布的數(shù)字,每個(gè) TPU 芯片 (v3) 可以達(dá)到 420 teraflops,而一個(gè) TPU pod 可以達(dá)到 100+ petaflops。TPU 已在 Google 內(nèi)部用于諸如 Google 搜索訓(xùn)練模型、通用 BERT 模型、DeepMind 的 AlphaGo 和 AlphaZero 等應(yīng)用。與 GPU 類似,TPU 支持 bfloat16 數(shù)據(jù)類型,這是一種以全浮點(diǎn) 32 位精度訓(xùn)練的低精度替代方案。
EdgeTPU:
EdgeTPU 也是谷歌設(shè)計(jì)的定制 ASIC 芯片。與 TPU 類似,它專門用于加速線性代數(shù)運(yùn)算,但僅用于推理,并且在邊緣設(shè)備上的計(jì)算預(yù)算要低得多。它進(jìn)一步僅限于操作的子集,并且僅適用于 int8 量化 Tensorflow Lite 模型。EdgeTPU 芯片本身比 1 美分硬幣還小,因此適合部署在多種物聯(lián)網(wǎng)設(shè)備中。它已部署在類似 Raspberry Pi 的開發(fā)板中,在 Pixel 4 智能手機(jī)中作為 Pixel Neural Core,也可以獨(dú)立焊接到 PCB 上。
Jetson Nano 模塊
Jetson:Jetson 是 Nvidia 的一系列加速器,用于為嵌入式和物聯(lián)網(wǎng)設(shè)備啟用深度學(xué)習(xí)應(yīng)用程序。它包括 Nano,這是一個(gè)為輕量級(jí)部署而設(shè)計(jì)的低功耗 “模塊系統(tǒng)”(SoM),以及更強(qiáng)大的 Xavier 和 TX 變體,它們基于 NVidia Volta 和 Pascal GPU 架構(gòu)。Nano 適用于家庭自動(dòng)化等應(yīng)用,其余適用于工業(yè)機(jī)器人等計(jì)算密集型應(yīng)用。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯黃海廣老師《機(jī)器學(xué)習(xí)課程》課件合集 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【深度学习】谷歌工程师万字好文:我们为何追求高性能深度学习?如何实现?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】NLP模型BERT和经典数据集
- 下一篇: 【深度学习】用 YOLO v5+Deep