專欄 | Detectron精讀系列之一:學習率的調節和踩坑

2021-03-02 機器之心

大家期盼已久的 Detectron 終於開源啦,state-of-the-art 的模型就在一個命令行之間。但是面對龐大的 caffe2 和 detectron 函數庫,多少會感覺有些迷茫。Detectron 精讀系列會從細小的調參開始,到一些重要的函數分析,最後掌握 Detectron 函數庫的全貌。在這個過程中,我們也會幫大家提前踩坑,希望大家可以從 Detectron 函數庫學到更多通用的計算機視覺技能。

Detectron 函數庫有一點複雜,在這次的解讀中我們主要介紹 multi-gpu 訓練的時候,學習率如何調節的問題。看似簡單的問題,最近 Facebook,Google 和 Berkeley 多個組都發表了論文對這一問題進行了理論和實驗的討論,首先我們對這些論文的結果做一個簡要的總結。三篇論文研究類似,但是每一篇相對於前一篇都有改進。

Facebook : Training Imagenet in 1 hour

貢獻:

提出了 Linear Scaling Rule,當 Batch size 變為 K 倍時,Learning rate 需要乘以 K 就能夠達到同樣的訓練結果。看似簡單的定律,Facebook 的論文給出了不完整的理論解釋和堅實的實驗證明。除此之外,論文還討論了如何處理 Batch Normalization 如何實現分布式 SGD。通過 Linear Scaling Rule,Facebook 成功的在一小時內訓練了 Batch size 為 8192 的 Resnet 50。

缺陷:

當 Batch Size 超過 8000 時觀測到了模型訓練結果會嚴重變差。如下圖:

Berkeley : Large Batch Training of Convolution Networks

Berkeley 的組發現 Facebook 提出的 Linear Scaling Rule 當 Batch Size 過大時訓練不穩定,容易發散。並且當模型 Batch Size 超過 8000 時,結果會嚴重退化。作者提出了 Layer Wise Adaptive Rate Scaling(LARS)定律,從而能夠在 Batch Size 為 32000 的情況下高效的訓練 ResNet 50 網絡。SGD 的權值更新等於梯度乘以 Learning rate,論文中作者提出了 global learning rate 和 local learning rate 決定,global learning rate 所有層共享,local learning rate 由梯度的變化速率決定,這一想法是受 ADAM 等 adaptive learning rate SGD 的方法的影響。下表格為 LARS 的訓練結果: 

Google : Don’t decrease the learning rate, increase the batch size

LSR 和 LARS 大大的提高了模型的並行性,但是不能夠提高模型的結果。Google 組的研究發現,通過增大 Batch Size 保持 Learning rate 不變的辦法可以得到與 decreasing learning rate 類似的學習曲線,並且將 batch size 進一步擴大到了 65536,整個模型的訓練過程只需要 2500 次參數更新。

收穫與總結:

三篇論文通過理論和實驗證明了 large batch size 能夠加快模型的訓練速度。面對動則幾百塊的 GPU,很多人對這三篇論文望而卻步。其實本文提出的 idea 可以在 Faster RCNN,Mask RCNN 中得到很好的應用,我們只需要使用 multi-GPU,並且根據 Linear Scaling Rule 來調節學習旅就可以大大的提高 Detection 網絡的訓練速度,並且還有可能得到更好的結果。

Detectron Linear Scaling Rule Example

Detectron 庫的 toy example 已經給大家展示如何使用 Linear Scaling Rule

 python2 tools/train_net.py \

   --cfg configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml \

   OUTPUT_DIR /tmp/detectron-output

python2 tools/train_net.py \

   --cfg configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml \

   OUTPUT_DIR /tmp/detectron-output

python2 tools/train_net.py \

   --cfg configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml \

   OUTPUT_DIR /tmp/detectron-output

python2 tools/train_net.py \

   --cfg configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml \

   OUTPUT_DIR /tmp/detectron-output

對應的 config 文件如下:

1 GPUs:

 BASE_LR: 0.0025

 MAX_ITER: 60000

 STEPS: [0, 30000, 40000]

