閱讀869 返回首頁    go 汽車大全


如何快速在阿裏雲上構建自己的機器學習應用

摘要:在2017雲棲大會深圳峰會開源專場上,阿裏雲容器服務技術專家車漾做了題為《在阿裏雲上構建機器學習應用》的精彩演講,車漾首先從2016年深度學習最火的兩個應用AlphaGo與Prisma談起,從宏觀層麵分享了機器學習以及深度學習所做的事情,並就Prisma的發展故事談起,為大家介紹了應該學會以工程思想思考和解決問題,並著重介紹了阿裏雲基於容器服務的機器學習解決方案架構設計以及如何借助阿裏雲快速搭建自己的機器學習應用,精彩不容錯過。

以下內容根據嘉賓演講視頻以及PPT整理而成。

在2016年有兩個深度學習應用使得深度學習這個概念走入了平常百姓家,大家開始意識到深度學習技術好像和我們的生活開始產生聯係了。第一件事情就是AlphaGo戰勝了圍棋世界的高手李世石,它向我們證明了一件事情:計算機不但具有強大的運算能力,它甚至開始學會學習了,更可怕的是計算機的學習能力是一種縱向深入的學習能力,也就是隨著計算機看到的數據越來越多,隨著時間的不斷往前發展,計算機有可能成為某個領域的專家,在圍棋中是這樣,在其他的領域,比如醫學等領域也都會有同樣的影響。可以說,AlphaGo是第一個使我們真正意識到機器學習具有一種自我演進能力的應用。
88b936aed30086c61e31fce430e52719757bcc06
第二件事情就比較有意思了,Prisma這款應用是2016年度蘋果APP Store的排到第一名的最佳手機應用,這款手機應用其實也是基於深度學習技術來實現的,它所做的事情就是像將自己家小區後院的照片傳上去,然後指定一個繪畫大師的作品,比如指定梵高的《星空》這個作品,將兩者合成一張新的圖片。
86f6dd5b91d3c54dbf41741aee1e4e5f172aba3b
合成後的這個圖片的特點就是內容還是樓下的小區,但是這張圖片的風格看起來就是梵高畫出來的了。那麼如果使用機器學習的語言來解釋一下這是如何做的就是實際上這個應用做了兩件事情:第一件事情就是從這張梵高的畫中學習出來一個函數f(),這個函數f()的價值是什麼呢?其實就是反應了梵高這幅畫作的風格,這就是機器學習所做的第一件事情,從這張畫作學習到了一個能夠反應梵高風格的函數。其實比如說產生整個圖片的工作需要花費10個小時的話,上麵說的這個產生f()函數的這件事情需要花費9個小時,甚至是9個小時55分鍾。而最後將這個函數f()求出來之後,將樓下小區的照片這個X賦值到f()函數中,就產生了一個新的圖片,其實剩下的僅有的5分鍾就是用來做這件事情的。
2b2805a9627812f3fcc4980b4957fc7a1af0a341
講到這裏大家應該就能理解所謂機器學習是在做什麼,應該怎樣去轉換這張圖片。這時候可能大家會產生一個疑問,其實早在2010年就已經濾鏡程序了,通過一個濾鏡打上去其實也可以產生這樣的效果,這個濾鏡程序和深度學習的畫像有什麼區別呢?其實兩者之間的區別就在於這個f(),這裏麵最大的區別就是f()是如何產生的,傳統的濾鏡技術是依靠一個程序員實現的,讓他去理解這個畫像的風格是什麼樣的,他自己去手敲代碼去實現f()這個函數,而機器學習則是由機器自己從這個圖片中提取信息並且計算出f()。這種區別產生的影響有兩個:第一個就是程序員寫一個梵高畫的風格的程序可能需要花費兩周的時間,如果再來一個畢加索就可能還需要兩周的時間,也就是產生的成本比較高,這是第一個影響,第二個影響是什麼呢?就是理解性問題,第一種使用濾鏡的方式對於畫的理解並不是梵高的理解,而是編寫程序的程序員的理解,所以在這裏麵需要為大家解釋清楚的就是機器學習和加濾鏡的區別就是機器學習的本質,也就是這個規律是機器自己學習到的,並不需要人來教,人隻需要給它數據集就可以了。

