0
雷鋒網(wǎng)AI科技評論按:近日,Rachel Thomas在fast.ai上發(fā)布了一篇博文《What you need to do deep learning》,他希望通過這篇文章回答一些深度學(xué)習(xí)入門者經(jīng)常會問到的問題:什么樣的電腦才能用來做深度學(xué)習(xí)?為什么 fast.ai 推薦使用英偉達(dá)的 GPU 呢?哪些深度學(xué)習(xí)庫不適合初學(xué)者?你又是如何將深度學(xué)習(xí)應(yīng)用到實際生產(chǎn)中的?
Rachel Thomas認(rèn)為,所有的這些問題都可以歸結(jié)到一個主題,那就是“究竟需要準(zhǔn)備好哪些東西(硬件、軟件、知識背景以及數(shù)據(jù)等)才能開始深度學(xué)習(xí)?”。所以本篇博客正是針對那些想入門深度學(xué)習(xí)以及對深度學(xué)習(xí)感興趣的新人而寫的。雷鋒網(wǎng)編譯如下。
關(guān)于硬件基礎(chǔ),我們首先不得不感謝一下游戲工業(yè)的蓬勃發(fā)展。
視頻游戲工業(yè)的體量(就盈利而言)遠(yuǎn)遠(yuǎn)超出了電影工業(yè)和音樂工業(yè)之和。在過去的 20 年里,視頻游戲工業(yè)極大地推進(jìn)了 GPUs (圖像處理單元)的發(fā)展進(jìn)步,這是由于 GPU 可用于加速游戲圖像渲染的矩陣數(shù)學(xué)運算過程。并且非常幸運的是,深度學(xué)習(xí)運算中也涉及到大量的矩陣操作。而這些年在 GPU 上取得運算能力的進(jìn)步也正是為什么神經(jīng)網(wǎng)絡(luò)算法在早期沒有發(fā)揮出效力,直到在近幾年才展露頭角的原因之一。因為在沒有 GPU 的條件下,要訓(xùn)練一個深度學(xué)習(xí)模型在大多數(shù)情況下都將是一個非常漫長而痛苦的過程。
圖一 英偉達(dá)Tesla系列顯卡
大多數(shù)的深度學(xué)習(xí)從業(yè)者并不需要直接通過編程來操控 GPUs,而是使用一些諸如 PyTorch 或 TensorFlow 這樣的軟件包來實現(xiàn)的。但是為了能夠高效地使用這些軟件包,我們必須購買正確的 GPU,而這幾乎就等價于我們需要購買英偉達(dá)出產(chǎn)的 GPU。
CUDA 和 OpenCL 是當(dāng)前用來實現(xiàn) GPU 編程的主流方式。CUDA 是迄今為止發(fā)展最好的,擁有最廣泛生態(tài)系統(tǒng)的,也是最被深度學(xué)習(xí)框架支持的集成技術(shù)。由于 CUDA 是由英偉達(dá)創(chuàng)建的集成技術(shù),所以它無法被其它公司的 GPU 所使用。所以當(dāng) fast.ai 推薦使用英偉達(dá)的 GPU 時,并不是因為我們對英偉達(dá)公司有好感或者說英偉達(dá)給了好處,而僅僅是因為這是目前深度學(xué)習(xí)的最佳選擇。
英偉達(dá)在 GPUs 的市場中占據(jù)著絕對的統(tǒng)治地位,然后緊隨其后的競爭者則是 AMD。在這個夏天,AMD 發(fā)布了 ROCm 平臺,用于對深度學(xué)習(xí)提供更多的技術(shù)支持。當(dāng)前 ROCm 平臺對于主流的深度學(xué)習(xí)框架(諸如 PyTorch, TensorFlow 和 CNTK 等)的支持還處于開發(fā)階段。因為 ROCm 平臺進(jìn)行了開源,并且能夠為深度學(xué)習(xí)的底層提供更多的選擇,我是非常希望它能夠取得成功的,但還是不得不承認(rèn) ROCm 的文檔比較晦澀難懂。以至于盡管我想要這里介紹一下 ROCm 平臺,但是在閱讀了 ROCm 網(wǎng)站提供的 Overview、Getting Started 和 Deep Learning 頁面之后卻依然無法通過自己的語言來描述和解釋 ROCm。(我承認(rèn)自己沒有硬件知識背景,但是我認(rèn)為像我這樣的數(shù)據(jù)科學(xué)家應(yīng)該成為該項目的目標(biāo)讀者之一)
如果你的電腦不具有 GPU 或者是沒有英偉達(dá)產(chǎn)的 GPU,你還擁有以下幾個選擇:
使用 Crestle,僅僅需要使用瀏覽器進(jìn)行操作。Crestle 提供了一套已經(jīng)配置成熟的云服務(wù)方案(由 fast.ai 的學(xué)生 Anurag Goel 開發(fā)),云服務(wù)器中已經(jīng)預(yù)裝了所有的主流科學(xué)計算與深度學(xué)習(xí)將使用到的框架,并且還配置好了相應(yīng)的 GPU 支持。而且你能夠通過瀏覽器輕松地進(jìn)行訪問。每位新用戶都將免費獲得 10 個小時的體驗時間以及 1GB 的存儲空間。體驗過后,帶有 GPU 支持的服務(wù)器收費是每小時 0.59 美元。我建議那些從未使用過 AWS 服務(wù)或者不熟悉控制臺操作的同學(xué)選擇這個。
通過控制臺創(chuàng)建一個 AWS 云實例。你可以選擇參考這篇由 fast.ai 出品的配置教程來創(chuàng)建一個 AWS 實例(AWS 能夠遠(yuǎn)程為你提供英偉達(dá)的 GPUs 服務(wù))。AWS 的收費標(biāo)準(zhǔn)是每小時 0.9 美元。雖然我們的教程是關(guān)于配置 AWS 的,還是有一位 fast.ai 的同學(xué)寫了一篇關(guān)于在 Azure 虛擬機(jī)上配置深度學(xué)習(xí)環(huán)境的博客。另外如果有哪位同學(xué)寫了關(guān)于如何在 Google 云引擎上配置深度學(xué)習(xí)環(huán)境的博客,我也非常樂于將其鏈接分享出來并添加到這里。
組建自己的深度學(xué)習(xí)工作站。這是我們 fast.ai 論壇中一個較為冗長的話題,人們可以在其中提問題、分享自己正在使用的組件以及發(fā)布其它有用的鏈接或者提示。最便宜的新款英偉達(dá) GPU 大概需要 300 美元左右,有些同學(xué)在 eBay 或 Craigslist 上發(fā)現(xiàn)了更便宜的舊版 GPU,另外也有些同學(xué)選擇了花費更多的錢來購買性能更加強(qiáng)悍的 GPUs。并且有許多的同學(xué)寫了博客來分享他們是如何組建起自己的深度學(xué)習(xí)機(jī)器:
Mariya Yao 寫的 Deep Confusion: Misadventures in Building a Deep Learning Machine
Sravya Tirukkovalur 寫的 Setting up a Deep learning machine in a lazy yet quick way
Brendan Fortuner 寫的 Building your own deep learning box
深度學(xué)習(xí)還是一個相對新興的領(lǐng)域,因此與它有關(guān)的框架和工具也是日新月異。比如說,我們在 2016 年教學(xué)課程第一部分采用的深度學(xué)習(xí)框架 Theano 就在最近宣布停止了支持和更新。而我們目前正在使用的 PyTorch 框架則是 2017 剛剛發(fā)布的。正如 Jeremy 在早些的博客中提到的——在學(xué)習(xí)任何特定的深度學(xué)習(xí)框架和軟件時你都必須做好它們可能在一年或者兩年后將被拋棄的心理準(zhǔn)備。最重要的事情是理解最基礎(chǔ)的概念,所以為了實現(xiàn)這一目標(biāo),我們基于 PyTorch 的基礎(chǔ)上創(chuàng)建了自己的軟件庫,并且我們認(rèn)為這將有助于更加清晰地展示深度學(xué)習(xí)的概念,同時也有助于實現(xiàn)最佳編碼。
Python 是當(dāng)前在深度學(xué)習(xí)領(lǐng)域使用最為廣泛的編程語言。另外還存在著各式各樣的深度學(xué)習(xí)框架可供選擇,并且?guī)缀跛械闹髁骺萍脊径贾С种髯圆煌目蚣?,盡管這些公司的員工在實際研發(fā)中總是混合使用著各類框架。深度學(xué)習(xí)框架包括有 TensorFlow (谷歌)、PyTorch (Facebook)、MxNet (華盛頓大學(xué)開發(fā),后由亞馬遜維護(hù))、CNTK (微軟)、DeepLearning4j (Skymind)、Caffe2 (Facebook)、Nnabla (索尼)、PaddlePaddle (百度)和Keras (一個基于前邊若干個框架為基礎(chǔ)進(jìn)行高級封裝的 API)。并且所有這些框架都提供有 Python 的 API 接口。
在 fast.ai,我們在選擇框架時優(yōu)先考慮程序員編程的便捷性(能更方便地進(jìn)行調(diào)試和更直觀地設(shè)計),而不是框架所能帶來的模型加速能力。這也正是我們選擇 PyTorch 的理由,因為它是一個具有動態(tài)圖機(jī)制的靈活框架。
依據(jù)采用動態(tài)計算或是靜態(tài)計算的不同,可以將這些眾多的深度學(xué)習(xí)框架劃分成兩大陣營,當(dāng)然也有些框架同時具有動態(tài)計算和靜態(tài)計算兩種機(jī)制(比如 MxNet 和最新的 TensorFlow)。動態(tài)計算意味著程序?qū)凑瘴覀兙帉懨畹捻樞蜻M(jìn)行執(zhí)行。這種機(jī)制將使得調(diào)試更加容易,并且也使得我們將大腦中的想法轉(zhuǎn)化為實際代碼變得更加容易。而靜態(tài)計算則意味著程序在編譯執(zhí)行時將先生成神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),然后再執(zhí)行相應(yīng)操作。從理論上講,靜態(tài)計算這樣的機(jī)制允許編譯器進(jìn)行更大程度的優(yōu)化,但是這也意味著你所期望的程序與編譯器實際執(zhí)行之間存在著更多的代溝。這也意味著,代碼中的錯誤將更加難以發(fā)現(xiàn)(比如,如果計算圖的結(jié)構(gòu)出現(xiàn)問題,你可能只有在代碼執(zhí)行到相應(yīng)操作的時候才能發(fā)現(xiàn)它)。盡管理論上而言,靜態(tài)計算圖比動態(tài)計算圖具有更好的性能,但是在實踐中我們經(jīng)常發(fā)現(xiàn)并不是這樣的。
谷歌的 TensorFlow 主要使用了靜態(tài)計算圖,而 Facebook 的 PyTorch 則使用了動態(tài)計算圖機(jī)制。(注:TensorFlow 在兩周前宣布了一個動態(tài)計算選項 Eager Execution,不過該特性還比較新穎并且 TensorFlow 的文檔和項目依然以靜態(tài)計算為主)。在九月份,fast.ai 宣布將在今年的課程中采用 PyTorch 框架進(jìn)行教學(xué)以及開發(fā) fast.ai 自己的框架(實際上就是采用了更好的編碼方式對 PyTorch 進(jìn)行高級封裝)。簡而言之,以下是我們選擇 PyTorch 的幾個原因(更詳細(xì)的原因請參見這里):
更加容易調(diào)試
動態(tài)計算更適用于自然語言處理
傳統(tǒng)的面向?qū)ο缶幊田L(fēng)格(這對我們來說更加自然)
TensorFlow 中采用的諸如 scope 和 sessions 等不尋常的機(jī)制容易使人感到疑惑不解,而且需要花費更多時間學(xué)習(xí)
谷歌在推廣 TensorFlow 上已經(jīng)花費了大量的資源,其投入要遠(yuǎn)遠(yuǎn)大于任何其它公司或者團(tuán)隊,并且我想這也是為什么 TensorFlow 會如此出名的原因之一(對于很多深度學(xué)習(xí)的門外漢,TensorFlow 是他們唯一聽說過的框架)。正如之前所述,TensorFlow 在幾周前發(fā)布了動態(tài)計算選項,這將解決了一些上述提到的問題。然后許多人就向 fast.ai 提問說我們是否考慮遷移回 TensorFlow 框架。但是目前 TensorFlow 提供的動態(tài)選項還比較新穎而且開發(fā)也不夠完善,所以我們依然選擇繼續(xù)愉快地使用 PyTorch。但是 TensorFlow 團(tuán)隊非常樂意于接受我們的想法,我們也很高興看到我們的 fastai 庫被移植到 TensorFlow 中。
許多人把工業(yè)應(yīng)用中的深度學(xué)習(xí)想的過于復(fù)雜,認(rèn)為自己需要比實際更加復(fù)雜的系統(tǒng)。你可以在生產(chǎn)中使用 CPU 和網(wǎng)絡(luò)服務(wù)器,并且這也是我們在多數(shù)情況下所推薦的。這里有一些關(guān)鍵點:
在工業(yè)應(yīng)用中需要訓(xùn)練網(wǎng)絡(luò)的情況是非常罕見的。即便你想要每天都更新模型權(quán)重,你也不需要在應(yīng)用中去進(jìn)行訓(xùn)練。這是一條很好的消息,這意味著我們在應(yīng)用中只需要進(jìn)行推理(模型前向傳播的過程),這遠(yuǎn)比訓(xùn)練要來的簡單和快速。
你可以使用任何自己所喜愛的網(wǎng)絡(luò)服務(wù)器(比如 Flask),并且將推理的過程設(shè)置成一個簡單的 API 調(diào)用。
只有能夠有效地批量處理數(shù)據(jù),GPU 才能夠提供更快的計算速度。不然假設(shè)你每秒獲得 32 個請求,使用 GPU 反而可能減慢速度,因為從第一個請求數(shù)據(jù)達(dá)到直到收集全 32 個請求數(shù)據(jù)時,你必須等待一秒鐘,然后再執(zhí)行計算,然后返回結(jié)果。因此我們建議在實際生產(chǎn)中使用 CPU,并且你也可以根據(jù)需要添加更多的 CPU(這比使用多 GPU 要來的簡單)。
對于大公司而言在服務(wù)器中采用 GPU 是有意義的,當(dāng)你發(fā)展到這個程度的時候你自然就知道自己需要了。但是過早地進(jìn)行擴(kuò)展只會增加不必要的復(fù)雜性并且拖慢你的速度。
啟發(fā) Jeremy 和我編寫《寫給程序員看的深度學(xué)習(xí)實踐》的一大原因是,目前大多數(shù)的深度學(xué)習(xí)材料存在著以下缺陷:
內(nèi)容過于簡單籠統(tǒng),以至于不能提供如何將深度學(xué)習(xí)應(yīng)用在實踐中或者創(chuàng)造最先進(jìn)模型所需的信息或技能。如果你僅僅需要一個整體的概覽,這些內(nèi)容沒有問題。但是如果你想學(xué)會如何應(yīng)用深度學(xué)習(xí),這卻是遠(yuǎn)遠(yuǎn)不夠的。
高度理論化并且假設(shè)讀者具備有本科生的數(shù)學(xué)背景知識。對于許多人來說,這是一道障礙,即使是具有數(shù)學(xué)博士學(xué)位的人。另外我發(fā)現(xiàn)這些過于理論化的學(xué)習(xí)對于掌握如何編寫實際代碼并沒有特別大的幫助。這些材料有這種理論化的傾向其實也并不奇怪。因為直到最近,深度學(xué)習(xí)還是一門學(xué)術(shù)學(xué)科,并且很大程度上是由在頂級學(xué)術(shù)刊物上發(fā)表的內(nèi)容所推動的。
我們的《寫給程序員看的深度學(xué)習(xí)實踐》是一門免費課程,其特點在于僅僅要求學(xué)員具備至少一年的編程經(jīng)驗,然后我們就可以教會你們?nèi)绾蝿?chuàng)建最先進(jìn)的模型。你的編程語言背景可以是任何一門語言,但是在開始學(xué)習(xí)我們的課程之前你最好先學(xué)會使用 Python,因為這正是我們所使用的。我們將根據(jù)需要介紹相關(guān)的數(shù)學(xué)概念,并不建議大家單獨嘗試學(xué)習(xí)數(shù)學(xué)理論。
如果你還不知道如何編寫代碼,我們強(qiáng)烈建議你去學(xué)習(xí)一下。另外如果你對數(shù)據(jù)科學(xué)感興趣的話,Python 是一門非常合適的語言。
雖然許多人都聲稱需要具備有像谷歌一般的數(shù)據(jù)量才能從事深度學(xué)習(xí)工作,但這種觀點是錯誤的。因為遷移學(xué)習(xí)(結(jié)合諸如數(shù)據(jù)增強(qiáng)的技術(shù))的出現(xiàn)使得人們能夠?qū)⒔?jīng)過預(yù)訓(xùn)練的模型在更小的數(shù)據(jù)集上進(jìn)行訓(xùn)練。正如我們在其它地方談到的,在一家醫(yī)療初創(chuàng)公司 Enlitic,Jeremy Howard 帶領(lǐng)著一支團(tuán)隊僅僅只使用了 1000 例肺癌 CT 掃描樣本,創(chuàng)建了一個比 4 位專業(yè)放射科醫(yī)師具備更準(zhǔn)確判別肺癌能力的算法。另外 C++ 庫 Dlib 提供了另外一個樣例,在這個例子中僅僅使用了 4 張圖片的 18 張臉來訓(xùn)練一個面部檢測器!
圖二 使用Dlib實現(xiàn)人臉識別
fast.ai 是一個致力于為所有人提供學(xué)習(xí)深度學(xué)習(xí)機(jī)會的平臺。我們相信,深度學(xué)習(xí)將是一個轉(zhuǎn)型的技術(shù),將顯著改善對發(fā)展中國家影響最大的醫(yī)藥,教育,農(nóng)業(yè),交通等諸多領(lǐng)域。但是要真正實現(xiàn)這一點,技術(shù)需要比現(xiàn)在更加容易使用,可靠和直觀。我們正在研究綜合利用人類與計算機(jī)各自優(yōu)勢的混合“人機(jī)”解決方案,建立一個隨時可用的應(yīng)用程序和模型庫,開發(fā)完整的教育框架,并為開發(fā)人員和用戶編寫能夠快速上手和易于使用的軟件。
Via: What you need to do deep learning ,雷鋒網(wǎng)編譯
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。