前兩天剛入了一塊二手Radeon Vii,裝了Rocm2.9+Tensorflow1.15 。今天通過實戰評測,談談我的體驗。

一、背景小知識:

除了這個問題里的人之外,恐怕很多人都不知道,現在Nvidia已經不再是深度學習唯一的選擇了。AMD對標CUDA的產品ROCm經過2年多的發展,對tensorflow和pytorch都實現了原生支持,A家最近幾代GCN架構的顯卡都可以跑,但不包括最新出的5700這種RDNA架構卡。

在GCN架構的消費級顯卡中,卡皇當屬2019年2月發布、7月就停產的的Radeon Vii。這塊卡基於7nm工藝,能提供13.44TFLOPS的fp32算力,或者2倍於此的fp16算力,相比之下,RTX 2080ti的TFLOPS是13.4,2080是10.1,1080ti是11.3, 1080是8.9。Raveon vii的性能應該等於2080Ti,但售價只有一半。更奢侈的是,這卡配備了16G HBM2高速顯存,光顯存成本就佔了顯卡價格的一半,因此網友們都推測它其實是AMD計算卡Mi50的馬甲,短暫下放只是為了不在旗艦級消費市場掉隊,屬於賠本賺吆喝的範疇。

其實,既然麻花騰不會虧,蘇媽當然也不會虧,只有老黃賺大了,天下苦Nvidia久矣!

二、實戰評測

本體:我收的是一塊藍寶石廠牌的Radeon Vii,比最低價要貴幾百,但據說vbois和蘋果更兼容,這是我的一個強需求。

Baseline:由於手頭沒有2080或者2080ti,我只能祭出原先用的是一塊1080。講道理這塊卡我很喜歡,微星和賊船聯合出品的Sea Hawk一體水冷,靜音效果那叫一個棒。但是問題有二:顯存只有8G,finetune個Bert不便;MAC OS 10.14之後不支持N卡。兩點都是硬傷。

平台: 公平起見,兩塊卡都在以下平台上測試:6700K CPU,16G內存,Ubuntu-18.04,kernel-4.15,anaconda-2.7,tensorflow-1.15,cuda-10,cudnn-7.6,rocm-2.9。bare metal安裝,不用docker。

2.1 tensorflow官方benchmark

tf官方提供了一個benchmark repo ,內含大部分常見卷積網路。廢話不多說直接開跑,trainning examples/per sec對比如下,-部分是顯存不夠無法啟動。

對應的speed up如圖:

可以看出三個表現:

  1. 當今常用的cnn模型,如vgg16、resnet、inception3等上,Radeon Vii可以達到相比GTX1080 1.6~2倍的加速比,而且可以跑更大的ResNet101或者152模型。這相當不錯,2080Ti我沒用過,但是估計也就這個水平,甚至略不如Radeon Vii。
  2. 在lenet和alexnet這兩個較早期的網路上,加速比只有1.3左右。這可以理解:這兩個模型的計算量太小了,都達到成千上萬的examples/sec,主要瓶頸不在計算,而在IO了。
  3. MobileNet非常反常,Radeon Vii反倒只有GTX 1080七分之一的速度。事出反常必有妖。

2.2 深度分離卷積benchmark

這事出反常的妖,大概率出在MobileNet中大量使用的一類特殊卷積方法——深度分離卷積(Depthwise Separable Convolution)上。它將一步普通卷積拆解成兩步Depthwise卷積+Pointwise卷積,以減少卷積核的參數量。其中Depthwise卷積獨立作用到輸入數據的每個channel上,Pointwise卷積則對輸出結果再進行一次Dense變換。Depthwise部分在計算上比較獨特,我猜測要麼A家的libmiopen.so中沒有提供足夠的支持,要麼就是tensorflow的開發人員用錯了底層api。

深度分離卷積

為了驗證這一點,我設計了一組對比實驗,去除所有不必要的激活、池化、全連接,採用全卷積網路:A.普通卷積,B.深度分離卷積,C.將深度分離卷積中的Pointwise部分也去掉。結果如下

猜想證實,採用普通卷積時(conv),Radeon Vii可以達到1.65倍的加速;採用深度分離卷積(D+P conv)就立馬降到1/6左右;更詭異的是,把P卷積去掉之後,理論上模型計算量減少了,GTX1080也反應了這一點,但Radeon Vii在batch=64時卻更慢了。必須說tensorflow-rocm目前對深度分離卷積的支持一塌糊塗,ROCm和tensorflow開發組,必有一鍋。要知道,這是我最愛的卷積核啊!在NLP問題里也很有用的!

