0
本文作者: 岑大師 | 2017-11-03 05:10 |
我們生活在大數(shù)據(jù)的時代,但在實際應(yīng)用中,大多數(shù)數(shù)據(jù)是“稀疏的”。例如,如果用一個龐大的表格表示亞馬遜所有客戶與其所有產(chǎn)品的對應(yīng)映射關(guān)系,購買某個產(chǎn)品以“1”表示,未購買以“0”表示,這張表的大部分將會是0。
使用稀疏數(shù)據(jù)進行分析的算法最終做了大量的加法和乘法,而這大部分計算是無效的。通常,程序員通過編寫自定義代碼來優(yōu)化和避免零條目,但這種代碼通常編寫起來復(fù)雜,而且通常適用范圍狹窄。
雷鋒網(wǎng)發(fā)現(xiàn),在ACM的系統(tǒng)、程序、語言和應(yīng)用會議(SPLASH)上,麻省理工學(xué)院、法國替代能源和原子能委員會的研究人員和Adobe研究院的研究者們最近提出了一個針對稀疏數(shù)據(jù)自動生成優(yōu)化代碼的系統(tǒng)。相比起現(xiàn)有的非優(yōu)化軟件包,該系統(tǒng)可實現(xiàn)100倍的加速,其性能與特定稀疏數(shù)據(jù)操作的精細手工優(yōu)化代碼相當(dāng),但程序員的工作要少得多。
該系統(tǒng)的名字叫Taco,即“張量代數(shù)編譯器”的縮寫。在計算機科學(xué)上,類似亞馬遜的表格這樣的數(shù)據(jù)結(jié)構(gòu)被稱為“矩陣”,張量只是一個矩陣的更高維的模擬。如果亞馬遜表格還將客戶和產(chǎn)品與亞馬遜網(wǎng)站上的客戶的產(chǎn)品評級以及產(chǎn)品評論中使用的字詞進行了對比,那么這可以用四維張量來表示。
對張量的數(shù)學(xué)運算對于大數(shù)據(jù)分析和機器學(xué)習(xí)都是至關(guān)重要的問題。自從愛因斯坦的時代以來,它一直是科學(xué)研究的主要內(nèi)容。傳統(tǒng)上,為了處理張量計算,數(shù)學(xué)軟件將張量運算分解為不同組成部分進行計算,例如如果需要計算兩個張量相乘加第三個向量,則軟件將在前兩個張量上運行其標(biāo)準(zhǔn)張量乘法程序,存儲結(jié)果,然后再運行其標(biāo)準(zhǔn)張量加法。
舉例來說,目前我們常用的深度學(xué)習(xí)框架,如TensorFlow、PyTorch等都會將一個深度學(xué)習(xí)的模型轉(zhuǎn)換為一個由基本計算符組成的數(shù)據(jù)流圖,再有下層的計算引擎一次調(diào)度執(zhí)行這些節(jié)點對應(yīng)的內(nèi)核函數(shù)(對于數(shù)據(jù)圖的動態(tài)優(yōu)化參見雷鋒網(wǎng)此前文章《緊跟未來深度學(xué)習(xí)框架需求,TensorFlow推出Eager Execution》)。好的深度學(xué)習(xí)框架中會定義成百上千個Operator,這些Operator定義了張量的加、減、乘、除和矩陣乘法等等,因此,在深度學(xué)習(xí)訓(xùn)練中,這些節(jié)點在GPU上的執(zhí)行會轉(zhuǎn)變成數(shù)千次GPU上的內(nèi)核執(zhí)行,從而使得張量的計算更加靈活。而對于這些內(nèi)核函數(shù)的頻繁調(diào)用也成為了影響深度學(xué)習(xí)框架的重要因素。
然而,在需要進行頻繁計算的大數(shù)據(jù)時代,像目前深度學(xué)習(xí)框架雖然能同時進行數(shù)千次運算,大仍然耗時太多。對深度學(xué)習(xí)框架進一步優(yōu)化、解決這些性能問題的一個直接方法就是Taco所采用的內(nèi)核融合方法(Kernel Fusion),即將一個計算圖中的節(jié)點所對應(yīng)的內(nèi)核函數(shù)融合成一個函數(shù),這樣整個數(shù)據(jù)流圖紙需要通過一次函數(shù)調(diào)用就可以完成所有計算,從而將對平臺的調(diào)度和內(nèi)核啟動的開銷降到最低。
該論文的第一作者、MIT博士生Fredrik Kjolstad解釋說,Taco采用對于大規(guī)模數(shù)據(jù)集的高效運行,張量運算的每一個序列都需要自己的“內(nèi)核”或計算模板。如果在一個內(nèi)核中執(zhí)行操作,用戶可以一次完成所有操作而不需將輸出存放在內(nèi)存中,從而極大加快計算速度。
此外,通過合理地設(shè)計不同內(nèi)核函數(shù)的輸入輸出數(shù)據(jù)的放置(雷鋒網(wǎng)注:例如使用GPU上的共享內(nèi)存或寄存器),可以極大地提高數(shù)據(jù)傳輸效率,從而提升整體計算性能。許多張量運算涉及從一個張量與另一個張量相乘的條目,用于處理大型稀疏矩陣的程序可能浪費大量的時間來添加和乘以零。通過手工優(yōu)化代碼可以識別稀疏張量中的零條目,在運算中做到只對非零條目進行計算或者省略對零條目的計算,可以簡化其操作從而加速張量的計算,但這需要程序員做更多的編程工作。
舉例來說,有兩個矩陣(即只有兩個維度的張量)需要進行相乘,如果矩陣所有位置都是有效信息,那么對應(yīng)的代碼只有12行,但如果矩陣是稀疏的(包含大量0),相同的操作相同的操作可能需要100行甚至更多的代碼來跟蹤遺漏和錯誤。
而在Taco,系統(tǒng)會自動添加所有額外的代碼。程序員只需要簡單地指定張量的大小,以及張量的類型(完整的或者稀疏的),以及文件的位置,從它應(yīng)該導(dǎo)入它的值。對于兩個張量上的任何給定操作,Taco會首先建立一個分層映射,指出來自兩個張量的哪些配對條目是非零的,然后將每個張量的條目與零配對,并在這過程中丟棄所有的零對。
此外,Taco還使用有效的索引方案來存儲稀疏張量的非零值。以前文提到的Amazon所有客戶和庫存對應(yīng)的表格為例,其原始圖表需要的存儲容量是目前Google服務(wù)器存儲容量的10倍,而使用Taco的壓縮方案只需要13GB,也就是說,一個智能手機就可以存儲這一信息。
俄亥俄州立大學(xué)計算機科學(xué)和工程教授Saday Sadayappan稱,過去二十年來,許多研究小組試圖解決稀疏矩陣計算的編譯器優(yōu)化和代碼生成問題,而 Fredrik 和其導(dǎo)師 Saman 的研究是這個對這個長期存在的開放性問題的一個重要突破?!彼麄兊木幾g器可以自動生成非常有效的代碼,讓開發(fā)者可以以非常簡單和方便的高級符號來指定非常復(fù)雜的稀疏矩陣或張量計算?!?Saday 說。 “從展示的結(jié)果看,由編譯器自動生成的代碼與手動編寫的代碼效果相當(dāng)甚至更好,這是最近在編譯器優(yōu)化領(lǐng)域最令人振奮的進步之一?!?/p>
關(guān)于 Taco 編譯器的更多信息可閱讀相關(guān)論文《The Tensor Algebra Compiler》。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。