朱紫鈺, 湯小春, 趙全
(西北工業大學 計算機學院, 陜西 西安 710072)
分布式機器學習[1-3]在數據挖掘、醫學影像、股票市場分析、計算機視覺、市場分析等領域被大規模使用。但是訓練機器學習模型通常需要大量的時間和計算資源。隨著數據中心開始大規模使用GPU設備,CPU-GPU混合的異構資源集群已經成為一種通用基礎設施[4-5]。企業界為了提高分布式機器學習的效率,也逐漸將這類應用移植到異構集群平臺上運行。但是,CPU-GPU集群上面臨的一個基本挑戰是如何高效地調度分布式機器學習作業中的任務。特別是當GPU計算資源較為珍貴時,如何最大程度地利用CPU-GPU計算資源進行模型訓練已成為異構集群上面臨的基本挑戰。

分布式機器學習初期,由于硬件限制,主要采用CPU集群來進行,針對一批訓練數據,計算框架把數據分成很多個片段,然后根據集群節點上CPU的數量,將每一個片段作為一個單獨的任務分配到計算節點的不同CPU上,進行局部梯度計算。當所有的任務完成計算后,參數服務器收集各個任務的梯度誤差進行匯總,然后發送新的參數用于下一次迭代。由于數據分片大小相同,CPU性能相同,所以每個任務在CPU上的執行時間大致相同,這能夠保證每一次迭代的同步。
近幾年來,隨著GPU硬件設施的廣泛應用,分布式機器學習開始使用GPU計算資源。在分布式機器學習的訓練過程中,一部分任務可能運行在GPU上,一部分任務可能運行在CPU上。GPU用于單純的梯度計算,CPU用于初始化、節點之間通信、數據加載、主機內存到設備內存之間拷貝以及啟動GPU的kernel函數等。
面對同構的集群環境,分布式機器學習采用大小相同的數據分片策略,這樣可以保證任務在CPU或者GPU上執行時間相同。面對異構集群環境,分布式機器學習存在學習過程中不能保證CPU和GPU資源合理利用的問題:如果只考慮使用異構集群中的CPU計算資源,則沒有考慮到GPU計算資源帶來的計算優勢;如果只考慮使用異構集群中的GPU計算資源,則在GPU設備執行任務時,CPU資源往往被閑置。無論是在異構集群中只使用CPU資源還是只使用GPU資源,都無法充分利用異構集群資源。因此,一種合理使用異構集群計算資源的方式為:當CPU資源存在空閑時,將任務分配到CPU上執行,當GPU資源存在空閑時,將任務分配到GPU上運行。這種資源分配方案的優點是最大限度地利用了CPU計算資源和GPU計算資源。但是上述任務分配方式的最大挑戰在于:(1)由于GPU和CPU具有不同的運算能力(FLOPS),導致同樣的任務在GPU上執行比在CPU上執行消耗的時間更短;(2)類似于聚類分析的迭代過程,只有當全部工作節點上的任務完成后,誤差聚合操作才能進行參數的更新,并發布下一次的迭代過程。因此,如果把每一次迭代過程中的計算任務均勻地分配給CPU和GPU資源,就會造成CPU任務嚴重滯后,迭代過程不能同步,從而導致誤差聚合操作的推遲,影響下一次迭代的開始時間。
針對分布式機器學習作業如何提高資源利用率的問題,有相當多的研究者進行了研究。文獻[6]從分布式機器學習訓練過程出發,詳細說明了訓練過程中各個階段使用CPU和GPU資源帶來的性能提升,同時也說明了使用GPU設備的瓶頸。文獻[7-14]主要針對GPU計算資源的調度策略,忽略CPU計算資源的調度。文獻[7]介紹了跨作業共享GPU資源帶來的一些挑戰性問題。文獻[8]描述了一種大規模快速梯度下降算法的應用場景,提出了大規模數據集在多個GPU之間的調度策略。文獻[9]提供了與分布式機器學習相關的資源管理模型和以及任務調度策略。文獻[10]提供了一種任務執行過程的控制算法,保證機器學習作業的質量。文獻[11]提出了一種針對異構資源的混合DRF算法,能夠有效提高集群資源利用率。文獻[12]提出了一種支持向量機的任務分類算法,任務根據類型劃分并投入相應的設備進行計算,可以改善集群資源利用情況,但是該算法獲得數據存在一定的時間延遲,并不能準確獲得集群資源變化。這些研究在最大化資源利用率、最小化作業的平均完成時間以及任務調度質量等方面都有一定的借鑒意義。但是,上述文獻對CPU和GPU搭配使用的研究不全面,即要么只考慮CPU資源,要么只考慮GPU資源,不考慮CPU資源與GPU資源混合分配和調度的價值,也不關注CPU和GPU資源混合調度的利用率。文獻[13-14]主要任務是解決多個機器學習作業共享GPU集群時,如何分配資源,減少迭代過程的延遲。它解決了不同作業之間的資源共享問題,但沒有解決CPU-GPU資源之間的合理分配問題。文獻[15]介紹了一種通用的CPU-GPU計算資源管理系統,它不涉及具體的應用,而是根據任務類型(例如工作節點程序,參數服務器程序)執行啟發式靜態資源分配,因此無法提高機器學習中CPU-GPU資源的利用率。文獻[16]通過預估任務的執行時間來調度資源,但是它的核心在于確定參數服務器與計算節點之間的分配關系,不太關注CPU資源與GPU資源分配問題。文獻[17]介紹了一種通過MapReduce來加速K-Means的算法,其按照CPU處理能力和GPU處理能力將Map任務分成2個部分,這種方式可以利用CPU資源和GPU資源,但是它對CPU任務和GPU任務的不敏感,導致迭代過程中CPU任務的延遲,增加了整個作業的響應時間。文獻[18]中的理論框架產生了一個最佳整數規劃解決方案,根據CPU數量、CPU與GPU之間計算能力的不同,少部分任務由CPU承擔,大部分任務由GPU承擔,提高了CPU和GPU的利用率,但是由于CPU任務的數據大小與GPU任務的數據大小相同,當數據分片較大時,存在任務延遲問題。
為了提高CPU和GPU資源利用率,同時也減少每次迭代中的任務延遲,本文提出了一種不均勻數據分片方法。在每一次迭代過程中,根據集群系統可以使用的CPU核數量和GPU數量,以及CPU和GPU的計算能力,將數據塊分解成大小不同的分片,小分片數據應用于CPU資源,大分片數據應用于GPU資源,在所有GPU任務執行結束前,保證CPU任務也能夠結束,從而減少2類不同任務之間的同步等待問題,進而降低分布式學習的訓練時間,且提高系統的資源使用率。
論文的主要創新點是提出了一種面向CPU-GPU混合集群的分布式機器學習調度框架,即在機器學習模型參數的訓練過程中,對于每個任務,系統都包含2個版本——GPU版本和CPU版本。在每一次迭代操作開始前,首先得到可以使用的CPU設備數量m以及GPU設備數量n,再根據任務的歷史統計數據,確定CPU和GPU上運行時間的比值(這個比值相當于CPU和GPU執行效率比),根據比值可將任務分解為p和q個;然后將GPU任務提交到GPU計算資源,CPU任務提交到CPU計算資源。最后,采用線性規劃的思想,保證分配的CPU任務與GPU任務之間的同步執行,即CPU任務與GPU任務之間不存在嚴重滯后的情況。
通常情況下,當使用GPU計算資源計算不同數據分片的梯度時,CPU被用來初始化參數,啟動kernel函數的運行。在GPU的kernel函數執行過程中,CPU就不再被使用。這會導致CPU處于閑置狀態,降低系統資源利用效率。但是,如果所有的CPU資源都處于“忙”狀態時,也會造成GPU任務等待CPU資源而不能被迅速執行的情況,這會浪費GPU資源。
在機器學習訓練中,要想CPU資源和GPU資源充分被利用,就需要考慮為GPU綁定一定的CPU資源,方便GPU任務的啟動。在面向CPU-GPU的異構集群系統中,圖1給出了CPU與GPU之間的資源分配關系。圖中的c0、c1等代表CPU設備,GPU1、GPU2等代表GPU設備。在每次的迭代過程中,將CPU和GPU進行捆綁,即為每個GPU搭配一定數量的CPU。訓練開始后,對于GPU任務,綁定的CPU只負責加載參數以及啟動GPU的kernel函數,一旦開始在GPU上進行誤差的計算,CPU會處于閑置狀態,直到完成所有的局部誤差計算。之后在指定的CPU或者GPU上進行誤差聚合運算,產生新的模型參數。上述過程相當于完成一次迭代,如果誤差未達到模型精度要求,則會進行重復的迭代過程,直到滿足精度要求。