2.3 LSTM benchmark

NLP玩家可能更關心LSTM的表現。這裡我做了一個簡單的模型,基於兩層biLSTM的序列分類。結果如下

在小batch size時,Radeon Vii還不如GTX1080;當batch size達到256後,兩者速度相等;繼續增大batch size,Radeon Vii還能繼續加速,GTX1080則顯存OOM了。結果也算reasonable:LSTM只能在batch層面實現並行化,Vii的流處理器更多,但單核性能和底層庫支持中必有一個力有不逮。早在CUDA8/9出來時就聽聞對RNN有特別優化,rocm還需努力啊。

2.4 Transformer benchmark

最激動人心的部分終於來了。買這塊卡的初衷之一就是應對Bert類場景。由於懶得一步一步按bert的代碼試驗,我就直接建了一個和Bert-Base一模一樣的Layer=12,Hidden=768的Transformer網路,在長度為200(此處失誤,該選512才能最大化壓榨顯存)的文本數據上從頭開始訓練,理論上和finetune的速度差不多。

Radeon Vii的速度大約是GTX1080的1.77倍,而且可以支持更大的batch size,這對finetune的收斂穩定性是有實際好處的。再說一遍這是文本長度200時的結果,本應測試512,但實驗做到這裡我實在是懶得再拆機箱插拔一遍顯卡了,itx機箱使我後悔。

三、總結

總結一下目前(2019年11月)使用ROCm平台 + AMD卡皇 Radeon Vii進行深度學習的幾點體驗吧:

優點:

  • 一般的CNN和Transformer上速度真的快,還能跑大batch size。可戰2080Ti,價格便宜了一倍,真香!
  • 支持(黑)蘋果,雖然ROCm只支持linux,但是倘若你願意用Keras,它有一個冷門的backend叫做plaidML,可以在蘋果上利用OpenCL或者Metal庫加速,做做小實驗夠了。性能留待下次再給大家測試吧。
  • AMD yes!A卡戰未來!翻看rocm社區的記錄,性能曲線一路彪升。聽說亞馬遜都和AMD簽了雲計算的合作協議,我在等著rocm完善的那一天。

缺點:

  • 深度分離卷積的支持一塌糊塗,不知道是rocm還是tensorflow的鍋,我準備去提個issue。由此推廣,如果你有開發/使用其他奇技淫巧的需求,A卡可能會坑了你。
  • LSTM的速度一般,小batch時不如N卡,不知道是單核性能不足,還是rocm優化問題。另外不論是N卡還是A卡,在大batch跑LSTM時都有很強的嘯叫聲,體驗差。
  • 莫名其妙地,經常第一個batch會卡很久才啟動,幾十秒到幾分鐘左右,另人惱火。

總得來說,如果你是個深度學習萌新,或者依賴這塊顯卡來穩定生產,建議暫時別入坑。如果你是個愛折騰的geek,或者有黑蘋果需求,建議入手。極高的性能,無盡的折騰,還有什麼比這更吸引人呢?


用rocm跑Tensorflow效果甚至比n卡好顯卡是Vega Frontier Edition

看了一下編譯過程,還是opencl老一套,不抱建設性態度


看了一下現在支持的配置:

Radeon R9 Nano, R9 Fury, R9 Fury X, AMD FirePro S9300x2Radeon R9 290, R9 390, AMD FirePro S9150, S9170等哪位有設備的來說說?==============================================

好像1.3支持了 Polaris


ai卡重要的還是生態,在生態建立起來之前光指望卡的性能來反身無異於痴人說夢。至少目前2020年了,各大AI論文用的代碼依然以CUDA為主,改python代碼容易,但重寫CPP呢?更何況現在ai主要還是流行於科研單位,NVIDIA已經是統治地位了,各大實驗室又何必去採用A卡改代碼給自己找不自在。


看來要買張 A卡支持一下了。。。。


相比CUDA完全沒有優勢,基本不會有幾個人去折騰。


就看amd能把庫做到多全了,別指望amd之外的開發者用這個編程


我覺得這東西好像不是完全和cuda對等的一個東西。
推薦閱讀:
相关文章