天天看點

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

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

<b>以下内容根據嘉賓演講視訊以及ppt整理而成。</b>

在2016年有兩個深度學習應用使得深度學習這個概念走入了平常百姓家,大家開始意識到深度學習技術好像和我們的生活開始産生聯系了。第一件事情就是alphago戰勝了圍棋世界的高手李世石,它向我們證明了一件事情:計算機不但具有強大的運算能力,它甚至開始學會學習了,更可怕的是計算機的學習能力是一種縱向深入的學習能力,也就是随着計算機看到的資料越來越多,随着時間的不斷往前發展,計算機有可能成為某個領域的專家,在圍棋中是這樣,在其他的領域,比如醫學等領域也都會有同樣的影響。可以說,alphago是第一個使我們真正意識到機器學習具有一種自我演進能力的應用。

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

第二件事情就比較有意思了,prisma這款應用是2016年度蘋果app store的排到第一名的最佳手機應用,這款手機應用其實也是基于深度學習技術來實作的,它所做的事情就是像将自己家小區後院的照片傳上去,然後指定一個繪畫大師的作品,比如指定梵高的《星空》這個作品,将兩者合成一張新的圖檔。

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

合成後的這個圖檔的特點就是内容還是樓下的小區,但是這張圖檔的風格看起來就是梵高畫出來的了。那麼如果使用機器學習的語言來解釋一下這是如何做的就是實際上這個應用做了兩件事情:第一件事情就是從這張梵高的畫中學習出來一個函數f(),這個函數f()的價值是什麼呢?其實就是反應了梵高這幅畫作的風格,這就是機器學習所做的第一件事情,從這張畫作學習到了一個能夠反應梵高風格的函數。其實比如說産生整個圖檔的工作需要花費10個小時的話,上面說的這個産生f()函數的這件事情需要花費9個小時,甚至是9個小時55分鐘。而最後将這個函數f()求出來之後,将樓下小區的照片這個x指派到f()函數中,就産生了一個新的圖檔,其實剩下的僅有的5分鐘就是用來做這件事情的。

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

講到這裡大家應該就能了解所謂機器學習是在做什麼,應該怎樣去轉換這張圖檔。這時候可能大家會産生一個疑問,其實早在2010年就已經濾鏡程式了,通過一個濾鏡打上去其實也可以産生這樣的效果,這個濾鏡程式和深度學習的畫像有什麼差別呢?其實兩者之間的差別就在于這個f(),這裡面最大的差別就是f()是如何産生的,傳統的濾鏡技術是依靠一個程式員實作的,讓他去了解這個畫像的風格是什麼樣的,他自己去手敲代碼去實作f()這個函數,而機器學習則是由機器自己從這個圖檔中提取資訊并且計算出f()。這種差別産生的影響有兩個:第一個就是程式員寫一個梵高畫的風格的程式可能需要花費兩周的時間,如果再來一個畢加索就可能還需要兩周的時間,也就是産生的成本比較高,這是第一個影響,第二個影響是什麼呢?就是了解性問題,第一種使用濾鏡的方式對于畫的了解并不是梵高的了解,而是編寫程式的程式員的了解,是以在這裡面需要為大家解釋清楚的就是機器學習和加濾鏡的差別就是機器學習的本質,也就是這個規律是機器自己學習到的,并不需要人來教,人隻需要給它資料集就可以了。

這個厲害的深度學習算法實際上并不是prisma這個公司的創始人發明的,而是在2015年,也就是prisma大火的前一年,三個德國的資料科學家發明了這個算法并且利用這個算法創辦了自己的創業公司叫做deepart,它所能做的事情就是提供一個網站讓使用者将自己的圖檔上傳上去并選擇一個風格,經過3到5個小時的計算産生處一個有自己圖檔内容的大師風格的作品。這個網站上線之後效果還算不錯,有一些人願意花100多歐元去得到這樣一幅作品,但是并沒有大火。

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

