如何僅花25美元并在3小時內完成ImageNet訓練?

譯者 | 核子可樂
編輯 | Debra、Vincent
AI 前線導讀:在斯坦福大學建立的項目 DAWNBench 競賽中,CIFAR10 與 ImageNet 的表現引起了人們的關注,在目標基本一致的前提下,兩者的準確度分別達 94% 和 93%,在成本和速度上均有亮眼的表現,其中 ImageNet 訓練成本低至 25 美元,CIFAR10 訓練成本僅為 0.26 美元!它們是如何做到這一點的?競賽中還有哪些讓人意外的發現呢?

更多干貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)
基準測試結果

DAWNBench 是斯坦福大學建立的項目,旨在以競賽形式對不同深度學習方法加以比較。在 Dawnbench 競賽當中,CIFAR10 與 ImageNet 的表現引起了我們的關注。二者的目標基本一致,在保證相對合理準確度(ImageNet 為 93%,CIFAR 為 94%)的同時盡可能提高圖像分類器執行速度并降低運行成本。

在 CIFAR 10 測試當中,我們的參賽作品在兩個方向上勝出,分別為速度最快與成本最低。來自 DARPA D3M 項目的獨行俠 Ben Johnson 在這兩個方向上皆取得亞軍成績。而在 ImageNet 測試當中,我們的結果是:


  • 在公有基礎設施上速度最快、在 GPU 上速度最快、在單一計算機上速度最快(甚至超過英特爾利用 128 臺計算機建立的集群!)

  • 成本最低(不過 DAWNBench 官方公布的結果并非我們的實際成本,下面將對此作出具體解釋)。

總體而言,我們的結論是:


  • 算法創造力比裸機性能更重要。

  • 由 Facebook AI Research 與協作者團隊開發出的 Pytorch 能夠提供快速迭代與調試能力,從而支持這種創造力。

  • AWS 競價實例是快速經濟運行實驗性負載的絕佳平臺。

在本篇文章中,我們將討論在每輪測試競賽中使用的具體方法。這里提及的所有方法已經或者正在被合并至 fast.ai 庫當中。

超級收斂

fast.ai 作為研究實驗室,致力于通過教育與開發更易使用的軟件方案降低深度學習入門門檻,從而簡化用戶的學習流程。在我們看來,擁有最新計算機設備或大規模計算集群不是也不應成為涉足深度學習的必要條件。相反,對現代技術與最新研究成果加以利用,同時清楚了解當前需要努力解決的問題才是其中的關鍵。作為這項研究的重要組成部分,我們最近開發出一套新的庫,用于訓練 基于 Pytorch 的深度學習模型——這就是 fastai。

隨著時間的推移,我們已經將眾多可能未在社區當中得到應有重視的研究論文當中的算法引入 fastai。具體來講,我們發現當前深度學習社區過分強調斯坦福大學、DeepMind 以及 OpenAI 等高知名度組織公布的研究結果,但卻忽略了其它同樣具有重要價值但卻知名度較低的學術來源。來自海軍研究實驗室的 Leslie Smith 就是其中一例,他最近發現了一種所謂“超級收斂”的重要現象。他解釋稱,這種現象可能帶來相當于原有已知方法 5 到 10 倍的深度神經網絡訓練速度,進而給整個領域帶來革命性的變化。然而,他的論文并未被學術出版機構所接受,因此無法出現在任何主流軟件方案當中。

在對這篇論文進行課上討論的 24 小時之內,fast.ai 學生 Sylvain Gugger 就已經完成了該方法的具體實現——即將其納入 fastai 當中。他還開發出一份交互式筆記,用以展示如何嘗試其它相關方法。從本質上講,Smith 的案例表明,如果在訓練期間緩慢提高學習率,同時降低動量,則可以極高的學習率完成訓練——這意味著我們將能夠避免過度訓練,并將訓練時長壓縮至極低水平。

超級收斂理論中的學習率與動量模式

這種新的算法思維轉變正是 Pytorch 與 fastai 的亮點所在。Pytorch 支持交互式調試以及對標準 Python 編碼方法的使用 ; 而 fastai 則提供多種構建塊與鉤子(在本示例中體現為回調,其允許實現定制化訓練,并利用 fastai.sqdr 建立新的學習率退火方法)。Pytorch 的張量庫與 CUDA 則允許用戶以探索方式快速嘗試新算法的實現。

