如何開發(fā)一個自己的TensorFlow?
鏈接:https://www.zhihu.com/question/326890535 編輯:深度學習與計算機視覺
https://www.zhihu.com/question/326890535/answer/719907717
當時測了幾個典型的模型的GPU訓練速度,論文中的表格:
我fork了一個完全由自己主導(dǎo)的版本:https://github.com/chncwang/N3LDG-plus
等有時間加上transformer和BERT的支持了,再整文檔吧(其實到底該叫啥名也沒想清楚,姑且稱之為N3LDG++),目前主要就自己在用來做文本生成。
GPU計算的實現(xiàn)是相對麻煩的一部分。出于性能極致的追求(N卡很貴,計算速度怎么強調(diào)都不過分)和對自己代碼負責的態(tài)度,當時算把CUDA徹底整明白了(除了圖形學用的紋理內(nèi)存),針對每種操作專門寫了對應(yīng)的CUDA,比如concat操作就能在一次kernel調(diào)用下完成一個batch里的多個不同維度輸入向量的拼接:
顯存也需要操心。由于GPU離CPU遠,不能像用malloc一樣頻繁地調(diào)cudaMalloc。當時不滿cnmem的性能,就自己擼了個buddy system。顯然這個做法不夠精細,dynet的解決方案應(yīng)該更合理,詳見他們的論文。
提到顯存,忍不住想多說幾句。NLP任務(wù)和CV不一樣,同個mini-batch中句子長短不一,pytorch會要求補零的操作以求維度對齊,往往還會有一個全局的max_sentence_length(哪怕是N3LDG也是如此),這其實很浪費顯存。在N3LDG++中,如果一個mini-batch里的句子總長度是100,那么分配100長度的空間也就夠用,減少了浪費。所以我計劃有時間了支持下BERT,至少讓base模型在1080ti里也能伸展開來,不怕OOM。只是不清楚大家都用啥顯卡,這塊的需求有多強。
然后說一下編程語言。主流的框架使用C++、CUDA實現(xiàn)底層的計算,然后用python實現(xiàn)上層的封裝,似乎是兼顧了計算效率和使用方便。然而使用PyTorch時還是會發(fā)現(xiàn)CPU模式下的龜速。我自己沒用過PyTorch,也不清楚CPU龜速的原因(也許是Python調(diào)用C++的額外開銷?),只是每當看到實驗室同學跑個幾千的數(shù)據(jù)集就要用GPU,就覺得Python在深度學習界的流行抬高了英偉達的市值。
N3LDG++中的C++代碼繼承自N3LDG,不過做了很大的改動,難以細述,最大的一點是改進了Node類型的資源管理方式,所有的Node對象由Graph持有(比如在N3LDG中每多創(chuàng)建一個節(jié)點,都需要有相應(yīng)的對象來持有,不能當作臨時變量用,這很不方便)。不過歷史遺留的代碼還是有點亂,不少該抽象的地方?jīng)]有抽象,以后慢慢改吧(唉純算法背景寫出的代碼真是。。。)
最后,我覺得從0寫一個可用的深度學習框架不難,但是工作量很大, 對人的要求也不高(但是多,不能光懂算法),主要以下幾點:
-
編碼能力過關(guān),精通C++、CUDA、OO思想,以及能搞定一切的debug能力 -
編碼習慣良好,比如重視變量命名 -
算法方面,會手算梯度就行
https://www.zhihu.com/question/326890535/answer/700281308首先需要熟練使用C++編程,其次學會cuda的GPU顯卡計算框架,了解一下并行計算,寫出比TensorFlow快的框架非常簡單。畢竟TensorFlow為了可移植性等等犧牲了很多。
我已經(jīng)用自己的框架做了三四個項目了,由于干最底層的算法崗,自己這不成熟的框架已經(jīng)能勝任幾乎所有需求了。目前我正在對框架進行可視化的相應(yīng)改進,力求能進一步突破TensorBoard。
https://www.zhihu.com/question/326890535/answer/827912517
1、現(xiàn)在網(wǎng)上tensorflow能源碼級的,較清晰解讀尚且沒看到,不知道說不難的人自己有沒有過過源碼;
2、不要把手寫一兩種CNN網(wǎng)絡(luò)的難度和一個大規(guī)模商用深度學習平臺來比,不考慮各類具體算法實現(xiàn),單單是工程層面的抽象、設(shè)計也不簡單;
3、還有說tf里算法容易的,就想先請教一個小問題,Tensorflow里那種通用求導(dǎo)是如何實現(xiàn)的?別上網(wǎng)搜,想想能搞定不?
—版權(quán)聲明—
僅用于學術(shù)分享,版權(quán)屬于原作者。
若有侵權(quán),請聯(lián)系微信號:yiyang-sy 刪除或修改!
—THE END—
