0
| 本文作者: 汪思穎 | 2018-03-25 20:55 |
雷鋒網(wǎng) AI 研習(xí)社按,日前,微軟提出深度學(xué)習(xí)框架的通用語言——repo1.0,號稱希望通過構(gòu)建這一深度學(xué)習(xí)框架「Rosetta Stone(羅塞塔石碑)」,讓研究者們能夠在不同框架之間輕松運用專業(yè)知識。他們在博客中講解了基準(zhǔn)深度學(xué)習(xí)框架的訓(xùn)練結(jié)果和相應(yīng)的經(jīng)驗教訓(xùn),雷鋒網(wǎng) AI 研習(xí)社編譯整理如下。
大家好,很高興發(fā)布 repo 1.0 版本,目前我們已經(jīng)將其在 GitHub 開源,地址如下:
https://github.com/ilkarman/DeepLearningFrameworks
我們相信深度學(xué)習(xí)框架就像語言一樣,就像很多人說英語,但每種語言都有各自的使用人群,都有其特定的用法。
我們已經(jīng)為幾個不同的網(wǎng)絡(luò)結(jié)構(gòu)創(chuàng)建了通用代碼,并將代碼在許多不同的框架中執(zhí)行。
我們的想法是創(chuàng)建一個深度學(xué)習(xí)框架的「Rosetta Stone(羅塞塔石碑)」——只需要了解一個框架就能延伸到任何框架,并幫助其他人。之后,可能出現(xiàn)這種情況:一篇論文中的代碼是用其他框架,或者整個流程都能使用另一種語言。與其利用你最喜歡的框架中從頭開始編寫模型,還不如直接使用「其他」語言。
再次感謝 CNTK、Pytorch、Chainer、Caffe2 和 Knet 團(tuán)隊,以及過去幾個月在開源社區(qū)中為 repo 做出貢獻(xiàn)的人員。
這次我們發(fā)布的目標(biāo)是如下幾點:
一個深度學(xué)習(xí)框架的羅塞塔石牌,能讓數(shù)據(jù)科學(xué)家輕松在不同框架間利用其專業(yè)知識
使用最新最高級別 API 的最優(yōu) GPU 代碼
比較不同 GPU 的常見設(shè)置(可能是 CUDA 版本和精度)
比較不同語言的常見設(shè)置(Python、Julia、R)
驗證安裝之后的性能
不同開源社群之間的協(xié)作
基準(zhǔn)深度學(xué)習(xí)框架的訓(xùn)練結(jié)果
下面,我們將帶來一類 CNN 模型(從預(yù)訓(xùn)練過的 ResNet50 中提取特征)和一類 RNN 模型的訓(xùn)練時間。
訓(xùn)練時間(s):CNN(VGG-style,32bit)在 CIFAR-10 上進(jìn)行圖像識別
該模型的輸入是標(biāo)準(zhǔn) CIFAR-10 數(shù)據(jù)集,數(shù)據(jù)集中包含 5 萬張訓(xùn)練圖像和 1 萬張測試圖像,均勻地分為 10 類。每張 32×32 的圖像看成 (3, 32, 32) 的張量,像素值從 0-255 調(diào)整至 0-1。

處理 1000 張圖片的平均時間(ResNet-50——特征提取)
加載預(yù)訓(xùn)練的 ResNet50 模型,在最后(7、7)的 avg_pooling 截斷,輸出 2048D 向量。可以將其插入 softmax 層或其他分類器如增強樹來執(zhí)行遷移學(xué)習(xí)。考慮到 warm start,這種僅前向傳播到 avg_pool 層是定時的。(注意:批次大小是常量,增加 GPU 內(nèi)存可帶來性能提升(GPU 內(nèi)存越大性能越好)。

訓(xùn)練時間(s):在 IMDB 上,用 RNN (GRU) 執(zhí)行情感分析
該模型的輸入為標(biāo)準(zhǔn) IMDB 電影評論數(shù)據(jù)集,包含二萬五千個訓(xùn)練評論和兩萬五千個測試評論,數(shù)據(jù)被均勻分成兩類 (正/負(fù))。我們遵循 Keras(https://github.com/fchollet/keras/blob/master/keras/datasets/imdb.py)上的方法,將 start-character 設(shè)置為 1, out-of-vocab (使用三萬大小的 vocab) 表示為 2,單詞索引從 3 開始。

希望大家都能來嘗試,增加更多更豐富的數(shù)據(jù)。
以下是一些經(jīng)驗教訓(xùn)
使用自動調(diào)參:
大多數(shù)框架使用 cuDNN 中的 cudnnFindConvolutionForwardAlgorithm() 進(jìn)行窮舉搜索,優(yōu)化算在固定大小的圖像上的前向卷積算法。這通常是默認(rèn)的,但一些框架可能需要諸如「torch.backends.cudnn.benchmark = True」的標(biāo)記。
多用 cuDNN:
對于普通的 RNNs(如基本 GRUs/LSTMs),通常可以調(diào)用 cuDNN 封裝器來提速,例如用 cudnn_rnn.CudnnGRU() 取代 rnn.GRUCell()。這樣做的缺點是接下來在 CPU 上進(jìn)行推理可能會更具挑戰(zhàn)。
形狀匹配:
在 cuDNN 上運行時,匹配 CNNs 中 NCHW 和 RNNs 中 TNC 的原始 channel-ordering,避免在重塑上浪費時間,直接進(jìn)行矩陣乘法。
原始生成器:
使用框架的原始生成器,這樣可以通過多線程異步來進(jìn)行增強和預(yù)處理(例如 shuffling),從而加速。
針對推斷:
要確保指定 flag 來避免計算的不必要的梯度,確保 batch-norm 和 drop-out 等層得到合理使用。
當(dāng)我們最初創(chuàng)建 repo 時,需要使用許多小技巧來確保框架之間使用的是相同的模型,并且是以最佳的方式運行。在過去的幾個月里,這些框架的改良速度快得令人難以置信。2017 年末的許多經(jīng)驗教訓(xùn)在現(xiàn)在已經(jīng)過時了,因為這些框架已經(jīng)更新。
通過在不同的框架中完成端到端解決方案,可以以多種方式比較框架。由于每個框架中使用的都是相同的模型結(jié)構(gòu)和數(shù)據(jù),所以框架間的準(zhǔn)確度非常相似。此外,我們開發(fā)的目的是使框架之間的對比更簡單,而不是為了加速。
當(dāng)然,我們是為了比較不同框架之間的速度和推理,而不是為了展示框架的整體性能,因為這里忽略了一些重要的對比,例如幫助和支持、可用的預(yù)訓(xùn)練模型、自定義層和架構(gòu)、數(shù)據(jù)加載器、調(diào)試、不同的平臺支持、分布式訓(xùn)練等等。我們開源 repo 只是為了展示如何在不同的框架上創(chuàng)建相同的網(wǎng)絡(luò),并評估在一些特定案例上的性能。
via:https://blogs.technet.microsoft.com
雷鋒網(wǎng) AI 研習(xí)社編譯整理
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。