我們已經建立起一支非正式深度學習研究小組(任何人皆可免費參加),大家在日常課程當中共同參與項目。我們希望通過編碼方式驗證 Smith 的結論是否像他宣稱的那樣有效。再加上斯坦福大學正在舉辦 DAWNBench 競賽 ,我們認為這絕對是測試其實際效果的好機會。但在決定參加時,距離競賽開始已經只剩下 10 天時間——形勢相當緊迫!

我們的深度學習研究小組

CIFAR 10

CIFAR 10 與 ImageNet 都屬于圖像識別類任務。舉例來說,假設我們擁有一組貓與狗的照片,而且打算構建一款工具對其進行自動區分。我們首先需要建立一套模型,而后利用大量照片對其進行訓練,這樣其就能自動分類未見過的貓與狗照片。接下來,我們可以利用這套模型處理規模更大的數據集——例如 CIFAR,這是一套照片集合,每張照片都包含貓、狗以及其它數十種動物 / 載具對象(例如青蛙與飛機)。這些圖片比較小巧(32 像素 x32 像素),因此整體數據集也比較袖珍(僅為 160 MB)且易于處理。目前,這套數據集受到的重視程度并不高,因為其在體量上遠遠不及當下比較流行的大規模數據集。然而,其中的數據量很能體現各類組織所面臨的實際情況,而較小的圖片尺寸既帶來識別挑戰同時也降低了訪問門檻。

在決定參加比賽時,當時的領先算法在一個多小時內即可達到 94% 的準確率。然而我們很快發現,我們在超級收斂理論的指導下只需要約 15 分鐘就能訓練出一套 Resnet 50 模型——這無疑是個激動人心的時刻!在此之后,我們還嘗試了其它一些架構,并發現 Resnet 18(實際上是 Resnet 18 的一套預激活變體)在 10 分鐘內即達到了相同的結果。我們在課堂上進行了討論,而 Ben Johnson 獨自對該方法進行深入開發。他在 fast.ai 當中添加了一種名為“concat pooling”(用于將網絡中倒數第二層內的最大池與平均池連接起來)的方法,并成功在單英偉達 GPU 之上實現了 6 分鐘模型訓練紀錄。

在研究小組當中,我們決定專注于多 GPU 訓練方向,以便在單一計算機上獲得最快的訓練結果。總體來講,我們認為在多臺機器上訓練模型會增加工程技術與系統管理工作的復雜性。為了盡可能避免這種復雜性,我們努力在單一計算機上提升方法效能。在這里,我們使用一套名為 NCCL 的庫,其能夠與 Pytorch 配合使用,旨在以最低管理成本利用多個 GPU。

大多數與多 GPU 訓練相關的論文與討論都側重于關注每秒運算次數,而非網絡訓練的實際時間周期。我們發現,在多個 GPU 上進行訓練時,我們的架構表現出了截然不同的特性。很明顯,研究界還需要投入更多精力以真正理解如何立足多個 GPU 在實踐當中獲得更好的端到端訓練結果。舉例來說,我們發現在單一 GPU 上運行良好的訓練設置,往往會在多 GPU 環境下出現梯度爆炸。我們參考了以往學術論文中的相關建議,并得出了一些合理的結論——但必須承認,我們還遠沒有利用到計算機的全部資源。

最后,我們發現要真正利用計算機上的 8 塊 GPU,我們實際上需要在每個批次當中引入更多任務量——也就是說,我們增加了各個層中的激活次數。在這里,我們再次采用了遭到忽略的學術成果:巴黎大學橋梁學院發表的《Wide Residual Networks》論文,其中對建立殘差網絡的不同方法作出了廣泛分析,同時討論了此類架構當中所必需的各類構建元素。

我們的另一位研究小組成員 Brett Koonce 開始利用各類不同參數設置進行實驗,希望發現最具實效的組合。我們最終為 resnet-34 架構創建了一套“寬化”版本。配合 Brett 精心挑選的超參數,其能夠在 3 分鐘訓練周期之內立足多 GPU 環境實現 94% 的準確度!

AWS 與競價實例