圖1 CPU-GPU異構集群系統資源分配方式
CPU-GPU異構集群要求任務的二進制程序既能夠在CPU上運行,也能夠在GPU上運行。當一個機器學習作業準備執行時,可以指定哪些任務運行在CPU設備上,哪些任務運行在GPU設備上。任務調度器會查看集群資源中是否有設備處于空閑狀態,如果有GPU空閑,則提交GPU任務,如果有CPU空閑,則提交CPU任務。任務調度器對任務進行資源分配時,如果需要使用GPU資源,那么任務就與GPU二進制程序綁定;如果需要使用CPU資源,那么任務就與CPU二進制程序綁定。之后,任務調度器會將任務及信息發送給工作節點的CPU執行器或GPU執行器,由執行器啟動并執行任務。在設計CPU二進制程序和GPU二進制程序時,任務的輸入數據格式和輸出數據格式要求完全一樣。這樣一來,2種任務的輸入輸出能夠正確獲得下一次迭代時新的訓練參數,且不會影響機器學習作業的參數更新效果。
數據分片策略包含2個目的:①面向分布式機器學習,通過數據分片,可以并行執行多個梯度計算過程,從而減少機器學習的訓練時間,快速地完成模型的訓練;②面向CPU-GPU異構集群環境,進行數據分片的目的是充分利用CPU資源和GPU資源。
為了達到上述目的,依據CPU任務和GPU任務的運行時間,對數據進行大小不等的分片。通過統計CPU任務和GPU任務在各自設備上的運行時間,得到任務運行效率的比值,從而確定數據分片的大小。由于機器學習聚合操作更新參數前要求本批次數據全部計算完成,因此分片大小決定了CPU任務和GPU任務的同步快慢問題,這是本文算法的關鍵所在。
減少機器學習迭代過程中運行時間的核心是保證CPU任務與GPU任務的同步完成。假設N是整個數據規模的大小,n是CPU核數量,m是GPU設備數量,對于同樣大小的一塊數據B,CPU運行時間與GPU運行時間的比值是α,稱α為加速系數。其含義是如果使用一個GPU設備完成數據的計算需要時間為t,那么使用一個CPU完成數據的計算需要α·t的時間。如果可以將數據分割成B/α的大小,那么一個CPU完成B/α數據的計算就只需要時間t,這樣對于GPU任務和CPU任務的計算就不存在執行時間差別的問題,很容易通過調度滿足迭代過程的同步。
對于機器學習中的數據N,現在需要進行數據的分片,分片后的每一個數據塊對應一個任務。為了保證計算性能的無差異,根據數據分片的大小決定任務由CPU執行還是由GPU執行。假設數據被分割后,有x個CPU任務和y個GPU任務。在n個CPU核上運行x個任務的完成時間記為tC,在m個GPU上完成y任務的時間為tG,理想狀態下,數據分割計劃的目的是|tC-tG|=0。因此,任務同步時間差如下所示
(1)
使用以上參數,需要確定CPU任務的個數x和GPU任務的個數y,目的是要減少CPU任務的執行結束時間與GPU任務執行結束時間的差值。所以給出以下的規劃條件,其目標是
min|f(x,y)|
(2)
同時要滿足條件
x·B1+y·B2≥N
(3)
|B2-αB1|<η
(4)
B1,B2,x,y≥0
(5)
公式(2)給出了目標函數,即減少CPU任務與GPU任務之間的不同步。其物理意義是,假設tp代表p個任務中第一個任務開始到最后一個任務結束的時間區間,而tq代表q個任務中第一個任務開始到最后一個任務結束的時間區間。調度的目的是滿足|tp-tq|<ε,ε∈?(0,1),即GPU任務的完成時間和CPU任務的完成時間相當。公式(3)是按數據分片要求,將CPU任務的數據分片大小為B1,GPU任務的數據分片大小為B2,公式(3)要求x+y個任務要處理完全部的訓練數據。公式(4)描述了CPU和GPU任務數據規模之間的關系,其數據要滿足加速系數要求,η表示數據分割誤差。公式(5)對所有變量的取值范圍進行了約束。
對于每一個數據分片,都會產生一個任務,分片小的數據綁定CPU任務,分片大的數據綁定GPU任務。整個數據分片完成后,將任務及數據信息分別插入到CPU任務隊列和GPU任務隊列中,等待調度器調度。根據數據分片產生的任務,只能用于機器學習中的局部梯度計算,即gi值的計算?;贑PU任務和GPU任務的數量,調度器安排CPU資源以及GPU資源執行任務。
迭代計算過程中,CPU負責內存到設備內存的輸入和輸出,GPU負責計算。當GPU計算時,CPU空閑,因此,利用這些CPU時間是可行的,但是前提是不能影響GPU執行前后對CPU的需求;另外,GPU數量一般較少,CPU核數量眾多,部分CPU核就可以承擔GPU計算前后的輸入和輸出工作,多余的CPU核就可以參與計算,因此CPU-GPU混合的算法是可行的。
為了利用這些CPU核,就需要對數據進行合理的分片,避免部分任務滯后導致的作業響應時間延遲。所以,論文采用整數規劃算法來計算分片的數量和分片的大小。
在時間復雜度方面,在公式(3)中,定義了2類變量B1和B2,設其可取最大值為N,由公式(4)可知2類變量滿足比例關系α。設x,y和N可取最大值為a,那么分片規模循環次數為a,任務數作為內層循環也為a,則公式(3)時間復雜度為O(a2),該時間復雜度為算法時間復雜度,因此本算法可行。在空間復雜度方面,算法使用的主要變量共8個,涉及的數量較少,因此占用內存較少,算法具有較好的空間復雜度。
機器學習作業的任務調度框架由3個主要部分組成(ML框架、工作節點和數據分片)。ML框架是主控節點,工作節點是由CPU-GPU資源組成的集群節點,數據分片是對整個訓練數據的劃分,其分片大小與計算資源的計算能力相關。整個框架如圖2所示。
ML框架:ML框架主要功能有①聚合各個工作節點執行器上發送的局部梯度值;②根據梯度值更新模型參數;③對訓練數據進行分片,并依據分片創建CPU任務和GPU任務的描述;④對上述任務進行調度。
工作節點:工作節點的主要功能是依據CPU資源和GPU資源的不同,啟動CPU執行器以及GPU執行器。CPU執行器接收CPU任務描述,使用CPU資源來計算指定分片數據的局部梯度值;GPU執行器接收GPU任務描述,采用GPU資源來計算指定分片數據的局部梯度值。
數據分片:數據分片是按照CPU資源和GPU資源的數量和計算能力,將整個訓練數據分割成大小不等的CPU數據塊以及GPU數據塊。
整個作業任務調度框架的運行過程按照以下步驟完成(以下的步驟序號與圖2中序號對應)。

