從硬件配置到框架選擇,請以這種姿勢入坑深度學習

選自fast.ai

機器之心編譯

參與:蔣思源、路雪

搭建深度學習系統需要哪些硬件、軟件、環境、課程和數據?本文將為我們一次解答這些問題。

深度學習初學者經常會問到這些問題:開發深度學習系統,我們需要什麼樣的計算機?為什麼絕大多數人會推薦英偉達 GPU?對於初學者而言哪種深度學習框架是最好的?如何將深度學習應用到生產環境中去?所有這些問題都可以歸結為一個——搭建深度學習系統都需要些什麼?(其中包含硬件、軟件、環境與數據)在本文中,讓我們將這些問題一併解決。

你需要的硬件

我們要感謝遊戲行業

從收益來看,視頻遊戲行業比電影和音樂行業加起來還要大。過去 20 年中,視頻遊戲行業推動 GPU 出現了巨大進步,GPU 用於製作呈現圖所需的矩陣運算。幸運的是,這些正是深度學習所需的計算類型。GPU 行業的發展是神經網絡比幾十年前更加強大的重要原因之一。大部分情況下不使用 GPU 訓練深度學習模型會非常慢。

選自fast.ai

機器之心編譯

參與:蔣思源、路雪

搭建深度學習系統需要哪些硬件、軟件、環境、課程和數據?本文將為我們一次解答這些問題。

深度學習初學者經常會問到這些問題:開發深度學習系統,我們需要什麼樣的計算機?為什麼絕大多數人會推薦英偉達 GPU?對於初學者而言哪種深度學習框架是最好的?如何將深度學習應用到生產環境中去?所有這些問題都可以歸結為一個——搭建深度學習系統都需要些什麼?(其中包含硬件、軟件、環境與數據)在本文中,讓我們將這些問題一併解決。

你需要的硬件

我們要感謝遊戲行業

從收益來看,視頻遊戲行業比電影和音樂行業加起來還要大。過去 20 年中,視頻遊戲行業推動 GPU 出現了巨大進步,GPU 用於製作呈現圖所需的矩陣運算。幸運的是,這些正是深度學習所需的計算類型。GPU 行業的發展是神經網絡比幾十年前更加強大的重要原因之一。大部分情況下不使用 GPU 訓練深度學習模型會非常慢。

從硬件配置到框架選擇,請以這種姿勢入坑深度學習

並非所有 GPU 都是一樣的

大部分深度學習從業者不直接編寫 GPU CUDA 代碼,我們通常會使用軟件庫(如 PyTorch 或 TensorFlow)。但是,要想高效使用軟件庫,你需要選擇合適的 GPU。在幾乎所有情況下,這意味著你需要使用英偉達的產品。

CUDA 和 OpenCL 是進行 GPU 編程的兩種主要方式。CUDA 目前是開發最好、具備最廣泛生態系統、深度學習庫最支持的方式。CUDA 是英偉達創建的專用語言,因此其他公司的 GPU 無法使用它。幾乎可以肯定,英偉達 GPU 是目前執行深度學習任務最好的選擇。

英偉達主導 GPU 市場,它最大的競爭對手是 AMD。今年夏天,AMD 發佈了 ROCm 平臺提供深度學習支持。該工具適用於主流深度學習庫(如 PyTorch、TensorFlow、MxNet 和 CNTK)。目前,ROCm 仍然在不斷開發中。雖然對於用戶而言我們都希望看到另一個開源的替代方案崛起,但是我必須得承認目前的 ROCm 文檔難以理解。我在閱讀 ROCm 網站上「概述、快速上手和深度學習」的頁面之後仍然無法用自己的語言複述出其中的內容——儘管我很希望把 AMD 的這部分內容包含進本文中(雖然我對於硬件的理解不深,但像我這樣的數據科學家應該是這一項目的使用者)。

如果你沒有 GPU

