0
本文作者: 奕欣 | 2018-02-16 12:07 |
雷鋒網(wǎng)AI科技評(píng)論消息,F(xiàn)acebook AI 研究院于近日開源了 C++ 庫(kù)及數(shù)學(xué)語言 Tensor Comprehensions,它能有效填補(bǔ)研究人員于數(shù)學(xué)運(yùn)算領(lǐng)域的溝通鴻溝,并基于各種硬件后端上大規(guī)模運(yùn)行工程模型。它的最大亮點(diǎn)在于,它采用了 Just-In-Time 的編譯自動(dòng)生成機(jī)器學(xué)習(xí)社區(qū)所需的高性能代碼。
也就是說,通過 Tensor Comprehensions,研究人員能夠以數(shù)學(xué)符號(hào)的方式進(jìn)行編寫,系統(tǒng)能夠根據(jù)需求進(jìn)行編譯調(diào)整,并輸出專業(yè)的代碼。
傳統(tǒng)意義上,如果要從零創(chuàng)造一個(gè)具有高性能表現(xiàn)的機(jī)器學(xué)習(xí)層需要兩個(gè)大步驟,這可能需要耗費(fèi)工程師數(shù)天甚至數(shù)周的努力。
1. 在 NumPy 層級(jí),研究人員需要寫一個(gè)全新層,并在以 PyTorch 為代表的深度學(xué)習(xí)庫(kù)中鏈接已有運(yùn)算,然后進(jìn)行小規(guī)模測(cè)試。如果要運(yùn)行大規(guī)模實(shí)驗(yàn),需要通過數(shù)量級(jí)加速檢測(cè)其代碼實(shí)現(xiàn)。
2. 工程師隨后采用這個(gè)層,并為 GPU 和 CPU 撰寫有效代碼(但這需要滿足多個(gè)條件):
1)工程師需要是一位在高性能計(jì)算頗有了解的專家,但這一人才目前非常稀缺;
2)文本、策略、寫代碼,debug,工程師需要樣樣精通;
3)將代碼與實(shí)際任務(wù)相關(guān)的后端相連接,如冗長(zhǎng)的參數(shù)檢查和添加樣板集成代碼
這也直接導(dǎo)致近年來深度學(xué)習(xí)社區(qū)一直依賴以 CuBLAS, MKL, 和 CuDNN 為代表的高性能庫(kù)而構(gòu)建運(yùn)行于 GPU 和 CPU 的代碼。對(duì)于研究員而言,如何尋找一條新的實(shí)現(xiàn)思路成為了巨大挑戰(zhàn)。
而在 Tensor Comprehensions 中,研究員們得以將這一流程從幾天甚至幾周減少到數(shù)分鐘。這一開源包含了:
? 用簡(jiǎn)單語法表達(dá)一系列機(jī)器學(xué)習(xí)概念的數(shù)學(xué)符號(hào)
? 基于 Halide IR 數(shù)學(xué)符號(hào)的 C ++前端
? 基于整數(shù)集庫(kù)(ISL)的 Just-in-Time 編譯器,
? 一個(gè)基于進(jìn)化搜索的多線程、多 GPU 自動(dòng)調(diào)節(jié)器
Halide 是一種最近在高性能圖像處理領(lǐng)域頗受歡迎的語言,它采用類似的高級(jí)函數(shù)語法來描述一個(gè)圖像處理的 pipeline,隨后在單獨(dú)代碼塊中調(diào)度到硬件上,并且詳細(xì)到如何平鋪、矢量化、并行化和融合。對(duì)于具有專業(yè)知識(shí)的人而言,這是一種非常高效的語言;但對(duì)于機(jī)器學(xué)習(xí)從業(yè)者來說,這一難度并不小。Halide 的自動(dòng)調(diào)度在研究上非常活躍,但對(duì)于 GPU 上運(yùn)行的機(jī)器學(xué)習(xí)代碼,目前還沒有很好的解決方案。
Tensor Comprehension 將 Halide 編譯器作為調(diào)用庫(kù)。FAIR 研究員構(gòu)建了 Halide 的中間表征(IR)和分析工具,并與多面編譯進(jìn)行技術(shù)配對(duì),因此,用戶可以在無需理解運(yùn)行原理的條件下使用相似的高級(jí)語法編寫層。此外,F(xiàn)AIR 研究員也找到了簡(jiǎn)化語言的方法,不需要為縮減運(yùn)算制定循環(huán)邊界。
使用 Halide 和多面編譯技術(shù),Tensor Comprehensions 能通過委托內(nèi)存管理和同步功能以自動(dòng)合成 CUDA 內(nèi)核。這一編譯能夠針對(duì)特定尺寸對(duì)一般操作符進(jìn)行融合,對(duì)快速本地內(nèi)存、快速縮減和 Just-in-Time 專業(yè)化都能優(yōu)化。因不嘗試涉足內(nèi)存管理,因此這一流程能夠輕松集成到機(jī)器學(xué)習(xí)的任意框架,以及任何允許調(diào)用 C++ 函數(shù)的語言中。
與經(jīng)典編譯器技術(shù)和庫(kù)方法相反的是,多面編譯能讓張量理解為每個(gè)新網(wǎng)絡(luò)按需調(diào)度單個(gè)張量元素的計(jì)算。
在 CUDA 層面,它結(jié)合了仿射循環(huán)轉(zhuǎn)換、融合/分裂和自動(dòng)并行處理,同時(shí)確保數(shù)據(jù)在存儲(chǔ)器層次結(jié)構(gòu)中正確移動(dòng)。
圖中數(shù)字表示最初計(jì)算張量元素的順序,箭頭表示它們之間的依賴關(guān)系。在這個(gè)例子中,數(shù)字旋轉(zhuǎn)對(duì)應(yīng)于循環(huán)交換,能夠?qū)崿F(xiàn)深度操作器的融合。
研究員提供了一個(gè)集成的多線程、多 GPU 自動(dòng)調(diào)節(jié)庫(kù),以推進(jìn)搜索過程,它使用 Evolutionary Search 來生成和評(píng)估數(shù)千種實(shí)現(xiàn)方案,并選擇性能最佳的方案。只需調(diào)用 Tensor Comprehension 上的 tune 功能,用戶便能目睹性能的改善。最好的策略是通過 protobuf 序列化,在當(dāng)下或離線情況下可重用。
在性能方面,Tensor Comprehensions 可能仍然有很大提升空間,但在條件滿足的情況下,它已經(jīng)可以匹配或打破當(dāng)前機(jī)器學(xué)習(xí)框架與手動(dòng)調(diào)整庫(kù)集成的性能,并通過將代碼生成策略適應(yīng)特定問題大小的能力來實(shí)現(xiàn)。下圖展現(xiàn)了 Tensor Comprehensions 與 Caffe2 和 ATen 的對(duì)比。
更多信息請(qǐng)參考 arXiv 論文(鏈接見底部)。
未來,Tensor Comprehensions 將補(bǔ)充硬件制造商(如 NVIDIA 和 Intel)編寫的快速庫(kù),并將與 CUDNN,MKL 或 NNPack 等庫(kù)一起使用。
雷鋒網(wǎng)AI科技評(píng)論了解到,該版本的開源庫(kù)能讓研究人員和程序員使用與他們?cè)谡撐闹惺褂玫臄?shù)學(xué)相似標(biāo)記來編寫層,并簡(jiǎn)明地傳達(dá)程序意圖。他們也能夠在幾分鐘內(nèi)將這種表示方法進(jìn)行編譯。未來隨著工具鏈的不斷增長(zhǎng),F(xiàn)AIR 認(rèn)為它的預(yù)計(jì)可用性和性能將會(huì)提升,并受益整個(gè)社區(qū)。
晚些時(shí)間,F(xiàn)AIR 將會(huì)發(fā)布 PyTorch 集成的 Tensor Comprehensions。
GitHub 鏈接:https://facebookresearch.github.io/TensorComprehensions/
arXiv 論文:https://arxiv.org/abs/1802.04730
Slack 頁(yè)面:https://tensorcomprehensions.herokuapp.com/
Email: tensorcomp@fb.com
雷鋒網(wǎng)AI科技評(píng)論編譯
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。