這里要感謝 AWS 的幫助。我們希望以并行方式運行多個實驗,同時盡可能壓縮實驗成本。為此,研究小組成員 Andrew Shaw 構建出一套 Python 庫,其負責自動啟動競價實例、對其進行設置、訓練模型、保存結果,最后關閉該實例。Andrew 甚至完成了訓練設置,使得訓練過程亦可自動化實現,以確保所有訓練皆可在 tmux 會話中發生。如此一來,我們將能夠隨時登錄任意實例并查看當前訓練進度。

根據此次競賽中的經驗,我們的建議是,對于大多數數據科學家而言,AWS 競價實例無疑是進行大規模模型訓練或大量模型訓練場景下的最佳選擇。其使用成本通常僅為按需實例成本的三分之一。遺憾的是,DAWNBench 公布的官方結果并沒有報告實際訓練成本,而僅提供了基于按需實例的假設成本。我們對這種作法表示質疑,因為在實踐當中,競價實例的價格通常非常穩定,而且相當適合用于模型訓練這類工作負載。

從本次競賽的結果來看,谷歌的 TPU 實例(目前處于 beta 測試階段)可能也是個不錯的選擇。但需要強調的是,使用 TPU 則意味著大家必須接受以下限制條件:


  • 使用谷歌硬件(TPU)。

  • 使用谷歌軟件 (Tensorflow)。

  • 使用谷歌云平臺 (GCP)。

更麻煩的是,TPU 不具備直接編碼能力,這嚴重限制了算法的創造性(正如我們之前所提到,創造力實際上直接決定著最終性能表現)。考慮到 TPU 上有限的神經網絡與算法支持范圍(例如不支持卷積神經網絡,而這對于包括谷歌自己的語言翻譯系統等具體應用非常重要),選擇谷歌平臺將嚴重影響我們所能解決的具體問題以及可以選擇的解決方式。

在另一方面,AWS 則允許我們運行任何軟件、架構與算法,而后獲取代碼結果并在自己的計算機或其它云平臺上加以運行。此外,競價實例的存在也意味著我們能夠享受到遠低于谷歌云平臺的使用成本(谷歌目前也在測試類似的‘競拍實例’,但其似乎并不支持 TPU,并會以 24 小時為周期清理工作負載內容)。

對于單一 GPU 訓練方法來說,另一個理想選項是 Paperspace——也就是我們在新課程當中使用的平臺。其設置過程要比 AWS 實例復雜得多,而且預安裝有完整的 fastai 架構。此外,其功能豐富性與靈活性也無法與 AWS 相提并論。其成本水平介于 AWS 競價實例與按需實例之間。我們正是利用 Paperspace 實例在此次競賽的成本測試單元中勝出——具體價格僅為 0.26 美元。

半精度運算

實現快速訓練的另一個關鍵,在于使用半精度浮點運算。英偉達最新推出的 Volta 架構包含張量核心,其專門用于處理半精度浮點數據。然而,利用這類數據進行訓練一直是個復雜的難題,而且目前還很少有成功利用此類數據完成模型訓練的案例。英偉達方面非常友好地提供利用半精度浮點數據進行 ImageNet 訓練的開源演示,而 Andrew Shaw 則將其中的指導思想納入到 fastai 當中。目前,我們只需要在代碼當中寫下 learn.half(),即可坐等系統自動執行所有必要步驟,從而快速準確地利用半精度浮點運算完成模型訓練。

ImageNet

相較于 CIFAR 10,ImageNet 就像是同一個問題的不同版本 ; 區別在于后者的圖像尺寸更大(224 像素,160 GB)且包含的類別更多(1000 種)。Smith 在他的論文當中展示了 ImageNet 的超級收斂實現方法,但其最終準確度低于原有訓練方法。我們也遇到了同樣的問題,即在以高學習率進行訓練時,模型無法達到 93% 的準確度要求。

為此,我們轉而使用 fast.ai 開發的另一種方法——即漸進式尺寸調整。這種技術的變化已經在此前的學術文獻(GAN 與強化深層殘差網絡的漸進式增長)當中有所體現,但我們還從未利用其進行過圖像分類。這項技術的原理非常簡單:在訓練開始時先從較小的圖像起步,并隨訓練的繼續逐漸增加圖像大小。從直覺角度講,人類不需要較大的圖像就能了解貓與狗的體貌特征 ; 但如果想深入了解不同狗只之間的差異時,圖像越大明顯學習效果更好。

