小米深度學習平臺架構與實現

IT大咖說發表於2017-08-22

小米深度學習平臺架構與實現

內容來源:2016年12月16日,小米雲平臺深度學習研發工程師陳迪豪在“GIAC 全球網際網路架構大會”進行《支撐百度搜尋引擎99.995%可靠名字服務架構設計》演講分享。IT大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。
閱讀字數:2783 | 4分鐘閱讀

小米深度學習平臺架構與實現

摘要

深度學習的概念源於人工神經網路的研究,含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現資料的分散式特徵表示。

嘉賓演講視訊和PPT地址:t.cn/R9ONt8f

機器學習與深度學習應用

機器學習是通過機器進行自主學習資料而非以編碼的方式;深度學習是機器學習的一個分支,主要包括四種最基本的網路結構。

CNN是卷積神經網路。通過卷積網路的模型,可以高效地處理影像分類或人臉識別等應用。

MLP是多層感知機,也就是傳統的神經網路。已經被Google大量應用在Youtube視訊推薦和APP推薦上。

RNN模型是在神經元里加入帶記憶的神經元結構,可以處理和時間序列有關的問題。

RL是Alphago用到的增強學習,它的底層也用到一些深度學習技術。

CaseStudy:Image Classification

假如有一個應用要通過大量圖片訓練分辨出貓和狗的圖片。如果按照傳統的方法,程式設計師自己寫應用來區別貓狗圖片,可能需要很多規則和圖形處理技巧,必須是一個影像專家。

但現在有了神經網路,輸入只是資料,只要定義一個簡單的神經網路,把應用寫好後通過資料訓練,就能實現一個效果不錯的影像分類應用。

小米深度學習平臺架構與實現

Google已經開源了Inception的模型,是層數比較高的一個多層神經網路。這個網路有些複雜,用GPU機器可能要訓練兩到三週才能實現。有了Tensorflow這樣的工具後,可以在Github地址上直接下載它的模型。

CaseStudy:Game AI

GameAI是遊戲人工智慧,通過影像的結果用增強學習和Qlearning的演算法,就可以實現它自動最大化地得到分數。

小米深度學習平臺架構與實現

Introduce Tensorflow

Tensorflow是Google開源的一個Deep Learning Library,提供了C++和Python介面,支援使用GPU和CPU進行訓練,也支援分散式大規模訓練。

小米深度學習平臺架構與實現

在使用Tensorflow的時候,只寫一個靜態純文字的檔案,通過Python直譯器去執行,所以Tensorflow本質上只是一個Deep Learning Library。

Summary Of Tensorflow

Tensorflow這個Library需要人工安裝,指令碼需要手動執行,環境需要手動配置。分散式的Tensorflow要把一個指令碼拷貝到多臺機器上,手動配置。要進行程式碼調優需要手動Run和Tune。

小米深度學習平臺架構與實現

我們想做Tensorflow模型調優,但伺服器可能出現OOM、可能使用的埠被別人佔用、也可能磁碟出現故障,伺服器環境變成應用開發者的負擔。

小米深度學習平臺架構與實現


分散式Tensorflow同樣需要把程式碼拷貝到分散式的各臺機器上,且不論Tensorflow的效能是否隨著節點數越多而增強,伺服器維護成本已呈線性增加了。

雖然Google開源了一個非常好的深度學習工具,但它並沒有解決深度學習應用部署和排程的問題。

有人說過,任何複雜的問題都能通過抽象來解決。

小米深度學習平臺架構與實現

我們在中間引入一個分散式的管理系統,讓上層業務應用不需要直接管理底層資源,由統一的排程系統去實現。

深度學習平臺架構與設計

Cloud-ML:The Principles

我們希望這是一個雲端計算,而不是提供裸機的服務。使用者只需寫好應用程式碼提交,不用通過Ssh或登入到伺服器上用指令碼執行。

我們想把模型的訓練和服務進行整合。一個模型訓練完成後會得到一些模型檔案,可以直接把這些模型檔案應用起來。

我們希望這個平臺是高可用的,即使使用者的任務訓練失敗,也能重新給使用者做一個排程。

使用者之間的任務是需要做資源隔離和動態排程。

我們希望能支援併發的訓練。

通過Automatically Tuning平臺,使用者可以一次提交多個超引數組合,讓它並行訓練,等訓練結束可以直接看到效果。

Cloud-ML:All-In-One Platform

小米深度學習平臺架構與實現

目前這個平臺已經為使用者提供深度學習框架的開發環境,開發完之後可以把程式碼提交上去,然後就可以訓練,訓練結果會直接儲存在我們自己的分散式儲存裡。使用者可以通過這個平臺起一個RPC服務,他的手機或業務伺服器能夠直接呼叫這個服務。我們還提供了Model Zoo以及RPC客戶端的一些功能。

小米深度學習平臺架構與實現

這是深度學習平臺的基本架構。

最上層是使用者業務,有廣告、搜尋、遊戲等,都有自己的業務場景,可以根據自己的資料格式編寫一些Tensorflow、深度學習的指令碼。通過Cloud-Ml的API把任務提交到服務端,由服務端建立一個容器,把它呼叫到真正的物理機計算資源上。

這整個大平臺主要是由Tensorflow和Kubermetes實現的。由這個平臺管理底層維護的CPU伺服器和GPU伺服器、虛擬機器以及AWS的機器。

Cloud-ML:Kubernetes Inside

Kubermetes是一個容器的叢集管理系統,它會依賴一個多節點的Etcd叢集,有一個或多個Master去管理Kubelet節點。每個物理機會部署一個Kubelet和Docker程式,在上面會執行多個Docker的Container。

