人工智能是計(jì)算領(lǐng)域的熱門話題之一,并且有著充分的理由。深度學(xué)習(xí)(DL)中的新技術(shù)在某些問題上有能力創(chuàng)建比人類精確度更好的神經(jīng)網(wǎng)絡(luò)。圖像識別是深度學(xué)習(xí)(DL)模型如何在識別圖像中的對象(對象檢測和分類)方面實(shí)現(xiàn)比人類準(zhǔn)確性更好的一個(gè)例子。
ImageNet競賽就是一個(gè)例子。自2010年以來,ImageNet大規(guī)模視覺識別挑戰(zhàn)(ILSVRC)已被用作圖像識別改進(jìn)的衡量標(biāo)準(zhǔn)。在2011年,其錯(cuò)誤率約為25%(該工具可以正確識別培訓(xùn)數(shù)據(jù)集之外的75%的圖像)。2012年,深度神經(jīng)網(wǎng)絡(luò)(DNN)的錯(cuò)誤率降低到16%。在接下來的幾年里,其錯(cuò)誤率將降至個(gè)位數(shù)。在2017年,36支參賽團(tuán)隊(duì)中有29人的失誤率低于5%,這通常要比人類識別做的更好。
深度學(xué)習(xí)使用各種類型的神經(jīng)網(wǎng)絡(luò),可應(yīng)用于各種各樣的問題。創(chuàng)建深度學(xué)習(xí)模型通常有兩個(gè)主要步驟:第一步就是所謂的訓(xùn)練。這是讓模型重復(fù)讀取輸入數(shù)據(jù)集,并調(diào)整模型參數(shù)以最小化錯(cuò)誤(正確輸出與計(jì)算輸出之間的差異)的過程。這一步需要大量的輸入,需要極端大量的計(jì)算量。
第二步發(fā)生在模型訓(xùn)練后,稱之為推理。這是訓(xùn)練模型在生產(chǎn)中的部署。生產(chǎn)意味著該模型可用于讀取未用于培訓(xùn)的數(shù)據(jù)。它產(chǎn)生用于某個(gè)任務(wù)的輸出,而不是訓(xùn)練神經(jīng)網(wǎng)絡(luò)。這一步也有一個(gè)計(jì)算組件。它不需要大量計(jì)算,它需要實(shí)現(xiàn)諸如最小化延遲、最佳可能精度,最大化吞吐量,以及最大化能源效率等目標(biāo)。
用于執(zhí)行這兩個(gè)步驟的計(jì)算的軟件由框架完成。這些軟件工具和數(shù)據(jù)庫可以讀取通常用Python編寫的腳本,告訴框架需要什么樣的操作以及神經(jīng)網(wǎng)絡(luò)是什么樣的。該代碼然后由框架讀取,然后執(zhí)行??蚣艿睦佑蠺ensorflow、Caffe或PyTorch。
有關(guān)IO模式的問題
通過研究深度學(xué)習(xí)(DL)框架的功能,可以了解IO模式。人們不需要知道具體框架的細(xì)節(jié),也不需要了解神經(jīng)網(wǎng)絡(luò)背后的數(shù)學(xué)知識。
深度學(xué)習(xí)(DL)框架中訓(xùn)練步驟的基本流程非常簡單。神經(jīng)網(wǎng)絡(luò)需要相當(dāng)多的輸入數(shù)據(jù)來正確訓(xùn)練網(wǎng)絡(luò)來執(zhí)行任務(wù)。它可以是圖像、視頻、音量、數(shù)字或幾乎任何數(shù)據(jù)的組合。
人們需要大量的數(shù)據(jù)。此外,其數(shù)據(jù)必須非常多樣化,并為每個(gè)輸入提供廣泛的信息。例如,確定某人是男性還是女性的簡單面部識別需要超過1億張圖像。
輸入數(shù)據(jù)能夠以各種方式進(jìn)行存儲,從簡單的csv文件中獲取真正少量的輸入數(shù)據(jù),以便了解深度神經(jīng)網(wǎng)絡(luò)(DNN)的數(shù)據(jù)庫,以及包含圖像的數(shù)據(jù)庫。只要深度神經(jīng)網(wǎng)絡(luò)(DNN)可以訪問數(shù)據(jù)并理解輸入格式,數(shù)據(jù)也可以分布在不同的格式和工具中。它也可以是結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的組合,只要用戶知道數(shù)據(jù)和格式,并且可以在模型中表達(dá)這些數(shù)據(jù)和格式即可。
存儲介質(zhì)上的數(shù)據(jù)大小可能會有所不同。在極端情況下,來自MNIST數(shù)據(jù)集的簡單圖像是28×28灰度圖像(值從0到255)。總共有784個(gè)像素,這格式非常小。如今人們擁有4K分辨率的電視機(jī)和相機(jī)。這將是4,096 x 4,096像素,總共16,777,216個(gè)像素。
4K色彩表示通常以8位(256個(gè)選擇)開始,或者可以達(dá)到16位信息。這可能導(dǎo)致非常大的圖像。如果將一個(gè)4K圖像制作為分辨率為4520 x 2540和8位的單個(gè)未壓縮的tiff文件,則其大小為45.9 MB。而對于16位色的圖像來說,其大小為91.8 MB。
如果組織擁有1億張圖片,對于一些面部識別算法來說是合理的,組織擁有這么多文件,這對當(dāng)今的文件系統(tǒng)來說并不算太壞。在8位圖像情況下使用的總空間是4.59 PB。對于使用大型高分辨率圖像的單個(gè)神經(jīng)網(wǎng)絡(luò)(NN)來說,這是相當(dāng)大的空間。
一般來說,神經(jīng)網(wǎng)絡(luò)在訓(xùn)練網(wǎng)絡(luò)時(shí)有兩個(gè)階段。第一階段稱為前饋。它接受輸入并通過網(wǎng)絡(luò)進(jìn)行處理。輸出與正確的輸出進(jìn)行比較以產(chǎn)生錯(cuò)誤。然后通過網(wǎng)絡(luò)傳播這個(gè)錯(cuò)誤(反向傳播)來調(diào)整網(wǎng)絡(luò)的參數(shù),以便希望減少網(wǎng)絡(luò)產(chǎn)生的錯(cuò)誤。
這個(gè)過程繼續(xù)進(jìn)行,以便所有圖像通過網(wǎng)絡(luò)進(jìn)行處理。這被稱為epoch(迭代次數(shù),1個(gè)epoch等于使用訓(xùn)練集中的全部樣本訓(xùn)練一次)。培訓(xùn)一個(gè)網(wǎng)絡(luò)達(dá)到所需的性能水平可能需要數(shù)百、數(shù)千或數(shù)萬個(gè)epoch。深度學(xué)習(xí)框架(例如Tensorflow或Caffe或PyTorch)負(fù)責(zé)用戶創(chuàng)建的網(wǎng)絡(luò)模型的整個(gè)過程。
整體IO進(jìn)程
深度學(xué)習(xí)的IO模式的簡要概述是數(shù)據(jù)一次又一次地被讀取。深度學(xué)習(xí)經(jīng)常重復(fù)讀取(重讀)。請注意讀取一些文字,但與閱讀相比,它的工作量是很小的,因?yàn)樗饕窃谏窠?jīng)網(wǎng)絡(luò)訓(xùn)練期間檢查指向。但是,為了改進(jìn)神經(jīng)網(wǎng)絡(luò)訓(xùn)練,可以使用一些影響IO模式的選項(xiàng)。
作為讀取或?qū)懭霐?shù)據(jù)量的示例,在此假設(shè)網(wǎng)絡(luò)需要1億張圖像,其中每張圖像為45.9 MB。此外,假設(shè)網(wǎng)絡(luò)模型需要大約40MB來保存,并且每100個(gè)epoch保存一次,并且需要5000個(gè)epoch來訓(xùn)練模型。
如前所述,一個(gè)epoch需要讀取4.59 PB的數(shù)據(jù)。這需要重復(fù)5000次。這總共需要讀取22.95EB的數(shù)據(jù)。如果每個(gè)圖像是單個(gè)文件,它還需要讀取500億個(gè)文件。
對于寫入IO,模型需要寫入50次。這是總共2 GB和50個(gè)寫入。與讀取相比,其工作量是非常小的。
對于這個(gè)例子,總共有459個(gè)PB執(zhí)行了100億個(gè)讀取IO。隨后是40MB的寫入IO。整個(gè)IO模式總共重復(fù)50次。
這是面向識別應(yīng)用的深度神經(jīng)網(wǎng)絡(luò)(DNN)的基本IO模式。為了減少訓(xùn)練時(shí)間,可以使用幾種技術(shù)。以下的主題是從IO角度對這些技術(shù)進(jìn)行快速概述。
訓(xùn)練技巧
神經(jīng)網(wǎng)絡(luò)(NN)訓(xùn)練中使用的第一種技術(shù)是輸入數(shù)據(jù)的隨機(jī)混洗。幾乎所有的時(shí)間都用它來減少所需的歷元(參考的時(shí)刻點(diǎn))并防止過擬合(優(yōu)化模型到數(shù)據(jù)集,但是模型在現(xiàn)實(shí)世界的數(shù)據(jù)上表現(xiàn)不佳)。
在新的epoch開始之前,數(shù)據(jù)讀取的順序是隨機(jī)的。這意味著讀取的IO模式是基于每個(gè)圖像的隨機(jī)數(shù)。在閱讀個(gè)人圖像時(shí)是連續(xù)的,但在圖像之間是隨機(jī)的。因此,由于隨機(jī)性,將模式表征為“重讀”而非“讀取”是困難的。
也有可以從數(shù)據(jù)庫中讀取數(shù)據(jù)的框架。IO模式的讀取仍然非常繁重,可能會隨機(jī)對數(shù)據(jù)進(jìn)行混洗。這可能會使IO模式的細(xì)節(jié)更加復(fù)雜化,因?yàn)閿?shù)據(jù)庫位于內(nèi)存和框架之間。
有時(shí)框架也會使用IO的mmap()函數(shù)。這是一個(gè)將文件或設(shè)備映射到內(nèi)存的系統(tǒng)調(diào)用。當(dāng)將虛擬內(nèi)存區(qū)域映射到文件時(shí),它被稱為“基于文件的映射”。讀取某些內(nèi)存區(qū)域?qū)x取文件。這是默認(rèn)行為。
無論是否使用mmap(),IO模式仍然是重讀的,遵循以上討論的模式。然而,使用mmap()會使分析復(fù)雜化,因?yàn)镮O直接從文件到內(nèi)存。
另一種常用的提高訓(xùn)練性能的技術(shù)稱為批處理。在每個(gè)輸入圖像(包括向前和向后傳播)之后更新網(wǎng)絡(luò),而不是在輸入“批量”圖像之后更新網(wǎng)絡(luò)。網(wǎng)絡(luò)的反向傳播部分對錯(cuò)誤進(jìn)行操作,例如對它們進(jìn)行平均,以更新網(wǎng)絡(luò)參數(shù)。這通常不會改變IO模式,因?yàn)閳D像仍然需要被讀取,但它可能會影響收斂速度。一般來說,它可以減緩收斂速度,但后向傳播的發(fā)生較少,提高了計(jì)算速度。
在使用GPU(圖形處理單元)進(jìn)行訓(xùn)練時(shí),使用批處理還有助于提高性能。批處理不是將文件從CPU移動到GPU,而是允許用戶將多個(gè)文件復(fù)制到GPU。這可以提高從CPU到GPU的吞吐量,并減少數(shù)據(jù)傳輸時(shí)間。以這個(gè)例子為例,批處理大小為32將減少數(shù)據(jù)傳輸?shù)?125000個(gè)傳輸?shù)臄?shù)量。
批處理確實(shí)有助于收斂,但不會真正影響IO模式。該模式仍然是隨機(jī)讀取,寫入很少。但它可以改變框架創(chuàng)建的輸出量。
數(shù)據(jù)存儲與深度學(xué)習(xí)
人工智能,尤其是深度學(xué)習(xí)是一種正在改變?nèi)藗兩畹脑S多方面的計(jì)算技術(shù)。深度學(xué)習(xí)的算法需要大量的數(shù)據(jù)。數(shù)量確實(shí)取決于算法和生成的網(wǎng)絡(luò)模型的目標(biāo),但對于一些復(fù)雜的模式來說,它可能會運(yùn)行數(shù)億的輸入集合。通常,用于訓(xùn)練模型的數(shù)據(jù)越多,數(shù)據(jù)越多樣化,最終訓(xùn)練的模型就越好。這指向非常大的數(shù)據(jù)集。
在以往,有人討論數(shù)據(jù)將變得越來越冷。這意味著在創(chuàng)建數(shù)據(jù)后,很少再次使用它。而人們通過檢查數(shù)據(jù),包括工程和企業(yè)數(shù)據(jù),并發(fā)現(xiàn)了一些非常有趣的趨勢:
這兩種工作負(fù)載都更加面向?qū)懭?。讀寫字節(jié)比率已顯著下降(從4:1到2:1)
相對于只讀和只寫訪問模式,讀寫訪問模式增加了30倍。
文件很少重新打開。超過66%只重開一次,95%少于五次。
文件很少重新打開。
研究期間超過90%的活動存儲空間未被使用。
一小部分客戶占文件活動的很大一部分。不到1%的客戶占文件請求的50%。
而總結(jié)數(shù)據(jù)的總體使用非常容易。
IO模式非常重視寫入。
數(shù)據(jù)很少被重復(fù)使用,但仍然存在。
比較深入學(xué)習(xí)算法的IO模式,可以發(fā)現(xiàn)它與傳統(tǒng)工程師、HPC和企業(yè)應(yīng)用程序的做法幾乎完全相反。深度學(xué)習(xí)非常重讀IO導(dǎo)向,數(shù)據(jù)在設(shè)計(jì)和訓(xùn)練模型時(shí)被重復(fù)使用。即使在模型被訓(xùn)練之后,仍然需要用新數(shù)據(jù)來增加現(xiàn)有的訓(xùn)練數(shù)據(jù)集,特別是模型輸出中的誤差。這是為了隨著時(shí)間的推移對模型進(jìn)行的改進(jìn)。