1. 如何開發(fā)一個自己的TensorFlow?

        共 5108字,需瀏覽 11分鐘

         ·

        2021-07-13 12:36

        鏈接:https://www.zhihu.com/question/326890535
        編輯:深度學習與計算機視覺
        我的理解,如果只是為了訓練一些具體的網(wǎng)絡(luò),不考慮擴展性,應(yīng)該不是很難吧,tensorflow也是用了很多第三方的庫。

        作者:王潛升
        https://www.zhihu.com/question/326890535/answer/719907717
        介紹一下自己研一時的一個工作,當時花過幾個月時間幫當時的論文指導(dǎo)老師寫過深度學習框架N3LDG(主要實現(xiàn)了完整的GPU計算和計算圖上的優(yōu)化),整了篇中文論文http://xbna.pku.edu.cn/EN/abstract/abstract3327.shtml

        當時測了幾個典型的模型的GPU訓練速度,論文中的表格:



        不過后來發(fā)現(xiàn)有個地方寫錯了,數(shù)據(jù)復(fù)制到gpu時沒有異步,改掉后就都比pytorch快了。

        我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里的多個不同維度輸入向量的拼接:

        這樣最后出來的CNN就能比pytorch快不少。
        其實模型訓練時的時間包含兩塊:1) GPU計算時間和 2) 計算圖的調(diào)度時間?,F(xiàn)在多數(shù)深度學習框架采用eager evaluation,這么做就使框架沒法對計算流程做優(yōu)化(主要是自動批量化)。在多數(shù)模型中,手動批量化也許可行,但是面對樹結(jié)構(gòu)或者圖結(jié)構(gòu)時就會很麻煩。這時lazy evaluation就是更好的選擇。然而計算圖的規(guī)劃是個NP難問題,只能通過一些啟發(fā)式規(guī)則來找到近似解。論文里這一塊follow的是dynet的工作,展開來講有點麻煩,感興趣的話可以看dynet的論文。

        顯存也需要操心。由于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能力
        • 編碼習慣良好,比如重視變量命名
        • 算法方面,會手算梯度就行
        更新 一下,項目已經(jīng)更名為InsNet,感興趣的話求個star~

        作者:劉冬煜
        https://www.zhihu.com/question/326890535/answer/700281308
        首先需要熟練使用C++編程,其次學會cuda的GPU顯卡計算框架,了解一下并行計算,寫出比TensorFlow快的框架非常簡單。畢竟TensorFlow為了可移植性等等犧牲了很多。
        下圖是我正在開發(fā)的一個閉源框架TenDPluS,名字中的Ten正是致敬TensorFlow:
        部分代碼
        用下圖網(wǎng)絡(luò)結(jié)構(gòu):
        神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)
        跑mnist,測試集正確率:
        mnist的正確率
        可以說,收斂速度、空間利用率和準確率都高于TensorFlow了。
        同時還提供了特征可視化的接口:


        一次演講的ppt,下兩圖來自TenDPluS的特征可視化

        我已經(jīng)用自己的框架做了三四個項目了,由于干最底層的算法崗,自己這不成熟的框架已經(jīng)能勝任幾乎所有需求了。目前我正在對框架進行可視化的相應(yīng)改進,力求能進一步突破TensorBoard。


        作者:phantomrider https://www.zhihu.com/question/326890535/answer/718793714
        TensorFlow沒寫過
        寫過一個小小的miniflow,用Python面相對象思維寫的,將每一層寫成一個類,然后每一個類里面有forward,backward兩個函數(shù)
        然后再用拓撲排序?qū)φ麄€神經(jīng)網(wǎng)絡(luò)進行forward和backpro操作

        作者:匿名用戶
        https://www.zhihu.com/question/326890535/answer/827912517
        我去,一個個都牛X成這個樣子了?

        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—
        瀏覽 55
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 香蕉婷婷 | 我就色色综合网 | 在线A∨视频 | av无码av| 色欲熟妇 |