1. 程式人生 > >拒絕空談 AI 設想!手把手教你構建實時、高可用的 AI 排程平臺

拒絕空談 AI 設想!手把手教你構建實時、高可用的 AI 排程平臺

640?wx_fmt=gif

640?wx_fmt=jpeg

當前人工智慧飛速發展,機器學習的精度和效能也在不斷提高,由機器學習引導的技術正在默默改變著大家的生活,並創造出很多新的商業機會和價值。

人工智慧目前最直接的出發點就是讓計算機能將人眼看到的、人耳聽到的媒體轉化為計算機可以理解的物件,計算機只能處理量化的資料和資訊,對於如何從音視訊和其它媒體中挖掘出其內在的資料是人工智慧領域在不斷探索的方向,因為資料即價值。目前視訊和圖片資源資料量巨大,如果能將其中的資料探勘並量化出來,將產生巨大的商業價值。

從目前技術方向看AI還是比較接地氣的技術方向,我們不斷看到越來越多AI真實落地的場景,並切實的解決人們工作生活中的問題。目前生產系統中大多深度學習推理計算任務(Inference)基於單機作業,對於商業化的系統,當Inference任務量很大的時候沒有合適的平臺適用。

傳統大資料平臺大都專注於資料和計算,而機器學習任務則更關注演算法並且需要提前載入模型,而且需要對連續的有關聯性的資料做分析跟蹤等處理,所以設計一款Scale Out、實時性和高可靠的排程平臺非常重要。


640?wx_fmt=png

計算裝置


CUDA的廣泛應用造就了GPU計算的崛起,用NVIDIA的顯示卡進行深度學習的加速訓練是最常用的一種裝置,其中使用最多的是GTX1080 Ti顯示卡,不過NVIDIA聲稱不再支援使用者消費級顯示卡進行深度學習訓練,這樣以後只能買更昂貴的Tesla GPU,所以以後發展成什麼樣還是個未知數。

CUDA GPU計算除了這種高功耗的顯示卡,還有NVIDIA Jetson TX2這種低功耗嵌入式平臺,這種平臺的CPU是ARM架構,GPU是Pascal GPU。

640?wx_fmt=jpeg

圖1 NVIDIA Jetson TX2

對於移動端或許不能使用CUDA的平臺則直接使用CPU進行計算,並結合NNPACK庫進行加速,NNPACK由Facebook開發,是一個加速神經網路計算的加速包,NNPACK可以在多核CPU平臺上提高卷積層計算效能,通常會有2-3倍的效能提升。

Movidius是英特爾推出的基於Myraid2晶片的神經元計算棒,將所有的功能封裝到了U盤大小的裝置中,使用者只需要將計算棒插入USB介面中,就可以進行高效的機器學習推理任務。

通常只需要一個樹莓派級別的載體作為宿主機就可以直接使用,如果單個計算棒的效能不夠,還可以使用多個進行加速,取得線性加速比。


640?wx_fmt=png

深度學習平臺


目前機器學習實踐的過程主要有兩個階段,首先是模型訓練,用標註資料集對目標場景進行訓練,使模型足夠收斂,達到一定精度。然後是用訓練好的模型進行推理,對新資料進行分類檢測,提取媒體資料中的特徵資料。

目前常用的深度學習平臺主要有TensorFlow、Keras、MXNet和PyTorch等,各有優缺點,目前還沒有哪一個具有絕對的優勢,處於百花齊放的階段。


640?wx_fmt=png

排程需求


目前AI正在飛速發展,所以計算裝置比較多樣,計算環境往往是異構的。包含桌面機、GPU伺服器和移動端等一些低功耗平臺,同時也可以直接使用雲端GPU資源組成Hybrid計算環境,這些需求對排程的框架提出了新的要求:

  • 實時性:實時效能大幅提高AI場景的使用者體驗,和離線的大資料處理不同,需要以最低的延時處理完深度學習計算任務,比如無人機上的影象處理,需要以幾乎實時的效能完成深度學習計算;

  • 高可用:對一些特徵提取的場景,資料的完整性非常重要,單個節點的故障不會引起業務的中斷,排程系統需具備HA和Failover功能;

  • Scale out:對於AI企業來說,以靈活的方式擴充套件計算能力顯得非常重要,不同的使用者會提出不同的部署模型和不同的排程策略,當計算任務增多的時候,橫向擴充套件便非常必要;

  • 細粒度:不同的深度學習模型具有不同的網路深度,對資源的消耗也不盡相同,較深的網路需要較大的記憶體或者視訊記憶體,同時有些網路後處理需要較多的CPU時間;

  • 多維度:目前深度學習的網路層數也是比較多,層數越多模型就越大,這就要求消耗更多的視訊記憶體和記憶體。也有一些經過刪枝精簡的模型適用於Mobile平臺和其它低功耗平臺,每種計算模型對GPU、CPU、視訊記憶體和記憶體的需求都不一致,所以必須使用多維度MDS(multidimensional scheduling)對資源進行分配和均衡。

640?wx_fmt=png

圖2 系統架構


640?wx_fmt=png

設計實現


1、多級排程

