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

2021-01-15 機器之心


大家期盼已久的 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)。這是通過在每次迭代時將學習速率乘以一個常數因子來實現的。如果你將損失描繪為學習率的函數,你應該首先看到它在下降。但過一段時間後,學習率會太高,因此損失會迅速回升:最佳學習率將略低於轉折點。
  • 從論文到測試:Facebook Detectron開源項目初探
    大家對Facebook的計算機視覺研究項目的開源期盼已久,經過1年多的漫長等待,今天Facebook終於開源了Detectron,Detectron開源項目使用caffe2和python接口。實現了10多篇計算機視覺最新的成果。下面我們簡單介紹一下Detectron所實現的論文。並且對Detectron進行初次測試,我們會在隨後的博客中更新我們自己測試得到的Detectron訓練模型和速度標準。
  • Facebook 發布 Detectron2:基於 PyTorch 的新一代目標檢測工具
    而 Detectron2 則是剛推出的新版 PyTorch 1.3 (詳情查看:https://www.leiphone.com/news/201910/9J4PTd833WMwdVoQ.html)中一重大新工具,它源於 maskrcnn 基準測試,但它卻是對先前版本 detectron 的一次徹底重寫。
  • Facebook開源物體識別工具Detectron,加速計算機視覺研究
    這一系列工具的開源,將使更多研究人員能使用到Facebook的平臺,進一步擴大Facebook人工智慧實驗室的影響力。經過一年半的發展,Detectron 的代碼庫已趨於成熟,並支持了很多內部項目,比如:Mask R-CNN 和 Focal Loss for Dense Object Detection(ICCV 2017 - Marr獎項和最佳學生論文獲獎項目)。
  • 踩坑oracle dbms_job簡單使用
    job number在聲明declare後系統會給你分配一個,同樣用job window創建時,無需畫蛇添足手動添加作業務號,我還沒試過,有興趣的可以踩踩更大的坑哈哈哈。sysdate是下一次執行時間next_date。
  • 銀飾和白K金首飾你還是分不清?那豈不是總踩坑?
    白K金和銀飾都是白色的,張阿姨就說在購買首飾的時候自己總是分不清,曾經再一個路邊小店裡面買了一個假金飾,其實是鍍了一層銀,但是那個黑心店家卻告訴她是白K金很值錢比黃金還值錢,今天小編為了防止大家踩坑就來和大家說一下這二者。銀飾其實可以回收的,比如說K金回收,不過銀飾回收行情一般。
  • 通過周期性學習率和快照集成來克服在訓練深度學習中的精度限制
    除了消失梯度等技術原因外(即因為某些激活函數將它們映射到一個小範圍內,所以如果網絡太深,誤差梯度不能回流到起始層),一個明顯的原因與局部最優有關和鞍點。 在局部最優點或鞍點處,誤差和權重的梯度幾乎為0,減慢了訓練過程。在某個方向上有足夠大的推動力,希望我們能擺脫這種情況。
  • 量子波動速讀走紅,家長常踩5大教育坑,每一條都映射無盡的焦慮
    避免家長踩坑。育兒路上家長常踩的5個坑第1條 :量子波動速讀 波動速讀 能鍛鍊閱讀能力我們的眼睛並不能一次性看到那麼多東西,聚焦也只能看到小範圍,利用快速翻閱書本就能夠吸收書本內容真正認識幾萬字,更是無稽之談,提高閱讀能力,就要多讀書,精讀書。孩子不太理解的內容,就鼓勵他來回看,精讀。閱讀是為了求知,不是求速度。
  • 真坑!孕婦路上踩中井蓋掉坑裡,傷人井蓋到底是誰的?
    這不,她和往常一樣下班回家,沒想到,走在路上卻發生了意外! 下班回家踩中井蓋掉坑,發現已懷孕 住在觀瀾的龔女士每天都自己上下班,4月26號晚上八點左右,龔女士途徑觀瀾人民路一個拐角>不小心踩到一個鬆動的井蓋就掉下去了!
  • 輪狀病毒出沒 這些坑家長別踩
    輪狀病毒是秋冬腹瀉的主要病原之一,該病12月份達到高峰,可持續到次年3月。由於腹瀉是一種常見病,有些家長嫌跑醫院比較麻煩,於是就在家裡自己用藥物給孩子治療。但在自行治療過程中難免會踩到「坑」,下面就給大家梳理一下,家長們在應對小兒輪狀病毒腸炎過程的幾個常見誤區。
  • 看看過來人經驗,能讓你少踩很多坑
    導讀:大家好,我是百家號作者:多麼美麗的小小村莊,每日和大家分享精彩的原創內容,希望大家能夠喜歡,今天我們分享的話題是:養鷓鴣有哪些需要注意的地方?看看過來人經驗,能讓你少踩很多坑養鷓鴣算是一種比較賺錢的行業了,因為這部現在的市場需求量還是挺大的,口感比較好,成了不少飯店的熱銷菜品。也正是因為它們對需求量太高,所以野生的這個股已經遠遠不夠了,現在人工養殖鷓鴣之所以這麼賺錢,就是因為它的前期投入不高,但是後期的收入卻很讓人滿意。
  • 玩HiFi少踩坑:一位資深燒友選購耳機的經驗分享
    在筆者入門的那個時代(2008年左右),網際網路並不如現在那麼發達,當時還上初中的我更幾乎無從得知線下的試聽店和展會的消息。在那個時候,我了解HiFi耳機的途徑只有在zol上看耳機參數和評測。    建立聽音觀最好的方式之一是聽音樂會的現場(非流行、搖滾樂現場),尤其是比較講究的劇院演奏能夠讓聽者真正理解什麼是真實的聲音。
  • 住宅建築師規劃強排系列-10 日照核算(上)—這些年踩過的坑
    01 日照規範只憑經驗,不好好看規範,是最大的坑。踩過坑的都應該知道,怎一個驚心動魄,心驚膽戰!)註:以上只是經驗數據,僅供參考,遇到實際項目,需和甲方確認現狀的日照條件。並不會一塵不變,可能出現各種各樣的驚喜。
  • 這些貌似健康的蔬菜,熱量堪比葷菜,有你曾經踩過的坑嗎?
    這些貌似健康的蔬菜,熱量堪比葷菜,有你曾經踩過的坑嗎?藕,小編在這裡說藕是一種熱量堪比葷菜的蔬菜,肯定很多人不相信,當然,這說的並不是藕本身含有的熱量,而是在製作過程中不小心入的坑。其實藕與土豆有很大的相似之處,本身所含的澱粉比較多。炒藕炒土豆的時候,短時間熟不透,長時間燒的話油少了就會糊鍋,所以炒藕的時候油肯定放的多,由於澱粉含量多,也挺吸油,吃的時候感覺並不明顯。
  • SPC實戰中踩過的那些坑
    =>過程能力系列:①原創|從變差談Cp、Cpk和Pp、Ppk③原創|當Cp、Cpk遭遇單邊公差?④原創|從田口質量損失函數到Cpm=>控制圖系列①原創|SPC系列之控制圖基本知識②原創|SPC系列之控制圖理論基礎③原創|SPC系列之控制圖的類型、選擇及應用④原創|SPC系列之控制圖的評價準則從本質上來說控制圖是時間序列分析中的一種特殊應用,而休哈特常規控制圖更是其中經過簡化過後、高度標準化的場景應用
  • 便宜的機票雖好但卻容易「踩坑」
    買機票稍不注意就容易踩到坑了!購票指南根據英國政府通告,入境英國的旅客需要提前在英國政府指定的網站上填報行程和聯繫方式,並在入境英國後自我隔離14天。雖然中轉航班相對來說比較便宜,但是還是有不少旅客因為對政策的不熟悉從而導致「踩坑」了!防坑寶典不少旅客之所以表示被坑,是在還沒搞懂中轉地的相關政策的前提下,就直接購票導致行程無法順利進行。
  • 精讀|《昆蟲記-10菜豆象》精讀批註
    」欄目給大家分享李曉老師對《昆蟲記》中《菜豆象》的精讀批註。精讀批註主要幫助同學們自主閱讀,同時亦可用作教師閱讀或備課參考。 點此查看:上期《豌豆象》精讀批註 點此查看:《菜豆象》原文+朗讀 《菜豆象》精讀批註
  • 這些年在英語啟蒙上踩過的坑
    哥哥的英語經常被周圍的人誇,但我們真的不是學霸,可能有一點突出的就是孩子的發音和口語表達。 因為有著兩個孩子跌跌撞撞的經驗,加上自己也累積了一些關於啟蒙的知識,總結一些我們掉進過的那些坑,幫助你們節約時間,避掉這些坑,這篇文章的意義就在於此吧。