小白最近在將以往tensorflow上的代碼遷移到pytorch上來,結果在大致相同的參數,固定的有限顯存的情況下,在tf上能夠實現更大batchsize,而在pytorch上極其容易爆掉顯存。請問這種情況是因為tensorflow這種靜態圖網路更容易節省顯存嘛?


tensorflow是否比pytorch在顯存管理利用方面更有優勢

最近在將以往tensorflow上的代碼遷移到pytorch上來,結果在大致相同的參數,固定的有限顯存的情況下,在tf上能夠實現更大batchsize,而在pytorch上極其容易爆掉顯存。請問這種情況是因為tensorflow這種靜態圖網路更容易節省顯存嘛?

不知道,取決於你具體幹了啥......

關於第一個問題隨便說兩句吧. 對於tensorflow這樣的一個declare-and-run的framework,能夠事先完整的知道你要進行的計算,那在內存管理和優化方面, 理論上是有明顯優勢的.

實際中,舉個最簡單的例子: 什麼時候釋放內存?

TensorFlow(graph mode): tensor不再被後面的計算用到的時候釋放.

Pytorch: tensor不可能再被後面的計算用到(也即無法從python里訪問到,引用計數為0)的時候釋放.

這兩句話的微妙區別就是 pytorch無法準確判斷一個tensor會不會再被用到, 所以只能保守釋放. 並且經常要把管理內存的重任交給寫代碼的人, 用戶要是不注意也容易寫出內存不經濟的代碼.

除了釋放tensor這一點之外, 在其他的operator fusion, in-place, gradient checkpointing等節約內存的手段上, 能夠事先拿到computation graph都是一個巨大的優勢.

當然, 作為用戶, 用戶總是知道完整的計算的. 所以即使在pytorch里,如果能夠不怕麻煩的針對你要做的事情寫一些奇怪的代碼,內存利用效率不會有很本質的區別.


知道靜態圖確實可以優化內存,但是實際上動態圖的自動內存管理也有很多優化的方法,並不是一定會爆的。

比如,靜態圖優化中的 Common Sub-expression Elimination 在動態圖中可以通過 Function Memorization 來實現。 Automatic Differentiation 中需要用到之前結果的時候也可以通過實現 Binomial Checkpointing 來自動 Evict 之前的 Tensor 佔用的內存。

只是上面提到的大家還沒來得及實現而已……慢慢寫……不著急……


TF 2.0 eager 模式和 PyTorch 比不好說,但 1.x 的 graph 模式和 PyTorch 比還是有優勢的。

類比一下就是編譯型語言和解釋型語言的區別,編譯器能拿到全局信息,能做的優化顯然比只有局部信息的解釋器要多。如果就內存佔用來講,即使是做了 JIT 編譯的解釋器,優化空間也顯然不如編譯器來得大。

當然優化潛力是一回事,有沒有做到是另一回事了,這個也看具體的模型和框架版本,但設計原則大體能體現未來一段時間內的狀況。


顯存佔用應該是差不多的,tensor中主要是數據占空間,所以只要數據一樣,顯存佔用也不會差太多。

你應該是沒有注意及時釋放中間變數的引用。pytorch里tensor的生命周期就是python對象的生命周期,如果對象沒被釋放,就會一直占著顯存。


為什麼我剛好和你相反?我在tf2.0上運行不了的數據集,移到pytorch上就能運行。


別糾結了,pytorch吧,人這一生就那麼幾十年


推薦閱讀:
相关文章