tf data是如何支援多執行緒的?為何會比基於queue的batch方案慢4到5倍?

時間 2021-05-09 05:05:02

1樓:丁煒傑

tf的計算都是乙個個小batch的走的,中間會有python和cpp的runtime切換,然後不可避免的會遇到GIL。

所以並沒有哪個解決方案一定會比另乙個慢幾倍的說法,tf.data和queue runner甚至自己寫pipeline在複雜度上其實沒有本質的區別,多cpu下的效能差異更多來自於中間遇到了幾個GIL。

我們曾經遇到過手寫pipeline比tfdata快十倍的場景,也遇到過反過來的。

終上,樓主可以檢查下慢的解決方案裡是不是遇到的GIL比較多。

2樓:

根據官方的 Performance Guide,Dataset API 使用了 C++ 多執行緒進行資料讀取。相比於原來基於 Python 的 queue_runner,Dataset API 可以取得更好的效能,是推薦的資料讀取方式。

3樓:胡昊

大概有這樣幾個地方是可以調的 (以下假定樓主是使用了TFRecordDataset):

1. 初始化TFRecordDataset時候的buffer_size, 現在預設的buffer size是256KB (我也不知道為什麼TF的dev選擇了這麼小的乙個數值……), 這個buffer_size最後會被用來初始化乙個BufferedInputStream, 參見code.

2. 如果樓主使用了多GPU或者說distributed training而需要使用Dataset.shard的話,應該注意要盡量去先在建立TFRecord的時候就建立不同的shard,而不是說只建立乙個很大的TFRecord檔案然後再去shard, 這個建議在TensorFlow的官方doc上有乙個說明,參見這裡。

3. prefetch操作應該是每乙個shard都會有乙個prefetch thread, 實現可以參見這裡.

4樓:馮姆姆

最近看見的tf.data,因為我只有一塊GTX 1080 ti,而且也不願意code裡面再import,還是覺得yield生成generator然後iteration迴圈迭代取值來的直接,都是ndarray.......不過,最近考慮如果需要對於輸入修改使用的話,還是使用GPU內處理,比較好,tf.

image模組應該學習~

PHP不內建多執行緒程式設計支援,是為讓PHP容器 PHP FPM Apache 執行更加穩健,不懂求解釋?

執行緒更輕,更容易共享資源,比如開啟的檔案。執行緒容易處理不當互相影響。程序頁表都不一樣所以乙個掛了不容易影響另外的程序。但是資源共享比較麻煩。反對 Dean.Lee 對執行緒和程序的觀念。程序和執行緒的區別更多是在共享資源方面。在Linux 下,執行緒是共享頁表和檔案還有其他資源的。無論是執行緒還...

關於多執行緒程式設計和CPU多核多執行緒的關係?

佐佐浪 具體到你的例子,修改優先順序和修改時間片是無法達到這個效果的。你需要做的是把你的計算部分做成並行的。單獨乙個執行緒是達不到你要的效果的。 棒子先生 首相我們了解下為什麼需要用到4核,這是由於不能盲目的提高CPU的主頻和頻寬,這樣會產生各種實際很難處理的問題,比如溫度飆公升等。舉例來說我們需要...

如何學會多執行緒工作?

dboy 你假設自己漂亮的大腦是個多核CPU,是很天真的。它不是,你是乙個人,有七情六慾,不是計算器,計算資源可以N等分水平擴充套件,但人腦不是,注意力是做好工作的必備資源,如果注意力可以隨意切分,就不會叫注意力了,太Sunny如果不能匯聚到一點是煮不開水的,光束再多也沒用。絕不多個主要目標齊頭並進...