而在2016年年初的時候,一個俄羅斯的軟體工程師看到了這個論文并且也看到了deepart所做的産品,這個俄羅斯的工程師就認為他們做的産品存在問題。那麼這個網站之是以沒有火起來是為什麼呢?俄羅斯工程師進行了思考,他發現原有産品中存在兩個問題,第一個問題就是産生圖檔的時間太長了,5到6個小時,沒有人願意去等這麼長的時間;第二個問題就是deepart隻提供了一個網站,大家都知道網站無法得到高頻的通路,我們需要有個電腦才能去進行登入再通路,是以使用起來的效果并不好。是以這個俄羅斯工程師就想開發一個手機app,并使得手機app能夠達到的效果是将圖檔上傳上去之後等待10到20秒就能夠得到已經選好風格的圖檔,是以他就開始研究如何讓圖檔轉換的時間變短。其實就像剛才提到的,在這裡機器學習主要做兩件事情,第一件就是去求解代表風格的函數,第二件事情就是利用将值賦給這個函數去計算出最後的結果值,也就是說在做風格轉換時的工作就是去解這個方程去求出繪畫風格。如果能夠像資料庫一樣将風格函數持久化地存儲到硬碟上,每一次生成新圖檔的時候都将函數從硬碟上進行加載而免去了計算的過程,就可以将原來的6小時變成幾分鐘甚至更短的時間,實作後這個時間縮短達到了20秒。這個俄羅斯工程師實際上并不是機器學習方面的專家,但是他找到了問題的症結,并在此基礎之上使用了一個月的時間開發出了這套prisma的app,這個app在歐洲一上線在大概兩周的時間内就有了三千萬的下載下傳量。如下圖所示,梅德韋傑夫也是prisma的忠實粉絲。當時在8月份的時候,在歐洲人普遍對于藝術有較高的鑒賞能力的情況下,他們都認為這個應用比較能夠打動内心。

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

剛才講述的這個故事實際上是想告訴大家一個道理,我們現在正處于ai即将到來的時代,但是ai時代并不隻屬于資料科學家、ai科學家以及這些程式員們。ai的技術是非常重要的一件事情,但比這件事情更重要的是如何利用ai技術轉化出相應的産品,實作資料、技術和産品之間的關聯,真正能夠将ai技術應用到大家的日常生活中,像prisma一樣應用ai來為大家創造價值,讨得大家的歡心,這個才是最重要的,也是需要大家一起去思考的事情。也許你并不是ai的專家,但是也應該去思考如何才能将ai應用起來。實際上重要的是我們的想法,如果你有自己的想法,再利用一些開源的工具,加上阿裡雲的資源就可以很容易地建構屬于自己的深度學習的應用。

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

我們所處的是一個開源的時代,很多深度學習和機器學習的學習庫實際上都是開放的,包括谷歌的tensorflow、微軟的cntk、caffe、mxnet等這些都是開源的機器學習庫,如果大家想去學習這些開源庫,其實有很多相關的資源可以參考。

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

在這裡主要介紹一下tensorflow,tensorflow是2015年谷歌開源的一套機器學習庫,其在深度學習方面非常好用,目前在github上面大約有5萬顆星,其實也是大家開始深度學習一個非常好的起點,它的最大特點是雖然不算性能最好,但是最為簡單。

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

在這裡想和大家說的是關于剛才提到的風格轉換這件事情實際上有很多個實作,依賴于不同的機器學習庫,包括tensorflow、mxnet、torch以及caffe等,在分享的最後也會給大家看一下一些使用這些庫實作應用的代碼。

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

有了這些機器學習庫和機器學習的代碼可以供大家進行學習,剩下的就是讓大家了解一下如何建構自己的機器學習以及深度學習的應用。剛才提到了整個機器學習的流程從大的方面可以分為兩個部分,一部分可以稱之為求解方程,第二部分可以稱為給方程指派。是以在機器學習的流程中的第一部分就是訓練,根據資料如何去訓練出這個機器學習模型,實際上就是在求解這個方程。而第二步當這個方程解完之後,就可以給方程賦予新的值讓它去做預測。具體來看,第一步在求解方程中最重要的也是機器學習最核心的事情就是資料和計算量,首先需要準備資料并且上傳到雲上,這是在雲上進行機器學習的最重要的起點。第二步就是需要開發自己的訓練程式,這個訓練程式所做的事情就是根據資料來進行訓練、求解方程,并對于程式的正确性進行确認。第三步,當我們具有大規模資料的時候,就可以執行一些訓練,剛開始時可能做的是單機,但是在真正進行訓練的時候,可能因為性能的需求、資料量的需求可能需要使用gpu以及分布式的訓練,這個時候就是第三步執行訓練任務,在執行完訓練任務之後有一個很重要的工作就是導出這個訓練模型,導出這個訓練方程。在最後将這些應用到線上預測中,就是相當于對于方程進行指派,這就是真正的工作流程。

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

然後向大家先介紹一下阿裡雲基于容器服務的機器學習解決方案架構。如下圖所示的解決方案是以容器服務為核心的,在這裡面所有服務是以容器作為載體的,容器服務貫穿整個機器學習的整個生命周期,包括開發、訓練、預測以及資料處理,并且這個解決方案很好地內建了阿裡雲已有的機器學習能力,比如彈性計算、高性能計算以及彈性gpu計算、vpc網絡以及共享存儲、運維以及鏡像等能力。使大家的深度學習應用能夠無縫地和阿裡雲的服務進行內建,這就是這個方案所能夠帶來的好處。

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

