更多幹貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)
https://github.com/ilkarman/DeepLearningFrameworks
我們認為深度學習框架就像語言一樣:當然,英語被很多人使用,但每種語言都有各自的用處。我們為幾種不同的框架建立了通用的程式碼,並在許多不同的框架中使用這些語言。我們的想法,是建立一類似外語學習軟體 Rosetta Stone 的深度學習框架,讓人們自如地使用不同框架。當關於一種全新的框架程式碼或語言論文發表時,就會出現問題,與其在你最喜歡的框架中從頭開始編寫模型,倒不如使用“外來”語言來得更容易。
在此,我們感謝 CNTK、Pytorch、Chainer、Caffe2 和 Knet 團隊,以及來自開源社群的所有朋友在過去幾個月為這個 repo 做出的貢獻。
總之,我們釋出這個 repo 的目的在於建立:
一個深度學習框架的“Rosetta Stone”,它可以讓資料科學家輕鬆地將他們的專業知識應用到不同的框架中。
一套使用最新的最高階 API 優化過的 GPU 程式碼。
一個對不同 GPU 進行比較的常見設定(可能為 CUDA 版本和精度)。
對不同語言進行比較的常用設定(Python、Julia、R)。
驗證自己所用框架的預期效能的可能。
不同開源社群之間的合作。
在下面的章節中,我們將回顧一下每種 CNN 模型的訓練時間,經過預訓練的 ResNet50 模型的特徵提取,以及每種 RNN 模型的訓練時間測試結果。我們的實驗在使用 K80 和更新的 P100 的 Azure 深度學習虛擬機器上進行。
該模型的輸入是包含 5 萬個訓練影像和 1 萬個測試影像的標準 CIFAR-10 資料集,被均勻地分成 10 個類。每張 32×32 影像被設為張量(3,32,32),畫素強度從 0-255 重新定為 0-1。
Caffe2:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Caffe2_Inference.ipynb
Chainer:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Chainer_Inference.ipynb
CNTK:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/CNTK_Inference.ipynb
Keras(CNTK):https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_CNTK_Inference.ipynb
Keras(TF):https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_TF_Inference.ipynb
Tensorflow:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Tensorflow_Inference.ipynb
MXNet:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/MXNet_Inference.ipynb
PyTorch :https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/PyTorch_Inference.ipynb
Julia –Knet:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Knet_Inference.ipynb
當 avg 池化在(7,7)結束之後載入並截斷一個預先訓練好的 ResNet50 模型,輸出一個 2048D 維向量。在這裡可以插入 softmax 層或其他分類器(如提升樹)以進行遷移學習。考慮到熱啟動的因素,這個僅向前傳遞給 avg_pool 層的時間是定時的。
注意:批量大小保持不變,但是在 GPU 上填充 RAM 會進一步提高效能(優於具有更多記憶體的 GPU)。
該模型的輸入是標準的 IMDB 電影評論資料集,其中包含 25000 個訓練評論和 25000 個測試評論,統一分為 2 個類別(正例 / 負例)。使用 Keras 的方法,其中起始字元被設定為 1,詞彙外(使用 30k 的詞彙大小)被表示為 2,詞索引從 3 開始。每個評論零填充 / 截斷到 150 字。
* 表示未進行實驗。
使用自動調整(auto-tune):大多數框架使用 cuDNN cudnnFindConvolutionForwardAlgorithm() 進行窮舉搜尋,並優化用於固定尺寸影像上卷積正向傳播的演算法,通常這個選項是預設啟用的,但是一些框架可能需要手動標記,如 torch.backends.cudnn.benchmark=True 等標識。
儘可能多使用 cuDNN:對於 vanilla RNNs(例如 GRU/LSTM)通常可以呼叫 cuDNN wrapper(https://devblogs.nvidia.com/optimizing-recurrent-neural-networks-cudnn-5/)提高速度,例如,cudnn_rnn.CudnnGRU() 而不是 rnn.GRUCell()。但是這種方法的缺點是這會讓後期在 CPU 上進行推理變得更難。
Match shapes:在 cuDNN 上執行時,匹配 NCHW 的 CNNs 和 TNC 的 RNNs 通道順序會縮短調整時間,且使用者可以直接進行矩陣乘法。
本地生成器(Native generators):使用框架的本地生成器,通過線性進行非同步增強甚至預處理(例如混排,shuffling),從而提高速度。
在推理階段,請確保在可能儲存不必要梯度計算的地方做標記,並確保 batch-norm 和 dropout 層得到正確應用。
最初,我們建立此 repo 時必須使用許多小技巧和竅門來確保在框架之間使用的是一樣的模型,並且是以最優方式完成的。然而,過去幾個月內,這些框架以令人難以置信的速度發展,很多都已經更新了,因此我們許多在 2017 年得出的優化方法現如今已經過時。
例如,帶有 TF 後端的 Keras 通道排序硬編碼為 channels-last(對於 cuDNN 非最佳),因此指定優先通道意味著它會在每批次(硬編碼值)處理後重新進行調整,從而大大減緩訓練速度。現在,支援 TF 的 Keras 已經允許本地通道優先。我們可以通過指定一個標誌使用 Winograd 演算法進行卷積來加速 Tensorflow,但這樣的方法已經不起作用了。有興趣的話可以檢視我們早期的 repo 得出的結論。
通過在不同框架中完成端到端解決方案,可以用多種方式對不同框架進行比較。由於每個框架都使用相同的模型體系結構和資料,因此所有框架的準確性相差無幾(實際上,這是我們測試程式碼的一種方式,以確保不同框架使用相同的模型!)另外,notebook 的開發方式讓我們可以輕鬆地對不同框架進行比較,而不一定在速度方面。
當然,雖然我們很容易從速度、推理時間等維度對不同的框架進行比較,但結果並不意味著框架的整體效能有任何問題,因為這種方法省略了重要維度之間的比較,例如:幫助和支援、預先訓練模型的可用性、自定義圖層和架構、資料載入器、除錯、支援的不同平臺、分散式訓練等!這種方法僅展示瞭如何在不同的框架中建立相同的網路,以及示例中框架的效能。
在社群中有很多流行的深度學習框架,它們幫助 AI 開發人員和資料科學家在各種情況下使用不同的深度學習框架解決問題。其中,開源的 Open Neural Network Exchange (ONNX,https://github.com/onnx/onnx)成為在不同框架之間應用深度學習模型互操作性的標準。例如,當你使用某一個框架進行模型開發,卻需要在另一個框架中評估這個模型時,ONNX 就會很有用。同樣,MMdnn (https://github.com/Microsoft/MMdnn)作為一組工具,可幫助使用者直接在不同框架之間進行轉換,並對模型體系結構進行視覺化處理。
ONNX 和 MMdnn 等深度學習框架的“旅伴”就像一臺自動機器翻譯機。相比之下,我們今天釋出的完整 1.0 版 repo 就像一個深度學習框架的 Rosetta Stone,展示了在不同框架之間構建模型的全過程。眾人拾柴火焰高,所有人的努力結合起來,就能使所有深度學習開發者能夠在多語言環境中更好地”暢遊“。
原文連結:
https://blogs.technet.microsoft.com/machinelearning/2018/03/14/comparing-deep-learning-frameworks-a-rosetta-stone-approach/
更多幹貨內容,可關注AI前線,ID:ai-front,後臺回覆「AI」、「TF」、「大資料」可獲得《AI前線》系列PDF迷你書和技能圖譜。