侯佳正,張紹陽,陳博遠
長安大學 信息工程學院,陜西 西安 710064
Magic 作為一款著名的電磁模擬商業軟件,可以通過饋入參數[1]仿真計算輸出功率。為了確定最優參數,開發了Magic 迭代計算軟件進行參數的優化,但該軟件是一個單機版本的軟件系統,由于解決相關領域問題所需的計算量大,使用該軟件完成每次迭代計算存在耗時長的問題。為了解決單機軟件耗時長的問題,目前常用的方法大約有以下幾種:張朝金等[2]對Bellhop 傳播模型算法進行改進,利用多線程技術,建立了穩定可靠的并行模型算法,實現了聲場的快速預報,提高了運行效率。劉俊見等[3]采用OpenMP[4]并行化技術,將可并行化的任務顯式的使用多線程的方法進行并行計算,顯著提高了側向散射激光雷達數據處理的效率。但是由于該Magic 迭代計算軟件的任務要開啟多個Magic 進程使其進行計算,且Magic 軟件作為成熟的商業軟件無法對其自身進行改造,故無法采用上述方法在線程級別進行改造。
隨著大數據的興起和發展,分布式計算技術實現了跨越式發展并被廣泛應用。可以使用MapReduce[5?7], Spark[8?9]、Storm[10]并行計算框架對特定領域的問題進行并行處理[11]。焦凱琳等[10]使用Hadoop 的HDFS 文件系統和分布式數據庫HBase 對海量的物流數據進行分布式存儲和管理,使用MapReduce 和Storm 并行計算框架實現批數據處理的分析研判業務以及一些與數據實時處理相關的查詢跟蹤業務。李業田[12]使用分布式文件系統HDFS 實現海量數據的存儲,采用并行處理框架MapReduce 對海量的電信數據進行并行處理。但是采用這種方法需要大量的軟硬件的支持,要針對具體業務搭建大數據平臺,成本較高;同時這種方法主要是對大批量的數據進行處理,更多的適用于數據挖掘和機器學習,并不能很好地實現特定軟件的并行化。
本文提出了一種基于Microsoft HPC 并行計算框架的解決方案,可以利用現有的硬件環境,基于Windows 操作系統搭建一個并行計算平臺,實現多個Magic 程序在多臺計算機上并行計算,解決耗時長的問題。
Magic 軟件是一款著名的電磁模擬軟件,可以通過饋入參數仿真計算輸出功率。為了確定最優的參數,實際工作中采用Magic 迭代計算軟件迭代計算進行參數確定,具體流程如圖1 所示。

圖1 Magic 迭代計算軟件流程
該程序為一個單機運行程序,該程序依據用戶在用戶界面上設置的一系列參數生成指定數量的參數文件,然后啟動相同數量的Magic 進程進行計算。計算完成后,根據計算結果,通過遺傳算法對參數進行優化,生成下一代的參數文件,再進行計算。通過迭代幾十代或上百代,直至優化出最優的參數。
該Magic 迭代計算軟件迭代一次大約需要花費50 min,迭代出最優的參數大約需要花費4~5 d的時間。
經研究發現制約運行速度的是多個Magic 進程在單臺計算機上進行計算這一步驟,由于每代求解的是多個具有獨立的幾何邊界條件的相似模型,是一個易并行問題,故提出將Magic 軟件放在多臺計算機上進行并行計算的構想。通過技術論證,最終提出了采用Microsoft HPC 將Magic 迭代計算軟件進行并行化的技術架構。
集群的架構如圖2 所示。采用Microsoft 的HPC 平 臺,通 過 使 用Microsoft HPC Pack 把 處 于一個局域網內的多臺計算機搭建成一個計算機集群:集群中頭節點裝有Windows server 操作系統,主要對計算節點進行監控和Magic 進程的分配和管理;計算節點利用Windows 操作系統(如Window 7)對頭節點分配的計算任務進行計算,在每個計算節點上設置共享文件夾,可以將Magic運行結果存儲到某一指定的共享文件夾中。

