肖熠,魯永泉,謝思燁1,
(1. 中國傳媒大學(xué) 計(jì)算機(jī)學(xué)院,北京 100024;2. 中國傳媒大學(xué) 高性能計(jì)算中心,北京 100024)
一種針對(duì)GPU資源的深度學(xué)習(xí)容器云研究
肖熠1,2,魯永泉2,謝思燁1,2
(1. 中國傳媒大學(xué) 計(jì)算機(jī)學(xué)院,北京 100024;2. 中國傳媒大學(xué) 高性能計(jì)算中心,北京 100024)
伴隨深度學(xué)習(xí)的研究發(fā)展,深度學(xué)習(xí)框架成為研究深度神經(jīng)網(wǎng)絡(luò)的重要工具。深度學(xué)習(xí)框架極大縮短了網(wǎng)絡(luò)構(gòu)建與計(jì)算時(shí)間,其強(qiáng)大的計(jì)算能力來源于GPU。但如何有效地在多種框架下合理分配和使用異構(gòu)集群中GPU資源是一個(gè)重要問題。本文提出一種針對(duì)GPU資源深度學(xué)習(xí)容器云架構(gòu)DLC,利用容器易部署、易遷移的特點(diǎn),可以將深度學(xué)習(xí)框架以容器形式快速部署在異構(gòu)集群上,結(jié)合nvidia-docker實(shí)現(xiàn)驅(qū)動(dòng)文件與容器解耦合。DLC以MESOS框架的形式提供服務(wù),通過調(diào)度獲取資源后快速創(chuàng)建對(duì)應(yīng)需求的深度學(xué)習(xí)框架,并加載指定的GPU資源及對(duì)應(yīng)的運(yùn)行庫,實(shí)現(xiàn)特定版本的深度學(xué)習(xí)環(huán)境的快速創(chuàng)建,這對(duì)推動(dòng)深度學(xué)習(xí)發(fā)展具有一定意義。
容器云;深度學(xué)習(xí);Docker;GPU
現(xiàn)如今,深度學(xué)習(xí)不斷推動(dòng)人工智能的發(fā)展,在圖像、自然語言處理、音頻處理等領(lǐng)域獲得巨大突破[1]。深度學(xué)習(xí)框架是深度學(xué)習(xí)開發(fā)者的重要工具,它能快速構(gòu)建各種結(jié)構(gòu)的深度神經(jīng)網(wǎng)絡(luò),通過給定網(wǎng)絡(luò)的輸入和標(biāo)簽數(shù)據(jù),框架會(huì)自動(dòng)進(jìn)行正向傳播計(jì)算和反向傳播計(jì)算來完成神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程,獲得最終模型。但是不同的深度學(xué)習(xí)框架基礎(chǔ)結(jié)構(gòu)與功能有所不同,這使得開發(fā)者需要根據(jù)所求解的網(wǎng)絡(luò)結(jié)構(gòu)類型進(jìn)行選擇,而框架本身又依賴于不同的基礎(chǔ)庫。另一方面,深度學(xué)習(xí)算法對(duì)計(jì)算能力要求高,目前深度學(xué)習(xí)逐漸采用HPC領(lǐng)域的方法加速網(wǎng)絡(luò)訓(xùn)練。使用GPU加速網(wǎng)絡(luò)訓(xùn)練過程中的矩陣運(yùn)算是HPC應(yīng)用的重要方式。在IT產(chǎn)業(yè)的日益發(fā)展下,云計(jì)算這一概念被提出。云計(jì)算將數(shù)臺(tái)計(jì)算機(jī)通過網(wǎng)絡(luò)協(xié)同對(duì)用戶提供服務(wù),擁有高可用性、可擴(kuò)展性和適用性[2]。根據(jù)常規(guī)服務(wù)類型,云計(jì)算可劃分為IaaS、PaaS和SaaS三層。伴隨研究發(fā)展,云計(jì)算領(lǐng)域和HPC領(lǐng)域之間相互借鑒,逐漸形成了相互獨(dú)立又依存的軟、硬件體系結(jié)構(gòu)[3]??v觀HPC和云計(jì)算的發(fā)展,二者采用各自不同的特點(diǎn)共同致力于解決用戶對(duì)集群的使用,HPC致力于提供更強(qiáng)大的計(jì)算能力,而云計(jì)算則側(cè)重于通過抽象使集群更易使用[4]。云計(jì)算系統(tǒng)可以快速幫助用戶構(gòu)建包含所需計(jì)算資源的虛擬主機(jī),如Amazon EC2和阿里云。容器技術(shù)的發(fā)展進(jìn)一步推動(dòng)了云計(jì)算技術(shù)的發(fā)展,為實(shí)現(xiàn)秒級(jí)部署提供支持。利用云計(jì)算技術(shù)將深度學(xué)習(xí)框架與GPU計(jì)算環(huán)境結(jié)合,將擁有強(qiáng)大計(jì)算能力的HPC集群以云服務(wù)的形式對(duì)外提供給用戶,是十分便捷的。
2.1 虛擬化技術(shù)
虛擬化技術(shù)是云計(jì)算技術(shù)的重要內(nèi)容,被廣泛地應(yīng)用到各個(gè)場景中。各大廠商也分別推出各自的虛擬化產(chǎn)品,如KVM、ESXi、Hyper-V等,結(jié)合開源或產(chǎn)品化的集群資源管理器構(gòu)建出云計(jì)算系統(tǒng)的基礎(chǔ)設(shè)施。近幾年,以Docker為代表的容器技術(shù)逐漸成熟,并獲得廣泛的關(guān)注,有些研究者將其作為云計(jì)算2.0的標(biāo)志技術(shù)之一,并制定出了容器標(biāo)準(zhǔn),將以容器為基礎(chǔ)的云計(jì)算系統(tǒng)稱為容器云。傳統(tǒng)虛擬化技術(shù)主要包括完全虛擬化和硬件輔助虛擬化,這兩種方式使得在虛擬機(jī)使用特定功能時(shí)需要硬件對(duì)虛擬化的支持。容器技術(shù)最早源于LXC(Linux Container)[5],與傳統(tǒng)虛擬化技術(shù)不同,容器技術(shù)通過Linux系統(tǒng)cgroup、namespaces等技術(shù)實(shí)現(xiàn)容器間資源隔離,并可以共享內(nèi)核功能[6],實(shí)現(xiàn)輕量級(jí)的虛擬化。在容器技術(shù)中,虛擬化的載體被稱為鏡像,所創(chuàng)建出實(shí)際運(yùn)行的載體稱為容器。與傳統(tǒng)虛擬機(jī)包含完整的操作系統(tǒng)不同,容器中只包含一個(gè)精簡的操作系統(tǒng)。這使得容器可以被快速創(chuàng)建和啟動(dòng)。對(duì)于實(shí)際應(yīng)用,基于容器技術(shù)較基于傳統(tǒng)虛擬化技術(shù)的云計(jì)算系統(tǒng)更貼近于計(jì)算資源。Jacobsen D M和Canon R S.指出容器技術(shù)為科學(xué)計(jì)算領(lǐng)域帶來了變革[7]。已有研究表明,在大部分情況下,容器的性能優(yōu)于傳統(tǒng)虛擬機(jī)[8]。
2.2 GPU資源隔離
在使用GPU作為計(jì)算加速器的應(yīng)用程序中,開發(fā)者通??梢垣@取當(dāng)前系統(tǒng)所有的GPU資源信息,并從中選擇合適的GPU設(shè)備運(yùn)行核函數(shù)。由于應(yīng)用程序無法直接獲取GPU資源的占用情況,當(dāng)多用戶在集群環(huán)境中使用時(shí)會(huì)造成應(yīng)用程序間相互搶奪資源。在一般情況下,先提交的GPU計(jì)算進(jìn)程會(huì)獨(dú)占GPU資源,后提交的任務(wù)會(huì)處于等待狀態(tài)。如何有效地解決多用戶對(duì)GPU的并發(fā)使用,提高GPU資源的利用率是GPU資源隔離的主要目的。GPU資源隔離是將GPU根據(jù)程序的使用需求在運(yùn)行前由系統(tǒng)管理者進(jìn)行分配,多個(gè)程序?qū)PU資源的使用相互獨(dú)立。
傳統(tǒng)GPU資源隔離通常有兩種方式,一種是在Hypervisor層加入vGPU Manager,利用特定GPU的虛擬化硬件支持,通過固定的模式將GPU映射到虛擬機(jī)中,每個(gè)虛擬機(jī)都具有獨(dú)立的顯存與核心,這種方式目前被ESXi所采用[9]。這種方式最大的優(yōu)點(diǎn)來源于GPU硬件對(duì)虛擬化的支持,通過專用硬件可將一個(gè)性能強(qiáng)大的GPU資源拆分為多個(gè)性能較弱的GPU資源使用,通常被用于解決VDI環(huán)境。
另一種是通過CUDA環(huán)境變量CUDA_VISIBLE_DEVICES指定當(dāng)程序運(yùn)行時(shí)所能獲取的GPU編號(hào)實(shí)現(xiàn)隔離。CUDA_VISIBLE_DEVICES的值是一個(gè)由GPU minor number組成的列表,當(dāng)CUDA程序運(yùn)行獲取系統(tǒng)GPU設(shè)備時(shí),系統(tǒng)只會(huì)返回列表中編號(hào)對(duì)應(yīng)的GPU,且會(huì)從0開始根據(jù)列表順序重排minor number,程序會(huì)繼續(xù)從中選擇合適的GPU設(shè)備運(yùn)行核函數(shù)。程序無法獲取列表之外的GPU資源,以此實(shí)現(xiàn)程序進(jìn)程間的GPU資源隔離。與vGPU Manager不同,通過環(huán)境變量的方式是以單一GPU設(shè)備為基礎(chǔ)單位進(jìn)行隔離,與vGPU可以從一個(gè)GPU設(shè)備虛擬為多個(gè)vGPU設(shè)備不同,前者可以將單一GPU設(shè)備映射到唯一的隔離環(huán)境中,后者可以將單一GPU設(shè)備映射到多個(gè)隔離環(huán)境中。HPC資源調(diào)度器slurm采用環(huán)境變量的方式調(diào)度任務(wù)所使用的GPU資源,通過記錄GPU資源的使用情況,將任務(wù)對(duì)GPU的資源請(qǐng)求通過CUDA_VISIBLE_DEVICES編號(hào)的形式進(jìn)行調(diào)度,任務(wù)獲取GPU編號(hào)即獲取GPU資源。但是每個(gè)GPU對(duì)應(yīng)的minor number并非固定的,當(dāng)系統(tǒng)重新加載GPU時(shí),其值會(huì)發(fā)生改變。這造成程序無法根據(jù)minor number向GPU資源管理器直接獲取滿足需求的GPU資源,也限制了程序的遷移。
容器技術(shù)通過cgroup實(shí)現(xiàn)容器間的資源隔離。以docker容器為例,通過device參數(shù)將主機(jī)指定設(shè)備文件映射到容器中。NVIDIA公司的開源項(xiàng)目nvidia-docker以docker為基礎(chǔ),對(duì)使用GPU資源隔離的容器使用操作和運(yùn)行環(huán)境進(jìn)行封裝。nvidia-docker將主機(jī)端的GPU驅(qū)動(dòng)與指定的GPU設(shè)備共同映射到容器內(nèi),確保容器與主機(jī)GPU驅(qū)動(dòng)一致,避免容器內(nèi)重新安裝驅(qū)動(dòng)的問題。以容器方式對(duì)GPU資源隔離的基礎(chǔ)單位與環(huán)境變量相同,屬于一對(duì)一的方式進(jìn)行隔離映射。在深度學(xué)習(xí)計(jì)算中更需要高效的計(jì)算能力。三種GPU隔離技術(shù)的對(duì)比如表1所示。
表1 GPU資源隔離技術(shù)對(duì)比
3.1 系統(tǒng)結(jié)構(gòu)
深度學(xué)習(xí)容器云框架部署在異構(gòu)集群上,其物理結(jié)構(gòu)如圖1所示。其中3臺(tái)CPU節(jié)點(diǎn)組成Mesos系統(tǒng)Master HA結(jié)構(gòu),3臺(tái)GPU節(jié)點(diǎn)為Mesos系統(tǒng)Agent節(jié)點(diǎn)[10]。每個(gè)GPU節(jié)點(diǎn)搭載2塊GPU卡。各節(jié)點(diǎn)間通過萬兆網(wǎng)絡(luò)互聯(lián)。
圖1 異構(gòu)集群物理結(jié)構(gòu)
Mesos是針對(duì)容器的分布式集群調(diào)度管理系統(tǒng),本文集群資源由Mesos負(fù)責(zé)管理與分配。在Mesos之上可以運(yùn)行多種不同功能的框架,如長時(shí)容器調(diào)度器Marathon、內(nèi)存計(jì)算框架Spark等。深度學(xué)習(xí)容器云(DLC,Deep Learning Container Cloud)以框架形式運(yùn)行在Mesos上,通過pymesos實(shí)現(xiàn)。Agent節(jié)點(diǎn)同時(shí)部署nvidia-docker以便于DLC獲取GPU資源底層信息。系統(tǒng)以DLC為基礎(chǔ)構(gòu)建深度學(xué)習(xí)框架系統(tǒng),處理用戶對(duì)深度學(xué)習(xí)框架及資源的請(qǐng)求,以容器形式提供多種深度學(xué)習(xí)框架服務(wù)。系統(tǒng)軟件結(jié)構(gòu)如圖2所示,系統(tǒng)主要軟件版本為Mesos 1.3.0、docker 1.12.5,深度學(xué)習(xí)框架版本由容器鏡像決定。
圖2 深度學(xué)習(xí)云框架軟件結(jié)構(gòu)
3.2 DLC結(jié)構(gòu)
DLC框架主要功能是向用戶提供帶有GPU資源的深度學(xué)習(xí)容器,其功能結(jié)構(gòu)如圖3所示。Mesos資源調(diào)度系統(tǒng)作為DLC的基礎(chǔ),維護(hù)集群狀態(tài),為DLC提供集群資源。由于Mesos僅支持對(duì)GPU的數(shù)量分配,因此DLC首先要解決的問題就是擴(kuò)展GPU資源分配為指定分配。GPU資源指定分配是指用戶可以指定所申請(qǐng)的環(huán)境包含某一特性的GPU,如GPU計(jì)算能力。用戶也可以直接指定GPU的編號(hào),如minor number來指定某一節(jié)點(diǎn)的GPU資源。為了避免節(jié)點(diǎn)重啟所帶來的GPU minor number改變,DLC使用GPU UUID作為GPU資源設(shè)備的輔助標(biāo)識(shí)符。GPU UUID是GPU資源的唯一標(biāo)識(shí),可以唯一標(biāo)識(shí)GPU設(shè)備,DLC在內(nèi)部維護(hù)各個(gè)節(jié)點(diǎn)GPU資源UUID與minor number對(duì)應(yīng)資源表。當(dāng)DLC從Mesos獲取資源后,DLC會(huì)在Agent上創(chuàng)建DLC-plugin用于占用一定比例的資源,這些資源會(huì)
被用于深度學(xué)習(xí)容器的創(chuàng)建,剩余資源由Mesos其他框架分配。從Mesos占用的資源會(huì)被寫入資源表中,GPU資源會(huì)通過nvidia-docker獲取設(shè)備對(duì)應(yīng)的UUID。資源表是DLC資源分配的基礎(chǔ),標(biāo)識(shí)了已分配的GPU資源和未分配的GPU資源。資源表另一個(gè)作用是用戶資源預(yù)留,將資源表中某些GPU資源設(shè)置為某些用戶專用,可實(shí)現(xiàn)GPU資源的合理分配。
用戶向DLC系統(tǒng)申請(qǐng)資源的信息包含CPU、內(nèi)存、GPU、深度學(xué)習(xí)框架和版本。其中GPU資源可以通過3種方式給出,其格式為:
gpu={’c’|’m’|’id’:’number|list’}
其中’c’、’m’、’id’分別對(duì)應(yīng)數(shù)量、minor number、UUID。當(dāng)用戶以minor number給出時(shí)會(huì)默認(rèn)認(rèn)為用戶確定當(dāng)前時(shí)刻其所對(duì)應(yīng)的GPU設(shè)備。當(dāng)DLC收到用戶請(qǐng)求時(shí)會(huì)根據(jù)資源表,向Agent nvidia-docker更新資源表中GPU資源信息與狀態(tài),通過查詢資源表確認(rèn)是否滿足設(shè)備請(qǐng)求,若滿足則將請(qǐng)求傳遞給DLC-plugin。DLC-plugin通過docker創(chuàng)建容器,并返回容器信息給DLC,容器信息主要包含容器id和容器映射端口。容器的創(chuàng)建依賴于nvidia-docker提供的驅(qū)動(dòng)文件卷,DLC-plugin會(huì)在映射之前檢測容器鏡像內(nèi)CUDA版本是否與驅(qū)動(dòng)文件卷兼容,若不兼容則返回拒絕信息。
圖3 DLC功能結(jié)構(gòu)
DLC默認(rèn)通過Docker Hub獲取深度學(xué)習(xí)框架容器鏡像。Docker Hub是由docker官方提供的容器鏡像資源倉庫,通過Docker Hub可以直接下載容器鏡像,便于部署。同樣也可以通過Docker Registry構(gòu)建私有容器鏡像庫。目前已直接提供對(duì)8種深度學(xué)習(xí)框架的支持,所有框架均通過automatically build方式由dockerfile在Docker Hub上直接構(gòu)建。容器鏡像庫同時(shí)提供了多版本CUDA和CUDNN作為基礎(chǔ)鏡像,用戶可以根據(jù)自身需求使用CUDA或CUDNN作為基礎(chǔ)鏡像構(gòu)建特定深度學(xué)習(xí)框架。
以Tensorflow為例通過DLC創(chuàng)建擁有2個(gè)GPU的容器環(huán)境。DLC主要輸入?yún)?shù)如表2所示。
表2 DLC主要參數(shù)列表
可以直接通過如下指令進(jìn)行創(chuàng)建:
dlc -c 1 -m 2048 -gpus ‘c:2’ --opt ‘-P’ tensorflow/tensorflow
指令會(huì)創(chuàng)建具有1個(gè)CPU,2G內(nèi)存,2個(gè)GPU的tensorflow容器,容器鏡像由tensorflow提供,通過--opt參數(shù)將容器端口映射到主機(jī),可以使開發(fā)者通過其默認(rèn)提供的Jupyter Notebook通過web進(jìn)行深度網(wǎng)絡(luò)開發(fā)。
本文對(duì)已有虛擬化技術(shù)進(jìn)行總結(jié),并對(duì)GPU隔離技術(shù)進(jìn)行深入研究分析,針對(duì)深度學(xué)習(xí)領(lǐng)域中開發(fā)者與使用者對(duì)深度學(xué)習(xí)框架的使用需求,提出一種基于Mesos的深度學(xué)習(xí)容器云。DLC系統(tǒng)擴(kuò)展了Mesos對(duì)GPU的資源隔離功能。通過DLC系統(tǒng),用戶可以創(chuàng)建擁有指定GPU資源和深度學(xué)習(xí)框架的容器環(huán)境,并可以將特定GPU資源作預(yù)留。這種方式可以提高特定任務(wù)的執(zhí)行效率,為合理分配GPU資源提供便利。依托容器的快速部署,將簡化深度學(xué)習(xí)框架的使用,便于多框架的選擇和版本間的切換。這對(duì)推動(dòng)深度學(xué)習(xí)發(fā)展具有一定意義。
[1]Lecun Y,Bengio Y,Hinton G. Deep learning[J]. Nature,2015,521(7553):436-444.
[2]Aznoli F,Navimipour N J. Cloud services recommendation:Reviewing the recent advances and suggesting the future research directions[J]. Journal of Network and Computer Applications,2017(77):73-86.
[3]Fox G C,Qiu J,Kamburugamuve S. HPC-ABDS high performance computing enhanced apache big data stack[C].Cluster,Cloud and Grid Computing(CCGrid),2015 15th IEEE/ACM International Symposium on IEEE,2015:1057-1066.
[4]Mateescu G,Gentzsch W,Ribbens C J. Hybrid computing—where HPC meets grid and cloud computing[J]. Future Generation Computer Systems,2011,27(5):440-453.
[5]Helsley M. LXC:Linux container tools[J]. IBM devloperWorks Technical Library,2009:11.
[6]Higgins J,Holmes V,Venters C. Orchestrating Docker Containers in the HPC Environment[C].International Conference on High Performance Computing,Springer International Publishing,2015:506-513.
[7]Jacobsen D M,Canon R S. Contain this,unleashing docker for hpc[J]. Proceedings of the Cray User Group,2015.
[8]Felter W,F(xiàn)erreira A,Rajamony R. An updated performance comparison of virtual machines and linux containers[C].Performance Analysis of Systems and Software(ISPASS).
[9]Alex Herrera. NVIDIA GRID vGPU:Delivering Scalable Graphics-rich Virtual Desktops[J].2015.
[10]Nvidia Corporation. Nvidia CUDA C Programming Guide 8.0[S]. 2016.
[11]Hindman B,Konwinski A,Zaharia M. Mesos:A Platform for Fine-Grained Resource Sharing in the Data Center[C].NSDI,2011,11(2011):22-22.
(責(zé)任編輯:宋金寶)
ADeepLearningContainerCloudStudyforGPUResources
XIAO Yi1,2,LU Yong-quan2,XIE Si-ye1,2
(1. Computer School,Communication University of China,Beijing 100024,China;2. High Performance Computing Center,Communication University of China,Beijing 100024,China)
With the development of deep learning,deep learning framework has become an important tool for the deep neural network developing. The deep learning framework greatly shortens the network construction and computing time,and its powerful computing ability comes from GPU. But it is an important issue that how to effectively allocate and use GPU resources in heterogeneous cluster among many frameworks. In this paper,we propose a Deep Learning Container Cloud(DLC)architecture for GPU resources specifically. Using the characteristics of easy deployment and easy migration,the frameworks can be deployed on heterogeneous cluster in the form of container,and the GPU driver and container can be decoupled according to nvidia-docker. The DLC provides services in the form of the MESOS framework. After obtaining resources through scheduling,a deep learning framework is created quickly to meet the requirements。DLC will load the specified GPU resource and the corresponding runtime library to achieve the rapid creation of a specific version of the deep learning environment. It is of great significance for promoting the development of deep learning.
container cloud;deep learning;docker;GPU
TP316
A
1673-4793(2017)06-0016-05
2017-09-26
肖熠(1989-),男(漢族),河北石家莊人,中國傳媒大學(xué)博士研究生. E-mail:louishpc@cuc.edu.cn