韋建文, 王 杰, 文敏華, 王一超, 林新華
(上海交通大學(xué)網(wǎng)絡(luò)信息中心,上海200240)
上海交通大學(xué)高性能計算平臺的計算能力位居全國高校前列[1],自2013年上線以來,常年滿負荷運行,已累計為校內(nèi)300多個課題組提供超過5億核小時的計算服務(wù)。為支持用戶高效完成計算任務(wù),除了穩(wěn)定可靠的硬件環(huán)境,還需要靈活易用的軟件環(huán)境。在每年2 000多人次技術(shù)咨詢中,“如何安裝軟件”占了60%。為應(yīng)對這種情況,中心配備了一名員工專職從事應(yīng)用編譯,在過去一年新增了71個計算軟件庫,進行了205次版本更新,可用軟件包總數(shù)超過200個。
2019年9月上線的第二代校級高性能計算平臺,計算能力提升了10倍,理論性能達到2PFlops??梢灶A(yù)期的是,用戶必將對軟件種類和易用性提出更高的要求。如何構(gòu)建一個軟件種類豐富、運行高效、調(diào)用方便的軟件環(huán)境,是維護高性能計算平臺的一個難題。本文將著重介紹構(gòu)建高性能計算軟件環(huán)境的主要挑戰(zhàn)、軟件包管理器的概念、如何使用Spack軟件包管理器以及使用Spack構(gòu)建上海交通大學(xué)的超算軟件環(huán)境。
如圖1所示,編譯一個高性能計算軟件需要準備好軟件源代碼以及依賴軟件庫,通過構(gòu)建工具編譯出可執(zhí)行程序,整理出軟件模塊文件供用戶調(diào)用。
圖1 軟件編譯流程
構(gòu)建一個面向高性能計算軟件環(huán)境存在如下挑戰(zhàn):
(1)軟件數(shù)量多。常用的高性能計算軟件多達上百種,若算上軟件在版本、編譯器、優(yōu)化選項上的變種,構(gòu)建軟件環(huán)境需要重復(fù)上千次準備源代碼、編譯、撰寫模塊的操作。
(2)編譯流程差異大。常用的軟件編譯工具就有Autotools[12]、CMake[13]、Maven[14]、SCons[15]等10 余種,用法上差異較大,需要投入大量時間才能熟練掌握這些工具。
(3)維護環(huán)境模塊工作量大。供最終用戶使用的環(huán)境模塊文件,必須與軟件版本一一對應(yīng),手動維護模塊文件難以保證內(nèi)容的正確性。
(4)軟件版本共存。出于性能、穩(wěn)定性和結(jié)果一致性的考慮,高性能計算平臺需要提供同一個軟件的多個版本供用戶使用,這需要在安裝時設(shè)計好安裝路徑,避免路徑?jīng)_突。
(5)軟件管理角色不清晰。在現(xiàn)有方法中,系統(tǒng)管理員擁有特權(quán)可以部署全局可用的軟件,普通用戶因無特權(quán)而很難從基礎(chǔ)庫開始構(gòu)建自定義的軟件環(huán)境。
為了應(yīng)對構(gòu)建軟件環(huán)境的挑戰(zhàn),一類被稱為軟件包管理器(Software Package Manager)的工具應(yīng)運而生。這類工具屏蔽了不同軟件在獲取、編譯和加載過程中的差異,為用戶提供了一個統(tǒng)一的軟件包管理接口,在類UNIX操作系統(tǒng)上獲得了廣泛應(yīng)用,例如Yum、Apt、BSD Ports等。一些針對高性能計算軟件環(huán)境的包管理器在此基礎(chǔ)上改進,如OpenHPC、Anaconda、EasyBuild、Spack 等。此外,Docker和Singularity等基于容器技術(shù)的軟件部署方法,也獲得了越來越多的關(guān)注。這些軟件包管理器的主要特性見表1。
表1 軟件包管理器對比
OpenHPC[6]是一個基于Yum的軟件包管理工具,以預(yù)編譯包提供x86和ARM平臺的常用高性能計算庫。OpenHPC需要使用管理員權(quán)限安裝,系統(tǒng)中只能保留軟件的一個版本。
Anaconda[7]是基于Pip的軟件包管理器,用于管理Python擴展包和一般的科學(xué)計算軟件包。Anaconda可以把軟件安裝在用戶家目錄,不需要管理員特權(quán),并可以創(chuàng)建多個相互隔離的軟件環(huán)境。
Docker[8]和Singularity[9]是基于容器技術(shù)的軟件封裝技術(shù),他們將軟件連同系統(tǒng)庫一起打包,構(gòu)建出一個共享宿主節(jié)點內(nèi)核的運行環(huán)境。應(yīng)用只需要打包一次就能在支持容器技術(shù)、同一指令集架構(gòu)的操作系統(tǒng)上運行。
EasyBuild[10]和Spack[11]借鑒了BSD Ports,將軟件編譯過程中的關(guān)鍵步驟抽象成一系列函數(shù),用戶使用函數(shù)而非具體執(zhí)行的命令描述編譯過程,在實際執(zhí)行時包管理器根據(jù)用戶編寫的流程完成下載源代碼包、解壓、編譯、安裝的流程。這兩個工具都可以方便地以普通用戶權(quán)限安裝軟件,且已支持超過1 000種科學(xué)計算軟件。Spack安裝簡單,命令行提供了豐富的編譯選項,評估試用后被選中用于構(gòu)建上海交通大學(xué)高性能計算平臺的軟件環(huán)境。
Spack只需要Python和GCC編譯器就能工作,安裝過程非常簡單,不需要管理員特權(quán),只要將源代碼克隆到本地即可使用。
$ git clone https://github.com/spack/spack.git
$ cd spack/bin
$ ./spack-v
Spack使用install命令安裝軟件包,這個命令可指定軟件版本、軟件功能、優(yōu)化選項、編譯器、依賴軟件包等編譯參數(shù)。如圖2所示,使用Spack安裝aoflagger[12]2.10.0 版本,指定編譯器優(yōu)化參數(shù)(cflags)為“-O2”,使用符號“%”指定編譯器為Intel編譯器18.0.3,使用“^”符號指定依賴軟件為casacore 2.4.1版本,并要求在casacore上開啟對python的支持。
圖2 Spack安裝軟件示例
編譯軟件時,Spack根據(jù)命令行指定的選項,讀取與軟件包對應(yīng)的package.py包文件,解析軟件包下載地址、特性選項、依賴和沖突、編譯方式,然后編譯軟件。aoflagger軟件的包文件片段如圖3所示。
圖3 Aoflagger的package.py示例片段
其中,class指定軟件包類型,以決定使用什么工具編譯這個軟件,Spack支持的軟件包類型包括AutotoolsPackage、CMakePackage、MakePackage 以及一般的Package等;home和url分別用于指定軟件主頁和下載地址;version指定軟件包的版本和校驗和,確保用戶下載的軟件源碼包是正確的;variant用于描述軟件支持的特性,常見的如是否開啟對openmp、mpi、python的支持等,使用者可以在spack install選項中通過“+”或“~”符號開啟或關(guān)閉這些特性;depends_on和conflicts指令用于描述這個軟件依賴的其他軟件包,或是與之沖突的軟件包、編譯器等。
Spack將遞歸地構(gòu)建出一個包含軟件及其依賴包的有向無圈圖(directed acyclic graph,DAG),以此指導(dǎo)編譯過程。編譯aoflagger的有向無圈圖如圖4所示,Spack將從下到上依次編譯依賴包最后編譯aoflagger。
圖4 Aoflagger軟件包依賴關(guān)系
高性能計算系統(tǒng)普遍使用環(huán)境模塊[13](Environment Module)調(diào)用軟件,環(huán)境模塊通過修改“PATH”“CPATH”“LD_LIBRARY_PATH”等環(huán)境變量動態(tài)地調(diào)用軟件。為軟件的每一個版本及其依賴庫手工編寫模塊文件,其工作量很大,Spack通過RPATH和自動生成模塊降低了軟件調(diào)用的難度。Spack在編譯時使用RPATH參數(shù)將依賴庫的路徑寫入了編譯出的二進制程序中而無須依賴環(huán)境模塊提供的LD_LIBRARY_PATH。每一個安裝的軟件唯一地對應(yīng)了一個有向無圈圖,Spack在軟件安裝路徑中添加了這個圖的散列值,從而保證同一軟件的不同編譯版本或變種能唯一地確定,不會發(fā)生路徑?jīng)_突。Spack根據(jù)軟件的構(gòu)建選項和安裝路徑,可自動生成環(huán)境模塊供用戶調(diào)用。下面的示例展示了通過module命令加載和使用軟件的流程。
$module avail gromacs
gromacs/4.5.5-intel-19.0.4 groamcs/4.5.5-gcc-8.3.0
$ module load gromacs/4.5.5-intel-19.0.4
$ which mdrun_mpi
/lustre/spack/opt/sandybridge/intel-19.0.4/gromacs-4.5.5-f239hfe823gf/bin
使用軟件編譯時間與軟件運行時間來考察Spack性能,與之對比的是手動編譯和Docker編譯。用于測試的程序是基因數(shù)據(jù)處理軟件Samtools[14]和計算流體軟件OpenFOAM[15],前者運行一個單機多線程算例,后者運行一個4節(jié)點MPI算例。
編譯耗時如圖5所示。Samtools編譯耗時差異很小,Docker因為需要下載鏡像,最耗時。OpenFOAM編譯耗時差異大,Docker可以直接使用操作系統(tǒng)預(yù)編譯的OpenMPI庫因而最快;Spack可以自動解決依賴包,可在無人值守狀態(tài)下完成編譯,也比手工方式快。
圖5 編譯時間
運行耗時如圖6所示。單節(jié)點Samtools運行耗時差異很小,Docker多了首次啟動需要的15 s時間。4節(jié)點OpenFOAM運行耗時差異大,手動編譯和Spack安裝的版本基本持平,分別需要603 s和598 s完成計算;而Docker版需要1 028 s,慢了41%。經(jīng)檢查發(fā)現(xiàn),Docker版本使用的操作系統(tǒng)自帶OpenMPI庫沒有加入對Infiniband網(wǎng)絡(luò)的支持,運行過程中使用了低速的千兆網(wǎng)導(dǎo)致多節(jié)點運行效率降低。
圖6 運行時間
綜上,手動編譯和Spack編譯都能發(fā)揮出了高性能計算平臺的應(yīng)有性能。而Docker為保證兼容性優(yōu)先選擇了操作系統(tǒng)預(yù)編譯的軟件包,這在配備了Infiniband等特殊硬件的高性能計算平臺上并不是最優(yōu)方案。使用Spack作為構(gòu)建Docker鏡像工具,以解決Docker應(yīng)用在高性能計算平臺上多節(jié)點運行效率低的問題,是一個可行的方向。
上海交大高性能計算中心摸索出了一套使用Spack構(gòu)建高性能計算軟件環(huán)境的方法,在國內(nèi)率先使用Spack安裝生產(chǎn)環(huán)境上的軟件,構(gòu)建流程如圖7所示。
圖7 基于Spack按角色分工的高性能計算軟件環(huán)境構(gòu)建方法
首先,Spack使用者被分為3類:Spack開發(fā)者,負責(zé)定期從Spack社區(qū)更新軟件包,測試軟件包穩(wěn)定性,并補充Spack缺失的軟件包;系統(tǒng)管理員,根據(jù)Spack開發(fā)者反饋的測試結(jié)果,將軟件的穩(wěn)定版本部署到系統(tǒng)中供所有用戶使用;普通用戶,既可以直接使用Spack部署在系統(tǒng)中的應(yīng)用,也可以只使用Spack部署的編譯器或科學(xué)庫,或者完全從頭用Spack部署自己的軟件環(huán)境。3個角色在相互隔離的環(huán)境中測試與合作,管理員只部署通過驗證的軟件,而開發(fā)者進行的測試不會影響生產(chǎn)環(huán)境,普通用戶可自由選擇復(fù)用或重新構(gòu)建整個軟件環(huán)境。
按類別選擇需要部署的軟件。軟件環(huán)境中的軟件數(shù)量并非越多越好,環(huán)境中共存的軟件數(shù)量越多,生成模塊文件和指定依賴關(guān)系時產(chǎn)生沖突的概率也越大。根據(jù)軟件類型、使用廣泛程度等因素,選擇一個穩(wěn)定可靠的子集部署在軟件環(huán)境中。對于編譯器和科學(xué)庫這類基礎(chǔ)軟件,如GCC、OpenBLAS等,可安裝盡可能多的版本供用戶選擇,并保持一個版本能用至少半年;常用科學(xué)計算軟件會保留最近的2~3個版本,更新頻率要比基礎(chǔ)庫高;對于使用量小的軟件將被部署在特定用戶的家目錄下。
這套分角色分類別的軟件構(gòu)建方法,很好兼顧了只需要運行計算軟件的初級用戶需求和需要構(gòu)建自己軟件環(huán)境的高級用戶的需求。軟件部署前經(jīng)過測試,超過生命周期后有序退出,管理員部署的軟件也能最大限度地復(fù)用,避免了重復(fù)勞動。
本文總結(jié)了構(gòu)建高性能計算軟件環(huán)境遇到的軟件數(shù)量多、編譯流程差異大、維護模塊工作量大、軟件版本共存、軟件管理角色不清晰等挑戰(zhàn),在對比數(shù)個軟件包管理器后,重點介紹了Spack軟件包管理器的安裝方法、工作流程和軟件調(diào)用方法,并通過測試展示了Spack優(yōu)異的編譯速度和高質(zhì)量的編譯結(jié)果。最后介紹了上海交通大學(xué)高性能計算平臺基于Spack的分角色分類別的軟件環(huán)境部署流程,這套流程能涵蓋Spack開發(fā)者、系統(tǒng)管理員和普通用戶的軟件部署需求,為構(gòu)建高性能計算軟件環(huán)境提供了有效方法。Spack收錄的軟件包數(shù)量和功能仍在穩(wěn)步增加,將為高性能計算用戶構(gòu)建特定領(lǐng)域的軟件環(huán)境帶來便利。