2 GPUs:

 BASE_LR: 0.005

 MAX_ITER: 30000

 STEPS: [0, 15000, 20000]

4 GPUs:

 BASE_LR: 0.01

 MAX_ITER: 15000

 STEPS: [0, 7500, 10000]

8 GPUs:

 BASE_LR: 0.02

 MAX_ITER: 7500

 STEPS: [0, 3750, 5000]

Large Batch Size 的初始訓練不穩定,需要使用 warm up schedule 進行學習旅調整,具體論文在 lib/utils/lr_policy.py 中實現。

Mxnet Faster RCNN Linear Scaling Rule Testing

Linear Scaling Law 簡單的讓人難以相信,為了真實的測定這一定律是適用於 faster rcnn,我們在 mxnet faster rcnn github 上面測試了該定律。我們分別測定了不使用 Linear Scaling Law 的 faster rcnn 跟使用 Linear Scaling Law 的結果。從結果分析使用 Linear Scaling Law 能夠加速訓練,並且還有可能得到更高的準確率。訓練集和測試集分別為:VOC 07 和 VOC 07 test 實驗結果如下:

nohup bash script/resnet_voc07.sh 0,1 0.001 &> resnet_voc07.log &

nohup bash script/resnet_voc07.sh 0,1,2,3 0.002 &> resnet_voc07.log &

nohup bash script/resnet_voc07.sh 0,1,2,3,4,5,6,7 0.004 &> resnet_voc07.log &

Learning rate / GPUs / MAP / training sample per second

 0.001 / 2 / 70.23 / 4

 0.002 / 4 / 71.43 / 6

 0.004 /  8 /  70.98 / 9

 0.001 / 4 / 66.50 / 6

 0.001 / 8 / 65.00 / 9

Detectron 函數庫訓練踩坑錄 (o^^o)

Detectron 條理清楚,但是免不了有一些小的 bug,下面我們就給大家分享一下我們遇到的小坑。

踩坑 1

Config 中大多數參數是為 8 路 GPU 準備的,直接把 GPU 數目改為 1 會讓結果變為 NAN。

Solution

根據 Linear Scaling Law 請自行降低學習率,減少 batch size 會增大梯度的不準確性,這時候大的學習率會讓神經網絡 diverge。

踩坑 2

Multi GPU 訓練的時候會 out of memory。錯誤如下:

terminate called after throwing an instance of 'caffe2::EnforceNotMet'

what(): [enforce fail at context_gpu.h:230] error == cudaSuccess. 4 vs 0. Error at: /home/huichan/caffe2/caffe2/caffe2/core/context_gpu.h:230: unspecified launch failure Error from operator:

input: "gpu_0/res5_0_branch2c_w_grad" output: "gpu_2/res5_0_branch2c_w_grad" name: "" type: "Copy" device_option { device_type: 1 cuda_gpu_id: 2 }

terminate called recursively

*** Aborted at 1516782983 (unix time) try "date -d @1516782983" if you are using GNU date ***

terminate called recursively

terminate called recursively

terminate called recursively

terminate called recursively

terminate called recursively

terminate called recursively

terminate called recursively

terminate called recursively

Solution

Facebook 已經發現了這一錯誤,對 lib/utils/subprocess.py 進行了及時的修改。

踩坑 3


我們使用 multi GPU 訓練的時候會出現伺服器重啟,初步懷疑 memory leakage,我們已經將該問題反饋回了 Facebook,如果遇到相同問題的同學,請稍加等候。

祝大家學習順利……(o^^o)

 