深度學習計算任務的處理過程是將原始資料放到神經網路中進行卷積和各種運算處理,所以執行之前需要先把網路模型載入到記憶體或者視訊記憶體中,模型的載入和解除安裝需要較大的時間,所以一次模型的載入需要儘可能多的處理資料,但是作為排程系統考慮到balance,不能佔用太長時間,所以需要對每個提交AI計算任務的session定義如下資源佔比:

  • Fixed Workers:系統中只要有可用資源就優先分配足額的worker數量,這些worker是pre-start,以最快的速度來處理session中提交過來的計算作業,確保使用者的計算作業能及時得到處理,保證作業處理的實時性;

  • Dynamic Share Ratio:當fixed workers配置的資源不能滿足作業的計算需求,導致session中pending作業較多的時候,通過配置dynamic share ratio,按照配置的資源使用份額,申請額外的worker來加速處理當前session,所有session中的pending作業競爭按照share ratio比重分配可用資源。

2、Scheduler Policy

排程系統支援以下排程策略:

  • 先來先服務:預設排程策略,先提交的作業優先排程派發作業到滿足資源需求節點執行;

  • 優先順序排程:對作業和session設定不同優先順序,排程系統有限處理高優先順序的作業;

  • 獨佔式排程:獨佔式排程可以讓作業獨佔節點的計算資源。排程系統把作業排程到滿足資源需求得節點,在作業完成前,不會讓其他作業使用該節點資源,從而實現獨佔該節點資源的目的;

  • 搶佔式排程:搶佔式排程可以讓一個處於等待狀態的高優先順序作業,強行搶佔一個正在執行的低優先順序作業的計算資源。使得高優先順序作業可以使用該計算資源,低優先順序的作業在高優先順序作業完成後,會盡快的恢復低優先順序作業的執行;

  • GPU繫結排程:將作業排程派發到指定的GPU卡執行,避免多個作業共享GPU導致相互干擾,實現GPU的繫結排程,提高作業執行效率。

3、Scheduler Policy Plugin

隨著應用的不斷髮展,使用者對排程策略也會有不同的需求,除了系統提供的排程策略,排程系統還支援使用者開發自己的排程策略,以滿足不同的作業排程需求,排程系統以外掛模式方式載入使用者自定義排程策略,實現排程策略的深度定製,提高排程策略的靈活性和可配性。

4、Cloud Plugin

當本地叢集沒有足夠的資源來處理時,可以通過Cloud Plugin動態申請雲端計算資源,這樣便可以組成Hybrid Cluster以增強本地叢集的算力,目前可選的公有云提供商也比較多,可以同時申請多個公有云的資源組成多雲Cluster。

5、資源的分配和計算

排程系統提供2種資源分配和計算的方式,一種是按照每種模型作業的資源需求固定分配,一種是通過排程系統自動調整每種模型作業對資源的需求,實現自適應的資源分配。

  • 固定分配:作業在申請計算資源時,如果通過排程系統按照作業的需求分配資源,有可能會出現作業申請資源過多,作業在實際使用計算資源時沒有充分利用現有的計算資源,導致計算資源的浪費。因此排程系統提供資源固定分配模式,每種模型作業按照使用的經驗值,配置模型作業的資源消耗,排程系統在啟動作業時會自動計算系統所有的資源池,按照節點的負載資訊和作業資源配置情況給每個作業分配相應的資源,確保作業能分配到滿足的資源,不會引起資源的競爭,提高資源的使用效率,待作業執行完畢,排程系統及時將作業的資源回收,下一輪排程時,分配給其他作業使用;

  • 自適應分配:當作業的資源需求配置和實際使用的資源誤差較小時,固定分配模式能滿足每種作業的資源需求,但是如果配置的資源需求和作業實際使用過程中使用的資源誤差較大。比如模型載入後,不同的輸入資料對資源的需求都不一樣,如果配置固定的資源需求,會導致部分作業資源需求得不到滿足,實時性得不到保證,而部分作業又使用不完分配的資源,導致了資源的浪費,排程系統提供資源自適應分配方式,作業啟動時,先給作業分配一個最低閾值的資源需求,然後排程系統在執行過程中,不斷收集作業資源使用情況,根據作業實際資源使用情況,動態調整作業的資源需求,實現自適應的資源分配,提高資源的使用效率。

6、API

排程系統提供相應的API開發介面,方便對排程系統進行定製化開發,滿足使用者的特殊需求,主要提供以下API介面:

  • 叢集:查詢叢集狀態、叢集相關資訊;

  • 作業:實現作業的提交、查詢和控制等;

  • 節點:節點狀態查詢、資源監控和節點控制等;

  • 排程策略:實現使用者自定義的排程策略;

  • 資源:查詢叢集資源使用情況、吞吐量等。

7、Block Host/GPU

