從零開始學習MXnet(五)MXnet的黑科技之顯存節省大法

  寫完發現名字有點拗口。。- -#git

  你們在作deep learning的時候,應該都遇到過顯存不夠用,而後不得不去痛苦的減去batchszie,或者砍本身的網絡結構呢? 最後跑出來的效果不盡如人意,總以爲本身被全世界針對了。。遇到這種狀況怎麼辦? 請使用MXnet的天奇大法帶你省顯存! 魯迅曾經說過:你不去試試,怎麼會知道本身的idea真的是這麼糟糕呢?github

  首先是傳送門附上 mxnet-memonger,相應的paper也是值得一看的 Training Deep Nets with Sublinear Memory Cost網絡

  實際上repo和paer裏面都說的很清楚了,這裏簡單提一下吧。ide

  1、Why?idea

  節省顯存的原理是什麼呢?咱們知道,咱們在訓練一個網絡的時候,顯存是用來保存中間的結果的,爲何須要保存中間的結果呢,由於在BP算梯度的時候,咱們是須要當前層的值和上一層回傳的梯度一塊兒才能計算獲得的,因此這看來顯存是沒法節省的?固然不會,簡單的舉個例子:一個3層的神經網絡,咱們能夠不保存第二層的結果,在BP到第二層須要它的結果的時候,能夠經過第一層的結果來計算出來,這樣就節省了很多內存。  提醒一下,這只是我我的的理解,事實上這篇paper一直沒有去好好的讀一下,有時間在再個筆記。不過大致的意思差很少就是這樣。spa

  

  2、How?code

  怎麼作呢?分享一下個人trick吧,我通常會在symbol的相加的地方如data = data+ data0這種後面加上一行 data._set_attr(force_mirroring='True'),爲何這麼作你們能夠去看看repo的readme,symbol的地方處理完之後,只有以下就能夠了,searchplan會返回一個能夠節省顯存的的symbol給你,其它地方徹底同樣。orm

  

 1 import mxnet as mx
 2 import memonger
 3 
 4 # configure your network
 5 net = my_symbol()
 6 
 7 # call memory optimizer to search possible memory plan.
 8 net_planned = memonger.search_plan(net)
 9 
10 # use as normal
11 model = mx.FeedForward(net_planned, ...)
12 model.fit(...)

  PS:使用的時候要注意,千萬不要在又隨機性的層例如dropout後面加上mirror,由於這個結果,再算一次就和上一次不一樣了,會讓你的symbol的loss變得很奇怪。。blog

 

3、總結內存

天奇大法吼啊!

相關文章
相關標籤/搜索