圖2 面向CPU-GPU集群的機器學習調度框架
①ML框架執行梯度值的聚集運算。如果是第一次迭代,隨機給出梯度值;如果不是第一次迭代,當所有的執行器全部將局部梯度值發送到ML框架后,ML框架再進行聚集計算;
②根據聚集的梯度值,ML框架計算出新的權重系數,即模型的參數值;
③ML框架將新的模型參數發布到各個工作節點的CPU執行器和GPU執行器;
④ML框架根據訓練數據的大小以及CPU和GPU資源數量,按照第1.4節的方式進行數據分片,將數據分為2類,CPU數據分片和GPU數據分片。每個分片包含訓練數據的編號、開始位置、數據塊大小和數據所在的IP地址信息等。每個數據分片按照一定數據格式構成一個任務描述,并添加到各自的排隊隊列中;
⑤ML框架的任務調度器從CPU隊列和GPU隊列中取得任務描述,并根據任務描述及調度算法,確定每個任務將要發送的執行器;
⑥調度器將任務發送到各個工作節點的CPU執行器和GPU執行器隊列中;
⑦各個工作節點的CPU執行器以及GPU執行器開始按照FIFO的方式執行機器學習中的局部訓練任務,計算局部梯度值;
⑧CPU執行器以及GPU執行器執行計算前,根據任務描述中的數據分片信息,從訓練數據中獲取采樣數據;
⑨各個工作節點的執行器完成任務的運行后,將所有計算出的局部梯度值發送到ML框架;
ML框架收到全部的梯度值后,檢查誤差是否達到訓練模型的精度要求或者是否滿足迭代次數的要求。如果滿足要求,停止訓練;否則,繼續執行①,進行新一輪的迭代計算。這樣不斷地進行迭代訓練過程,最終得到模型參數;
機器學習是一個不斷迭代的過程,每一次迭代都需要計算梯度誤差的變化,然后收集這些變化,為下一次的迭代做準備。分布式機器學習中,采用數據并行的計算模型,各個計算節點上只計算整個數據的一個分片,然后將計算結果發送到PS服務器進行聚合。如果數據分片大小不合適,可能會出現某個工作節點嚴重滯后的情況,導致下一次迭代的延遲,因此數據分片是本調度算法的核心。對于CPU-GPU混合的集群系統,根據CPU執行時間和GPU執行時間來決定分片的數據大小,使一個分片對應一個計算任務,從而產生大量的任務。這些任務在執行過程中,會根據各自的分片信息,讀取相應的數據,按照各自的類別在相應的計算資源上進行計算。其計算過程如算法1所示。
ML-FrameWork 是ML框架的主函數,也是PS服務器所在的節點。ML-FrameWork首先得到CPU-GPU集群中的CPU資源數量和GPU資源數量(s1),然后進入迭代過程中(s2~s8)。(s3)獲得各個數據分片任務計算的梯度值,進行聚合計算;(s4)根據CPU和GPU數量、訓練數據大小以及CPU任務與GPU任務之間的加速系數,將數據劃分為大小不同的數據塊;(s5)對于較小的數據塊,產生CPU任務描述,放入CPU執行隊列;(s6)對于較大的數據塊,產生GPU任務描述,放入GPU執行隊列;(s7)是ML-FrameWork等待CPU任務隊列和GPU任務隊列的執行同步。
WorkerIterate運行在各個工作節點的執行器上,是計算局部梯度的函數。它可以使用CPU資源或GPU資源進行局部梯度計算。(s1)更新并保存來自PS服務器的新的模型參數;(s2)計算梯度值,其中最為關鍵的是獲得數據的分片信息,然后讀取對應的訓練數據,通過分片信息中包含的計算資源信息,使用不同的計算資源計算出新的局部梯度值;(s3)將計算出的局部梯度值按照一定的標準格式組織起來并返回給ML-FrameWork。
算法1梯度優化的分布式機器學習框架算法
Begin ML-FrameWork:
(s1)x=cpus,y=gpus
(s2) for iterationt=0,1,…,Tdo
(s7) sync
(s8) end for
End ML-FrameWork
Begin WorkerIterate(t):
End WorkerIterate
Schedule函數描述從隊列中取出任務并提交到工作節點的過程,如算法2所示。任務調度器從隊列取出一個任務描述,根據任務的類型,如果是GPU任務,執行(s1),根據任務描述中的IP地址,將任務的分片ID、數據分片的起始位置和數據長度發送到對應工作節點的GPU執行器(s2),請求GPU執行器執行;反之,執行(s3),發送任務到CPU執行器(s4)。
算法2任務調度算法
Begin Schedule
(s1) while(Task=gpu-queue.deque())
(s2) launchTask to GPU
(s3) while(Task=cpu-queue.deque())
(s4) launchTask to CPU
End Schedule
系統在一個集群上進行實驗,集群中包含6臺NF5468M5服務器,作為計算節點;1臺中科曙光服務器620/420,作為參數服務器節點。每個服務器節點包含2顆Xeon2.1處理器,每個處理器包含8個核(相當于一個服務器節點具有16個CPU核),32 GB DDR4內存,2塊RTX2080TI GPU卡,10 GB顯存。集群包含1臺AS2150G2磁盤陣列。服務器操作系統為Ubuntu 7.5.0,CUDA版本為10.1.105,采用C++11作為編程語言,軟件編寫采用NVIDIA CUDA工具和C++。
考慮使用一種通用的數據分析算法K-Means進行實驗驗證和分析。K-Means算法是一個迭代求解的聚類算法,是實驗分析中常用算法,且具有代表性。實現了一個CPU版本和GPU版本的K-Means程序,使用C++語言來編寫程序的CPU版本,NVIDIA CUDA來編寫程序的GPU版本。調度框架和執行器使用C++語言編寫。調度框架和執行器通過實現上述算法,完成對K-Means分布式機器學習作業的執行。
使用3種資源分配策略來比較K-Means算法的梯度計算的過程,圖3為使用3種策略的作業執行時間比較。