很多人錯誤地認為,立足一種圖像尺寸訓練而成的模型無法適應其它圖像尺寸。沒錯,2013 年的 VGG 架構確實只能處理特定尺寸的圖像,但如今情況早已發生變化。問題在于,很多網絡會在末端錯誤地使用固定尺寸的池化層,而未能使用全局 / 自適應池化層。舉例來說,官方 Pytorch torchvision 模型就沒有正確使用自適應池化層。正因為如此,fastai 與 keras 這類庫就顯得非常重要——這些庫致力于確保即插即用能力,同時盡可能納入所有相關最佳實踐。很明顯,Pytorch 與 TensorFlow 等項目的開發者們更關注底層基礎,而非最終用戶體驗。

通過使用漸進式尺寸調整,我們能夠顯著提升初始階段的訓練速度(因為此時使用 128 x 128 像素圖像,而非通常的 224 x 224 像素圖像),同時也令最終階段的準確度保持合理(利用 288 x 288 像素圖像獲得更高準確度)。除了良好的準確度之外,這種方法還帶來了理想的性能表現 ; 而憑借著更為廣泛的圖像素材尺寸,模型本身也能夠更好地解決過度擬合問題。

關于創新與創造力

我在機器學習領域已經擁有 25 年的從業歷程,我發現工程師們特別喜歡在自己能找到的最強勁的計算設備上運行規模最大的數據集,而各類媒體也喜歡報道一切“最大”的事物。但事實上,真正的進步并非來源于此——差異性遠比規模重要得多。舉例來說,dropout 允許我們在較小的數據集上進行訓練且避免過度擬合,批量標準化讓我們更快完成訓練,而修正線性單元則能夠避免在訓練期間出現梯度爆炸。有追求的研究人員們會考慮采取不同的處理措施,希望幫助我們更快地訓練出更好的網絡模型。

在與身處谷歌、OpenAI 以及其它實力雄厚機構的朋友們進行交流時,我一直擔心他們輕松獲取大量資源的優勢反而會扼殺其創造力。既然資源幾乎無窮無盡,我們還有什么理由進行琢磨與考量?同樣需要強調的是,在這些機構之外,資源也往往相當稀缺,因此以資源無限為前提形成的思維習慣將無法給用戶真正帶來幫助。而更可怕的是,目前幾乎沒有多少研究人員真正意識到這個問題的存在。

更糟糕的是,交流當中這些朋友往往表示他們并不能真正獲得如此可觀的資源,因此他們也就放棄了前沿研究。在他們看來,似乎沒有大量 GPU 與 CPU 的支持,他們將永遠無法完成任何有價值的工作。在我看來,這個結論是完全錯誤的:卓越的實驗者加較差的設備,在研究成果上仍將遠超卓越的設備加上較差的實驗者。

我們很幸運,因為像 Pytorch 團隊這樣的積極力量正在構建創造性從業者們最需要的快速迭代與實驗工具。我希望看到更多來自小型非營利性實驗室與兼職學生的這類高水平成果,從而幫助整個業界破除“無資源、不科研”的認識誤區。

原文鏈接:

http://www.fast.ai/2018/04/30/dawnbench-fastai/


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中什么是上下文

所謂上下文,它是用來存儲系統的一些初始化信息,例如在jboss中通過配置文件指定了數據源,那么在jboss啟動的時候就把這個文件的相關信息加載到上下文中,于是在我們使用這個數據源的時候,就需要先獲得系統的上下文&#…

jquery文件上傳插件uploadify 講解

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.名詞解釋: tracker服務器:中文叫做跟蹤器,主要做調度工作,在訪問上起負載均衡的作用。&…

POJ 1651 Multiplication Puzzle(類似矩陣連乘 區間dp)

傳送門:http://poj.org/problem?id1651 Multiplication PuzzleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 13109 Accepted: 8034Description The multiplication puzzle is played with a row of cards, each containing a single positive integ…

25--最后一個單詞的長度

文章目錄1.問題描述2.代碼詳情1.問題描述 給定一個僅包含大小寫字母和空格 ’ ’ 的字符串 s,返回其最后一個單詞的長度。如果字符串從左向右滾動顯示,那么最后一個單詞就是最后出現的單詞。 如果不存在最后一個單詞,請返回 0 。 說明&…

MySQL 企業監控器 2.3.10 正式版發布