小米深度學習平臺架構與實現

我們這個平臺封裝了一個Kubelet,讓使用者把業務程式碼提交上來,組成一個Docker容器的格式,然後由Kubelet去排程。

Cloud-ML:The Architecture

小米深度學習平臺架構與實現

這是一個分層和解耦的基本架構,好處就是API服務只需要負責授權認證、任務管理,排程通過Kubermetes去做,Kubermetes的後設資料都通過Etcd去儲存,每一部分都利用API進行請求。這樣就能把整個系統的元件解耦。

Cloud-ML:Train Job

小米深度學習平臺架構與實現

有了深度學習平臺之後,通過已經支援的API宣告提交任務的名稱,編寫好Python程式碼的地址。執行程式碼的引數通過Post請求過來。

我們也提供SDK對API做了封裝。

命令列工具Command能夠直接把寫好的指令碼提交到雲平臺進行訓練。還有內部整合的Web Console。

小米深度學習平臺架構與實現

訓練任務提交之後,在命令列可以看到任務訓練日誌。

Tensorboard可以看定義的模型結構。

Cloud-ML:Model Service

訓練任務結束後可以直接起一個Model Service。因為檔案已經儲存在雲端儲存裡了,只要再發一個API請求,在後端也封裝了一個Docker Image。

小米深度學習平臺架構與實現

底層是依賴Google已經開源的Tensorflow Serving直接載入模型檔案。

左邊是Online Services,使用者把模型訓練完儲存在這裡,起一個容器,對外提供高效能的RPC服務。

Cloud-ML:Predict Client

小米深度學習平臺架構與實現

線上服務支援Grpc和HTTP介面,理論上支援大部分程式語言。可以使用Java客戶端、C++客戶端、Go客戶端和Python客戶端,或直接在Andriod請求模型服務。

通過一個統一的介面對外提供影像相關的API,底層是由Kubermetes進行排程和資源隔離。

右邊是Python的Grpc客戶端,當模型起來以後,使用者只需要編寫二十幾行Python程式碼,把模型的輸入準備好,就可以請求服務。

Cloud-ML:Wrap-Up

小米深度學習平臺架構與實現

在有深度學習平臺以後,工作流是這樣的。上面是工作環境,雲端有伺服器和基礎架構維護的服務。使用者在本地環境編寫自己的Tensorflow應用,在本地驗證這個應用能否跑起來。

通過Submit Train Job的API把任務提交到雲端,真正用GPU或CPU訓練的程式碼就在雲端執行。執行完之後會把模型儲存到分散式儲存裡面。

使用者可以用官方提供的Test TF APP去看模型訓練的效果如何,如果沒問題,在使用者自己的環境呼叫Deploy Model的API,這樣就會把Model拿出來起一個容器,對外提供RPC服務。

使用者就可以選擇自己喜歡的客戶端,用RPC的方式請求模型服務。

深度學習平臺實踐與應用

Practice:Distributed Training

小米深度學習平臺架構與實現

支援分散式訓練。使用者在Python指令碼里定義了一系列引數,把這個指令碼拷貝到各臺機器上去執行。

我們讓使用者把分散式節點個數和當前程式角色通過環境變數定義,環境變數名是固定的。這樣它只需要一個環境變數就可以定義程式在分散式訓練裡的角色。

小米深度學習平臺架構與實現

我們把使用者的指令碼拿出來以後,不需要它去管理伺服器的環境,只需要宣告這個叢集有多少個PS、Worker和Master,把這些引數提交給Cloud-Ml的API服務,由它來申請可用的IP和埠。

Practice:Storage Integration

小米深度學習平臺架構與實現

我們對儲存系統做了整合。開源的Tensorflow目前只支援本地儲存,因為我們在雲端訓練,任務由我們排程到特定的機器,使用者不可能直接把訓練資料放到本地。

我們希望使用者能直接訪問我們的分散式儲存,所以對Tensorflow原始碼做了修改。提交任務的時候可以直接指定一個FDS的路徑,系統就能根據使用者的許可權直接讀取訓練資料。

對Google官方的Tensorflow做了擴充。訓練完之後資料全部放在分散式儲存裡,用Tensorflow指定FDS路徑。

訓練完把模型匯出到FDS以後,通過Cloud-Ml的API建立一個服務,載入它的模型檔案。

針對不同的模型宣告不同的請求資料,輸入型別和輸入的值通過Json定義,就可以請求模型服務了。

Practice:Support HPAT

小米深度學習平臺架構與實現

HPAT是神經網路裡的超引數自動調優,極大縮短了科研人員和專注做演算法模型人員的時間。

Practice:Dependency Management

小米深度學習平臺架構與實現

讓使用者提交程式碼的時候提交一個標準的Python Package。

Practice:BringYour Own Image

小米深度學習平臺架構與實現

讓使用者的Docker直接提交到Kubermetes叢集裡,真正徹底解決使用者依賴的問題。

Practice:ModelZoo

我們把Model檔案放到儲存中,通過API把Paper實現了,不同的Model都可以部署到這個平臺上,這樣就可以通過RPC來直接訪問這個服務了。

總結

今天主要給大家分享了深度學習的應用,以及在思考做一個深度學習平臺之後,我們的考慮和架構設計,希望能給大家帶來一些幫助。我們也相信雲端計算大資料時代已經到來,下一個時代將會是深度學習,並且未來會繼續往雲深度學習發展。謝謝大家!

今天的分享到此結束,謝謝大家!

小米深度學習平臺架構與實現


相關文章