圖3 使用不同調度算法的K-Means作業執行時間
1) 每個計算節點采用16個CPU核來計算數據的梯度,在任務調度過程中,數據均勻分片,1個任務綁定1個CPU核,即當1個計算節點有1個CPU核處于空閑狀態時,分配1個數據分片對應的任務到該空閑CPU核。稱該算法為CPU算法(KM-CPU)。
2) 每個計算節點使用1個CPU核以及1個GPU設備,GPU設備綁定該CPU核。這時稱被綁定的CPU核處于非自由狀態,反之為自由狀態。在任務調度過程中,數據均勻分片,1個任務綁定1個GPU設備,即當該節點GPU設備空閑時,分配1個數據分片對應的任務到該空閑GPU設備,稱該算法為GPU算法(KM-GPU)。
3) 每個計算節點使用16個CPU核及1個GPU設備,將每個節點中的GPU設備綁定1個CPU核。這時,1個計算節點上擁有1個非自由狀態的CPU核和15個自由狀態的CPU核。ML框架按照本文提出的算法進行數據的不均勻分片,1個分片對應的任務綁定1個自由狀態的CPU核或者1個GPU設備,當自由狀態的CPU核空閑時,提交1個具有較小的數據分片的任務,當GPU設備空閑時,提交1個具有較大的數據分片的任務。該算法稱為混合資源調度算法(KM-Hybrid)。
圖3包含3組數據,分別代表使用KM-CPU算法、KM-GPU算法和KM-Hybrid算法對應的作業執行時間。每個節點測試3次,取平均值進行統計。其中,橫坐標代表集群節點數目,縱坐標代表使用各算法的作業執行時間。從實驗中可以得到2個結論:①使用KM-GPU和KM-Hybrid算法的作業執行時間明顯少于KM-CPU算法,這是因為GPU設備的運算能力遠高于CPU設備,說明使用GPU計算資源可以明顯降低K-Means作業的執行時間;②隨著節點增加,計算設備增加,3種算法用時逐漸減少,性能提升逐漸變慢,這是由于每一個分片包含的數據量變少,且當節點數目過多時,節點通信開銷成為影響算法性能提升的重要因素。因此,使用本文提出的算法執行分布式機器學習作業,能夠加快作業的執行,且能夠有效提高CPU-GPU集群中CPU計算資源的利用率,不再只是將CPU計算資源閑置。
考慮到上述實驗并未說明KM-Hybrid相較于KM-GPU算法的具體優勢,下面探究隨著節點增加,KM-GPU和KM-Hybrid算法加速比。加速比是衡量算法性能常用指標,表示為s(n,p)=Tserial(n)/Tparallel(n,p),其中n表示數據處理規模,Tserial(n)表示作業串行計算用時,Tparallel(n,p)表示作業并行計算用時。圖4為KM-GPU和KM-Hybrid加速比對比情況。其中橫坐標代表節點個數,縱坐標代表加速比。比值越大,說明并行計算加速效果越好。在圖4中可以得出結論:隨著節點數目增加,2種算法均表現出較好的加速;但隨著節點數目增加,KM-GPU加速比增長逐漸緩慢,KM-Hybrid加速比增長緩慢并出現回落現象,分析后得出原因:隨著節點增加,通信延遲和調度處理開銷增加,2種算法的加速比增長緩慢,且KM-Hybrid算法對通信和調度延遲更敏感。

