李茜萌,陳春雨,何恒翔
哈爾濱工程大學(xué) 信息與通信工程學(xué)院,黑龍江 哈爾濱 150000
近年來,以ARM 陣營為代表的嵌入式計算平臺的性能高速增長帶來了嵌入式產(chǎn)業(yè)的繁榮,ARM 芯片開始進入越來越多的平臺,如無人機、平板、智能機器人。ARM 芯片內(nèi)部集成了CPU、GPU、ISP 等模塊,部分芯片內(nèi)甚至集成了通訊基帶,這種系統(tǒng)級芯片(system-on-a-chip,Soc)的封裝特點在于大大簡化了嵌入式設(shè)備的硬件研發(fā)難度的同時,為嵌入式平臺帶來了強大的圖像、音頻及其他傳感器數(shù)據(jù)獲取的能力[1]。在具備了可靠的數(shù)據(jù)高速獲取能力之后,如何更加高速可靠地處理這些數(shù)據(jù)則對平臺性能提出了更高的要求。當(dāng)前,人工智能技術(shù)的第三次繁榮,其在計算機視覺(computer vision,CV)、自然語言處理(natural language processing,NLP)等領(lǐng)域取得了比傳統(tǒng)算法更加優(yōu)良的效果,部分領(lǐng)域甚至實現(xiàn)了大幅度的超越。但是深度學(xué)習(xí)技術(shù)對于計算力的需求極高,很多網(wǎng)絡(luò)需要高性能的GPU 或者TPU 才能運行,無法直接將其移植至嵌入式端[2]。本系統(tǒng)利用現(xiàn)代社會已經(jīng)實現(xiàn)完善部署的Wi-Fi 網(wǎng)絡(luò)及蜂窩網(wǎng)絡(luò),將嵌入式設(shè)備需要計算的圖像數(shù)據(jù)傳送至云端,云端通過部署的服務(wù)器、工作站集群進行高速計算并返回結(jié)果,充分利用了嵌入式設(shè)備體積小巧、適合部署于前端的特性,以及云計算高性能、高可靠、存儲容量大的特性,實現(xiàn)了成本及性能的最優(yōu)化配置,對多種現(xiàn)代流行的AI 框架都能很好的兼容。大量嵌入式設(shè)備的同時接入,對系統(tǒng)的計算能力也提出了巨大的挑戰(zhàn),本文將探究一種能夠解決以上矛盾的可彈性部署的分布式AI 計算架構(gòu)系統(tǒng)。
在傳統(tǒng)方法中,為了讓嵌入式設(shè)備采集到的數(shù)據(jù)能被高速處理,多采用有線連接的模式在其附近部署一套工作站。這種方式雖然初步實現(xiàn)了深度學(xué)習(xí)計算的功能,但是其能耗高、發(fā)熱量大,在部分工業(yè)生產(chǎn)環(huán)境中是不被允許的,特別是部分現(xiàn)場潮濕、多塵、電壓不穩(wěn)的情況,這些不利因素直接導(dǎo)致了工作站不能穩(wěn)定工作。并且因為數(shù)據(jù)并非時刻需要計算,那么這種方案也將導(dǎo)致計算資源長時間處于閑置狀態(tài),是一種極大的成本和資源的浪費。本文結(jié)合分布式設(shè)計思路[3-5],提出了一種框架,將計算平臺部署于云端,工作站集群部署于環(huán)境適宜的機房內(nèi),為設(shè)備長時間高負荷運行提供了有效保障[6]。分布式計算、彈性部署的特點能為大量嵌入式設(shè)備的計算需求提供有效的計算性能保障,同時也減少了計算資源的限制和浪費。與單純利用嵌入式設(shè)備進行計算對比,本方案具有極大的性能優(yōu)勢,以Mask RCNN[7]網(wǎng)絡(luò)為例,相較在樹莓派4 平臺直接運行,速度提升幾十倍。
本系統(tǒng)由中央服務(wù)器、集群服務(wù)器、GPU 工作站集群、嵌入式端4 部分組成。中央處理器是整個網(wǎng)絡(luò)的核心節(jié)點,負責(zé)綜合調(diào)度各個設(shè)備進行工作,接收到嵌入式端的請求后會為其分配當(dāng)前最空閑的計算集群的連接方式;然后嵌入式設(shè)備連接集群服務(wù)器后開始傳送數(shù)據(jù),集群服務(wù)器會進一步將數(shù)據(jù)轉(zhuǎn)發(fā)給集群內(nèi)運行對應(yīng)模型,且最為空閑的GPU 工作站進行計算并接收計算結(jié)果;最后將結(jié)果回傳給嵌入式終端,如圖1 所示。
圖1 系統(tǒng)架構(gòu)
中央服務(wù)器在整個系統(tǒng)中擔(dān)當(dāng)?shù)氖呛诵恼{(diào)度的工作,其對設(shè)備的穩(wěn)定性要求極高[8],故采用了阿里云服務(wù)器作為中央服務(wù)器的硬件載體。云服務(wù)器具有安全、可靠、穩(wěn)定及可彈性增加容量等特點[9]。本系統(tǒng)中的云服務(wù)器配置為單核Xeon處理器,主頻2.4 GHz,2 GB 內(nèi)存,40 GB 硬盤,1 Mb固定IP 帶寬,操作系統(tǒng)為Windows Server 2013。
為了實現(xiàn)多地分布式部署,一個系統(tǒng)中允許存在多個計算工作站集群,每個集群中都有一臺專門的服務(wù)器作為集群服務(wù)器,由其與中央服務(wù)器以及嵌入式設(shè)備進行通信,然后再轉(zhuǎn)發(fā)給與它連接的各臺GPU 工作站。集群服務(wù)器需要運行大量的通信進程以及調(diào)度進程,同時需要保存大量原始數(shù)據(jù)和計算結(jié)果,故對CPU 核心數(shù)量、內(nèi)存容量以及存儲空間要求較高,本系統(tǒng)中集群服務(wù)器使用了一臺搭載i7-8700k 處理器、64 GB DDR4 內(nèi)存、1 TB 固態(tài)硬盤、12 TB 機械硬盤的工作站,并為其開通了50 Mb 帶寬的固定IP,操作系統(tǒng)為Ubuntu 18.04。
一個集群內(nèi)部會部署多臺GPU 工作站,GPU 作為AI 計算的實際主體,為了盡可能多部署GPU,每臺GPU 工作站內(nèi)部都擁有多塊顯卡[10]。本系統(tǒng)采用的GPU 工作站配置為:i9-10900k 處理器、128 GB DDR4 內(nèi)存、4 塊2080Ti 顯卡、2 TB 固態(tài)硬盤、12 TB 機械硬盤,操作系統(tǒng)為Ubuntu 18.04。深度學(xué)習(xí)框架支持主流的Tensorflow、Keras、Pytorch、Caffe 等[11]。
嵌入式端采用最新推出的樹莓派4B 作為主控板,其搭載了1.5 GHz 四核A72 核心CPU,500 MHz的GPU,2 GB DDR4 內(nèi)存,802.11ac 無線網(wǎng)卡,千兆有線網(wǎng)卡,USB3.0 接口。四核心的高性能ARM核心搭配大容量的內(nèi)存,使其能運用多線程技術(shù)來很好地支持?jǐn)?shù)據(jù)采集工作,千兆網(wǎng)口和802.11ac無線網(wǎng)卡的配備使其能很方便地接入有線網(wǎng)絡(luò)或Wi-Fi 網(wǎng)絡(luò)。再結(jié)合小巧的體積和低功耗、低發(fā)熱設(shè)計,完善的操作系統(tǒng)適配,使其極其適合作為本系統(tǒng)的嵌入式端核心板,操作系統(tǒng)采用其官方系統(tǒng)(基于Debian 開發(fā))。
本系統(tǒng)是一套面向?qū)嶋H應(yīng)用的可彈性部署的分布式AI 計算系統(tǒng),當(dāng)前整套系統(tǒng)跨越了Windows、Ubuntu、Debian 這3 個操作系統(tǒng),且未來很可能會移植代碼至不同的操作系統(tǒng)進行運行。為了實現(xiàn)代碼能方便地進行跨系統(tǒng)開發(fā),我們選定了C++作為主要開發(fā)語言,并且采用Boost 這個實際意義上的C++標(biāo)準(zhǔn)庫來實現(xiàn)代碼與操作系統(tǒng)無關(guān)的特性。同時,在深度學(xué)習(xí)模型中,調(diào)用部分采用Python 編寫,采用C++調(diào)用Python 的方法將兩者融合。C++和Python 這2 種語言都具有很好的跨平臺適配能力,C++擁有極高的運行速度,多用于系統(tǒng)、平臺框架開發(fā);Python 具有開發(fā)方便、工具包眾多等優(yōu)點,在人工智能等領(lǐng)域被廣泛采用。C++與Python 的混合開發(fā),使整個系統(tǒng)兼具運行速度快和開發(fā)方便的優(yōu)點。
在通訊程序部分,本系統(tǒng)采用了Boost.Asio作為通訊框架,以TCP 為通信協(xié)議。本項目需要傳送大量文件數(shù)據(jù),TCP 相比UDP 擁有更好的可靠性,能很好地支持系統(tǒng)工作。通訊模式采用異步非阻塞模式,以實現(xiàn)在盡可能少占用資源的情況下進行大量設(shè)備的連接和數(shù)據(jù)收發(fā)[12]。在本系統(tǒng)中,服務(wù)器端和客戶端各自擁有一個處理交互類,在該類中,定義了一系列收發(fā)處理函數(shù)及超時檢測等函數(shù)。因異步非阻塞通信的特殊性,為了實現(xiàn)錯誤重發(fā)和文件收發(fā)等功能,在類內(nèi)定義了一個保存狀態(tài)的標(biāo)志位。默認(rèn)狀態(tài)標(biāo)志是normal,服務(wù)器在該狀態(tài)可以接收客戶端發(fā)送的字符串信息。接收到字符串后,按照指定格式解碼字符串,從而提取到客戶端的需求,如:登陸、心跳檢測、信息傳輸、文件發(fā)送請求等。接著服務(wù)器端調(diào)用相信函數(shù)處理客戶端需求后并回傳結(jié)果信息。以收發(fā)圖像為例,如客戶端發(fā)送的字符串屬于請求發(fā)送圖像,則該字符串內(nèi)同時會包含圖像文件大小等信息,此時服務(wù)器的狀態(tài)和客戶端的狀態(tài)標(biāo)志都會改變?yōu)槭瞻l(fā)文件狀態(tài)。下一步客戶端會在收到服務(wù)器回信后發(fā)送文件,服務(wù)器端則會啟動一個循環(huán)接收的程序,直至收到的文件大小等于上一步中客戶端發(fā)送的文件大小值,收發(fā)成功后,服務(wù)器和客戶端的狀態(tài)再次回歸normal,如出錯則再次進行文件傳送。
中央服務(wù)器是整個系統(tǒng)的核心節(jié)點,其擁有固定公網(wǎng)IP 且開發(fā)特定端口允許設(shè)備連接,其核心功能由3 部分構(gòu)成:與集群服務(wù)器通訊程序、與嵌入式端通訊程序、與其他服務(wù)器通訊程序,
如圖2 所示。中央服務(wù)器支持負載均衡功能,能為用戶設(shè)備提供最合適的算力分配。中央服務(wù)器內(nèi)部擁有一個儲存各個集群服務(wù)器實時狀態(tài)信息的vector,該vector 內(nèi)的信息每秒會更新一次。當(dāng)中央服務(wù)器收到嵌入式端計算請求后,會遍歷該vector,首先檢測哪幾個集群服務(wù)器能提供滿足該計算需求的計算能力,接著對比這幾個集群服務(wù)器負載壓力,找出壓力最小的那個服務(wù)器集群并將其連接方式轉(zhuǎn)發(fā)給嵌入式端,以此實現(xiàn)負載均衡,平衡各個集群的計算壓力。
圖2 中央服務(wù)器
2.1.1 與集群服務(wù)器通信
該模塊能管理接入的集群服務(wù)器信息,其內(nèi)部擁有一個vector 用于存儲集群服務(wù)器的信息,包括連接模式、IP 地址、端口、當(dāng)前負載、支持運行的模型名稱及其版本等。
其首先會啟動一個異步非阻塞模式的通訊服務(wù)器端用于接收集群服務(wù)器的連接。當(dāng)一臺集群服務(wù)器進行接入時,服務(wù)器端會先接收到一條帶有l(wèi)ogin 標(biāo)志為用戶名及密碼的字符串,可以以此進行身份校驗,防止惡意接入。身份校驗通過后,服務(wù)器會接收到一條字符串信息,解碼該字符串即可獲取其連接方式,該信息將用于轉(zhuǎn)發(fā)給嵌入式端。以上步驟完成后,服務(wù)器端會每秒和集群服務(wù)器通信一次,接收其發(fā)送的實時負載狀態(tài)并更新vector 中對應(yīng)位置的信息。
2.1.2 與嵌入式端通訊
該模塊負責(zé)與嵌入式設(shè)備進行通訊,工作模式為異步非阻塞。當(dāng)嵌入式設(shè)備接入時,同樣會首先進行賬號和密碼驗證,確認(rèn)無誤后進一步接收設(shè)備需要計算的模型信息。接著該模塊開始檢索存儲有集群服務(wù)器信息的vector 列表,找出支持該模型計算的、且當(dāng)前負荷最小的那個集群,進一步取出該集群的連接方式等信息后轉(zhuǎn)發(fā)給嵌入式端,待嵌入式端接收完畢后,中央服務(wù)器會斷開連接以減少整個系統(tǒng)的負荷。
2.1.3 與其他服務(wù)器通訊
此模塊主要與其他服務(wù)器,如數(shù)據(jù)庫服務(wù)器、管理服務(wù)器進行通訊和信息交互,通訊模式為同步阻塞模式,屬于客戶端。此模塊屬于對外交互模塊,主要用于上傳狀態(tài)信息、計算結(jié)果等信息給其他服務(wù)器,同時可以幫助中轉(zhuǎn)其他服務(wù)器的指令給嵌入式端。
集群服務(wù)器扮演著一個計算集群的管理者的角色,也是整個集群對外交互的唯一設(shè)備。其作為一個客戶端與中央服務(wù)器進行通訊,用于上傳自身的連接方式和實時狀態(tài)信息,同時其自身也作為一個服務(wù)器端與嵌入式端進行通訊,將需要計算的數(shù)據(jù)分發(fā)給各個工作站,如圖3 所示。
圖3 集群服務(wù)器
由于部分復(fù)雜任務(wù)需要依次經(jīng)過多個模型進行計算才能完成,如先經(jīng)過一個Mask R-CNN模型,再經(jīng)過一個ResNet[13]才能輸出結(jié)果,所以集群服務(wù)器內(nèi)部維護著一個上下文列表,這個上下文列表記錄著每個任務(wù)需要依次調(diào)用的模型以及模型的版本。當(dāng)一個計算任務(wù)到達時,集群服務(wù)器會先檢索這個上下文列表,尋找到該任務(wù)需要進行的計算步驟,然后依次將該數(shù)據(jù)發(fā)送給進行對應(yīng)任務(wù)的GPU 工作站進行計算,并取回結(jié)果。
集群服務(wù)器管理著一個集群內(nèi)部的所有GPU工作站,它會建立一個通訊服務(wù)器程序,當(dāng)GPU工作站上的各種計算程序接入后,就會被集群服務(wù)器進行集中管理,實時監(jiān)控各個任務(wù)的計算負荷、模型名稱和版本等數(shù)據(jù)。
GPU 工作站集群由多臺GPU 工作站構(gòu)成,每臺都安裝有多塊高性能GPU,每一塊GPU 視部署的模型大小可以運行一個或多個任務(wù)進程,每一個進程都是一個獨立的程序。
當(dāng)一個計算進程啟動后,會首先調(diào)用Python加載深度學(xué)習(xí)模型,同時讀取該模型的記錄文檔,獲取模型名稱和版本信息。以上步驟完成后,該進程會啟動一個Python 版的Socket 程序主動連接集群服務(wù)器,身份校驗以及字符串解碼等格式與本系統(tǒng)中其他部分的通信程序一致,不同的是此處采用同步阻塞模式,可以大大減輕編程復(fù)雜度。依托通信程序,GPU 進程能告知集群服務(wù)器自身的模型版本以及負載壓力等信息,后續(xù)當(dāng)收到集群服務(wù)器發(fā)送的圖像數(shù)據(jù)后,GPU 立刻開始計算并返回計算結(jié)果。為了提高軟硬件運行效率,每一個計算進程都支持?jǐn)?shù)據(jù)緩存隊列,會提前接收后續(xù)數(shù)據(jù)放入隊列中,這樣可以減少每次計算的數(shù)據(jù)等待時間。
當(dāng)前存在很多熱門的深度學(xué)習(xí)框架,而一個任務(wù)很可能在不同的處理階段需要依賴不同的框架進行計算。為了實現(xiàn)對多種深度學(xué)習(xí)框架的支持,本系統(tǒng)允許各個計算進程在單獨的Python 環(huán)境中運行。即利用Anaconda 生成多個獨立的深度學(xué)習(xí)環(huán)境,分別安裝不同的深度學(xué)習(xí)框架[14],然后再在各個框架內(nèi)建立任務(wù)進程。各個進程都依靠網(wǎng)絡(luò)通訊單獨與集群服務(wù)器建立連接,再依賴集群服務(wù)器的上下文管理功能進行任務(wù)調(diào)度,這種模式有效避免了不同深度學(xué)習(xí)框架依賴庫版本不同而導(dǎo)致的系統(tǒng)混亂,完美實現(xiàn)了一個系統(tǒng)內(nèi)多種深度學(xué)習(xí)框架的共存。
嵌入式端是用戶使用的設(shè)備,當(dāng)用戶有數(shù)據(jù)需要云端進行計算時,其首先會以客戶端的身份連接中央服務(wù)器的通訊端口,同時上傳自身的身份驗證和任務(wù)需求,在接收到云服務(wù)器返回的計算集群連接信息后,斷開與中央服務(wù)器之間的連接。接著又以客戶端的身份連接集群服務(wù)器,支持以IP 和網(wǎng)址的形式進行連接,在連接到集群服務(wù)器后,同樣是先進行身份驗證,然后再上傳任務(wù)需求和所需計算的數(shù)據(jù),如圖4 所示。因為嵌入式端需要計算的往往是圖像數(shù)據(jù),以項目中經(jīng)常需要計算的3D 圖像和RGB 高清圖像數(shù)據(jù)為例,單份數(shù)據(jù)的體積往往能達到3 MB。為了盡可能地減少網(wǎng)絡(luò)資源占用及降低通訊延時,同時為了防止數(shù)據(jù)在公網(wǎng)進行傳輸時發(fā)生泄密,需要在數(shù)據(jù)發(fā)送前對其進行一定壓縮及加密[15]。最后,嵌入式端會等待集群服務(wù)器回傳計算結(jié)果,一次完整的計算過程便完成了。
圖4 嵌入式端
為了使本套系統(tǒng)能符合項目使用需要,故列出如表1 所示性能指標(biāo)。
表1 系統(tǒng)性能指標(biāo)
本系統(tǒng)采用Boost.Aasio 作為核心通信框架,相比經(jīng)典的Socket 通信程序,Boost.Asio 可以看成是Boost 庫對Socket 的進一步封裝,能更好地支持異步通信模式。相比ACE 等通信框架,鑒于Boost 庫已經(jīng)成為事實上的C++標(biāo)準(zhǔn)庫,其自帶的Asio 擁有比ACE 框架更加容易安裝和使用的優(yōu)勢。
在實際測試場景中,中央服務(wù)器帶寬為1 Mb,計算集群帶寬為50 Mb,嵌入式端上行帶寬受用戶實際使用場景不同而不同。每份數(shù)據(jù)經(jīng)過壓縮后約為0.6 MB。因為每個設(shè)備不是連續(xù)發(fā)送數(shù)據(jù)的,經(jīng)測試,整個系統(tǒng)可以同時為超過50 臺設(shè)備提供服務(wù),同一時刻并發(fā)接收8 個設(shè)備上傳數(shù)據(jù),基本接近了網(wǎng)絡(luò)帶寬極限。在客戶端連接數(shù)量方面,實測最大可保持連接數(shù)可保持500 以上,短時可保持1 000 以上。
模型計算方面以GPU 集群中部署的Mask RCNN 模型為例,計算一張圖像的平均時間約為0.15 s,數(shù)據(jù)傳輸時間受用戶上行帶寬不同而不同,按平均0.2 s 計算,設(shè)備端完整運行一次云計算的時間花費約0.35 s,完全滿足用戶需求。
經(jīng)測試,整個程序可完美兼容Ubuntu、Mac OS、Windows 這3 款主流操作系統(tǒng),支持C++和Python 混合編程,對Tensorflow 和Pytorch 這2 款學(xué)術(shù)界熱門的深度學(xué)習(xí)框架能很好地支持。
中央服務(wù)器工作狀態(tài)如圖5 所示。
圖5 中央服務(wù)器工作狀態(tài)
隨著嵌入式產(chǎn)業(yè)與人工智能產(chǎn)業(yè)的蓬勃發(fā)展,以及最新5G 及Wi-Fi 6 的入局,為大量嵌入式設(shè)備提供AI 計算云服務(wù)成為了一個重要的研究方向。
1)本系統(tǒng)構(gòu)建了一套可彈性擴容、分布式部署的AI 計算系統(tǒng);
2)該系統(tǒng)試驗期間穩(wěn)定運行無崩潰現(xiàn)象;
3)本系統(tǒng)是智能養(yǎng)殖場景下,使用深度學(xué)習(xí)方法進行體尺計算的一種創(chuàng)新型方法;
4)本系統(tǒng)具有硬件資源利用率高、成本低、安全可靠的特點,有效解決了嵌入式設(shè)備對快速可靠的AI 計算的需求。
5)本系統(tǒng)很容易擴展至其他應(yīng)用場景。