本文為機器之心專欄,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:editor@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 適合新手的Detectron2入門
    有關更高級的教程,請參閱我們的文檔(https://detectron2.readthedocs.io/tutorials/extend.html)。預訓練模型的推理演示從模型Zoo(https://urlify.cn/qeeMJz) 中選擇一個模型及其配置文件 ,例如mask_rcnn_R_50_FPN_3x.yaml。
  • 深度學習的學習率調節實踐
    找到一個好的學習率的一個方法是訓練模型進行幾百次迭代,從非常低的學習率(例如,1e-5)開始,逐漸增加到非常大的值(例如,10)。這是通過在每次迭代時將學習速率乘以一個常數因子來實現的。如果你將損失描繪為學習率的函數,你應該首先看到它在下降,但過一段時間後,學習率會變得很高,這時損失會迅速回升:最佳學習率將略低於轉折點,然後你可以重新初始化你的模型,並使用此良好的學習率對其進行正常訓練。
  • 學習率和batchsize如何影響模型的性能?
    雖然學習率的變化是最離散的,但是並不影響模型收斂到比較好的結果。其次是exp,poly。它們能取得與step,multistep相當的結果,也是因為學習率以比較好的速率下降,雖然變化更加平滑,但是結果也未必能勝過step和multistep方法,在這很多的研究中都得到過驗證,離散的學習率變更策略不影響模型的學習。inv和fixed的收斂結果最差。
  • 年終總結:這一年踩過的坑
    有句古老的諺語:沒有踩過坑的產品經理不是好的產品經理。因此,工作之外,我專注的只有一件事:踩坑。踩坑,是項技術活。有的人踩坑,踩的七歪八扭,深淺不一。這種踩最後就只剩下坑。我呢,稍微踩的好點,踩的坑都圍繞著同一個基點:教育行業的產品經理。這個詞可以分成兩截理解:教育行業、產品經理。
  • 深度學習煉丹手冊——學習率設置
    在訓練深度學習模型時,一個非常重要的超參數就是學習率,學習率設置的合理與否,非常影響模型的收斂速度和最終性能。
  • H&D英語精讀專欄(六) 川普的經濟政策
    為何辦 H&R 英語精讀專欄,我已在 2016 年 3 月 13 日的「開篇詞」說過了。這裡再略述一二。
  • 不瞞你說,在分級閱讀上我也踩過不少坑
    你看,我陪你們一起雞娃,娃跟你們娃一起長大,碰到好的資源就齊分享,踩過的坑也絕對不藏著掖著。所以,我就來聊聊,跟分級閱讀碰撞的兩年裡,我踩過的一些坑,你們的很多疑問可能就在我的這些坑裡。第一坑,貪多。因為到了高級別,故事系的看多了,很難打動我了;但科普系的,太難抗拒了,RAZ很直男但知識面廣,大貓和牛津樹其他分支的科普,真的畫面又好看,內容又精良。幹嘛要出這麼多好書,真是一聲長嘆!第二坑,咋讀啊,麻爪!
  • 破壁機的挑選購買,到底如何「避雷防踩坑」?
    近幾年,破壁機吸引了眾多消費者的關注,除了功能強大外,它也經常讓消費者踩雷掉坑,例如會出現「破壁機使用幾次後只能擱置落灰」等尷尬情況。究其根本,是因為消費者在購買和挑選破壁機的過程中,對破壁機不太了解,導致踩雷掉坑,變成了「種草容易拔草難」。
  • 深度學習100問-11:什麼是學習率衰減?
    比如說參數初始化策略、batch size的選擇、使用哪種激活函數和優化器等等。其中優化器的學習率的設置是一個重要調參步驟。     關於優化算法的相關理論,這裡不過多展開,筆者在深度學習60講系列中第6講中有詳細講解,需要複習的朋友回看深度學習筆記6:神經網絡優化算法之從SGD到Adam即可。這裡咱們單獨把優化器中的學習率拎出來,因為學習率是一個神經網絡優化的關鍵參數。
  • 美縫劑的坑,你踩了幾個?
    當然,網上有很多教你如何挑選美縫劑的文章和視頻。無外乎是教如何通過聞氣味、光澤度、黏稠度、硬度什麼的來判斷好壞。可是你不可能把所有的美縫劑都買回來一個個打開試吧?小編,就是鄙人,在建築粘膠材料行業浸潤了十多年了,先是做玻璃膠和幕牆膠行業,然後就是美縫劑做了三年,應該有資格告訴一下大家如何挑選美縫劑吧。
  • 三個股東用技術入股被坑過億,律師教你不踩坑的5招
    專欄前面共介紹了6家技術入股的案例,包含技術入股的9種方法。其中有3家公司是出技術的股東被坑了,被坑金額高達1億,被坑得有點慘哦。但他們的公司章程規定和股東協議不一樣,公司章程寫公司註冊資本是50萬元,雙方都以貨幣出資,小股東認繳出資額22.5萬元,大股東認繳出資額為27.5萬元,而小股東用來繳付出資的22.5萬元是大股東給的。因為公司章程和股東協議的約定不一樣,為後面的紛爭埋下大坑。
  • 考研英語真題精讀專欄正式回歸!
    大家可以點擊公眾號菜單欄」雙語精讀「中的」考研精讀「閱讀。今年,我們暫定每周五準時更新,歡迎2021考研黨以及未來的考研黨持續關注。在正式開始閱讀前,我先教大家如何最大化的利用好「考研英語真題精讀」這個專欄的內容。
  • Facebook 發布 Detectron2:基於 PyTorch 的新一代目標檢測工具
    而 Detectron2 則是剛推出的新版 PyTorch 1.3 (詳情查看:https://www.leiphone.com/news/201910/9J4PTd833WMwdVoQ.html)中一重大新工具,它源於 maskrcnn 基準測試,但它卻是對先前版本 detectron 的一次徹底重寫。
  • 實用技能 | ppt裡你踩過的那些坑
    看到這個標題,是不是想到上期的「word裡你踩過的那些坑」,今後歡迎留意實用技能組針對常用在線工具的「踩坑」系列。
  • 筆記本電腦選購要注意套路,這些坑小白最好別踩,謹慎總比被坑好
    筆記本電腦實際上,就是算是選購筆記本電腦,如果經驗不足或粗心大意也有會被坑的可能。所以小白們在選購筆記本電腦時,這些坑最好別踩,小心謹慎一點總比被別人坑的好。結果往往就是,你買了和他一樣配置的筆記本電腦,他踩過的坑你一樣也要踩。
  • Echarts在Taro微信小程序開發中的踩坑記錄
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】經微信公眾號授權轉載,如需轉載與原文作者聯繫背景近期筆者在使用Taro進行微信小程序開發,當引入Echarts圖表庫時,微信檢測單包超限2M的一系列優化措施的踩坑記錄,期望能指導讀者少走一些彎路。
  • 破壁機防套路秘籍,不得不知道的「避雷防踩坑」要點
    除了功能強大外,經常讓消費者踩雷落坑。因為聲音大,故障,不好用等原因,「破壁料理機使用幾次後,只能用來落灰」。根本原因是消費者在選購破壁機過程中對破壁機了解不多,從而踩雷掉坑,變成「種草容易,拔草難」。如果你想把上海的破壁機扔掉,你仍然需要和破壁機應該是什麼樣的垃圾做鬥爭,相信每個人都會說:「我太難了。」
  • 小學生閱讀理解走過的坑,請不要接著踩
    小學生閱讀理解走過的坑,請不要接著踩。近期有很多家長諮詢我,孩子閱讀理解經常丟分,假期要不要給孩子買一些練習冊集中訓練。有沒有什麼好方法,能夠快速提高閱讀成績。小學生閱讀丟分問題我在《小學生閱讀理解頻繁出錯的真相》一文中做過一些分析。這裡不再重複以前講過的問題。
  • 農信社網申容易踩到的那些「坑」!你不會踩到吧?
    可見,網申的「坑」也不少啊!為了讓大家少踩坑,小編整理了報考農信社的一些「坑」和避「坑」方法,希望大家以後能避開,順利去到自己想去的崗位工作。網申報名的簡歷填寫頁面中,帶有*號的項為必填項,沒有標記的為選填項。很多同學因為「犯懶」就將其空缺,其實這是不對的!
  • 考研路上踩過的坑,避雷指南
    首先我想申明我不是考研大神也不是學霸,只是單單從我考過研我踩過的坑和我閨蜜踩過的坑想告訴大家,雖然在學習路上不能一味地趕進度但是也不能用以為把基礎打牢再去強化。研究生考試選拔選的就是在有限時間內掌握知識並運用,真的沒有時間讓我們慢慢的學習。