圖4 KM-GPU和KM-Hybrid加速比
為了進一步探究本文中提出的不均勻數據分片策略為分布式機器學習作業帶來的性能提升情況,現對KM-GPU和KM-Hybrid算法單次梯度計算時間進行了統計,其結果如圖5所示。在圖5中,橫坐標為集群節點數目,縱坐標為單次梯度計算平均值。隨著計算節點增加,2種算法單次梯度計算任務的平均時間均呈現非線性減少,主要原因是:①數據分片規模對梯度計算用時有很大的影響。隨著節點增加,并行任務數目增加,單個分片數據量變少,計算設備計算時間減少;②節點的增加會造成分布式機器學習中I/O通信開銷增加,特別是通過網絡傳輸的代價會增加,導致單次梯度計算用時減少的速度越來越緩慢。基于以上兩點,KM-GPU算法和KM-Hybrid算法單次梯度計算的平均時間會呈非線性減少。

圖5 梯度計算任務平均時間
上述實驗過程主要探究了集群內CPU計算設備和GPU計算設備之間對作業調度的影響,但是還沒有探究集群中不同數量GPU對作業調度的影響。為了更加明確GPU數量對分布式機器學習作業的影響,針對不同數量的GPU進行了K-Means算法附加實驗,實驗共測試4種不同情況:
1) 每個節點使用1個GPU設備和1個CPU核,GPU設備綁定該CPU核,該算法記為KM-1-GPU,相當于上述KM-GPU算法。
2) 每個節點使用2個GPU設備和2個CPU核,1個GPU設備綁定1個CPU核。該算法記為KM-2-GPU,其任務分配方式與步驟1)中相同,但計算資源量是步驟1)的2倍。
3) 每個節點使用1個GPU設備和16個CPU核,16個CPU核中有1個非自由狀態核和15個自由狀態核,數據按照自由狀態的CPU核以及GPU處理能力來分片,將較大的數據分片分配給GPU,較小的數據分片分給CPU。該算法記為KM-1-Hybrid,相當于上述KM-Hybrid算法。
4) 每個節點使用2個GPU設備和16個CPU核,16個CPU核中包含2個非自由狀態核和14個自由狀態核。任務分配方式同步驟3)。該算法記為KM-2-Hybrid。
圖6為不同GPU數量下K-Means算法作業執行時間的測試結果??梢缘玫饺缦陆Y論:①由于節點數目增加,CPU和GPU計算資源增多,4種算法性能均有提升。②KM-2-GPU比KM-1-GPU算法作業執行時間少,KM-2-Hybrid比KM-1-Hybrid算法作業執行時間少,即GPU設備越多,作業執行越快,算法性能越好。③KM-1-Hybrid比KM-2-GPU算法作業執行時間少,說明集群內單純增加GPU計算資源帶來的作業性能提升不如將集群中已有的閑置CPU利用起來對作業的性能提升大,因此可以考慮使用不均勻數據分片策略,將集群中空閑或部分空閑的CPU利用起來。