人工智慧作業在應用中對計算任務的順序和完整性有比較高的要求,比如視訊的計算任務需要按照視訊幀的順序進行處理完整才能得到最終能的統計資料。所以對叢集的硬體計算裝置有比較高的要求,排程系統提供以下2個功能,方便實現硬體的擴充套件和維護:

  • Block GPU:基於成本考慮,大部分企業不會直接選擇Tesla GPU進行計算,一個Tesla P4專業GPU的價格是GTX1080Ti的4-5倍,但是效能卻只有2倍左右, 當然GTX1080Ti是消費級的GPU,作為企業應用的話穩定性肯定比不上Tesla P4,所以一定要考慮GPU出現故障的場景,這時候就需要單獨Block故障GPU,在排程系統中標記排除,不再將作業派發到這類GPU,確保計算作業的正常處理,但是其他可用的GPU可以繼續分配作業使用;

  • Block Host:作為長時間執行的GPU伺服器也有可能隨時出現故障導致作業不能正常結束,排程系統通過命令列介面,可以Block該故障機器,將機器標記成不可用狀態,確保沒有新的作業派發到該節點執行,以免影響整個作業執行的順序和完整性。另外,如果需要對該節點進行維護升級,可以通過Block Host功能,在不影響已經執行的作業情況下,排程系統不派發新的作業到該節點,直到節點上的作業執行完畢,方便對裝置進行維護升級。

8、High Available

HA在商業系統中是不可或缺的功能,往往體現在系統設計的各個層面。

  • 作業維度:作為排程系統,必須保證每一個提交進去的作業被正確執行,作業執行過程中很有可能因為各種原因發生錯誤,首先需要做的就是本地Retry,當本地Retry到一定次數後需要考慮Host環境因素由排程系統排程到其它機器進行Retry,如果再次失敗到一定次數,可以標記Task為Fail。另外,對於支援檢查點的作業(checkpoint),排程系統提供介面支援定期對作業進行checkpoint,方便作業及時恢復和遷移,對於不支援檢查點的作業,排程系統對每個作業的執行狀態記錄相應的events,當排程系統重啟後,能根據events恢復作業的執行狀態,確保作業的正常執行;

  • GPU維度:AI計算使用的GPU一般都是高階顯示卡,功耗有比較大,在測試和應用場景中經常會發生GPU無法使用的作業,當一些作業連續在同一個GPU上失敗後,排程系統需要將該GPU標記,並在後續的排程中排除該GPU的使用,確保作業能正常的執行;

  • 節點維度:類似於GPU維度,排程系統如果檢測到計算主機不可用,需要將該主機上目前執行的任務重新分配到其它計算節點繼續執行,將該計算主機標記並排除到後續的排程中,同時當該主機恢復後能繼續加入到計算列表中進行任務分配;

  • Scheduler維度:Scheduler具有Master scheduler和Slave Scheduler,通過ETCD選舉Leader進行排程,Scheduler需要啟動多於3個節點,當Master Scheduler程序離線後,ETCD可以確保選出一個新的Mastre scheduler接管當前的排程任務,同時Master Scheduler需要實時同步當前資源分配計劃到ETCD cluster,在新的Scheduler啟動後快速從ETCD同步資料恢復現場,保證叢集可用性。

9、演算法編排

一個完整的人工智慧應用,在一個流程中可能會用到好幾個模型演算法,為了能快速適用於不同客戶的AI需求而不用頻繁修改程式碼,需要能快速組織出一個新的流程,類似於叢集和容器的編排,演算法編排用於快速定義一個機器學習程式的計算流程以實現一個完整的商業需求。

將不同的演算法功能模組抽象為公共演算法模組,這些演算法模組組織成流水線來完成一個完整的演算法輸入和輸出。輸入引數為採集過來或者實時的原始資料,比如文字、視訊、圖片和視訊流等,輸出就是具體檢測跟蹤或者提取的結構化資料,可以用來儲存到關係型資料庫或者NoSQL資料庫。

通過模型編排組織起來的演算法流水線能夠以最快的速度進行AI處理,可以極大提高AI產品的實時性和效能。

640?wx_fmt=png

圖3 演算法編排

作者:呂金明,系統架構師,長期從事分散式計算以及大資料相關的研發工作,以及大資料產品的整合,如Spark、Docker、Kubernetes、Tensorflow等開源框架及技術。李鬆鬆,高階軟體開發工程師,一直從事分散式計算、叢集作業排程系統以及HPC相關的研發工作。

宣告:本文為作者投稿,版權歸其個人所有。

 熱 文 推 薦 

☞ Facebook 十五年,扎克伯格回到了工程師的原點

☞ iPhone 大降價;谷歌再爆醜聞;京東雲金山雲迴應合併傳聞 | 極客頭條

☞ 從 C++98 到 C++17,超程式設計是如何演進的? | 技術頭條

☞ 剛剛!程式設計師集體榮獲2個冠軍,這份2018 IT報告還說這些!

☞ 程式碼“大換血”,以太坊能耗將減少99%背後的故事

☞ “微信之父”張小龍:我沒去過龍泉寺!

☞ Spark+Alluxio效能調優十大技巧

☞ 春運搶票靠加速包?試試這個Python開源專案吧



  

print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"

640?wx_fmt=gif點選“閱讀原文”,開啟 CSDN App 閱讀更貼心!

640?wx_fmt=png 喜歡就點選“好看”吧!