這個厲害的深度學習算法實際上並不是Prisma這個公司的創始人發明的,而是在2015年,也就是Prisma大火的前一年,三個德國的數據科學家發明了這個算法並且利用這個算法創辦了自己的創業公司叫做DeepArt,它所能做的事情就是提供一個網站讓用戶將自己的圖片上傳上去並選擇一個風格,經過3到5個小時的計算產生處一個有自己圖片內容的大師風格的作品。這個網站上線之後效果還算不錯,有一些人願意花100多歐元去得到這樣一幅作品,但是並沒有大火。
e7cef577d5dd086a97c20390914e3f45b43ae702
而在2016年年初的時候,一個俄羅斯的軟件工程師看到了這個論文並且也看到了DeepArt所做的產品,這個俄羅斯的工程師就認為他們做的產品存在問題。那麼這個網站之所以沒有火起來是為什麼呢?俄羅斯工程師進行了思考,他發現原有產品中存在兩個問題,第一個問題就是產生圖片的時間太長了,5到6個小時,沒有人願意去等這麼長的時間;第二個問題就是DeepArt隻提供了一個網站,大家都知道網站無法得到高頻的訪問,我們需要有個電腦才能去進行登錄再訪問,所以使用起來的效果並不好。所以這個俄羅斯工程師就想開發一個手機APP,並使得手機APP能夠達到的效果是將圖片上傳上去之後等待10到20秒就能夠得到已經選好風格的圖片,所以他就開始研究如何讓圖片轉換的時間變短。其實就像剛才提到的,在這裏機器學習主要做兩件事情,第一件就是去求解代表風格的函數,第二件事情就是利用將值賦給這個函數去計算出最後的結果值,也就是說在做風格轉換時的工作就是去解這個方程去求出繪畫風格。如果能夠像數據庫一樣將風格函數持久化地存儲到硬盤上,每一次生成新圖片的時候都將函數從硬盤上進行加載而免去了計算的過程,就可以將原來的6小時變成幾分鍾甚至更短的時間,實現後這個時間縮短達到了20秒。這個俄羅斯工程師實際上並不是機器學習方麵的專家,但是他找到了問題的症結,並在此基礎之上使用了一個月的時間開發出了這套Prisma的APP,這個APP在歐洲一上線在大概兩周的時間內就有了三千萬的下載量。如下圖所示,梅德韋傑夫也是Prisma的忠實粉絲。當時在8月份的時候,在歐洲人普遍對於藝術有較高的鑒賞能力的情況下,他們都認為這個應用比較能夠打動內心。
f023474cf91a2703d087a8f55ec89ce76b6c8147
剛才講述的這個故事實際上是想告訴大家一個道理,我們現在正處於AI即將到來的時代,但是AI時代並不隻屬於數據科學家、AI科學家以及這些程序員們。AI的技術是非常重要的一件事情,但比這件事情更重要的是如何利用AI技術轉化出相應的產品,實現數據、技術和產品之間的聯動,真正能夠將AI技術應用到大家的日常生活中,像Prisma一樣應用AI來為大家創造價值,討得大家的歡心,這個才是最重要的,也是需要大家一起去思考的事情。也許你並不是AI的專家,但是也應該去思考如何才能將AI應用起來。實際上重要的是我們的想法,如果你有自己的想法,再利用一些開源的工具,加上阿裏雲的資源就可以很容易地構建屬於自己的深度學習的應用。
b79c68d886e98105fe7bc881fe4d7ac39fdc41fa
我們所處的是一個開源的時代,很多深度學習和機器學習的學習庫實際上都是開放的,包括穀歌的TensorFlow、微軟的CNTK、Caffe、Mxnet等這些都是開源的機器學習庫,如果大家想去學習這些開源庫,其實有很多相關的資源可以參考。
910661d0442f4f8ef571479bcc49e554f17eeac7
在這裏主要介紹一下TensorFlow,TensorFlow是2015年穀歌開源的一套機器學習庫,其在深度學習方麵非常好用,目前在GitHub上麵大約有5萬顆星,其實也是大家開始深度學習一個非常好的起點,它的最大特點是雖然不算性能最好,但是最為簡單。
2657bdf43290cf5aa703cb3084488ea17e51dc5e
在這裏想和大家說的是關於剛才提到的風格轉換這件事情實際上有很多個實現,依賴於不同的機器學習庫,包括TensorFlow、Mxnet、Torch以及Caffe等,在分享的最後也會給大家看一下一些使用這些庫實現應用的代碼。
cb70533c5ed000f99d96642672d779334242e22d
有了這些機器學習庫和機器學習的代碼可以供大家進行學習,剩下的就是讓大家了解一下如何構建自己的機器學習以及深度學習的應用。剛才提到了整個機器學習的流程從大的方麵可以分為兩個部分,一部分可以稱之為求解方程,第二部分可以稱為給方程賦值。所以在機器學習的流程中的第一部分就是訓練,根據數據如何去訓練出這個機器學習模型,實際上就是在求解這個方程。而第二步當這個方程解完之後,就可以給方程賦予新的值讓它去做預測。具體來看,第一步在求解方程中最重要的也是機器學習最核心的事情就是數據和計算量,首先需要準備數據並且上傳到雲上,這是在雲上進行機器學習的最重要的起點。第二步就是需要開發自己的訓練程序,這個訓練程序所做的事情就是根據數據來進行訓練、求解方程,並對於程序的正確性進行確認。第三步,當我們具有大規模數據的時候,就可以執行一些訓練,剛開始時可能做的是單機,但是在真正進行訓練的時候,可能因為性能的需求、數據量的需求可能需要使用GPU以及分布式的訓練,這個時候就是第三步執行訓練任務,在執行完訓練任務之後有一個很重要的工作就是導出這個訓練模型,導出這個訓練方程。在最後將這些應用到在線預測中,就是相當於對於方程進行賦值,這就是真正的工作流程。
cdb27f5c364b8b3f40f5b7b63b901c40fabf1021
然後向大家先介紹一下阿裏雲基於容器服務的機器學習解決方案架構。如下圖所示的解決方案是以容器服務為核心的,在這裏麵所有服務是以容器作為載體的,容器服務貫穿整個機器學習的整個生命周期,包括開發、訓練、預測以及數據處理,並且這個解決方案很好地集成了阿裏雲已有的機器學習能力,比如彈性計算、高性能計算以及彈性GPU計算、VPC網絡以及共享存儲、運維以及鏡像等能力。使大家的深度學習應用能夠無縫地和阿裏雲的服務進行集成,這就是這個方案所能夠帶來的好處。
812167cab6d20fa539ebc6f0d93099c00acaf527
那麼這個事情具體是如何實現的呢?首先第一步是需要準備數據,因為我們知道像在阿裏雲上做深度學習的話,上傳數據最簡單的方式是通過OSS,這就可以通過OSS命令或者圖形客戶端的拖拽方式將數據上傳上去。同時如果數據量非常巨大,那麼OSS還提供了一套傳輸上G數據的解決方案,這樣就可以支持大規模的運算。
6d6150fe73680addf9b6b425982f6d24cfda7b97
第二步就是開始創建雲端的實驗開發環境,利用圖形應用,在這裏是使用阿裏雲的圖形管理界麵來創建Jupyter的一套開發測試環境。如果大家曾實現過深度學習的編程可能就會知道Jupyter是一套比較好的交互式的文本,可以在上麵寫自己的查詢代碼然後以交互的方式知道每一步執行的結果是什麼樣子。這裏麵同時還加入了TensorBoard,TensorBoard具有針對TensorFlow的一些支持,可以將整個學習的過程包括最後求解的方程所求的數值解與真實解之間的誤差是多少以圖形化的方式展示出來。可以通過這個觀察整個誤差的發展情況,以此來判斷整個的學習過程是不是在正確的方向上。搭建完成環境後的第一個步驟就是構建應用。
46df5bf784e08f6d450b7368371c3c64ca47a130
當程序寫完之後,下一步做的事情就是構建雲端訓練,也就是如何在雲上麵將真正的程序跑起來,因為這個程序可能是分布式,那麼這裏麵支持的是什麼呢?其實通過圖形用戶化的界麵就可以去指定這裏麵使用到的是單機訓練還是多機訓練,以及這個程序所需要的依賴是什麼。而這裏麵最重要的是方程的解,這可以通過阿裏分布式存儲解決方案幫助去將checkpoint和模型保存成為可持久化的數據,同時利用TensorBoard去監控整個訓練的過程。
dc3b3b4e020b87b085aa784a8eb981d77cb54144
這裏稍微提一下如何使用TensorFlow去保存模型。TensorFlow提供了兩種保存模型的方式,第一種方式是Checkpoint,Checkpoint實際上是最常用的保存方式,其最常用的場景就是當進行訓練的時候,有時總會因為一些莫名其妙的原因使得整個進程都崩掉了,這時候中間的結果就會丟失了,而Checkpoint的好處就是比如做一千步訓練或者多少步訓練的時候,就可以將數據保存到一個固定的Checkpoint裏麵,如果中間崩掉的時候就可以從Checkpoint點重新開始訓練,這是Checkpoint的最主要的應用場景。當然由於TensorFlow在最早的時候就將Checkpoint提供出來,所以很多的TensorFlow用戶也會使用Checkpoint來做Session,實際上其原理就是將原來訓練的結果保存下來,在另外的地方加載下來之後重新再計算一遍f(),也就是在加載之後進行一次運算起到了預測的作用。
1db1d177148a094158017297c7003ceee5268054
現在大家比較常用的一種方式是利用model進行預測,也就是TensorFlow提供了一套預測框架是基於GRTC的TensorFlow Serving,並且它是使用C++完成的,它所接受的數據類型是export類型,而不是Checkpoint類型,所以它有一套特殊的編程API可以把自己的這套model導出,並且由TensorFlow Serving直接進行加載,通過不同的Java客戶端、Go客戶端、Python客戶端甚至Android和IOS客戶端來訪問它實現預測,它所做的也是TensorFlow相應的運算的方程求解的過程。
a5d11dfa96a848804ae8717a6f2b78aded7747a9
最後的一件事情是當一些Checkpoint運算成功結束之後,Checkpoint保留出來之後就可以進行在線運算和預測的過程。這裏還是通過前端的UI指定預測類型以及預測應該用是應該怎樣去部署的,可以選擇使用GPU還是CPU,選擇使用Hadoop TensorFlow的預測方式還是選擇使用自定義的預測方式以及通過Checkpoint的預測方式,這些都是支持的。同時也支持運維期間需要的負載均衡和彈性伸縮的能力,這樣可以看到將一個正常的圖片放進去,選擇不同的Checkpoint以及不同的風格類型的時候,能夠產生不同的運算結果。
2326b1571e1c582017874dcb29f49091e9da3d30
那麼如何在阿裏雲的這套環境上麵進行開發測試呢,首先進去前端控製台,描述應用的名字,然後從多個應用框架進行選擇,是使用TensorFlow 1.0還是TensorFlow 0.12還是其他更多的框架。在這裏麵由於需要監控訓練集,所以需要寫上需要監控的日誌目錄是什麼。當選擇創建之後,就可以看到創建出來兩個中心節點,一個是Jupyter的開發測試環境,輸入密碼之後就可以使用Jupyter執行並看到執行的結果以及訓練的過程。當訓練完成之後就可以通過TensorBoard看整個訓練的結果是什麼樣子,是不是能夠達到最終的目標值的Cost越來越小。在TensorBoard上可以看到訓練的趨勢是什麼樣子,其精確度是在向什麼樣的方向發展,還可以看到在TensorFlow裏麵進行運算時整個數據組織是什麼樣的結構。

