155
技術社區[雲棲]
打造雲上深度學習實驗室
雲棲TechDay36期,來自阿裏雲技術專家必嘫帶來題為“打造雲上深度學習實驗室”的演講。本文主要從深度學習流程開始談起,解釋了深度學習應用構建的完整生命周期,進而分享了機遇與容器服務的深度學習解決方案架構,接著講解了端到端的深度學習體驗,最後作了簡要總結。以下是精彩內容整理:
深度學習流程
目前,人工智能已經進入了深度學習時代,
利用GPU加上深度學習理論,構建了一個模型,從2010年開始ImageNet所有技術都是基於傳統機器視覺技術來做的,當時的識別率最好也差不多是在75%左右, 2012年達到了85%的準確率,基於深度學習的機器視覺能力上已經超越人類,機器識別的錯誤率是2.7%,而人的識別錯誤率是5.3%,這些技術基本上都是完全基於深入學習的技術往下做。從2012年開始,紫色的圖都是基於深度學習。
深度學習有一些必要的因素,才有今天成功的效果。從AlphaGo身上,我們已經看到了機器的可怕,過去我們一直認為機器強大的是在於有強大的計算能力,但是深度學習能力使機器慢慢具備了強大的學習能力,而且這個學習能力是在某個領域可以深度加進的能力,也就是說它在某個固定的領域有一些足夠多的數據讓它去訓練的話,它很有可能在某個領域成為技術專家並超越人,這其實對大家是一個非常大的警示,不懂深度學習的都在談,因為大家確實開始感覺到了這項技術對我們是有影響的。
圖為深度學習很常見的應用,這是俄羅斯開發的一款個人APP,這款APP能夠把普通的照片加上一個大師的照片,相當於從你的照片中提取圖片的內容,從大師圖片的內容提取風格,最後合出來一張圖,其實它用的是深度學習的技術。這個應用去年是IOS下載榜的冠軍,打敗了口袋精靈APP。
還有一個比較常見的應用就是語義分析,比如說看到中國能夠聯想到北京,這些都是深度學習廣泛使用的一些場景。
那麼,深度學習到底是幹什麼的?我們給它一個定義,深度學習是在端到端的去尋找一個Y=F(X)的方程,或者是在做一個A到B的映射。具體來說,對於語音識別,我們傳給你一段語音,你就能夠翻譯出,它能夠知道是“你好”,然後在圖象裏麵我畫出來一個猴子,能夠識別出來是猴子,AlphaGo下棋的時候,當我把棋局發給你,反饋就是下一步應該如何走,其實機器本身就在幹這件事情,當人不知道怎麼解決問題的時候,機器學習做一件事情,尋找一個方程能夠反應這個規律。
那麼,深度學習和機器學習的區別在哪裏?在於端到端,傳統機器學習不能直接把圖片傳給機器學習來處理的,它需要一些數據科學家,在阿裏我們把算法工程師分成兩類,一類叫基礎算法工程師就是去開發F()裏麵東西的人,另外一類叫業務算法工程師,從最開始圖片開始特征工程,所謂特征工程就是我來定義有哪些特征,什麼是你的鼻子,什麼是你的眼睛,然後先把圖片轉化成特征,把特征作為一個輸入,輸入到方程裏麵去求解。那麼就意味著整個規律的提取實際上是由人來完成的,它對人是強行依賴的。而深度學習最不一樣的地方在於從原數據開始,是由計算機本身來做特征提取,不是由人來做特征提取讓機器去運算,這可以稱的上是一個革命性的變化。這是深度學習的價值,你隻需要在原數據中做計算,不需要做特征提取的事情,但是這也說明了它其實是有局限性的,深度學習其實是有自己的場景限製的,表現比較好的一些領域包括圖象識別、語音識別、文字處理和下圍棋等;還有對原數據的依賴性非常高,它必須要求原數據裏麵沒有任何的特征丟失。
深度學習是直接從數據裏麵學規律,那麼數據是很重要的事情。深度學習的真實應用比如語音識別和客服係統,這兩個領域很成功。還有人臉識別,現在所有銀行所用的人臉識別技術都是基於深度學習的。人工智能前麵看到有多少智能,後麵就有多少人工,它是完全數據驅動的,如果沒有足夠大的標注數據,深度學習是比較難開展的,所以要把數據標注出來,而這個東西耗時耗力,先要從網上拉圖片,然後對這些圖片進行標識。
標識完之後,要把數據分成訓練集和測試集,提高它的泛化能力。
因為深度學習其實是尋找方程,那個方程會有很多的參數,會產生什麼效果呢?會成為一個實驗室的書呆子,我隻能夠把實驗室的訓練數據學的特別好,輸入一個照片,可以給出正確的判斷,但是當拿到真實的社會上去用的時候,我發現它是一個書呆子,看起來隻是把那些數據的擬合程度做的比較好,但是它實際上叫過擬合,它隻符合自己實驗室的數據,沒有真正學到規律。所以我們真實處理深度學習的時候,通常會做兩件事情,數據標注好之後我會把數據分成兩類,一類是訓練數據,另外一類是測試數據,這是很重要的過程。後麵做的事情就是把前麵找到的一些後選方程輸入進來進行比較,看哪個方程表現最好,表現最好的方式再做一個測試,當這個方程能夠滿足測試條件的時候,它就可以用來做商業化,用來做預測的方程。
深度學習是有門檻的,數據的能力、算法的能力和計算能力。過去隻有數據科學家知道怎麼解決的一些問題,而現在,特別像Google把TensorFlow庫開放出來之後,對於普通的程序員來說,有許多東西你隻要知道它能幹什麼,而它的使用實際上隻是一個API的調用,這在深度學習方麵有非常好的支持。
開源代碼實現
另外一件事情,深度學習有機會把一些論文用代碼實現,並且是可以下載找到並且學習的。所有成功的在做深度學習的公司,其實還是依賴於大數據來做。但是實際上包括Google、各個大學都已經把一些圖象的庫甚至一些視頻的庫放在了網上,如果大家肯去學習肯去看,這些庫都是可以拿到的,重要的是你想要讓深度學習幫你做什麼,你要做一盤什麼樣的菜。
深度學習應用構建的完整生命周期
對於普通人來說,深度學習到底跟我們有沒有關係?如果我想做成一個業務應用,你要做哪些事情?首先是數據準備,數據是深度學習的驅動力,然後裏麵有模型開發和模型訓練,深度學習實際上在尋找一個方程,用這個方程去描述某些事情的規律,那麼這個方程有兩部分,這個方程長什麼樣,WX+B,後麵加一個激活函數後麵再加CNN,這個事情是由模型開發來決定的。我大概決定方程長成什麼樣,然後做模型訓練,我隻能知道模型長什麼樣,但是模型的參數實際上是訓練在做的事情,把參數進行優化,當整個模型訓練完成之後,就產生了一個模型。
那麼,模型預測是幹什麼的呢?實際上就是把辛辛苦苦通過數據搜集、通過模型開發模型訓練產生的模型進行商業化,它可以去做AlphaGo跟人下棋,可以做圖象轉化,實際上它有兩種存在方式,一種是在線的存在方式,它作為一個API服務和整個微服務、其他外部服務進行整合,我從外部的API去調用,把這些輸入放進去,返回一個值,這是一種方式;另外一種方式是手機APP,把它作為一個圖書館加上一個配置放在手機應用裏麵來做模型預測,當你的模型預測是為API所用的時候,這裏麵就涉及到升級擴展的問題。
為什麼要用阿裏雲容器服務來跑我的GPU?阿裏雲容器服務助力深度學習敏捷化
• 快速部署:無需安裝,分鍾級別啟動/關閉;
• 多套環境共存:可以支持多個TensorFlow,Keras版本,不同python庫;
• 可複現,可遷移並且可擴展:可複製可備份的環境,擴容簡單,方便共享;
• 集成阿裏雲的分布式存儲,負載均衡,雲監控等服務,提供一站式的深度學習訓練體驗:ECS,EGS,NAS,OSS,SLB,SLS等服務無縫集成。
基於容器服務的深度學習解決方案架構
這是我們深度學習解決方案的一個整體架構,可以看到向上關聯了它整個生命周期從數據的預處理,從開發訓練到預測,包括EGS,我們支持GPU N卡,N卡是在深度學習場景下很重要的東西,包括VPC、共享存儲,我們都已經集成了。向上管理整個生命周期,向下集成阿裏雲所有服務,你隻需要使用我們的服務,就不需要管如何去用OSS,NAS的問題了。在運維的層麵上,負載均衡、彈性伸縮包括你的資源監控都是在我們管理範圍之內。同時我們也和EMR的集成。
利用容器技術進行GPU管理和調度
我們利用容器的技術進行GPU的調度,可以看到在控製台裏麵隻需要告訴我,你的深度學習應用需要用幾塊GPU卡,如果是兩卡,就把兩卡都分割給你,如果是一卡,可以看到,在真正的主機上一個DVS要一個GPU0,一個DVS需要GPU1,寫程序必須要指明用GPU0還是GPU1。利用容器化技術可以把你的應用和底層相屏蔽,做到應用裏麵是GPU0,雖然下麵用的是GPU0和GPU1,但是在容器視角裏麵看,他們都是GPU0,這樣使你的程序和底層相當於做到透明化管理。
另外,我們提供了docker鏡像,我們提供的東西跟你的需求還是有差異的,你也可以用自定義的鏡像來管理你的深度學習技術庫。
端到端的深度學習體驗
我們做的實驗也是基於我們的解決方案,我們在模型開發、模型訓練和模型預測三個最主要的場景下給大家一些支持。
模型開發支持很多學習框架,正確學習深度學習的話,是需要比較大數據量的,所以需要一些外接的數據券支持,包括OSS、NAS、HDFS,這個我們在模型開發上都做了支持,你可以選擇要用GPU還是CPU;模型訓練現在支持TensorFlow,我們支持TensorBoard的分布式訓練,如果你的數據比較大,模型比較大,可以在我們這套框架下做分布式的訓練。我們同時還有OSS、NAS和HDFS的支持等。我們也支持job的曆史記錄以及訓練的時候要用到GPU和CPU;模型預測所做的事情是什麼呢?我前麵做的所有努力都是為了最後業務結果來付出的,最後的業務結果就是算出一個模型,把它做成一個服務暴露出去,存儲現在支持OSS和NAS,也支持大實例和負載均衡。
簡單看一下,如果要做模型開發,怎麼創建一套EGS的環境?首先要選一個集群,整個環境實際上都是你自己的,實際上對你來說完全安全的。然後選擇開發環境的名字,然後選擇訓練框架,然後選擇GPU的數量。可以選擇使用數據券也可以選擇不適用數據券。另外一個就是jupyter,相當於外部開發環境下麵的密碼,當你開發完之後,運行訓練的時候,會有一個訓練監控,就是我要看整個訓練效果準確率等等。
下麵就涉及到你是不是用SSH的方式去訪問,當它被創建出來之後,可以看到有兩個鏈接,一個是jupyter,一個是Tensorboard的訪問連接,你可以通過這兩個鏈接分別去訪問兩個不同的服務。
同樣,模型開發我們提供了SSH的登錄方式,這種方式對大多的程序員來說還是比較熟悉的。
圖為分布式模型訓練,因為我們現在多數客戶,除了一些比較先進客戶在用這套東西,多數人還停留在模型開發,而模型訓練的東西和模型開發有一點類似,但是最大的區別是有一個分布式訓練選擇。分布式訓練我就可以選擇去做參數服務器,然後做Worker, Worker是來做乘法操作的,所以要指定每個Worker要用幾個GPU。數據券是把數據加載進來,如果你有比較大的數據量,另外我們有一個規約,相當於訓練中間每隔1000步、2000步會產生一個中間的訓練結果,把它記錄下來,保存到某個地方,如果你的程序不幸掛掉,還可以自動恢複來進行運算,保證整個訓練的時間沒有因為意外而間隔。同樣它也支持訓練監控,一旦你把訓練監控加長的話你就可以這裏看到,每台Worker訓練的效果是一個什麼樣子,包括日誌。
分布式預測是用所謂的預測程序去加載模型,可以利用阿裏雲的負載均衡去做負載均衡的工作,用你的客戶端來訪問,相當於支持預測這個場景。除此之外,我們還提供了深度學習的一些基礎服務,我們可以從HDFS上拿數據。
另外就是運維支撐,包括GPU的監控和報警,還有負載均衡以及根據監控和報警產生結果來做一些彈性伸縮的工作。大家可以看到,我們其實提供兩個監控方式,一種監控方式是完全由你自己一個開源框架來做的,就是這套監控環境就布在你自己的機器上,阿裏雲不會拿到他的數據,另外一個方式是你可以把你的監控數據對接到你的監控上,我們監控能夠給你提供一些像報警、自動恢複的能力,大家可以看到我們監控的維度,像GPU的使用率、GPU顯存的使用率、GPU的溫度。
雲上深度學習的價值
總結來看,大家經常說可以自己手操一套,自己買一個GPU機器,自己來搭一套環境是沒問題的,實際上有一些隱性的成本可能要跟大家談一談。圖中就是整個手工操作所必須的,包括這些深度學習庫的版本維護,還有多版本的共存,以及它的監控和運維等,阿裏雲深度學習的方案給大家提供的就是一套基於深度學習的在線運維係統,幫助你把阿裏雲的經驗放到雲裏麵,幫助你更有效的訓練出來你的深度訓練模式。
最後更新:2017-07-27 11:32:50