如果你的電腦沒有 GPU 或者不是英偉達的 GPU,那麼你有以下幾個選擇:

  • 通過瀏覽器使用 Crestle:Crestle 是 fast.ai 學生 Anurag Goel 開發的一項服務,提供雲服務,所有流行的科學和深度學習框架都已經預安裝和配置完成,便於在雲端運行 GPU。你可以通過瀏覽器輕鬆獲取。新用戶可免費使用 10 小時,享受 1 GB 的存儲空間。10 小時之後,每小時 59 美分。我推薦 AWS 新手或剛開始使用控制檯的人選擇該選項。

  • 通過控制檯設置一個 AWS 雲實例:你可以按照該說明創建一個 AWS 實例(http://course.fast.ai/lessons/aws.html)。AWS 收費是 90 美分/小時。我們的設置材料是關於 AWS 的,不過 fast.ai 的學生為設置適合深度學習的 Azure 虛擬機創建了一個教程(https://medium.com/@abhikprince/setting-up-an-azure-vm-for-deep-learning-bb76b453272b)。

  • 構建自己的深度學習機器。這裡是 fast.ai 的論壇:http://forums.fast.ai/t/making-your-own-server/174,人們在這裡提問,分享使用的組件,併發布一些有用的鏈接和貼士。最便宜的全新英偉達 GPU 需要 300 美元左右,很多學生髮現這比在 eBay 或 Craigslist 上使用 GPU 便宜。fast.ai 的一些學生寫了幾篇博客記錄他們如何配置自己的設備:

你需要的軟件

深度學習是一個新興領域,軟件庫和工具包每天都在快速地提升。例如我們常在課程和研究中使用的 Theano 剛剛退休,而現如今非常流行的 PyTorch 也只不過是今年才發佈。可能正如 Jeremy 所說的那樣,我們必須相信現在具體使用的函數庫或深度學習框架在一兩年後會有很大的變更,甚至有可能不復存在。因此更重要的是對深度學習底層概念的理解,所以我們在 PyTorch 上構建了自己的庫,我們相信它能令深度學習概念更加清晰,並通過編寫標準模型進一步在實踐中理解這些概念。

因為 Python 的簡潔和強大的軟件包擴展體系,它目前是深度學習中最常見的語言。目前我們有很多深度學習庫能夠選擇,例如 TensorFlow(谷歌)、PyTorch(Facebook)、MXNet(華盛頓大學和亞馬遜)、CNTK(微軟)、DeepLearning4j(Skymind)、Caffe2(Facebook)、Nnabla(索尼)、PaddlePaddle(百度)和 Keras(構建在前面部分庫之上的高級 API)。當然,這些深度學習框架都支持 Python。

動態計算圖 vs. 靜態計算圖

在很多教學和研究中,我們優先考慮開發者是否能快速進行實驗與迭代,而不是考慮具體的理論性能或計算效率。這就要求深度學習框架具有更簡潔的調試和更直觀的設計等屬性,而現如今流行的 PyTorch 正好符合這一點,它的動態計算圖令深度學習模型的構建變得更加明瞭與簡潔。

各深度學習庫之間一個重要的區別就是它到底是使用動態計算圖還是靜態計算圖,當然目前的 TensorFlow 和 MXNet 兩者都支持。動態計算圖表示程序將按照我們編寫的順序執行,這通常令模型或代碼的調試更加方便,也使我們將創意從頭到尾按貫序的方式更直觀地實現。而對於靜態計算圖來說,我們首先要聲明或構建一個計算圖,並確定每一個結點和邊的內容與定代碼然後再執行該靜態計算圖以訓練模型。從理論上來說,靜態計算圖允許編譯器執行更多的優化,這也就導致我們聲明的代碼內容和編譯器確切執行內容可能會有一些差別。不過即使理論上證明靜態計算圖要比動態計算圖擁有更好的性能,但實際上很可能恰恰相反。

谷歌的 TensorFlow 可能是最常用的靜態計算圖框架,當然它也是我們最常用的深度學習框架。而 Facebook 的 PyTorch 是現在最常用的動態計算圖框架。雖然 TensorFlow 目前也表明它能支持動態計算圖(Eager Execution),但 Eager Execution 畢竟只是新生的庫,TensorFlow 的文檔也還是以靜態計算圖為主。在今年九月,fast.ai 就表明它們的課程會使用 PyTorch 而不是 TensorFlow,並且還會使用包裝的高級 PyTorch 庫來實現更好的實踐體驗。一般來說選擇 PyTorch 有以下幾個原因:

  • 易於調試

  • 動態計算圖更適用於自然語言處理

  • 支持傳統的面向對象編程風格

  • TensorFlow 的 上下文管理器和會話等機制需要我們花費額外的精力學習

fast.ai 認為谷歌在 TensorFlow 上做了大量的推廣與營銷,這也是 TensorFlow 如此出名的原因。對於很多深度學習門外漢來說,TensorFlow 可能是他們聽過唯一的深度學習框架。不過雖然 TensorFlow 前幾周發佈了動態計算圖,但對於很多人來說這一擴展庫還是非常新的概念,它還遠遠不夠完善與成熟。此外,TensorFlow 團隊對於 fast.ai 的想法十分歡迎,因此我們也期待著把 fast.ai 庫遷移到 TensorFlow 中。

生產所需:不需要 GPU

很多人過分複雜化在生產中使用深度學習的想法,並且認為他們需要比平時更復雜的系統才行。在生產中使用深度學習一塊 CPU 就可以,服務器可任選。大多數使用案例我們都推薦這麼做。以下是幾個要點:

  • 在生產中進行訓練的情況非常少見。即使你想每天都更新模型權重,也無需在生產中進行訓練。這是一個好消息!因為這樣你只需要在生產中進行推斷(模型中的前向傳遞)就行了,比訓練更快也更簡單。

  • 你可以使用任意服務器(如 Flask),將推斷設置為一個簡單的 API 調用。

  • 如果你能夠高效分批處理數據,GPU 僅提供加速。即使你每秒收到 32 個請求,使用 GPU 很可能降低速度,因為你必須等一秒:第一個請求先到達收集所有 32 個請求,然後執行計算,再返回結果。我們推薦在生產中使用 CPU,你可以按需要添加更多 CPU(比使用多個 GPU 簡單一些)。

大公司在生產過程中使用 GPU 可能有意義,等你到那個規模時就知道了。過早嘗試擴大規模只會增加不必要的複雜性,降低速度。

學習資源

目前網上有非常多的機器學習和深度學習資源,甚至各種各樣的深度學習速成班也快速地成長了起來。因此,我們有必要了解優秀的學習資源到底有哪些。一般來說,學習資源可分為四部分,首先是如吳恩達 Machine Learning 或 Deep Learning Specialization 等課程視頻,隨後還有李航的統計學習方法或 Ian Goodfellow 的 DeepLearning 書籍,後面的機器學習或深度學習技術博客也不能錯過。當然,最後部分的學習資源應該來自研究論文,因為我們要是希望瞭解一個算法或一個技術,沒有什麼是比專門描述該技術的論文講述地更加清晰。(若需要了解目前各方向業內最佳性能的工作,請查看:良心GitHub項目:各種機器學習任務的頂級結果(論文)彙總)

以上這四部分的資源又可以從兩個方面理解,即實踐和理論。對於實踐來說,我們只需要理解深度學習的基本概念,然後再詳細瞭解各深度學習框架的庫函數就能學著實現簡單的深度學習模型。而對於理論來說,數學基礎是十分重要的,先不說基本的概率論、微積分、線性代數,那些深度學習概念背後的數學推導我們同樣需要理解。此外,深度學習非常核心的最優化方法也是一個大坑,需要非常多的理論知識來做出改進。

課程建議:

  • 斯坦福大學 CS231n 卷積神經網絡與圖像識別:http://cs231n.stanford.edu/

  • 吳恩達 Deep Learning Specialization:https://www.coursera.org/specializations/deep-learning

  • Udacity 免費深度學習課程:https://www.udacity.com/course/deep-learning—ud730

  • Geoffrey Hinton 的 Neural Networks For Machine Learning:https://www.coursera.org/learn/neural-networks

  • 斯坦福大學 CS224d 自然語言處理深度學習:http://cs224d.stanford.edu/

所需數據:比你想象的少得多

儘管很多文章聲稱需要谷歌級別的數據集才能做深度學習,這種說法是錯誤的。遷移學習(數據增強技術相關)使人們可以在小型數據集上使用預訓練的模型。在醫療創業公司 Enlitic,Jeremy Howard 帶領的團隊僅使用 1000 個肺癌 CT 掃描樣本構建了一個算法,該算法診斷肺癌的準確率超過 4 個放射科專家。C++ 庫 Dlib 有一個樣例:人臉檢測器僅使用包含 18 張人臉的 4 張圖像就可以進行準確訓練!

相關推薦

推薦中...