本次講座是清華大資料産業聯合會"技術•前沿"系列講座的第一講,主講人為英特爾(中國)研究院院長吳甘沙。回複“清華大資料”可獲得完整版ppt。
吳甘沙院長從大資料技術前沿的十個問題入手,對大資料産業進行了深度解析。講座分為三部分:
大資料的10個技術前沿(上)——資料,12月25日已發
大資料的10個技術前沿(中)——計算,本期
大資料的10個技術前沿(下)——分析,待續
演講正文:
第四,軟硬兼施。就是軟的硬的兩手抓。
首先,對大資料來說,一定要選擇更好的硬體架構。展現在:計算、存儲、互聯。在計算這一塊,首先要選擇的是大小核,brawny cores是大核,主要是至強伺服器晶片,wimpy cores是小核,主要是arm伺服器晶片。前幾年大小核争得很厲害,但最近随着某些arm伺服器晶片廠商破産,大家都比較明白了,對于絕大多數大資料應用,大核肯定優于小核。大家可以關注一下兩個人的論述,一個是urs holzle,谷歌基礎設施的一把手,另一個是james hamilton,亞馬遜aws的主要架構師。
第二,異構計算。首先是內建異構多核,英特爾有一類伺服器晶片,在一個晶片上同時內建了cpu和gpu,現在百度在研究利用這類晶片做深度學習的可能性。第二類是gpgpu,單獨的gpu的卡來做,比如大家都在用的深度學習架構caffe就有針對gpgpu的優化。類似的,英特爾也有xeon phi,也就是世界排名第一超級計算機天河2号中用的晶片。目前來說,gpgpu和phi都是插在pcie插槽上的加速器,它們的加速性能都受到pcie帶寬的限制。明年phi的新版本可以獨立啟動系統,是以pcie的限制就不存在了,這對gpgpu是一種優勢。另外,fpga是現在用的比較多的一種方法,美國自然科學基金會最近的一個報告說對于深度學習,fpga比gpgpu還更有效。還有一種是asip(applicationspecific instruction processor),比如說npu(neural processing unit),現在很多神經網絡的應用希望有專門的神經網絡的晶片來做。
第三,大資料跟高性能計算的典型差別是在于,大資料是一個資料密集型的,資料是存在記憶體裡面的。是以一個很重要的架構上的變化就是讓記憶體跟處理器能夠更加靠近。比如說利用edram,使得處理器跟記憶體之間有更大的緩存。或者把記憶體和處理器堆疊起來,獲得更大的帶寬。或者把處理器反過來放到記憶體裡面去,叫computingin memory。
在存儲互聯的架構選擇上,第一個是大記憶體的伺服器,現在已經是主流。現在大家去做大資料,你買的伺服器如果是小于一百gb的記憶體,基本上是不能用。甚至現在微軟的azure雲裡面,他提供的虛拟機,不是實體機,最高能夠帶400多個gb的記憶體。當然記憶體計算需要解決容錯的問題,比如spark的lineage,還有傳統的checkpoint,多資料備援,基于日志的容錯機制等。
對于存儲而言,ssd到pcie ssd到閃存存儲,這一路的發展需要重構系統的軟體棧。尤其是對于全閃存存儲,檔案系統可能不需要了,我可能直接讓應用操作在閃存裡面的資料。如果不是全閃存的存儲,要有智能資料的遷移,哪些資料放到閃存裡面,哪些資料放到硬碟。nvram是未來,因為資料不會丢失,是以像checkpointing這樣的技術就不需要了。另外,資料靜态儲存和動态使用的狀态統一了,是以不需要檔案,不需要序列化和反序列化,整個系統棧會更淺更簡單。
在互聯上,節點和節點之間的互聯已經到40gbps,未來100gbps甚至更高,現在最新的技術叫silicon photonics(矽光),可以輕松上到幾百個gbps,基于矽光也好,高速以太網也好,為了發揮記憶體計算的效用,需要更便宜、更高擴充性的rdma。
在選擇了硬體架構之後,軟體跟硬體架構需要做協同的優化。協同優化反映在幾個方面:
第一,針對硬體的特點,對軟體棧進行優化,這裡又有不同的做法。
首先,我們要把硬體暴露給軟體棧。大家現在玩hadoop、spark的話,都知道它們是跑在jvm上面的,你沒有辦法針對硬體的架構特征做優化。那你就需要通過一種方式來打破這個界限。比如英特爾嘗試的nativetask,把mapreduce裡面排序的那部分通過java native interface轉到原生代碼裡做,針對系統緩存架構做優化,mapreduce的總體系統提升了30-50%。spark最近創了terasort的世界紀錄,其中網絡通訊這塊也通過java native interface轉到原生的netty來做。還有,現在很多基于java的大資料計算庫,它都能夠利用底層非常優化的線性代數原生庫。
其次,重新設計軟體棧,像剛才說過的全閃存存儲和nvram。甚至硬碟現在也ip化、對象存儲化,傳統的軟體棧需要重新設計。
再者,一體機。我現在賣東西不是隻賣給你伺服器,或者隻賣給你軟體,而把軟體、硬體打包成一體機來賣。現在最有名的一體機就是hap的hana,這個一體機單英特爾就有十幾個工程師幫助他進行優化,比如它的b+樹是針對高速緩存優化的,它能用sse對資料進行流式的、線上的壓縮和解壓縮。
還有一個場景是雲化,hadoop在雲化,spark也有了databricks cloud,但一旦雲化了以後會帶來很多的問題,比如hadoop、hdfs他對于資料的本地性要求非常高,你一旦虛拟化了以後,資料在虛拟機中遷移,性能影響很大。是以vmware貢獻了hve,hadoop virtual extensions。雲化另外要解決的問題是資源管理,yarn是第一步,但還有很多的研究問題沒有解決。另外,把hadoop和spark置于docker中運作是目前的一個熱點。
所有這些都能夠幫助大資料的軟體站針對硬體來優化。
協同設計第二個大的方向是硬體可重構,尤其是英特爾現在推出的rack scale architecture,你能夠對一個機架進行重構,重構的基礎是資源的池化和disaggregation。我可能是一個抽屜的全部是計算子產品,一個抽屜全部是存儲子產品,一個抽屜是網絡,一個抽屜是記憶體。我把資源池化。通過非常高速的矽光進行互聯,可以把這些資源池重新進行劃分,把它配置成針對不同應用需求的虛拟的伺服器。這是一個非常重要的發展方向。在機架之上,是針對多資料中心的軟體定義基礎設施。
軟硬體架構協同優化的典型展現是大學習系統。它是機器學習算法與底層系統更好的配合。我這裡列出了比較有名的學習系統,vw,graphlab,distbelief,project adam,petuum。其中vw和projectadam跟微軟研究院相關(vw最早在雅虎研究院開始),graphlab和petuum是源自英特爾支援的cmu雲計算科研中心,distbelief是谷歌的,他們的特點都是把機器學習的算法和底層架構做更好的協同優化。除了distbelief,其他都有開源。
第五,多快好省。就是處理資料量多,更快,品質好,成本還省。
實作多快好省的方式,第一個是軟硬體的協同設計,剛才說了。
下面說一下記憶體計算,它不是在技術棧的某一層的技術,在硬體平台層,要大記憶體,全閃存,用最新的nvram、用rdma。
在資料管理和存儲層,要有記憶體資料庫,更好的記憶體緩存,要有堆外的記憶體,記憶體檔案系統。
在計算處理層,要用新的記憶體計算的平台如spark,或者在傳統的資料庫上面再堆一層記憶體計算的新層次,如in memory datagrids。
在資料分析和可視化層,你要重新設計資料結構。
這裡面舉了幾個例子,分析,現在大資料的問題中有很大一部分是圖問題,或者是複雜網絡問題,這裡面選了兩個:graphlab,一個是graphchi,graphchi把資料的結構進行了改變,使它能夠流處理,最後在一台機器上能夠達到十台、幾十台叢集能夠達到的性能。這就是重新設計資料結構帶來的好處。這個資料結構是不是能夠支援可改性,也是很重要的。現在新的趨勢就是線上的機器學習,就是你一邊訓練,一邊做識别。這個過程中涉及到核心模型資料結構的可改變性,graphchi就能夠支援圖結構的修改。另一個場景是可視化,nanocube在16gb記憶體上能夠對tb級的資料進行實時的處理,他采用了一種新的資料結構叫做in—memory data cube。所謂的原位(in-situ)分析和可視化,就是在記憶體原地進行分析和可視化,而無需做資料的轉化和移動。
另外一種實作多快好省的方式就是降低空間和時間的複雜度。
降低空間複雜度就是把大資料變小。變小的方式有很多,比如說壓縮(尤其是列式存儲),又如緩存和多溫度存儲,把最重要的大資料找出來放在記憶體和閃存裡面。又比如說采用稀疏的結構。亞馬遜在做商品推薦的時候,使用者以及他購買的商品矩陣是稀疏的,你通過稀疏的結構能夠把空間複雜度下降。把大資料變小太重要了,最近spark采取了一種shuffle機制的改變,從基于hash的變成了基于sort的,極大地降低了記憶體使用,無論是terasort的世界紀錄也好,還是在實際的應用場景,如大規模的廣告分析logistics regression,都非常有用。
另外一種是時間複雜度降低。比如,使用簡單的模型。在機器學習發展中有一度大家覺得複雜的模型更好。随着大資料時代的來臨,研究發現用簡單的模型就可以了,隻要你資料量足夠多。這裡面有一篇典型的文章,谷歌peternorvig他們寫的,大概意思是:資料有一種不可名狀的魔力,使得一個非常簡單的模型(用web文本處理為例是n-gram),大量的資料喂進去以後,針對機器翻譯就有了一個很大的質的提升。而這種簡單的模型往往它的計算複雜度是比較低的。
第二種是通過簡單模型的組合。模型組合(ensemble)是一個機器學習的專業領域。我不想說的特别專業,我隻給大家舉一個例子,netflix曾經舉辦過一個競賽,你隻要把我推薦有效性提升10%,我給你一百萬美金。很多團隊參加這個競賽,但是每個團隊都沒有達到10%,後來團隊與團隊之間進行組合,最後達到了10%,拿到了一百萬美金。ibmwatson事實上是一百多種模型的組合。如果每種模型是o(n2),它們的組合一定比一個o(n3)的複雜模型更快。
還有一種是采樣和近似,采樣是傳統統計方法,但在大資料裡面也有用武之地,比如blinkdb,隻要能夠容忍百分之幾的誤差,它在tb級資料上能夠實作秒級的延遲。近似也是類似,我用更簡單的資料結構來做一些精确度要求不是那麼高的判斷。比如說在網際網路中經常有一個計算叫uv。如果你用近似算法,複雜度一下子就能夠下來了。
還有一個是降維和混合模組化。資料在高維空間中、但資料點很稀疏,這也催生了一些降低複雜性的方法。比如混合模組化,把适用于小資料規模的帶參數模型與大資料規模的無參模型結合起來,先用後者在不同的低維空間模組化,再由前者把這些模型綜合起來,這種方法能夠有效地解決稀疏性和計算量的問題。還有一種方法是針對高維資料進行降維,然後再對其施以更快的通用算法。所有這些方法能降低降低學習的複雜性。
關于多快好省我最後要講的就是分布式和并行化。
典型的分布式優化是acid到base的變化。acid是傳統的資料庫裡面要獲得事務特性必須得做的。但是這個成本非常高。大家就改成了base,他隻要最終是一緻的。這也是蠻有意思的。acid在英文裡面是酸的意思,base英文裡面是堿的意思,後者實作了并行的可能。
對于疊代計算,有兩種方法,jacobi方法和gauss-seidel方法。對于gauss-seidel方法,目前疊代可以使用最新的資料,是以收斂一般會快,但需要異步通信,實作複雜。對于jacobi方法,目前疊代一定是基于上一個疊代的資料,問題是,一旦分布式了以後,上一個疊代的資料是分布在很多不同的節點上。如果說你要完全的獲得新的資料的話,你就需要等待所有的節點算完,把這些新的資料拿過來。這是不利于分布式的優化的。因為很多機器學習算法能夠容忍模糊性,他能夠基于目前節點上過時的資料(而不是要等其他節點最新的資料)進行計算,打破疊代之間資料的依賴。這樣使很多節點并行計算,最終他還是能夠收斂。這裡,谷歌采用了參數伺服器的方式,cmu既有參數伺服器,也有更通用的ssp,stale synchronous parallel。
機器學習都會碰到幾種并行,首先是資料并行,更複雜的是圖并行,或者是模型的并行。模型的并行需要基于模型或圖的機構做相應的資料劃分、任務排程,原來比較火的是graphlab,最近比較火的是petuum,都是源自cmu。
總體來說,并行化和分布式的重點就是減少通訊,大家做系統,一定會碰到這些問題,一旦把一個系統分布式化,你要解決緩存的問題、一緻性的問題、本地性的問題,劃分的問題、排程的問題,同步的問題,同步有bsp的全同步,graphlab的異步,或ssp的半同步。在狀态更新時,可以批量進行更新,或者個别進行更新的問題。通訊是可以傳輸全部資料,也可以隻傳輸改變的資料。有一個教授叫ionstoica,他有一篇論文,關于bit torrent,也就是現在大家下載下傳電影常用的一個協定,他就是傳輸變量,在spark中得到使用。
第六,天下三分。
在最早的時候,人們都希望能夠用一套架構把所有的問題處理。後面michael stonebraker提出我針對不同的計算需求提供不同的引擎,效果更好。是以,出現了資料和計算的分野。
現在主流的資料類型有幾種:第一,表,或者是kv。第二種是數組或者是矩陣。第三種是圖。他們可以用不同的計算範式處理。表格最适合的是關系的函數。數組和矩陣是以線性代數為代表的複雜的分析。圖是需要圖計算。
同樣,我對計算範式也做了分類。
首先把大的計算範式分成了計算圖和圖計算。對于計算圖,圖上每一個節點是一個計算。先完成這個計算,再通過不同的邊到下一個階段的計算。它隻有資料依賴,沒有計算依賴。而圖計算,圖上的每一個節點是資料,邊代表他們之間計算的依賴。
在計算圖裡面又分成兩類,一類叫做批量的計算,他的典型特征是資料量太大了,資料不動,計算扔過來算。另一類是流式計算,是計算不動,資料恒動,計算分到每一個節點上,源源不斷的資料流經這些節點,進行計算。
批量計算裡面又分幾類,一類是mapreduce,二階段,bsp(比如pregel)是三階段,還有dag(有向無環圖)和多疊代計算,比如spark、tez。
流式計算裡面也有不同類型,比如一次處理一個記錄(record-at-a-time)還是mini-batch,storm是前者,sparkstreaming是後者。不同的流式計算在容錯上有不同實作,尤其是時鐘語義和投遞保證上。關于投遞保證,假設我是一封信的話,最高的保證是一定能夠到達接受者有且隻有一次,而較低的保證是至少到達一次。另外,流式計算可以是做簡單計算,比如基于時間窗的統計,或更複雜的流式線上學習。
程式設計模型這一塊,有資料并行,有流式計算的任務并行,還有圖并行。現在往往要求圖結構支援關系操作,比如跟一張表來join,這是現在很多圖計算程式設計模型新加入的。還有,最新出來一種機率程式設計模型,針對機率圖的機器學習是更好的程式設計模型。
在大資料領域最近也在推事件驅動程式設計模型。一個非常火的範式叫reactive範式。最早在erlang裡,叫actor模式,現在在scala akka語言裡面,有更好的實作,他在針對異步的處理邏輯的時候,有更好的可擴充性。
第七,融合。既然分了,就有合。
融合一直在發生。big dawg是英特爾在mit最近支援的研究工作。他提出了普适的程式設計模型,一種叫做bql的語言,他支援關系和線性代數、複雜資料模型、疊代計算、并行計算。
twitter summingbird是在程式設計接口層面融合,同時支援批量(mapreduce, spark)和流式(storm)的。
lambda架構則是在應用架構層面的融合,把實時和批量結合起來,兩者之間加入增量計算,同時批量那邊加入緩存。
spark則是在實作架構層面的融合。
最後微軟的reef則是通過資源管理層,如yarn,來實作多計算模型的融合。
我拿spark做為一個案例,它的bdas軟體棧底層是hdfs加上tachyon記憶體檔案系統,接着是spark記憶體計算架構加上velox的模型管理。在上面支援各種不同的計算範式,如spark streaming的流計算,sparksql的互動查詢,graphx的圖計算,mllib的機器學習等。由于sparksql的核心資料結構schemardd起到基礎性的作用,其他幾個計算範式可能會建築在sparksql之上。
有了這個bdas以後,大家可以想像處理不同場景,比如說流查詢,我把spark stremaing的流式和sparksql代表的資料倉庫整合在一起;實時加上批量,sparkstreaming是實時,spark本身是批量,實時加上曆史資料分析獲得全時洞察;spark streaming的流處理加上mllib的機器學習,實作線上學習。又比如說圖流水線,傳統上先要對圖資料進行處理,進行etl,中間進行圖計算,最後後處理。傳統的圖計算引起隻能做中間這部分,前後還得靠mapreduce去做。而在spark之上,可以一條流水線做完。最後,sparksql和mllib可以有機結合,把互動分析和機器學習揉在一起。
在其他方面,融合也在發生:
比如資料管理和資料分析的融合,在傳統的資料庫中,有兩類處理:一類叫做oltp,做資料管理,一類叫做olap,做資料分析。兩者基于不同的資料格式,之間需要etl。現在的趨勢是兩者融合,在一套資料上計算。
mpp和hadoop各有優勢,現在也在融合。
就連高性能計算或超算也在跟大資料融合,前者原來是計算密集的,以模拟為核心的,現在也有很多資料密集的應用,重心也從模拟轉移到資料分析,出現了high performance data analysis和data intensivesupercomputing等新的子領域。
原文釋出時間為:2014-12-30
本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号