1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一個(gè)關(guān)于 TensorFlow 的悲劇故事

        共 3525字,需瀏覽 8分鐘

         ·

        2021-10-20 19:31

        點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

        點(diǎn)擊上方?Java技術(shù)迷,選擇?設(shè)為星標(biāo)

        作者 |?Zahar?Chikishev

        譯者 | 彎月

        出品 | CSDN(ID:CSDNnews)


        使用 Pytorch 已經(jīng)好幾年了,我很喜歡這個(gè)框架。它清晰、直觀、靈活,而且速度很快。后來一次偶然的機(jī)會(huì),我決定使用 TensorFlow 構(gòu)建一個(gè)新的計(jì)算機(jī)視覺項(xiàng)目。本文講述的這個(gè)故事就始于此。

        TensorFlow是一個(gè)很完善,且使用很廣泛的框架。因此,當(dāng)時(shí)我對(duì)自己說,不可能太糟糕。鑒于 Google 強(qiáng)大的工程師團(tuán)隊(duì)以及機(jī)器學(xué)習(xí)方面的專業(yè)知識(shí),我以為相信他們準(zhǔn)沒錯(cuò)。然而,去年使用了一陣子 TensorFlow 之后,如今的我可以說這個(gè)框架的組織非?;靵y、維護(hù)不善、方向不正確,而且代碼中 bug 累累。以下是我遇到的一系列難題。
        首先聲明,我不是 TensorFlow 專家,文本的觀點(diǎn)也許不夠全面,有些方面我肯定沒有注意到。

        1

        安裝

        ?
        這個(gè)故事首先從安裝開始。TensorFlow 的安裝有一個(gè)先決條件:需要安裝 NVidia CUDA 和 cuDNN 庫(kù)。
        出于某種原因,要下載 cuDNN,必須先注冊(cè)和登錄 NVidia 門戶網(wǎng)站,這一點(diǎn)讓我覺得很煩。接下來,實(shí)際安裝的 CUDA 與 cuDNN 的版本必須與 TensorFlow 版本相匹配,否則就無法運(yùn)行。而且即使你知道版本匹配表在什么地方表(https://www.tensorflow.org/install/source#gpu),也很難找到。這些依賴性會(huì)持續(xù)引發(fā)一系列的問題。實(shí)驗(yàn)升級(jí)和降級(jí)很難,我經(jīng)常缺少一些庫(kù)。
        除了 tensorflow 本身,還有一個(gè)經(jīng)常使用的 python 包 tensorflow-addons。其中應(yīng)該是包含一些不太常用的代碼,但實(shí)際上開發(fā)人員總是需要安裝兩者,因此說到底將代碼分割成兩部分根本沒必要。當(dāng)然,兩個(gè)包的版本必須完全匹配,而且也有一個(gè)對(duì)照表。
        最后,還有 tensorflow-gpu。盡管我盡了最大努力,但仍然沒有搞清楚為什么這個(gè)包至今仍在pip 上, 而且一直在與 tensorflow 同步更新,盡管它在 2 年前就退休了。
        安裝非常艱難,但面對(duì)接下來的工作,我們必須堅(jiān)強(qiáng)起來。

        2

        Eagerexecution 就是一個(gè)騙局

        ?
        Eagerexecution 是 TensorFlow 官方文檔引入的一個(gè)概念(https://www.tensorflow.org/guide/effective_tf2)。
        Eagerexecution 的主要問題在于,它的運(yùn)行速度通常比圖模式慢。對(duì)于我的 CNN 模型,Eager execution 的執(zhí)行速度慢了 5 倍。就沖著這一點(diǎn),它就是一個(gè)非常小眾的調(diào)試工具,在默認(rèn)情況下誰(shuí)會(huì)使用這樣的工具?
        TensorFlow文檔中有明確的說明(https://www.tensorflow.org/guide/eager#benchmarks):
        對(duì)于計(jì)算量繁重的模型(如在 GPU 上訓(xùn)練的 ResNet50),EagerExecution 性能與 tf.function 執(zhí)行相當(dāng)。但是對(duì)于計(jì)算量較小的模型來說,這種性能差距會(huì)越來越大,并且在為有大量小運(yùn)算的模型優(yōu)化熱代碼路徑方面,其性能還有待提升。
        盡管他們承諾 Eager Execution 的性能與 tf.function 執(zhí)行相當(dāng),但我使用 ResNet50 進(jìn)行了測(cè)試,結(jié)果還是慢了 5 倍。但我也使用了自定義頭部和自定義損失函數(shù),對(duì)于希望急速處理的人來說,這些處理顯然太麻煩了。Keras 團(tuán)隊(duì)意識(shí)到了這些問題,他們默認(rèn)的執(zhí)行模式是圖模式。他們甚至強(qiáng)烈建議不要使用eager:
        請(qǐng)注意,Keras 是 TensorFlow 的主要推薦 API。然而,TensorFlow 2.0 卻宣布默認(rèn)情況下會(huì)運(yùn)行 Eager Execution。

        3

        tf.data.DataSetAPI 更是一團(tuán)糟


        在 TensorFlow v2 中,構(gòu)建數(shù)據(jù)流水線的推薦方法是調(diào)用tf.data.DataSet API。從表面上看,“直觀”的模塊化結(jié)構(gòu)與承諾的性能改進(jìn)確實(shí)不錯(cuò)。但是在試用了很多天之后,我感到很失望。
        我的機(jī)器學(xué)習(xí)任務(wù)是一個(gè)基本的圖像分類問題。使用舊的 Sequence API 處理同一個(gè)圖像加載和增強(qiáng)流水線,能夠達(dá)到相似的 GPU 利用率,甚至比 tf.data.DataSet 略快。
        但更糟糕的是,眾所周知,tf.data.DataSet API 非常難以使用,而且調(diào)試也非常困難。我們必須明確指定參數(shù)類型,這一點(diǎn)似乎完全沒必要。如果使用 tf.py_function,還需要在輸出中指定張量形狀,而文檔中卻沒有很好的解釋,你需要大費(fèi)周折才能找到。
        對(duì)于處理函數(shù),你需要在 tf.function、tf.py_function 和 tf.numpy_function 之間做出選擇。tf.function 是編譯版本,完全不支持 Eager Execution。但是 tf.py_function 會(huì)很慢,因?yàn)槊看握{(diào)用都會(huì)鎖定 python GIL。

        4

        API重復(fù)

        ?
        猜猜看我們一共有多少個(gè)二維卷積層的實(shí)現(xiàn)?根據(jù) TensorFlow 開發(fā)人員的說法,一共有 7 個(gè)之多:

        1、tf.nn.conv2d

        2、tf.keras.layers.Conv2D

        3、tf.compat.v1.layers.Conv2D

        4、tf.compat.v1.layers.conv2d

        5、tf.layers.Conv2D

        6、tf.raw_ops.Conv2D

        7、tf.contrib.slim.conv2d

        其中一些是底層 API,而有些則是高層 API;一些由第三方開發(fā),一些已棄用。但請(qǐng)注意,相應(yīng)的文檔頁(yè)面上并沒有提到這些。
        這種重復(fù)在 TensorFlow 中隨處可見。因此,我們很難知道使用哪些功能才是正確的,有什么區(qū)別,以及某些功能之間是否互相兼容但與其他功能不兼容。這是一個(gè)非?,F(xiàn)實(shí)的問題,開發(fā)人員每天都必須浪費(fèi)寶貴的時(shí)間和精力從 7 個(gè)函數(shù)中挑選一個(gè)正確的。

        5

        開發(fā)的各種不嚴(yán)謹(jǐn)

        ?
        以下是我遇到的其他幾個(gè)問題。
        • ImageDataGenerator是 TensorFlow 的增強(qiáng)庫(kù),與所有現(xiàn)代庫(kù)一樣,不允許局部生成隨機(jī)種子。相反,它使用全局 numpy.random.seed()。使用全局種子會(huì)導(dǎo)致可復(fù)現(xiàn)實(shí)驗(yàn)的開發(fā)變得異常復(fù)雜,尤其是在多線程的情況下。
        • Sequence 數(shù)據(jù) API 方法 on_epoch_end() 沒有使用 epoch 作為參數(shù)。在幾個(gè)版本中,它甚至沒有被調(diào)用,因此相比之下,缺少的參數(shù)似乎只是一個(gè)小問題。通過這個(gè)例子,我們也可以看出 TensorFlow 的測(cè)試覆蓋率(遠(yuǎn)低于應(yīng)有水平)。
        • TF 中的 GPU 內(nèi)存管理很糟糕。首先,無論實(shí)際模型大小如何,默認(rèn)情況下都會(huì)在模型初始化時(shí)占用所有內(nèi)存。幸運(yùn)的是,有一個(gè)配置選項(xiàng)允許分配的內(nèi)存按需遞增。但接下來還有一個(gè)大問題:分配的 GPU 內(nèi)存在使用后無法釋放,釋放內(nèi)存的唯一方法是殺死進(jìn)程。
        • TF 訓(xùn)練日志總是包含幾個(gè)模糊的警告消息。根據(jù)版本不同,警告也會(huì)不同。我個(gè)人不喜歡日志中出現(xiàn)警告消息,我會(huì)想辦法解決掉。但我無法解決掉 TF 訓(xùn)練日志中的警告,因?yàn)橥ǔJ且粋€(gè) TF 函數(shù)抱怨另一個(gè) TF 函數(shù)。這些函數(shù)真的應(yīng)該選擇其他的交流方式。
        最后,model.predict() 函數(shù)會(huì)泄漏 RAM 內(nèi)存。這不是生產(chǎn)推理需要使用的主要API調(diào)用嗎?難道 TF不是應(yīng)該至少能投入生產(chǎn)嗎?

        6

        結(jié)論


        我還是換回 Pytorch吧。

        版本

        本文以 TensorFlow 2.3.0 ~ 2.5.0 為基礎(chǔ)。
        參考鏈接:
        https://medium.com/geekculture/tensorflow-sad-story-cf8e062d84ba


        1、靈魂一問:你的登錄接口真的安全嗎?
        2、HashMap 中這些設(shè)計(jì),絕了~
        3、在 IntelliJ IDEA 中這樣使用 Git,賊方便了!
        4、計(jì)算機(jī)時(shí)間到底是怎么來的?程序員必看的時(shí)間知識(shí)!
        5、這些IDEA的優(yōu)化設(shè)置趕緊安排起來,效率提升杠杠的!
        6、21 款 yyds 的 IDEA插件
        7、真香!用 IDEA 神器看源碼,效率真高!

        點(diǎn)分享

        點(diǎn)收藏

        點(diǎn)點(diǎn)贊

        點(diǎn)在看

        瀏覽 25
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操碰在线观看视频 | 欧美黑吊大战白妞欧美大片 | 人妻一二 | 国产高清一二三区 | 超碰中文字幕在线观看 | 男人干女人b | 国产精品自拍不卡 | 国产一级A片精品免费高清天套 | 亚洲无码视频免费看 | 五月婷婷丁香综合 |