在鈦媒體Pro專業(yè)用戶和付費(fèi)用戶專享的“鈦坦白”在線課堂第33期,我們再次請來三位鈦客分享對機(jī)器學(xué)習(xí)的思考 。本期鈦客之一、百度資深工程師、Paddle API重構(gòu)設(shè)計負(fù)責(zé)人于洋,從事百度深度學(xué)習(xí)平臺PaddlePaddle開發(fā)工作。加入百度后一直從事深度學(xué)習(xí)系統(tǒng)的研發(fā),主要負(fù)責(zé)深度學(xué)習(xí)系統(tǒng)的性能優(yōu)化和功能開發(fā)工作。2016年獲得百度年輕高潛人才(YTP)項目成員以及百度最佳個人。
本文節(jié)選自于洋在鈦坦白的分享。如果您還不是鈦媒體Pro用戶,希望查看鈦坦白所有干貨,進(jìn)入鈦坦白九個專業(yè)群交流,并查看更豐富的專業(yè)數(shù)據(jù)和信息,可點擊:http://www.chcmb.cn/pro 注冊。
以下根據(jù)于洋在鈦坦白的分享實錄整理:
大家晚上好,我是來自于百度深度學(xué)習(xí)實驗室的于洋,在百度主要從事百度深度學(xué)習(xí)系統(tǒng)PaddlePaddle的開發(fā),今天給大家?guī)淼姆窒眍}目是《深度學(xué)習(xí)系統(tǒng)本身所面臨的一些挑戰(zhàn)》。
先思考一個AI落地的真實問題
AI已經(jīng)是一個很火的話題,但是AI如何在中小企業(yè)落地,其實牽扯到很多現(xiàn)實的問題。比如一個最簡單的問題,如何通過語音來控制電視,我們認(rèn)為有四種解法:
1、用AI HUB,也就是說將神經(jīng)網(wǎng)絡(luò)的模型放到一個芯片或者是一個很小的機(jī)器里讓這個機(jī)器去控制電視。這個AI Hub不應(yīng)該放到電視。例如Amazon Alexa或者Google Home。二者雖然實現(xiàn)了聲控,但是人可能在屋里到處走動,不是身在何處都能喚醒Alexa的。
但這么做其實不是特別經(jīng)濟(jì),因為如果要讓AI去控制電視的話,首先每一臺電視都要具有神經(jīng)網(wǎng)絡(luò)的預(yù)測功能,同時當(dāng)用戶的真實數(shù)據(jù)預(yù)測完之后,神經(jīng)網(wǎng)絡(luò)也要去根據(jù)用戶的新數(shù)據(jù)去重新訓(xùn)練模型,讓模型更好。這就要求一個芯片既具備神經(jīng)網(wǎng)絡(luò)的推斷能力,又具備訓(xùn)練能力。
2、提供一個深度學(xué)習(xí)的API給大家,比如百度提供一個深度學(xué)習(xí)訓(xùn)練和預(yù)測的平臺。大家愿不愿意把自己的數(shù)據(jù)放到百度或者谷歌的云盤里,讓百度給大家提供機(jī)器學(xué)習(xí)訓(xùn)練預(yù)測的API呢?
我想這在很多場景下是不現(xiàn)實的。第一個原因是,用戶要學(xué)會用API就很難,要在IoT上調(diào)用API更難。另一個原因是,在百度PaddlePaddle團(tuán)隊和其他企業(yè)進(jìn)行交流的時候發(fā)現(xiàn),大部分企業(yè)都想用的是私有云。不使用公有云的理由其實不是成本,主要還是公有云可能帶來的數(shù)據(jù)安全問題,因為對于企業(yè)來說真正有價值的東西其實是訓(xùn)練數(shù)據(jù)。
3、企業(yè)自己搭一個AI的專用集群,或者說買一百臺GPU機(jī)器只去跑深度學(xué)習(xí)的訓(xùn)練,這樣做是不是可行的呢?我想也是不可行的,因為專用的AI集群的GPU是非常昂貴的,大體上,租用一個AWS GPU instance一年的費(fèi)用和買一臺一樣。而專用集群的集群利用率并不會非常高,因而很不劃算。至于專用集群的利用率為什么不會很高,我們稍后再講。
4、PaddlePaddle提出的目標(biāo)是做一個通用的AI集群。通用的意思是AI集群里既可以跑神經(jīng)網(wǎng)絡(luò)的訓(xùn)練任務(wù)也可以跑其他的任務(wù),對于各項任務(wù)既可以跑生產(chǎn)環(huán)境的作業(yè),也可以跑實驗性作業(yè)。這樣一來,一個企業(yè)里各個業(yè)務(wù)的各個團(tuán)隊都可以使用同一個機(jī)群,甚至如果部署到云上可以使不同企業(yè)一起用一個機(jī)群。你不用的時候我用,你的作業(yè)用GPU同時我的在用磁盤,從而使得機(jī)群的總體利用率大幅提升。
選擇專用集群還是通用集群?
下面這張圖是谷歌Deepmind的AlphaGo所使用的資源使用情況。可以看到,在最后分布式的時候使用了280塊GPU:
下圖是百度的GPU訓(xùn)練機(jī)器,我們的一臺機(jī)器就可以支持16塊GPU顯卡,最多可以擴(kuò)展到64塊顯卡:
所以這種深度學(xué)習(xí)的專用集群地球上沒有幾個企業(yè)能真正玩得起。比如說百度的機(jī)器翻譯系統(tǒng),在我們組訓(xùn)練的時候,可能會用32塊K40的GPU做十天左右的訓(xùn)練;谷歌的機(jī)器翻譯用了96塊K80做GPU訓(xùn)練;AlphaGo其實用了50塊GPU訓(xùn)練了一個月。這些昂貴的使用成本是初創(chuàng)企業(yè)所不能承受的,也是不應(yīng)該承受的。
為什么像百度、谷歌或者微軟之類的大公司可以承受這樣成本呢?其實原因還是比較簡單的,在這些公司,深度學(xué)習(xí)在產(chǎn)品線里應(yīng)用是比較廣的。比如大部分的百度產(chǎn)品線都使用了PaddlePaddle,利用深度學(xué)習(xí)提升這些產(chǎn)品的功能和用戶體驗。
大家如果調(diào)試過深度學(xué)習(xí)任務(wù)就可以很明顯知道, 深度學(xué)習(xí)任務(wù)是有一定的資源使用周期的。比如在實驗剛剛開始的時候,用戶可能從大量的數(shù)據(jù)中采樣出來一個小的樣本集合,在這個小的樣本集合里調(diào)通一個比較好的模型。在這個階段里,機(jī)器的使用量其實是不大的,可能只有單臺機(jī)器或者幾塊顯卡。之后,為了驗證這個模型的效果,可能會將全量的數(shù)據(jù)進(jìn)行線下的訓(xùn)練,也就是用一個專用的深度學(xué)習(xí)集群去做訓(xùn)練,在這個階段可能會提交幾十到上百個計算機(jī)機(jī)器的訓(xùn)練任務(wù),這些機(jī)器每一臺都可能有數(shù)塊顯卡。
用戶的模型在線下訓(xùn)練中得以驗證正確,在大數(shù)據(jù)集上可以再對模型進(jìn)行一些精細(xì)化調(diào)整,從而將模型打造成可以用來做線上預(yù)測的狀態(tài)。線上預(yù)測時使用的機(jī)器數(shù)量明顯要少于訓(xùn)練時的機(jī)器數(shù)量,這是因為預(yù)測的時候,其實不需要將神經(jīng)網(wǎng)絡(luò)的前饋和反饋全跑一遍,也不需要去反復(fù)的跑訓(xùn)練集。
在這個預(yù)測模型上線之后,收集到用戶提供的新的數(shù)據(jù)和真實的反饋。我們將這些日志進(jìn)行收集,從而進(jìn)行一些增量訓(xùn)練,進(jìn)而讓我們的模型越來越好。在增量訓(xùn)練之后,就是更新預(yù)測模型,預(yù)測和增量訓(xùn)練的再一個循環(huán)過程。
可以看到一個初創(chuàng)企業(yè)如果只有少數(shù)的幾個深度學(xué)習(xí)任務(wù),由于深度學(xué)習(xí)任務(wù)的周期性,專用的深度學(xué)習(xí)集群一定不會有非常高的使用率,大體上能有20%的使用率就已經(jīng)很不錯了。但像在百度、谷歌之類的大公司,有各種各樣的產(chǎn)品線,這些產(chǎn)品線都需要使用深度學(xué)習(xí)進(jìn)行一些提升,所以這些任務(wù)雖然有周期性,但是任務(wù)和任務(wù)之間發(fā)生的時間是不同的,所以就形成了各個任務(wù)之間的一個疊加效應(yīng)。
我看群里面大家基本上都是相關(guān)領(lǐng)域的研究者或者創(chuàng)業(yè)創(chuàng)新的人員。針對創(chuàng)業(yè)創(chuàng)新的人員,其實部署一個專用的AI集群成本是非常高的,然而使用率是非常低的。專用的AI集群在我們看來只適合于大型的互聯(lián)網(wǎng)公司,而且這個互聯(lián)網(wǎng)公司要有多種多樣的AI業(yè)務(wù),如果有少量的AI業(yè)務(wù)的公司或者是初創(chuàng)型企業(yè),我們推薦使用通用集群去做深度學(xué)習(xí)的訓(xùn)練集群。
PaddlePaddle從專用集群到通用集群的改變
PaddlePaddle在去年9月份開源之前也是運(yùn)行在百度內(nèi)部的一個專用AI集群中。 在這個集群里面,它的機(jī)器都是同構(gòu)的,也就是說大家的CPU型號包括顯卡的型號都是一樣的,也是基于MPI進(jìn)行調(diào)度,內(nèi)網(wǎng)運(yùn)行環(huán)境也是隔離的,也是穩(wěn)定的。所以在去年9月PaddlePaddle開源之前,百度對PaddlePaddle的要求只有一個,就是盡量快,在盡量短的時間內(nèi)完成更多的任務(wù)。PaddlePaddle還有一個特點是因為百度本身是一個搜索企業(yè),PaddlePaddle為了服務(wù)百度更多的產(chǎn)品線,它在自然語言處理方面打造得會更好。
PaddlePaddle的運(yùn)行效率可謂是刻在PaddlePaddle基因里的一件東西,我們在開源之后,和Caffe還有TensorFlow做了一些benchmark,結(jié)果如下面三張圖所示。PaddlePaddle和其他框架在單顯卡上的速度都差不多,但是在多顯卡的速度上,Caffe是明顯要慢的,Tensorflow和PaddlePaddle其實在多顯卡的聚合上也差不多,PaddlePaddle會稍微快一點。但是在LSTM上,PaddlePaddle可以顯示出明顯的優(yōu)勢,如下圖可以看出,PaddlePaddle在單顯卡的時候就已經(jīng)比Tensorflow在LSTM網(wǎng)絡(luò)結(jié)構(gòu)里要快一些,LSTM在4GPU下,可以看到PaddlePaddle實際上比Tensorflow要快很多。
但是單純的單機(jī)和集群跑得快,已經(jīng)不是PaddlePaddle現(xiàn)階段的目標(biāo)。因為我們相信,只有在通用集群上跑得更快,才能服務(wù)更多的中小企業(yè),也才能夠讓更多的人接受PaddlePaddle,也才能夠給社會帶來更大的價值。
通用AI集群應(yīng)該怎么搭建?
專用集群其實是更常見的一種集群配置模式。比如說我們公司有存儲的需求,我就配置一個Hadoop集群去使用HDFS,有線下處理的需求,我再用Hadoop的Map-Reduce集群去做線下處理。對于網(wǎng)站的話,網(wǎng)站前端大家會配置一個nginx集群,再使用kalfka將網(wǎng)站的一些日志收集下來,再給AI處理。
專用集群的架構(gòu)就是把幾個事情分別部署在不同的機(jī)器里,這些機(jī)器是相互隔離,不能互相訪問的。這樣做的好處其實是顯而易見的,因為不同應(yīng)用分別跑在不同的物理機(jī)里,可以避免不同應(yīng)用之間的相互影響,但是壞處也很明顯,就是成本會很高,每個集群其實物理硬件的利用率是不夠的。
下面我以一個語音識別服務(wù)舉例,說明一個通用AI集群應(yīng)該怎么搭建。
下圖是一個通用集群的簡單示意圖,這個集群里有很多GPU的服務(wù)器,也有很多CPU的服務(wù)器,他們都部署在一個集群里。在這個集群的機(jī)器之上運(yùn)行著Kubernetes。Kubernetes是一個谷歌開源的分布式的操作系統(tǒng)。在2007年的時候,谷歌就使用集群操作系統(tǒng)Borg,通過混合部署各種來源的各種任務(wù),將CPU的利用率一直維持在75%到80%左右。而Kubernetes開發(fā)之前是Borg開發(fā)團(tuán)隊中的一部分,Kubernetes的設(shè)計繼承了Borg項目多年總結(jié)的經(jīng)驗,是目前最先進(jìn)集群操作系統(tǒng)。
這對企業(yè)的成本是一個極大的降低。之前我們說過普遍專用集群的資源利用率大概在20%左右,如果我們使用一個集群操作系統(tǒng)去管理集群的任務(wù),那么硬件利用率可以提升到75%到80%左右,這樣一個通用集群就相當(dāng)于普通的四個左右的專用集群。
通用集群數(shù)據(jù)還是存儲在HDFS上,在HDFS上有一些有標(biāo)簽的數(shù)據(jù),這些數(shù)據(jù)送給PaddlePaddle做線下訓(xùn)練。在這個系統(tǒng)的前端就是一個語音識別的服務(wù),用戶去提交自己的語音后返回一段文字。在這個前端語音識別API里用戶實時提交的語音數(shù)據(jù)就形成了一個實時的日志,這個日志就會被其他的進(jìn)程收集下來,比如使用Kalfka進(jìn)行收集,再去做一些線上的預(yù)處理,進(jìn)而將這些數(shù)據(jù)繼續(xù)傳遞給PaddlePaddle做訓(xùn)練。這樣PaddlePaddle既可以支持線下的大批量的數(shù)據(jù)訓(xùn)練,也可以支持線上的實時的數(shù)據(jù)訓(xùn)練。
在目前眾多的深度學(xué)習(xí)平臺里似乎沒有一個平臺再去考慮如何在通用集群里更好地進(jìn)行訓(xùn)練。這是因為大部分的深度學(xué)習(xí)平臺都是大企業(yè)開發(fā)的,在大企業(yè)中,通用集群的訓(xùn)練對他們來講并不重要,但這對初創(chuàng)企業(yè)是至關(guān)重要的。
通用集群對深度學(xué)習(xí)系統(tǒng)的挑戰(zhàn)
挑戰(zhàn)主要有這么幾方面:
- 通用集群首先會將任進(jìn)程成很多的組,每組構(gòu)成一個Job,這些作業(yè)中,有的是Web 服務(wù),有的是流式數(shù)據(jù)處理作業(yè),還有深度學(xué)習(xí)作業(yè);
- 這個集群需要做到服務(wù)隔離、多用戶,因為這個集群上跑了眾多的任務(wù),一個任務(wù)掛掉不可以讓其他的任務(wù)有任何的問題,并且由于這個集群是直接的線上集群,所以它的穩(wěn)定性要求還是非常高的;
- 這個集群需要有一定的優(yōu)先級調(diào)度的能力,比如他需要首先保證線上任務(wù)的穩(wěn)定性,但是也需要在機(jī)器空余的時候可以去做低優(yōu)先級的任務(wù),比如實驗性質(zhì)的任務(wù);
- 在這種集群里,可以對硬件進(jìn)行高效的利用,比如說一個Hadoop任務(wù),比如說HDFS可能更需要的是磁盤的IO或帶寬,但是對于深度學(xué)習(xí)任務(wù)來講可能更多需要CPU的計算能力和GPU的計算能力,他們就可以調(diào)度到同一個物理節(jié)點上;
- 這個集群還需要有自動伸縮的功能,比如在白天,活躍用戶眾多,集群會用盡量少的節(jié)點做深度學(xué)習(xí)的訓(xùn)練,而用更多的節(jié)點去做深度學(xué)習(xí)的預(yù)測或者是一個web服務(wù)進(jìn)程。但是在晚上,我們的用戶又比較少,閑置的機(jī)器就可以去做更多的機(jī)器學(xué)習(xí)的訓(xùn)練任務(wù),讓模型變得越來越好;
- 深度學(xué)習(xí)系統(tǒng)必須有一定的錯誤容忍能力,也就是說在運(yùn)行過程中,我們可以殺死任意多的訓(xùn)練節(jié)點,將機(jī)器騰出來保證其他的任務(wù)運(yùn)行。這里就涉及到一個問題,傳統(tǒng)上很多研究人員以為減少一個作業(yè)的運(yùn)行時間就是提升效率,而實際上真正的優(yōu)化目標(biāo)應(yīng)該是讓更多研究人員能并行工作,讓機(jī)群總是“累著” —— 這樣來提升團(tuán)隊和公司效率。
以上內(nèi)容希望能夠讓大家明白,PaddlePaddle為什么要做通用集群下的可伸縮訓(xùn)練。
PaddlePaddle的規(guī)劃和目標(biāo)
PaddlePaddle開源了以后,和作為百度內(nèi)部的一個項目有非常大的差別,我們從原來只追求高性能和功能,漸漸的要過渡到下圖所示的幾個目標(biāo)。我們所有的事情只有一個最重要的點,也就是中間的那個橘色的方塊,我們希望讓大家的業(yè)務(wù)變得awesome,變得非常炫,非常給力。我們評價PaddlePaddle“給力”的標(biāo)準(zhǔn)不是發(fā)了多少論文、被多少媒體提及,而是解決用戶痛點,讓用戶爽。
通用集群下的可伸縮PaddlePaddle只是我們目標(biāo)里的一部分,希望大家能夠持續(xù)關(guān)注PaddlePaddle的進(jìn)一步發(fā)展。
在這里我也想介紹一些我們其他的工作,比如說我們寫了一本深度學(xué)習(xí)實戰(zhàn)手冊,目前已經(jīng)寫完了八章,點擊鏈接前往:http://book.paddlepaddle.org/ 在這個手冊里,我們舉了八個例子,教大家深度學(xué)習(xí)應(yīng)該怎么入門和怎么在真實的場景中使用。
每一個例子都是精心設(shè)計過的,比如說其中的一章情感分類。所謂情感分類就是將一個文本分類成正向情感還是負(fù)向情感,實際上就是一個簡單的文本分類問題。單純套用文本分類的模型,我們可以去解決如下圖所列各種各樣的問題。
PaddlePaddle作為一個年輕的開源深度學(xué)習(xí)系統(tǒng),也面臨著非常多的挑戰(zhàn)。我們會以更加開放的心態(tài)來迎接所有的挑戰(zhàn)。PaddlePaddle作為一個開源軟件,所有的開發(fā),包括設(shè)計和討論全在Github進(jìn)行,目前已經(jīng)有不少百度之外的團(tuán)隊參與到開發(fā)中來了。其中有從事AI的公司,也有做分布式操作系統(tǒng)技術(shù)的公司。大家一起在Github上借review設(shè)計和提交代碼討論交流。
我們也希望可以看到更多的企業(yè)構(gòu)建出更多支持AI的通用集群,幫助越來越廣泛的企業(yè)將他們的業(yè)務(wù)變得更好,更awesome。同時PaddlePaddle作為源于百度企業(yè)里的深度學(xué)習(xí)框架,我們也會促進(jìn)開源盡量多的工業(yè)界成熟模型,來幫助更多其他企業(yè)來提升自己的業(yè)務(wù)。
鈦坦白群友互動:
1.請問人工智能公眾服務(wù)如何保障用戶的隱私和數(shù)據(jù)安全?
于洋:我其實也不是這方面的專家,我談一下自己的想法。就PaddlePaddle而言,我們的策略是提供一個能夠在私有云或者說在本地直接部署的PaddlePaddle,這樣用戶就不需要將敏感的數(shù)據(jù)傳遞給PaddlePaddle這個平臺。有一些論文給出的方案,是將深度學(xué)習(xí)訓(xùn)練直接部署在手機(jī)上,將增量訓(xùn)練好的模型上傳給服務(wù)器,這樣用戶的數(shù)據(jù)就不需要從手機(jī)去上傳到服務(wù)器,而是直接在手機(jī)上進(jìn)行訓(xùn)練優(yōu)化。
2.如何保障訓(xùn)練服務(wù)對并發(fā)任務(wù)的資源配置的公平性?
于洋:現(xiàn)在有一些開源的集群操作系統(tǒng),比如Kubernetes使用這些集群操作系統(tǒng),我們可以直接去調(diào)度CPU數(shù)和GPU數(shù),也就是計算資源的數(shù)量,這樣每個用戶都可以有自己的一個配額。當(dāng)用戶的配額超過了他應(yīng)該用的配額的時候,他的任務(wù)就只能等待,當(dāng)用戶的配額小于他實際上使用的配額,他就有可能會被調(diào)度,這些調(diào)度策略現(xiàn)在有非常成熟的開源平臺,都可以提供。
3.訓(xùn)練的硬件高投入在本地部署時有辦法解決嗎?
于洋:訓(xùn)練硬件的高投入我覺得還是有辦法解決的,解決的辦法就是我前面說的,將這個企業(yè)的大部分機(jī)器都放在一個特別大通用集群里,這個集群既可以跑深度學(xué)習(xí)的任務(wù),也可以跑其他的比如說web服務(wù)之類的東西。這樣深度學(xué)習(xí)的機(jī)器雖然說你買GPU很貴,但是他平時也可以被其他的任務(wù)所利用,不會完全浪費(fèi)。
4.配額靠經(jīng)濟(jì)杠桿在多用戶間協(xié)調(diào)嗎?有沒有定價策略,中小企業(yè)用得起嗎?
于洋:我記得亞馬遜的公有云,也就是AWS上面應(yīng)該是提供競價實例的,也就是說大家一塊去拍賣一個機(jī)器,誰出的價高誰就可以在這個時間段去用這個機(jī)器。這樣經(jīng)濟(jì)杠桿就起作用了。
(本文獨家首發(fā)鈦媒體,根據(jù)百度資深工程師、Paddle API重構(gòu)設(shè)計負(fù)責(zé)人于洋在鈦坦白上的分享整理)
………………………………
鈦坦白第33期,AI已來之機(jī)器學(xué)習(xí)2,今晚7點繼續(xù)!
地點:鈦坦白 | 人工智能(微信群)
報名聽課、交流:
鈦坦白目前有醫(yī)療健康、人工智能、文娛社交、VR/AR、區(qū)塊鏈、支付創(chuàng)新、體育、云計算、SaaS等九個專業(yè)群。
1、鈦媒體Pro專業(yè)版用戶,可以點擊鏈接http://www.chcmb.cn/pro,登錄賬號,在線免費(fèi)、任意選擇自己要進(jìn)入的群,按提示操作;
2、非鈦媒體Pro專業(yè)版用戶,可以添加微信號taitanbai0,在通過好友后,發(fā)99元紅包給小鈦,你將有權(quán)利從九個群中任選一個群進(jìn)入,長期聽課、交流。請告訴小鈦你要進(jìn)入哪一個群,然后等待小鈦拉你入群~
推薦鈦客、贊助、合作:
請與鈦坦白負(fù)責(zé)人佳音聯(lián)系,郵箱jiayinge@tmtpost.com






快報
根據(jù)《網(wǎng)絡(luò)安全法》實名制要求,請綁定手機(jī)號后發(fā)表評論