Spark是UC Berkeley AMPLab開源的通用并行計(jì)算框架。Spark基于內(nèi)存實(shí)現(xiàn)的分布式計(jì)算,擁有Hadoop所具有的優(yōu)點(diǎn);但不同于Hadoop,Spark Job的中間輸出和結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地應(yīng)用于需要迭代的Map-Reduce算法。
圖4 分布式模擬平臺(tái)總體架構(gòu)
如圖4所示,為了高效地進(jìn)行無(wú)人駕駛回放模擬,我們?cè)O(shè)計(jì)了基于Spark的分布式模擬平臺(tái)框架。我們使用Spark進(jìn)行資源的分配管理、數(shù)據(jù)的讀寫以及ROS的節(jié)點(diǎn)管理。在Spark Driver上,我們可以觸發(fā)不同的模擬應(yīng)用,比如基于LiDAR的定位、基于圖片的物體識(shí)別、車輛決策與控制等。Spark Driver會(huì)根據(jù)數(shù)據(jù)量與計(jì)算量等需求請(qǐng)求Spark worker資源。每個(gè)Spark worker首先會(huì)把Rosbag數(shù)據(jù)讀入內(nèi)存,然后通過(guò)pipe啟動(dòng)ROS Node進(jìn)程進(jìn)行計(jì)算。我們也可以使用JNI方式連接Spark worker以及ROS Node,但這將涉及對(duì)ROS的修改,使得整個(gè)系統(tǒng)難以維護(hù)與迭代。經(jīng)過(guò)權(quán)衡之后,我們最終選擇了pipe的設(shè)計(jì)方案。
在pipe的設(shè)計(jì)方案中,有兩個(gè)問(wèn)題需要解決:第一,Spark本身支持讀取文本數(shù)據(jù),但并不支持多媒體數(shù)據(jù)讀取,我們需要設(shè)計(jì)一個(gè)高效的二進(jìn)制文件讀取方法。第二,Rosbag的play功能如何從內(nèi)存中讀取緩存的數(shù)據(jù),record功能如何將數(shù)據(jù)緩存至內(nèi)存中。以下我們將討論這些設(shè)計(jì)。
二進(jìn)制文件流式管道處理
Spark操作數(shù)據(jù)的核心是彈性分布式數(shù)據(jù)集(RDD),它允許程序員以一種容錯(cuò)的方式在一個(gè)大型集群上執(zhí)行內(nèi)存計(jì)算。百度美國(guó)研發(fā)中心之前的一個(gè)工作就是在這一數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上引入了新的RDD來(lái)實(shí)現(xiàn)二進(jìn)制文件流式管道處理。其結(jié)構(gòu)如圖5所示(關(guān)于這個(gè)設(shè)計(jì)的細(xì)節(jié)請(qǐng)參考《程序員》2016年1月刊《基于Spark的百度圖搜變現(xiàn)系統(tǒng)架構(gòu)》)。
圖5 BinPiped RDD的總體設(shè)計(jì)和主要功能
在每一個(gè)Spark的worker上,worker根據(jù)Binpiped RDD的信息通過(guò)標(biāo)準(zhǔn)輸入流在內(nèi)存中將數(shù)據(jù)傳送給用戶程序,用戶程序處理完數(shù)據(jù)后通過(guò)標(biāo)準(zhǔn)輸出流在內(nèi)存中將數(shù)據(jù)傳回給Spark的worker。worker將數(shù)據(jù)匯集存儲(chǔ)到HDFS上。
Rosbag緩存數(shù)據(jù)讀取
在當(dāng)前使用場(chǎng)景下(如圖6),我們的輸入是一定量的Bag二進(jìn)制文件,以某種形式存儲(chǔ)在分布式文件系統(tǒng)上面,而用戶想要的輸出是所有這些Bag文件在每一個(gè)worker上回放信息進(jìn)入模擬器后經(jīng)過(guò)處理得到的數(shù)據(jù),顯然這一過(guò)程通過(guò)Rosbag的play和record功能最易實(shí)現(xiàn)。
圖6 模擬器在分布式平臺(tái)的運(yùn)作流程
圖7 MemoryChunkedFile設(shè)計(jì)
不過(guò)這一過(guò)程中還存在缺失的環(huán)節(jié),即Rosbag的play功能如何從內(nèi)存中讀取緩存的數(shù)據(jù),以及record功能如何將數(shù)據(jù)緩存至內(nèi)存中。為了實(shí)現(xiàn)這一功能,我們?yōu)樵瓉?lái)的Bag和ChunkedFile的兩層邏輯結(jié)構(gòu)增加了一個(gè)分支邏輯層。如圖7所示,MemoryChunkedFile類繼承于ChunkedFile類并且重寫了ChunkedFile所有的方法。MemoryChunkedFile在向下層讀寫文件時(shí)是向內(nèi)存讀寫數(shù)據(jù),而不是像ChunkedFile類一樣向硬盤讀寫數(shù)據(jù)。這樣做的一個(gè)好處就是worker通過(guò)標(biāo)準(zhǔn)輸入流傳給模擬器的數(shù)據(jù)不用經(jīng)過(guò)磁盤I/O讀寫就可以被直接讀入,經(jīng)過(guò)模擬器處理的數(shù)據(jù)也不用經(jīng)過(guò)磁盤I/O讀寫就可以由內(nèi)存直接傳回worker。這樣的讀寫模式極大地縮短了模擬器處理數(shù)據(jù)的時(shí)間。
通過(guò)這一邏輯層的添加,我們可以將模擬器部署到Spark集群內(nèi)的每一臺(tái)worker機(jī)器上。通過(guò)加載不同的配置文件使每臺(tái)機(jī)器運(yùn)行不同的模塊;也可以通過(guò)部署相同模塊不同模型的條件下運(yùn)行相同數(shù)據(jù),以比較模型的不同;還可以在相同模塊相同模型的條件下運(yùn)行不同數(shù)據(jù),比對(duì)不同數(shù)據(jù)的差異。由此可見(jiàn),分布式系統(tǒng)的使用為模擬器添加了無(wú)數(shù)擴(kuò)展的可能。
性能評(píng)估
在設(shè)計(jì)實(shí)現(xiàn)的同時(shí),我們對(duì)系統(tǒng)進(jìn)行了性能評(píng)估。隨著計(jì)算資源的增加,計(jì)算時(shí)間也在線性地降低,系統(tǒng)表現(xiàn)出很強(qiáng)的可擴(kuò)展性,可以承受很大的數(shù)據(jù)量與計(jì)算量。在一個(gè)圖像識(shí)別測(cè)試集中,使用單機(jī)處理圖像數(shù)據(jù)耗時(shí)為3個(gè)小時(shí),而使用8個(gè)Spark worker后,耗時(shí)僅25分鐘。假設(shè)我們使用10000個(gè)Spark worker對(duì)谷歌無(wú)人車級(jí)別的數(shù)據(jù)進(jìn)行大規(guī)模的圖像識(shí)別模擬測(cè)試,整個(gè)實(shí)驗(yàn)也可以在100小時(shí)內(nèi)完成。
結(jié)論
使用分布式系統(tǒng)能夠極大提升模擬器的工作能力,使無(wú)人駕駛系統(tǒng)的測(cè)試工作得以大規(guī)模有序地?cái)U(kuò)展開來(lái)。這一結(jié)果是建立在模擬器架構(gòu)模塊化,以及測(cè)試用例組合模塊化的基礎(chǔ)之上的。采用分布式系統(tǒng)搭建模擬平臺(tái),使得在真車上路之前測(cè)試無(wú)人駕駛汽車將要行駛的每一條道路成為現(xiàn)實(shí)。當(dāng)然無(wú)人駕駛汽車在真實(shí)道路上的測(cè)試依然必不可少,但是模擬器已經(jīng)為無(wú)人駕駛系統(tǒng)測(cè)試了海量的基礎(chǔ)情景,使我們可以以最低的成本最大限度地保障真車測(cè)試時(shí)的安全。
無(wú)人駕駛技術(shù)系列:
光學(xué)雷達(dá)(LiDAR)在無(wú)人駕駛技術(shù)中的應(yīng)用
基于ROS的無(wú)人駕駛系統(tǒng)
基于計(jì)算機(jī)視覺(jué)的無(wú)人駕駛感知系統(tǒng)
作者:劉少山,PerceptIn聯(lián)合創(chuàng)始人。加州大學(xué)歐文分校博士,研究方向包括智能感知計(jì)算、系統(tǒng)軟件、體系結(jié)構(gòu)與異構(gòu)計(jì)算。現(xiàn)在主要專注于SLAM技術(shù)及其在智能硬件上的實(shí)現(xiàn)與優(yōu)化。曾負(fù)責(zé)百度無(wú)人車系統(tǒng)架構(gòu)與產(chǎn)品化。
2025-09-04 21:58
2025-08-28 11:13
2025-08-27 14:14
2025-08-26 13:50
2025-08-23 20:37
2025-08-22 10:33
2025-08-18 14:20
2025-08-13 11:12
2025-08-13 10:55
2025-08-08 09:53