當程序開發結束之後,開始進行訓練。這時就需要指定訓練輸入的數據集,以及預處理的模型,這裏的框架有多種選擇,還可以指定預定義的框架,這裏麵還可以選擇是不是支持GPU,然後還有指定數據需要寫入到哪個數據件裏麵以及數據來源是什麼,還需要指定總共訓練的次數以及需要保存的地點是在什麼位置,都是需要一些規約來定義這些事情的。

整個方案的最大特點就是速度會非常快,就是可以快速地在這套解決方案上搭建出來自己的機器學習小應用。這裏麵做的事情首先會從GitHub上將應用下載下來,然後這裏麵的規約就會自動安裝自定義的Python依賴,之後就開始調用GPU資源並啟動,開始構建網絡,之後真正開始進行訓練。當將Checkpoint指定到一個更好的位置的時候就會將雲的產生數據存放到分布式存儲上。當擁有這些數據之後就可以進行預測,預測的具體內容包括把之前計算過的東西保存下來,之後根據保存的數據和模型提供一個Read API,這裏麵並沒有TensorFlow Serving這個標準框架而是自己實現了使用Python寫的框架,並使用Checkpoint方式加載應用。並且如果需要使用負載均衡可以提供更多的實例的數量,並指定加載數據的模型數據卷以及阿裏雲的彈性的SLB負載均衡服務,就會很快地將服務提進來。當將服務提進來之後還是通過路由列表,通過阿裏雲提供的負載均衡訪問端點進行訪問。它所能提供的東西就是在這裏上傳一個圖片,然後根據所指定的不同的風格進行轉換就可以得到不同的風格圖片,基本上就實現了與Prisma相似的功能。也就是說在現有的開源技術上,就可以在阿裏雲上構建自己的一個小應用,並且可以提供一站式運維的體驗。甚至在阿裏雲上不僅可以轉換圖片的風格,現在還可以轉化視頻的風格。

