以下為演講全文:我們管的是我們的科研生產(chǎn)雙重的集群,300臺服務(wù)器,里面有各種不同的機(jī)器,兩用的服務(wù)器,也有開放計算項目,還有各種軟件,包括各種開源軟件,我們搭建了一個平臺,這個平臺上有100多個真實用戶,每天都在跑各種任務(wù),絕大多數(shù)任務(wù)都跟大數(shù)據(jù)和人工智能相關(guān),白天這個機(jī)器有兩個管理員,晚上就是我,為什么晚上是我?因為學(xué)校不付教授加班工資,所以別人下班了就由我管。
我們跑的應(yīng)用是什么?這是我們自己做的一些科研項目,比如這里是一些視頻,旁邊的字是自動生成的,叫做視頻自動加字幕。還有一個是醫(yī)療方面的,自動判讀胸部CT,到底哪里有結(jié)節(jié)都可以讀出來,都是智能的應(yīng)用。這些應(yīng)用和傳統(tǒng)企業(yè)IT不一樣,需求每天變,要的都是不一樣的架構(gòu)和計算能力,所以我們需要不斷調(diào)整系統(tǒng)。我今天講的核心問題是,我們有最智能的應(yīng)用,但是這些智能的應(yīng)用是跑在最“傻”的數(shù)據(jù)中心基礎(chǔ)架構(gòu)上。什么領(lǐng)域用大數(shù)據(jù)用的最差的?就是我們自己的領(lǐng)域,就是云計算管理的領(lǐng)域。為什么這么說?現(xiàn)在我們還在做云計算自動化,它是什么?就是基于規(guī)則的專家系統(tǒng),這個專家系統(tǒng)80年代就說過,到現(xiàn)在再說,我就不用在這里講了。但是市面上號稱很先進(jìn)的例如ANSIBLE,就是一些規(guī)則。還有Openstack云計算系統(tǒng),很流行,包含了一千萬行代碼。這些代碼都是什么?它們告訴你如果發(fā)生了什么事,我需要干什么。這個叫做基于規(guī)則的系統(tǒng),不是智能。為什么?我們需要太多的規(guī)則了。我們究竟需要多少規(guī)則呢?這張圖是我最喜歡的,我拿它解釋什么叫做復(fù)雜,看這里有多少組件?再看這個小圈里是什么?進(jìn)去看這里面是這樣的,里面還有多少組件,這么復(fù)雜的系統(tǒng),你就靠一些規(guī)則,你就慢慢寫吧,所以難怪寫那么多代碼跑起來還是有很多BUG。所以,我今天要講的主題就是說怎么利用大數(shù)據(jù)和人工智能讓云計算變得更智能,能夠讓大數(shù)據(jù)和人工智能幫上我們系統(tǒng)管理員自己,而不是我們只是幫助大數(shù)據(jù)和人工智能。
我是一個做技術(shù)的人,下邊開始講很技術(shù)的內(nèi)容。從大的方向上看,我認(rèn)為把一個全是用規(guī)則執(zhí)行的基礎(chǔ)架構(gòu),變成一個智能的架構(gòu),我們需要以下這幾個步驟和方法:第一我們要看到系統(tǒng)里發(fā)生了什么,如果看不見就沒辦法讓它智能。第二看到了這些信息之后,要把它們整理出來,整理成人和機(jī)器能懂的信息。再往下如果要能利用這些信息,硬件架構(gòu)必須是可以用軟件定義和控制的。然后你這種控制還需要還要提升可靠性和準(zhǔn)確性,才能讓大家放心。再往后我們還做不到,但是我們正在朝著這個方向努力,就是怎么樣讓機(jī)器自主學(xué)習(xí)不同的事情應(yīng)該怎么做。當(dāng)然,這個事到這里就組夠了,再往前了機(jī)器就會覺得,我都學(xué)會了要人干什么,然后終結(jié)者就出現(xiàn)了。。。
其實這里面每走一步都面臨很大的挑戰(zhàn),這也是為什么IT系統(tǒng)的智能化前進(jìn)的比較慢,我們需要看到的是大量非結(jié)構(gòu)化的資源,我們有多個層次的抽象。最關(guān)鍵系統(tǒng)沒有模型,為什么飛機(jī)可以飛,一開始它就有個空氣動力學(xué)的模型。但是系統(tǒng)沒有模型沒有架構(gòu),是大家打補(bǔ)丁打出來的。而且很多系統(tǒng)是非常靈活的,有很多隨機(jī)行為,這種情況下怎么讓它變得更智能?所以今天舉幾個例子,就是我們做的一些科研和已經(jīng)部署的項目,希望給大家一些思路,怎么樣讓系統(tǒng)變得更加智能。首先是采集和處理數(shù)據(jù)中心的大數(shù)據(jù),我們要采集的全面、靈活、可靠、方便,且可以看到系統(tǒng)里很多的內(nèi)部信息,我非常贊賞(上邊)這句話30年之后,谷歌的工程師仍然說“仔細(xì)思考和打印語句讓我們走到了現(xiàn)在”。打印出來的日志很有意思,它不是結(jié)構(gòu)化的,像自然語言,看著就是一大堆字。這些字怎么看?不知道,大家要想辦法把它變得結(jié)構(gòu)化一點,所以有很多結(jié)構(gòu)化收集數(shù)據(jù)的嘗試,但是這些嘗試因為有太多局限性,所以不會特別成功,所以文本日志還是很重要的。一個重要的觀點是,我們認(rèn)為這種日志,也就是計算機(jī)跟你說話,都不是自然語言。計算機(jī)為什么說這些話?是因為有人寫了程序讓它說的。
所以我們可以做這樣一個事情,就是通過分析程序的源代碼,來結(jié)構(gòu)化日志的文本。例如提取出日志中的結(jié)構(gòu)化變量來。分析出了日志中的結(jié)構(gòu)信息就好辦了,可以用各種機(jī)器學(xué)習(xí)方法來處理這些文本。處理大量的文本不是問題,我們是做大數(shù)據(jù)的,每天處理幾十億行的文本日志毫無壓力,通過處理這些海量數(shù)據(jù),能分析出機(jī)器里到底哪里出了問題.但是采集這么多數(shù)據(jù)是很貴的,其實你用不到這么多數(shù)據(jù),你只要數(shù)據(jù)里邊能反映問題的那一點點。怎么才能降低采集日志文件的成本?首先我們看看這件事為什么很貴?因為你得先把程序的東西變成一個文本,你再把這個文本用文本或者其他的方式展示給人看。如果用機(jī)器處理,你需要把信息變成文本再變回結(jié)構(gòu)化數(shù)據(jù),再審讀這些文件。為了節(jié)約存儲,你還要壓縮,這些處理都是成本,所以大家不愿意采集非常詳細(xì)的日志,但是不采集詳細(xì)的日志系統(tǒng)出了事就麻煩了。其實節(jié)約日志采集成本也很簡單,日志這些都不是為了給人看的,日志是為了能讓機(jī)器處理它,讓機(jī)器自己變得更智能?;谶@個考慮,我們雖然打的還是一個非結(jié)構(gòu)化的日志,但是我們可以把這些日志存成非常小的二進(jìn)制的表示,等展示的時候,再重新把它轉(zhuǎn)化為人類可讀的文本。如果是機(jī)器處理我們就不轉(zhuǎn)化了。通過這個改進(jìn),通過這個改造,可以把打印一行日志的開銷,從3微秒降低到200納秒。為什么這個事情重要?,因為一個程序一秒鐘要打印數(shù)千行日志,這些資源節(jié)省積累起來是相當(dāng)可觀的。這個改進(jìn)還不夠。你根本不應(yīng)該采取很多沒意義的數(shù)據(jù)。當(dāng)然,你不采你怎么知道它沒有意義?;跈C(jī)器學(xué)習(xí)算法,我可以提前告訴系統(tǒng)哪些日志是沒有用的,可以盡早扔掉,用來節(jié)省更多的計算、存儲和網(wǎng)絡(luò)資源。
我們學(xué)到了什么?首先,系統(tǒng)監(jiān)控一定要做,如果覺得它太貴,我們可以詳細(xì)優(yōu)化每一個細(xì)節(jié),是不是做了壓縮,是不是做了所有可能的事情,來減少數(shù)據(jù)采集的開銷。第二系統(tǒng)監(jiān)控數(shù)據(jù),系統(tǒng)跟你說的話不是自然語言,這些語言不是給你分析的,而是給機(jī)器分析的,因此機(jī)器應(yīng)該分析得比人準(zhǔn)。一個系統(tǒng),我們采集了數(shù)據(jù),這個數(shù)據(jù)怎么展示,怎么變成你要的知識?這個可愛的動物叫小白。我們通常管一些非技術(shù)用戶叫小白用戶,他如果碰到了問題,就會叫,例如會說“我網(wǎng)絡(luò)不通了”,為啥不通了?他描述不出來。再來說什么叫專業(yè),你找到專業(yè)網(wǎng)絡(luò)工程師,他能想出來無數(shù)個問題讓你去查,當(dāng)然怎么查有時候你還是不知道。為什么它至腦子里跟我們想的不一樣,能想到這些問題?這是因為他記住的是這些復(fù)雜的事情。這些東西他能教給我么?因為我不是天天干這件事的,我不可能記住這些。所以系統(tǒng)運維的知識很難傳授。
當(dāng)然,系統(tǒng)知識很難傳授對于IT咨詢行業(yè)很好,能一直保持生意,但是對其他來說是很搞笑的事。對于這種狀況,我們能做什么?我們可以通過最最基本的規(guī)則和信息,就是大家都知道這個系統(tǒng)里有的信息,例如系統(tǒng)里有數(shù)據(jù)庫信息,有一些可以列出來的狀態(tài),還有些包括日志之類的事件信息,通過這些信息,我們可以發(fā)現(xiàn)系統(tǒng)里存在哪些實體組件,以及最重要的是,這些組件之間的關(guān)系是什么?誰使用了誰,誰發(fā)生在誰之前,通過這些我們可以知道系統(tǒng)組件在時間和空間上的關(guān)系。再進(jìn)一步看這些關(guān)系,都是系統(tǒng)里最重要的東西。比如我硬盤壞了,哪一臺系統(tǒng)機(jī)會掛掉,這件事要用傳統(tǒng)方法解決,至少需要20條左右的命令,而且運行在不同的機(jī)器。這些命令都是知識,一般人不知道的。而采用我們的方法,我們能夠把這些零散的信息整理成一個知識網(wǎng)絡(luò),這種知識不需要額外的信息,只需要用一些基本的操作(比如圖的遍歷),就能查詢了。當(dāng)然這種數(shù)據(jù)很大,我們120多臺機(jī)器,運行了三天多種狀態(tài)達(dá)到460萬個,每個狀態(tài)和每個狀態(tài)都有關(guān)系,這些關(guān)系你怎么刨出來。我們是做大數(shù)據(jù)處理系統(tǒng)的,這些數(shù)據(jù)對我們來說很小,所以我們能夠主動檢測出系統(tǒng)有什么問題。這樣我們用機(jī)器的計算,代替了人類的智能。
剛剛說了“看”的問題,假定我可以看到系統(tǒng)有什么問題,有什么優(yōu)化的,下面我們看看,我們怎么能影響這個系統(tǒng),讓它運行得更好?一個必經(jīng)之路是,增強(qiáng)系統(tǒng)對于軟件定義的支持會讓大家覺得軟件是軟的東西,但是硬件的東西不變,所以我們定義不了它。這不對,這種狀況在改變,越來越多的硬件在支持軟件定義。下邊我們講一個網(wǎng)絡(luò)的例子。數(shù)據(jù)中心一個最大的問題是長尾延遲,數(shù)據(jù)中心網(wǎng)絡(luò)大多數(shù)時候都很快。然而一個好的IT系統(tǒng)關(guān)心的是,有沒有千份之一的請求是非常慢的。為什么關(guān)心這個?因為如果你一秒鐘有一百萬個用戶訪問,千份之一就意味著每一秒鐘有一個用戶覺得難以忍受。這個是不行的。然而為什么會有這種延遲?因為網(wǎng)絡(luò)游擁塞,不是持續(xù)擁塞,是偶然碰一下就擁塞了。怎么解決擁塞呢?繞著走是一個途徑,然而,有時候你繞不過去的,就像北京的交通,你往哪兒繞呢?如果城市的路網(wǎng)是這樣的,就非常容易做了。在不擁塞的情況下,大家都高興。現(xiàn)在,這條路太擁塞了,如果路網(wǎng)是可以變的,叫做逢山開路、遇水搭橋,我們有很多路,如果哪里擁塞就把這些活動的路搭到哪里去,這樣就不會擁塞了。當(dāng)然在物理世界里這是不可能的,但是在IT上是可以的,通過這種可變光網(wǎng)絡(luò)技術(shù),哪一條鏈路擁塞就把額外的帶寬加到這個鏈路上去。
這里是我們設(shè)計的物理層可控的數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)。通過對不同波長的光的控制,我們可以動態(tài)改變每條物理鏈路上的帶寬。我們搭建了這個12機(jī)架,180節(jié)點的實驗平臺。現(xiàn)在我們在物理網(wǎng)絡(luò)上有一個非常靈活的可以軟件定義的方式,但是這種東西怎么用好?第一,我們需要實時監(jiān)控,如何看到現(xiàn)在流量到底是什么樣的?如何預(yù)測下一步的流量是什么樣的?第二,你既可以選擇繞路,也可以選擇搭一條路,如果一邊繞一邊搭路,怎么保證最后得到的結(jié)果是完美的結(jié)果,是一個非常有意思的問題,在這方面我們做了很多的工作。我們能達(dá)到的效果是,很多情況下可以把長尾延遲降低近80%。這個軟件定義是可以影響硬件的,未來的硬件將是可定制化的,有了這種軟件定義的靈活性,我們就又離智能運維的系統(tǒng)更近了一步。
當(dāng)然,很多基礎(chǔ)架構(gòu)還沒有靈活的軟件定義,那么在一個傻的設(shè)施上,我們還能不能做一些精確的控制,或者至少加入一些影響,讓它變得更智能呢?我舉一個例子,比網(wǎng)絡(luò)更加基礎(chǔ)的基礎(chǔ)設(shè)施就是供電。數(shù)據(jù)中心供電容量非常貴,你說要建一個10兆瓦的數(shù)據(jù)中心就要找10兆瓦的電容量來。百度有那么多計算需求,本來想放更多機(jī)器進(jìn)到數(shù)據(jù)中心,但是它的數(shù)據(jù)中心平均功率利用率也就是72%就滿了,不敢再放了,浪費了很多錢。為什么?因為供電在時間和空間上都是不均勻,會防止某一個時間段或者某一個閘下面造成跳閘,IT人員做事很保守,就不敢放了。當(dāng)然你仔細(xì)想,會發(fā)現(xiàn),其實我別處還有電可用,我可以用別處的電。比如下面這一組機(jī)器,我感覺它們電容量快滿了,我就說不要再往里面放任務(wù),而上邊的機(jī)器還有電容量,就可以再多放任務(wù)進(jìn)去。智能供電的挑戰(zhàn),一個是調(diào)度器的接口限制太大,例如我連我放的任務(wù)是什么都不知道。我不知道調(diào)度器還要用這個機(jī)器干什么,還要要用多少電。另外一個困難是,在生產(chǎn)系統(tǒng)上沒有辦法做系統(tǒng)模型。這種情況下,我們還能不能做任何的智能控制?我認(rèn)為也是能的,只要把問題想清楚,可以用非常近似的模型,并且通過持續(xù)的反饋控制來補(bǔ)償誤差。
我們可以達(dá)到的結(jié)果是,它在用電量比較低的時候沒有控制,用電量比較高的時候會開始準(zhǔn)確的控制,如果有控制的話,你看這條綠線是不會跳閘的。藍(lán)線是沒有控制的,它時不時會超過了橙色的閾值線,那時候就會跳閘。是否有用?我們可以在同一個數(shù)據(jù)中心里,多放17%服務(wù)器增加15%吞吐量,不影響供電安全,不影響業(yè)務(wù)性能。大大節(jié)約了成本。學(xué)到了什么?我們可以容忍有限的接口,不準(zhǔn)確的控制要比什么都沒有好。雖然接口上是不準(zhǔn)確的,我們可以通過反饋控制來提升控制結(jié)果的的可靠性和精度。上面是我們在數(shù)據(jù)中心里做一些探索。采集和處理數(shù)據(jù)中心的大數(shù)據(jù),從大數(shù)據(jù)中發(fā)掘關(guān)于系統(tǒng)的知識,增強(qiáng)基礎(chǔ)設(shè)施的靈活性,增加操作的可靠性和精度。這些都是讓數(shù)據(jù)中心更加智能的基礎(chǔ)?;氐轿覀冎暗膯栴},我們到底離真正的智能系統(tǒng)還有多遠(yuǎn)?我認(rèn)為有了這些基礎(chǔ),下一步是通過加強(qiáng)學(xué)習(xí)和深度學(xué)習(xí)等方法,讓系統(tǒng)學(xué)習(xí)如何自動處理各種事件。這也是我們正在探索的方向。鑒于目前系統(tǒng)方面和人工智能方面都已經(jīng)有了長足的發(fā)展,我們相信在不久的將來,我們會看到真正的智能數(shù)據(jù)中心基礎(chǔ)架構(gòu)。