深度學(xué)習(xí)算法崗平時需要自己寫cuda嗎?
鏈接:https://www.zhihu.com/question/436008648 編輯:機(jī)器學(xué)習(xí)實(shí)驗(yàn)室
聲明:僅做學(xué)術(shù)分享,侵刪

https://www.zhihu.com/question/436008648/answer/1649590705
再不濟(jì)就是利用動態(tài)圖的性質(zhì)由numpy、py_func等實(shí)現(xiàn)然后手動定義反向梯度函數(shù)。
這里相對更重要的反而是算法工程師定義反傳的能力。雖然不是什么特別難的工作,但不少算法崗的同學(xué)可能也沒仔細(xì)思考過最基礎(chǔ)的矩陣乘法怎么定義grad,或者不清楚tensorflow或者pytorch的autograd機(jī)制而導(dǎo)致無從下手。
然后提到CUDA最大的關(guān)心點(diǎn)必然是性能。無論是速度還是顯存都有可能通過CUDA開發(fā)來過得極大的提升,一般體現(xiàn)在訪存效率、數(shù)據(jù)結(jié)構(gòu)設(shè)計、算子融合等技巧上。事實(shí)上從個人經(jīng)驗(yàn)來說,有時候自己實(shí)現(xiàn)的算子庫跑模型很容易比native的tensorflow快兩到三倍,如果是一些特殊情況,十幾甚至極限情況上百倍也有可能。并且合理的設(shè)計比起生硬的用原生算子能夠大大減少顯存開銷,這對于訓(xùn)練和推理都是有極大益處的。
但是,CUDA開發(fā)有些不小的成本,特別是對于算法研究,靈活性非常重要。可能要短時間里嘗試很多種不同的自定義算子,這時候堆機(jī)器能解決的話一般先不急著進(jìn)行深層次的優(yōu)化,而且在整個網(wǎng)絡(luò)結(jié)構(gòu)確定下來之前,很難進(jìn)行最終的優(yōu)化。除非有特別高頻使用的算子,優(yōu)化前后的差距非常明顯(比如對整體的影響5倍左右,無論是顯存還是速度)才可以考慮進(jìn)行個別算子的優(yōu)化。萬一一通CUDA操作下來,模型效果提升不明顯,最終的時間/人力成本不一定劃算。我更傾向于盡量先驗(yàn)證算法再進(jìn)行優(yōu)化。
此外,涉及到這么深層次的研究,并且CUDA優(yōu)化非常必要的情況,一般公司都會有專門的HPC組或者團(tuán)隊(duì)接手了,或者可能就該思考為什么通用的算子不能滿足需求。
再說下CUDA開發(fā)的成本。C/CPP本身的編寫和調(diào)試難度就不提了,CUDA C基本就是小半個新語言,Debug邏輯也是全新的。如果為了極限性能進(jìn)行魔改然后遇到一些非法的顯存訪問更是頭疼,不過現(xiàn)在各類nv的可視化調(diào)試工具出來了應(yīng)該體驗(yàn)會好很多。一些初入坑的同學(xué)可能會覺得把算子換成cudnn api就好了,但其實(shí)很多時候性能瓶頸是來自于訪存效率,這往往意味著需要寫新的kernal來融合算子,親自掌控顯存/緩存的管理。工作量特別是調(diào)試上會比想象的大很多。如果只是簡單換下cudnn,很可能反而增大了潛在的數(shù)據(jù)拷貝開銷導(dǎo)致性能變差。這里面的各方面經(jīng)驗(yàn)需要長時間的積累,要不就交給專業(yè)的團(tuán)隊(duì)做,要不就自己長時間保持這方面的學(xué)習(xí)實(shí)踐。基本上不會作為一個算法工程師的必備素質(zhì)。
但是如果擁有這樣的視野對于算法工程師來說是非常好的,即使沒有用到,平時也能在設(shè)計模型時保持從性能和效率的角度思考問題,而不是局限于模型效果。工業(yè)界對于成本是非常看重的。
https://www.zhihu.com/question/436008648/answer/1746022828
比如,現(xiàn)在要優(yōu)化模型推理性能,剪枝,蒸餾,量化一大通操作下來,模型純推理時間由30ms降到15ms,性能翻倍,感覺不錯,但是一看數(shù)據(jù)預(yù)處理,耗時10ms,模型后處理耗時15ms,算下來處理數(shù)據(jù)花的時間比我模型推理花的時間還要長。這時候,cuda大神就可以上場了,我們把預(yù)處理和后處理搬到cuda上,一測,預(yù)處理,后處理共5ms就搞定了。這時候,報告一寫,模型推理時間55ms降低到20ms,領(lǐng)導(dǎo)看后一頓夸,心里美滋滋,升職加薪不是夢。
再比如,最近模型指標(biāo)一直上不去,看著三年前的老模型,一臉嫌棄,感覺是時候擁抱新模型了。然后各種頂會,博客看下來,找到了個三個月前剛發(fā)表的新論文,華麗的辭藻,sota的指標(biāo)讓你按捺不住,想趕快把它用在自己的工程中,結(jié)果github上沒找到開源代碼。這時候,cuda大神又可以上場了,熬幾個通宵,把論文中跳動的字符轉(zhuǎn)換成cuda實(shí)現(xiàn)的美麗算子,然后模型一訓(xùn),數(shù)據(jù)一測,指標(biāo)提了3個點(diǎn),老板看后又一頓夸,心里又美滋滋,升職加薪又不是夢。
cuda的作用很多,水也很深,一般做cv方向手?jǐn)]cuda的機(jī)會還真不多,但是真的用上的時候,大概率是用來解決重大問題的時候。多了解了解,用的6確實(shí)可以算是自己很大的加分項(xiàng)。
https://www.zhihu.com/question/436008648/answer/1683251210
我只能說,前世界上95%的算法和碼農(nóng)崗位都不需要你能夠GPU編程,刷好題比這些都重要。
當(dāng)然了,前一陣G社回來反挖失敗那就是另一回事了。
評論圈有人說既然選了G社,就應(yīng)該知道需要刷題,這屬于準(zhǔn)備不善。確實(shí),我同事后來也是這么說的,當(dāng)時根本就沒有準(zhǔn)備刷題,因?yàn)楸旧硪矝]準(zhǔn)備去做碼農(nóng),抱著試試看的心理去了。
至于這類數(shù)據(jù)結(jié)構(gòu)和算法輪子,大家千萬不要認(rèn)為用不到刷的題屬于無用功。其實(shí)即便是用pytorch寫煉丹算法還是要注意這些的。比如什么情況會造成新分配內(nèi)存啊,何時內(nèi)存會被copy啊,等等。輪子的基礎(chǔ)越深,最后的車的舒適度,性能也越好,這是肯定的。
https://www.zhihu.com/question/436008648/answer/1768209276
為了提升效率,需要在gpu上跑數(shù)據(jù)的,算法也是自己寫的,通常效率估計比不上專門寫框架的人,但是至少比在CPU上快好多倍。
往期精彩:
【原創(chuàng)首發(fā)】機(jī)器學(xué)習(xí)公式推導(dǎo)與代碼實(shí)現(xiàn)30講.pdf
【原創(chuàng)首發(fā)】深度學(xué)習(xí)語義分割理論與實(shí)戰(zhàn)指南.pdf
算法工程師的日常,一定不能脫離產(chǎn)業(yè)實(shí)踐
點(diǎn)個在看