總結
6b1b2da467cbedb9efef46be4f860d93e84f6978
最後總結一下,大家可以看到阿裏雲基於容器的機器學習解決方案的最大特點就是相對而言比較簡單,能夠根據一些開源的東西以及一些已有的服務快速地構建一套機器學習應用,並且使應用與阿裏雲上的NAS,OSS,SLB以及簡單日誌服務等都可以做到無縫集成,隻需要通過將他們加在一起就可以了,這是這套方案的第一個優勢就是比較簡單並且快速。

第二個好處就是優化,與容器服務團隊進行合作的還有一個比較有名的就是阿裏雲的高性能計算團隊,像對於阿裏媽媽這些的優化都是他們團隊做的,他們會提供一些特定場景性能優化的TensorFlow和Caffe的一些鏡像,針對一些特定的場景進行性能優化,而不是百分百的優化。另外一件事情就是這套方案在持續集成和持續交付這件事情上是比較有經驗的。其實可以將機器學習看做兩部分,第一部分可以看做實驗科學,需要不斷地去嚐試,找出最佳的組合來做推演;第二部分其實是交付的科學,如何將模型交付到機器上,如何進行A/B Test,而這件事情又是容器服務團隊非常擅長的事情,既可以幫助優化性能,又能夠幫助優化流程。

第三件事情就是定製化,阿裏雲希望能夠通過為用戶提供更大的靈活性,比如增加自己定義的鏡像以及operator等來滿足高級用戶的需求,並平衡靈活性和自動化之間的關係。

最後更新:2017-05-17 18:31:45

  上一篇:go  資源獲取模式
  下一篇:go  java package的設計原則