那麼這個事情具體是如何實作的呢?首先第一步是需要準備資料,因為我們知道像在阿裡雲上做深度學習的話,上傳資料最簡單的方式是通過oss,這就可以通過oss指令或者圖形用戶端的拖拽方式将資料上傳上去。同時如果資料量非常巨大,那麼oss還提供了一套傳輸上g資料的解決方案,這樣就可以支援大規模的運算。

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

第二步就是開始建立雲端的實驗開發環境,利用圖形應用,在這裡是使用阿裡雲的圖形管理界面來建立jupyter的一套開發測試環境。如果大家曾實作過深度學習的程式設計可能就會知道jupyter是一套比較好的互動式的文本,可以在上面寫自己的查詢代碼然後以互動的方式知道每一步執行的結果是什麼樣子。這裡面同時還加入了tensorboard,tensorboard具有針對tensorflow的一些支援,可以将整個學習的過程包括最後求解的方程所求的數值解與真實解之間的誤差是多少以圖形化的方式展示出來。可以通過這個觀察整個誤差的發展情況,以此來判斷整個的學習過程是不是在正确的方向上。搭建完成環境後的第一個步驟就是建構應用。

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

當程式寫完之後,下一步做的事情就是建構雲端訓練,也就是如何在雲上面将真正的程式跑起來,因為這個程式可能是分布式,那麼這裡面支援的是什麼呢?其實通過圖形使用者化的界面就可以去指定這裡面使用到的是單機訓練還是多機訓練,以及這個程式所需要的依賴是什麼。而這裡面最重要的是方程的解,這可以通過阿裡分布式存儲解決方案幫助去将checkpoint和模型儲存成為可持久化的資料,同時利用tensorboard去監控整個訓練的過程。

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

這裡稍微提一下如何使用tensorflow去儲存模型。tensorflow提供了兩種儲存模型的方式,第一種方式是checkpoint,checkpoint實際上是最常用的儲存方式,其最常用的場景就是當進行訓練的時候,有時總會因為一些莫名其妙的原因使得整個程序都崩掉了,這時候中間的結果就會丢失了,而checkpoint的好處就是比如做一千步訓練或者多少步訓練的時候,就可以将資料儲存到一個固定的checkpoint裡面,如果中間崩掉的時候就可以從checkpoint點重新開始訓練,這是checkpoint的最主要的應用場景。當然由于tensorflow在最早的時候就将checkpoint提供出來,是以很多的tensorflow使用者也會使用checkpoint來做session,實際上其原理就是将原來訓練的結果儲存下來,在另外的地方加載下來之後重新再計算一遍f(),也就是在加載之後進行一次運算起到了預測的作用。

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

現在大家比較常用的一種方式是利用model進行預測,也就是tensorflow提供了一套預測架構是基于grtc的tensorflow serving,并且它是使用c++完成的,它所接受的資料類型是export類型,而不是checkpoint類型,是以它有一套特殊的程式設計api可以把自己的這套model導出,并且由tensorflow serving直接進行加載,通過不同的java用戶端、go用戶端、python用戶端甚至android和ios用戶端來通路它實作預測,它所做的也是tensorflow相應的運算的方程求解的過程。

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

最後的一件事情是當一些checkpoint運算成功結束之後,checkpoint保留出來之後就可以進行線上運算和預測的過程。這裡還是通過前端的ui指定預測類型以及預測應該用是應該怎樣去部署的,可以選擇使用gpu還是cpu,選擇使用hadoop tensorflow的預測方式還是選擇使用自定義的預測方式以及通過checkpoint的預測方式,這些都是支援的。同時也支援運維期間需要的負載均衡和彈性伸縮的能力,這樣可以看到将一個正常的圖檔放進去,選擇不同的checkpoint以及不同的風格類型的時候,能夠産生不同的運算結果。

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

那麼如何在阿裡雲的這套環境上面進行開發測試呢,首先進去前端控制台,描述應用的名字,然後從多個應用架構進行選擇,是使用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相似的功能。也就是說在現有的開源技術上,就可以在阿裡雲上建構自己的一個小應用,并且可以提供一站式運維的體驗。甚至在阿裡雲上不僅可以轉換圖檔的風格,現在還可以轉化視訊的風格。

<b>總結</b>

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

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

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

第三件事情就是定制化,阿裡雲希望能夠通過為使用者提供更大的靈活性,比如增加自己定義的鏡像以及operator等來滿足進階使用者的需求,并平衡靈活性和自動化之間的關系。

繼續閱讀