圖2 集群的架構
改進的Magic 迭代計算軟件首先連接到集群的頭結點,然后指明任務(即Magic 程序)的絕對路徑、輸入文件的絕對路徑、結果輸出路徑、程序要占用的CPU 內核數等信息,生成一代所需的任務數,組成一個作業。將作業提交到頭結點,頭結點按照分配策略在可用的計算節點啟動一定數量的Magic 進程。計算節點在計算完成后,將計算結果存儲到指定的共享文件夾中。頭結點可以對計算節點上的每個Magic 進程進行監控,可以獲得每個計算節點Magic 進程完成的進度、所花的時間等狀態信息,也可以終止掉異常的Magic 進程。改進的Magic 迭代計算軟件可以向集群的頭結點發送信息,可以獲得Magic 進程的狀態信息和對Magic 進程進行控制和管理,流程如圖3 所示。

圖3 改進的Magic 迭代計算軟件工作流程
3.1.1 頭結點的部署與配置
在已安裝服務器操作系統(如Windows server 2016)的計算機上添加域服務,并將該計算機添加到域中。使用Microsoft HPC Pack,創建頭結點。
使用HPC Pack 群集管理器配置網絡拓撲,圖2 集群的架構圖所展現的為其中的一種網絡拓撲關系。
創建不同級別的節點組,即將可用的計算資源進行分組,使每組擁有不同數量的計算資源。如可以使某組擁有集群中所有的計算資源,保證計算時的性能最好。本文只設置了一個組,該組中包含所有的計算節點。
創建作業模板,在向集群提交作業時使用。在作業模板中可以設置作業放在哪個或哪幾個節點組上進行計算,防止占用整個集群的計算資源,影響他人的使用。可以設置作業的最大運行時間,設置提交作業的優先級,也可以限定該作業模板的使用權限等。
3.1.2 計算結點的部署與配置
在Windows 計算節點上開啟HPC pack 安裝向導,可以選擇創建工作站節點或選擇計算節點將計算節點加入現有HPC 群集。輸入頭節點名稱,完成安裝。通過HPC Cluster Manager 軟件在節點管理中為每個節點套入節點模板,并將剛加入到集群中的節點添加到某個計算組中,以增加該組中可用的計算資源的數目。因為作業模板會要求選擇相應的節點組,在進行并行計算時會使用該組的計算資源。
注意事項:1)配置IP 和DNS,IP 地址確保和主節點在同一個局域網內,DNS 服務器的地址設置為頭節點的IP 地址。2)設置計算機名及域名:設置易于和其他計算機區分的計算名便于在通過程序生成的日志文件查看每個計算節點上被分配了多少Magic 進程;設置域名:域名為配置頭節點時設置的根域名。
要求每個計算節點的Magic 進程在啟動計算時能讀取到參數文件,且當各個計算節點計算完成后,能把計算結果匯總到一起,方便用戶查看。
由于Windows 提供了在局域網中文件共享機制,故在每臺計算機上設置了一個共享文件夾,在提交作業之前,用戶可以通過Magic 迭代算法軟件的前臺界面設置共享文件夾的絕對路徑。這樣,在局域網中的每臺計算節點在計算時,就可以從共享文件夾中讀取所需的參數文件;計算完成后,就會將結果輸出到該共享文件夾下。
用戶只需在用戶界面上配置好所需的參數,程序會自動進行迭代并將作業提交到集群上進行計算,實現集群對用戶的透明化,簡化用戶的操作,提升用戶體驗。改進的Magic 迭代計算軟件既可以放到計算節點上運行,又可以放在頭節點上運行。
Magic 迭代計算軟件的改進主要包含以下3 點:
1)用戶名密碼的設計
在Magic 迭代計算軟件的前端設置登錄界面,將用戶名密碼和之前創建的作業模板綁定在一起,存放在數據庫中。不同的用戶登錄后,在提交作業時從數據庫中讀出相對應的作業模板,進而實現不同的用戶在提交作業進行計算時使用不同的計算資源,達到資源合理利用的目的。在提交作業時,在作業名稱上加上用戶名,這樣管理員可以知道哪些用戶正在使用集群資源。
2)計算任務的提交
Microsoft HPC pack SDK 提 供 了 可 供 二 次 開發的API 接口[13],通過編程調用相應的接口實現集群的連接和將每一代的Magic 程序放到集群上進行計算的操作,從而實現將耗時耗資源的計算采用并行方式完成。
通過調用API 相應的函數可以設置作業使用的作業模板,Magic 進程要使用的內核數,以到達合理利用集群中計算資源的目的。
3)日志文件的編寫
當進行集群計算時,編寫相應的日志文件,用來統計一個作業提交到集群上的時間點:每個Magic 進程被分配到哪個計算節點上,計算每個Magic 所花的時間;每個計算節點被分配的任務數,用于集群計算所花的時間;每個作業完成的時間點、所耗時長和檢查每個任務是否計算出了結果,一些錯誤提示等一系列的信息。通過統計以上信息,可以和單機運行所花費的時間進行比較,判斷是否可以提升計算效率。可以清楚地判斷每個計算節點計算快慢,可以棄用計算較慢的計算節點。
在并行化過程中遇到了一些問題,下面對出現的問題進行探討并給出相應的解決辦法。
1) Magic 進程沒有進行計算。
本文使用工作站作為計算節點,每個工作站有32 個CPU 內核,在實驗時使用2 臺相同的工作站充當計算節點,設置每個Magic 進程使用的CPU 內核數為1,當給每臺工作站分配超過24 個Magic 進程時,會出現部分Magic 進程沒有進行計算,卻顯示計算完成的情況。針對這種情況,本文采取了下面的措施:作業提交后,在獲取作業的完成進度過程中,每當進度發生變化時,代表有Magic 進程計算完成,此時獲取任務的列表,通過檢測已完成的任務是否生成完整的計算結果文件,來判斷Magic 進程是否計算完成,如果沒有完整的結果文件,將該任務再次提交到集群上進行計算。
2)算例在計算完成后無法停止。
在搭建的測試集群平臺上經測試發現,在計算節點上,部分Magic 進程在計算完成后,所有的結果文件已經生成,但是卻無法自己停止,在集群中顯示該Magic 進程正在運行,這樣導致某一次迭代無法完成,無法生成下一次迭代所需的參數文件,無法進入下一次迭代,大大降低了運算的效率。
針對這種情況,因為在作業模板中可以設置一個作業最大運行時間,所以規定了一個作業最大運行時間的值,到規定的時間,終止掉這一代。但是發現參數文件不同,每個Magic 進程計算所需的時間不同,無法準確得知每一代最大的運行時間。如果最大運行時間設置得過大,計算完成,Magic 進程遲遲無法停掉,同樣也會增加每一代運行的時間,降低計算效率;如果每代計算時間設置的過小,部分Magic 進程還沒有計算出結果,就被強行終止掉了,會使下一代無法生成較好的參數,甚至會導致最終無法生成最優的參數。
依據Magic 無法自動終止,就利用集群的頭結點強行停止掉的思想,在作業正在運行時每過一段時間(如20 s),獲取Magic 進程列表,檢測正在運行的Magic 進程,看所有的結果文件是否已經存在,如果已存在,可將該Magic 進程終止。這樣可以做到及時終止計算已完成但未自動結束的Magic 進程。
應當注意的是,由于在程序中反復通過調用API 函數獲取作業的任務列表,如果任務列表比較大,會占用較大的內存,在使用完成后,沒有及時的釋放掉,會造成內存泄漏的問題。所以在使用完任務列表后要及時的釋放掉,可以通過調用ISchedulerCollection::Clear 函數進行釋放,以免造成程序出錯。
3)為每個計算節點分配的最大任務數。
經實驗發現,在搭建的集群平臺上,在把多個Magic 進程分配到集群上時,當一次迭代的Magic 進程過多,超過了一臺計算節點可用的CPU內核數時,集群頭節點會把任務循環分配到可以使用的計算節點上。如可用的計算節點有3 個,第1 個任務會分配到第1 臺計算節點上,第2 個任務會被分配到第2 個計算節點上,第3 個任務會被分配到第3 個計算節點上,第4 個任務又會被分配到第1 個計算節點上,依次循環,有1 個計算節點上的內核被分配完就不再給該計算節點再分配;當一代中包括的Magic 較少時,集群會將所有的Magic 進程分配到一個計算節點上。
為每個計算節點分配的Magic 進程數應根據CPU 的利用率、每個計算節點上所有Magic 計算完成的時間和集群用戶數量這3 個指標來確定。
每臺工作站都是多核CPU,如果每個Magic進程占用CPU 的1 個內核,1 個計算節點被分配的Magic 進程數為CPU 的內核數,計算節點的CPU 利用率會很高,甚至會達到100%。有的計算節點不僅要滿足集群運算的需求,還要滿足用戶正常的使用,如果CPU 的利用率過高,則無法滿足用戶對計算機的正常使用;CPU 的利用率過高,也會導致1 個計算節點上多個Magic 進程之間相互影響,1 個計算節點上任務完成的時間增加。如果在多核工作站上分配的Magic 進程過多,會存在許多顯示計算完成卻沒有進行計算的Magic 進程,雖然重復提交可以解決該問題,但是還是會略微增加迭代一次所需的時間。
如果1 個計算節點被分配的Magic 進程數少于CPU 的內核數,CPU 的利用率就會下降,1 個計算節點上分配的Magic 進程相互之間影響較小,完成時間縮短,但是整個集群能并行運算的算例總數量就會下降。假如集群中的計算節點的數量一定,不再增加,多個用戶同時使用集群,就可能會出現部分用戶提交的任務會處于排隊狀態。所以,要把這3 個因素綜合考慮,取得一個最優值。
綜合以上所有因素,本文經實驗發現當1 臺計算機擁有的CPU 內核數較多時,設置每臺計算節點最大可用于計算的內核數為每臺計算節點擁有CPU 內核數的 [ 2/3]為宜,規定每個Magic 進程計算使用的內核數為1 即可。
值得注意的是,只有先在HPC Cluster Manage軟件中把每臺計算節點進行脫機后,才能使用該軟件設置每個計算節點可以使用的最大內核數,且可用的最大內核數只能設置為偶數。
由于在進行Magic 進行并行化時,要求集群具有容錯能力,即1 個計算節點宕機的情況。經過實驗論證發現,當某個計算節點在運行Magic 進程時出現了宕機的情況,該機上計算任務不會失敗,任務會被重新收回,狀態變成排隊狀態,當有可用的計算資源時,任務會被重新分配出去,完成計算;當1 個計算節點發生故障時,集群將不會分配Magic 進程給該計算節點。1 個計算節點出現故障,不會影響整個集群的正常使用。
本文在Magic 迭代算法軟件的前端界面上設置好Magic 程序所需的參數信息,使用搭建好的2 臺相同的工作站集群充當計算節點,用于Magic 程序的運行,每臺工作站擁有32 個CPU內核,同時準備1 臺相同的工作站進行單機迭代優化參數。
經過測算在工作站上單獨運行一個Magic 進程,計算完成平均花費15 min。程序每次迭代會生成44 個Magic 進程。由于我們設定的每臺計算節點可用的最大內核為22 個,每個Magic 進程占用1 個CPU 內核,故每次迭代44 個Magic 進程可以同時進行計算,沒有排隊現象。對于單機的magic 進程一般習慣設定同時開啟的Magic 進程數為工作站的最大內核數,故一次開啟32 個進程。集群和用于單機迭代優化參數的工作站都沒有運行其他程序。
放在集群上進行迭代,44 個Magic 進程計算完成平均所花的時間為22 min。而在單機上完成44 個Magic 進程計算平均花費40 min。說明使用較單機多一倍的計算資源,計算速度大約提升了一倍,加速比約為2。通過實驗數據比對發現該方法能提高計算效率,所以該方法是行之有效的。
本文以單機Magic 迭代計算軟件為研究對象,針對每代開啟多個Magic 程序、運行效率低下的問題,提出了一種基于Microsoft HPC 的并行化方法,提高了計算速度。
1)本文采用了共享存儲的方法,使用共享文件夾實現多臺計算機計算開始前讀取所需參數,計算完成后存儲計算結果的功能。
2)本文提出基于Microsoft HPC 的方法實現Magic 迭代計算軟件的并行化,將每代的Magic 程序分配到多臺計算機的不同計算單元上進行計算,既利用了閑置的計算資源,又提高了計算效率,且成本低。為解決同類問題提供了一種可行的思路和方法。
在未來的工作中,可以深入的研究一下在并行計算過程中出現的個別Magic 進程沒有進行計算以及部分算例在計算完成后無法自行停止問題的真正原因。