圖6 不同GPU數量時的作業執行時間對比
為了進一步驗證論文提出的不均勻數據分片策略對分布式學習帶來的性能提升,使用Rodinia[19]基準測試套件驗證實驗效果,該套件包含huffman、K-Means等單節點基準程序。圖7為Rodinia K-Means基準測試用時和KM-Hybrid用時對比情況,橫坐標表示實驗次數,縱坐標表示作業運行時間。如圖所示,R-16-CPU表示在單節點上使用16個線程進行K-Means計算,R-1-GPU表示在單節點上使用1塊GPU進行K-Means計算,KM-Hrbrid表示在單節點上使用1塊GPU,15塊CPU進行K-Means計算。數據規模為819 200×100,3組數據平均值分別為:33.87,29.83,23.8 s,方差分別為1.079,0.224,3.443??梢缘玫饺缦陆Y論:①使用GPU進行加速的效果比使用多線程加速的效果好;②KM-Hybrid算法比上述2種算法效果更好,這是由于在節點上既使用了GPU進行計算加速,又利用了閑置的CPU;③KM-Hybrid算法的穩定性不如Rodinia基準測試,這和數據規模及程序運行時CPU、GPU設備的性能相關,可以對其進一步探究。

圖7 基準測試用時對比
上述實驗可以得出,本文提出的算法可以實現對作業的加速并提高異構集群資源利用率,但是其執行效果受到CPU和GPU實時性能的影響,穩定性較差。
為了進一步分析算法對作業質量的影響,使用輪廓系數[20]作為衡量KM-Hybrid作業質量的標準。數據規模為8 192×100,每項測試進行10次,取平均值作為作業質量評估值。輪廓系數越接近1,算法執行質量越好。經計算,R-16-CPU算法輪廓系數均值為0.567 996,R-1-GPU算法輪廓系數均值為0.540 185,KM-Hybrid算法輪廓系數均值為0.538 466,3種算法輪廓系數相近,由此可以得出結論:本文基于不均勻數據分片策略的機器學習方法對作業質量沒有顯著影響。
通過CPU-GPU混合異構集群進行分布式機器學習訓練已經成為一個趨勢,但是在這個過程中經常存在集群資源得不到充分利用的現象。為此,論文提出了一種不均勻分片的資源調度算法,并證實該算法能夠加快分布式機器學習訓練,提高集群系統資源利用率。但是,考慮到算法受制于CPU和GPU資源的任務分配方式,如何更加精確合理地對CPU與GPU任務進行資源分配,是今后的研究方向。