Oracle于近日發布了 MySQL 企業監控器 2.3.10 正式版。 MySQL企業監控器主要用于實施對數據庫進行監控和管理。通過它,數據庫管理員不但可以獲得高級的數據復制和數據庫監控功能,同時還可以簡化安裝流程。而且,無論是對于MySQL企業版&#xf…

Docker 跨主機網絡方案分析

PS:文章首發公眾號,歡迎大家關注我的公眾號:aCloudDeveloper,專注技術分享,努力打造干貨分享平臺,二維碼在文末可以掃,謝謝大家。 上篇文章介紹了容器網絡的單主機網絡,本文將進一步…

java中為什么使用上轉型和下轉型

為什么使用上轉型?因為當一個父類有很多子類,子類都重寫了父類的方法并加以使用。這時候,如果要在之前代碼讓你用其他子類來實現,就變得很簡單,只需要把A a new B();換成A a new C();(假設B和C都繼承了A&…

session和cache的區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 以前實現數據的緩存有很多種方法,有客戶端的Cookie,有服務器端的Session和Application。 其中Cookie是保存在客…

第四個

。 轉載于:https://www.cnblogs.com/wxy2000/p/9657823.html

26-- 轉換成小寫字母

文章目錄1.問題描述2.代碼詳情1.問題描述 實現函數 ToLowerCase(),該函數接收一個字符串參數 str,并將該字符串中的大寫字母轉換成小寫字母,之后返回新的字符串。 示例 1: 輸入: “Hello” 輸出: “hello” 示例 2:…

java守護線程和用戶線程的區別

Java中的線程可以分為兩類,即用戶線程和守護線程。用戶線程是為了完成任務,而守護線程主要是為其他線程服務。 守護線程的唯一用途是為其他線程提供服務。守護線程會隨時中斷,因此不要在守護線程上使用需要釋放資源的資源,如輸入輸…

初學duboo+zookeeper

看了很多相關資料,其實都沒有自己動手試一次印象更深刻一些。找了很多教程,下工具,花了幾個小時終于讓程序跑起來了,下面說下步驟:1.java環境也就安裝jdk,我使用的是1.7版本,jdk安裝就不在這復述…

Fedora 17 Beta 版發布

Fedora團隊今天發布了Fedora 17 Beta版本,這是正式版本發布前的最后一個重要的里程碑版本。據該團隊介紹,正式版將在今年5月發布,將主要修復Beta版中發現的關鍵性bug。針對普通用戶的桌面改進: 采用GNOME 3.4,提升了用…

27--字符串相加

文章目錄1.問題描述2.代碼詳情1.問題描述 給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。 注意: num1 和num2 的長度都小于 5100. num1 和num2 都只包含數字 0-9. num1 和num2 都不包含任何前導零。 你不能使用任何內建 BigInteger 庫&…

[轉] 一文弄懂神經網絡中的反向傳播法——BackPropagation

在看CNN和RNN的相關算法TF實現,總感覺有些細枝末節理解不到位,浮在表面。那么就一點點扣細節吧。 這個作者講方向傳播也是沒誰了,666~ 原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度學習…

java線程組

線程組 線程組是Java線程編程所持有的概念。在Java中,線程組是指java.lang.ThreadGroup類的對象,每個線程都隸屬于唯一的一個線程組,這個線程組在線程創建時指定并在線程的整個生命周期內都不能更改。可以通過調用包含ThreadGroup類型參數的T…

FreeBSD 8.3 發布

近日,FreeBSD開發團隊放出了8.x穩定分支的8.3版本。此次發行的版本將支持amd64、i386、pc98和 sparc64等處理器類型。FreeBSD是一種類UNIX操作系統,但不是真正意義上的 UNIX 操作系統,它是由經過 BSD、386BSD 和 4.4BSD 發展而來的 Unix 的一…

Java中四種訪問權限總結

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Java中有四種訪問權限, 其中三種有訪問權限修飾符,分別為private、public、protected,還有一種不…

28--僅僅反轉字母

文章目錄1.問題描述2.代碼詳情1.問題描述 給定一個字符串 S,返回 “反轉后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置發生反轉。 示例 1: 輸入:“ab-cd” 輸出:“dc-ba” 示例 2&…

Moving Average

移動平均算法Demo #!/usr/bin/python2.7 # Fetch data from BD and analyse.import json import urllib import traceback import numpy as np # import pandas as pd import matplotlib.pyplot as plt #from scipy import statsdef fetch_raw_data(url):try:response urllib.…