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


內容來源: 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來直接訪問這個服務了。

總結

今天主要給你們分享了深度學習的應用,以及在思考作一個深度學習平臺以後,咱們的考慮和架構設計,但願能給你們帶來一些幫助。咱們也相信雲計算大數據時代已經到來,下一個時代將會是深度學習,而且將來會繼續往雲深度學習發展。謝謝你們!

今天的分享到此結束,謝謝你們!

相關文章
相關標籤/搜索