作者:仇昌棟、廖長(zhǎng)軍
GPU虛擬化是一種技術(shù),它允許多個(gè)虛擬環(huán)境共享單個(gè)物理GPU的資源,它能帶來(lái)提高資源利用率、降低成本、高靈活性和可擴(kuò)展性、提高安全性等方面的好處。隨著GPU在各種領(lǐng)域的應(yīng)用越來(lái)越普及,如圖形渲染、通用計(jì)算(如深度學(xué)習(xí))、音視頻編解碼等,GPU虛擬化也在近年來(lái)得到了越來(lái)越廣泛的關(guān)注。
Part 01●??背景?●
1.1 GPU應(yīng)用場(chǎng)景
GPU(圖形處理器)最初設(shè)計(jì)用于處理計(jì)算機(jī)圖形學(xué)任務(wù),但現(xiàn)在其應(yīng)用場(chǎng)景已經(jīng)擴(kuò)展到了許多其他領(lǐng)域。以下是一些GPU應(yīng)用的場(chǎng)景:
游戲和視覺(jué)效果:GPU最初的目的是為了加速圖形渲染,因此它們?cè)谟螒蚝鸵曈X(jué)效果方面有很大的應(yīng)用。GPU可以快速處理大量數(shù)據(jù)并生成復(fù)雜的三維圖形,為玩家提供更真實(shí)的游戲體驗(yàn)。
機(jī)器學(xué)習(xí)和深度學(xué)習(xí):近年來(lái),GPU在人工智能領(lǐng)域的應(yīng)用越來(lái)越廣泛。由于深度學(xué)習(xí)模型需要大量的并行計(jì)算和浮點(diǎn)運(yùn)算,GPU非常適合這種任務(wù)。使用GPU加速機(jī)器學(xué)習(xí)訓(xùn)練過(guò)程可以節(jié)省大量時(shí)間。
科學(xué)模擬和數(shù)據(jù)分析:許多科學(xué)計(jì)算任務(wù)需要處理大量數(shù)據(jù)并進(jìn)行復(fù)雜數(shù)學(xué)運(yùn)算。GPU可以在分子動(dòng)力學(xué)、流體動(dòng)力學(xué)、天文學(xué)、地球科學(xué)等領(lǐng)域的模擬和分析中發(fā)揮重要作用。
圖像和視頻處理:GPU在圖像和視頻處理領(lǐng)域也有很大的應(yīng)用。例如,它們可以用于實(shí)時(shí)視頻編解碼、圖像降噪、圖像增強(qiáng)、圖像識(shí)別等任務(wù)。
虛擬現(xiàn)實(shí)和增強(qiáng)現(xiàn)實(shí):GPU在虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)領(lǐng)域也有很大的應(yīng)用。它們可以實(shí)時(shí)渲染高質(zhì)量的虛擬環(huán)境,為用戶提供沉浸式體驗(yàn)。
可以預(yù)見(jiàn),隨著技術(shù)的發(fā)展,GPU的應(yīng)用領(lǐng)域還將繼續(xù)擴(kuò)展。
1.2 GPU虛擬化帶來(lái)的優(yōu)勢(shì)
GPU虛擬化是一種將物理GPU的計(jì)算和顯存資源在多個(gè)虛擬環(huán)境中共享的技術(shù),它的主要優(yōu)勢(shì)如下:
資源共享:GPU虛擬化允許在多個(gè)虛擬環(huán)境中共享物理GPU的計(jì)算和顯存資源,提高GPU的使用效率。
彈性擴(kuò)展:通過(guò)GPU虛擬化,可以根據(jù)應(yīng)用程序的需求動(dòng)態(tài)調(diào)整虛擬GPU的計(jì)算和顯存資源,實(shí)現(xiàn)資源的彈性擴(kuò)展。
成本效益:GPU虛擬化可以降低硬件投資和維護(hù)成本,因?yàn)樗试S在多個(gè)虛擬環(huán)境中共享物理GPU,從而減少了購(gòu)買和維護(hù)多個(gè)獨(dú)立GPU的需要。
隔離性:GPU虛擬化提供了良好的隔離性,確保了虛擬環(huán)境之間的安全和獨(dú)立性。這在多租戶云計(jì)算環(huán)境中尤為重要,因?yàn)樗梢源_保不同租戶之間的數(shù)據(jù)和計(jì)算隔離。
靈活部署:GPU虛擬化使得虛擬環(huán)境可以靈活地部署在不同的物理硬件上,以滿足不同的性能需求。這意味著用戶可以根據(jù)自己的需求選擇合適的GPU硬件,而無(wú)需考慮與現(xiàn)有虛擬環(huán)境的兼容性問(wèn)題。
Part 02●??相關(guān)基礎(chǔ)概念?●
為方便大家理解GPU虛擬化,先介紹相關(guān)的基礎(chǔ)概念,包括I/O總線、GPU API、GPU工作流程。
2.1 I/O總線
根據(jù)接口協(xié)議的性能,現(xiàn)代計(jì)算機(jī)對(duì)I/O總線進(jìn)行了分層。
見(jiàn)上圖,一些外圍相對(duì)較慢的I/O設(shè)備則通過(guò)外圍I/O總線連接到系統(tǒng),比如使用SCSI(Small Computer System Interface)、SATA(Serial AT Attachment)或者USB(Universal Serial Bus)等協(xié)議的I/O設(shè)備。而顯卡、網(wǎng)卡等高性能的I/O設(shè)備通過(guò)通用I/O總線連接到系統(tǒng),在許多現(xiàn)代系統(tǒng)中會(huì)是PCIe(Peripheral Component Interconnect Express)或它的衍生形式。
2.2 GPU API
為了支持各種功能,GPU提供了不同類型的API,讓開(kāi)發(fā)者能夠在應(yīng)用程序中使用GPU的強(qiáng)大功能。這些API可分為三類:圖形渲染、通用計(jì)算和音視頻編解碼。
圖形渲染API被用于處理圖形渲染任務(wù),例如實(shí)時(shí)3D圖形和動(dòng)畫(huà)。這些API提供了一組函數(shù)和接口,允許開(kāi)發(fā)者在程序中創(chuàng)建和操縱3D對(duì)象、紋理和著色器。這些API經(jīng)常被用于游戲和3D建模軟件。主要的渲染API有:OpenGL(開(kāi)放圖形庫(kù)):跨平臺(tái)的圖形編程接口,提供2D和3D圖形渲染功能;Vulkan:與OpenGL類似,是一個(gè)跨平臺(tái)的3D圖形和計(jì)算API,但提供了更低級(jí)的硬件控制和更高的性能;DirectX:由微軟開(kāi)發(fā)的一系列API,包括Direct3D,用于處理Windows平臺(tái)上的3D圖形渲染;Metal:由蘋(píng)果開(kāi)發(fā)的圖形和計(jì)算API,專為iOS和macOS平臺(tái)設(shè)計(jì)。
通用計(jì)算API允許開(kāi)發(fā)者將GPU用于通用計(jì)算任務(wù),而不僅僅是圖形渲染。這些任務(wù)可能包括物理模擬、機(jī)器學(xué)習(xí)、圖像處理等。通用計(jì)算API提供了編程模型和優(yōu)化工具,以便在GPU上實(shí)現(xiàn)高性能并行計(jì)算。主要的通用計(jì)算API有:CUDA(Compute Unified Device Architecture):由NVIDIA開(kāi)發(fā)的并行計(jì)算平臺(tái)和編程模型,專為NVIDIA GPU設(shè)計(jì);OpenCL(開(kāi)放計(jì)算語(yǔ)言):跨平臺(tái)的并行計(jì)算API,可以在不同類型的處理器(如GPU、CPU和其他加速器)上運(yùn)行。
音視頻編解碼API用于處理音頻和視頻數(shù)據(jù)的編碼和解碼。它們利用GPU的并行處理能力來(lái)加速音視頻數(shù)據(jù)的壓縮和解壓縮。主要的音視頻編解碼API有:NVENC/NVDEC:NVIDIA GPU上的硬件加速視頻編碼和解碼API,支持常見(jiàn)的視頻編碼標(biāo)準(zhǔn),如H.264、HEVC和VP9;AMD VCE/UVD:AMD GPU上的硬件加速視頻編碼和解碼API,支持常見(jiàn)的視頻編碼標(biāo)準(zhǔn);Intel Quick Sync Video:Intel處理器集成GPU上的硬件加速視頻編解碼API;VideoToolbox:蘋(píng)果平臺(tái)上的硬件加速視頻編解碼框架,支持iOS和macOS設(shè)備。
2.3 GPU工作流程
在沒(méi)有虛擬化的情況下,渲染涉及到的關(guān)鍵組件見(jiàn)下圖。
一個(gè)典型的GPU設(shè)備的工作流程如下:
應(yīng)用調(diào)用GPU支持的某個(gè)API,如OpenGL或DirectX;
OpenGL或DirectX庫(kù),提交渲染負(fù)載到操作系統(tǒng)內(nèi)核GPU驅(qū)動(dòng);
GPU驅(qū)動(dòng)把它提交給GPU硬件;
GPU硬件開(kāi)始工作。完成后,DMA到內(nèi)存,發(fā)出中斷給CPU;
CPU找到中斷處理程序(GPU驅(qū)動(dòng)此前向操作系統(tǒng)注冊(cè)過(guò)的)調(diào)用它;
中斷處理程序找到是哪個(gè)渲染負(fù)載被執(zhí)行完畢了,最終GPU驅(qū)動(dòng)喚醒相關(guān)的應(yīng)用。
Part 03●??GPU虛擬化技術(shù)方案?●
3.1?PCIe直通
PCIe直通是一種虛擬化技術(shù),允許虛擬機(jī)(Virtual Machine,VM)直接訪問(wèn)物理主機(jī)上的PCIe設(shè)備,而無(wú)需通過(guò)虛擬化軟件進(jìn)行模擬。通過(guò)PCIe直通就可以將GPU設(shè)備直接分配給虛擬機(jī),見(jiàn)下圖:
各大公用云廠商廣泛采用直通模式,因?yàn)樗男阅軗p耗最小,硬件驅(qū)動(dòng)無(wú)需修改。直通模式?jīng)]有對(duì)可支持的GPU數(shù)量做限制,也沒(méi)有對(duì)GPU功能性做閹割,因此大多數(shù)功能可以在直通模式下無(wú)修改支持。
? 直通模式存在以下優(yōu)點(diǎn):
①性能損耗?。?/p>
②功能兼容性好;
③技術(shù)簡(jiǎn)單,運(yùn)維成本低,對(duì)GPU廠商沒(méi)有依賴。
? 直通模式存在以下缺點(diǎn):
1.不支持熱遷移;
2.只能支持1:1,不支持GPU資源分隔。
3.2 PCIe SR-IOV
PCIe SR-IOV(Single Root Input/Output Virtualization)是一種更高級(jí)的虛擬化技術(shù),允許一個(gè)PCIe設(shè)備在多個(gè)虛擬機(jī)之間共享,同時(shí)保持較高的性能。它是通過(guò)在物理設(shè)備(Physical Functions,PF)上創(chuàng)建多個(gè)虛擬功能(Virtual Functions,VF)來(lái)實(shí)現(xiàn)的,每個(gè)虛擬功能可以被分配給一個(gè)虛擬機(jī),讓虛擬機(jī)直接訪問(wèn)和控制這些虛擬功能,從而實(shí)現(xiàn)高效的I/O虛擬化?;赑CIe SR-IOV的GPU虛擬化方案,本質(zhì)是把一個(gè)物理GPU顯卡設(shè)備(PF)拆分成多份虛擬(VF)的顯卡設(shè)備,而且VF 依然是符合 PCIe 規(guī)范的設(shè)備。核心架構(gòu)如下圖:
在SR-IOV方案中,可以將一個(gè)PF虛擬化分割為多個(gè)VF。
基于此,SR-IOV有三種應(yīng)用場(chǎng)景:
(1)用戶基于HostOS通過(guò)PF驅(qū)動(dòng)直接使用PF;
(2)用戶基于HostOS通過(guò)VF驅(qū)動(dòng)直接使用VF;
(3)用戶在VM中通過(guò)VF驅(qū)動(dòng)使用VF;
? SR-IOV方案的優(yōu)點(diǎn):
①每個(gè)VF都有獨(dú)立的配置空間、MMIO、地址空間,因此數(shù)據(jù)更加安全;
②真正實(shí)現(xiàn)了1:N,一個(gè)PCIe設(shè)備提供給多個(gè)VM使用;
? SR-IOV方案的缺點(diǎn):
1.靈活性較差,無(wú)法進(jìn)行更細(xì)粒度的分割與調(diào)度;
2.不支持熱遷移。
業(yè)界支持SR-IOV的顯卡:
1、AMD Radeon PRO V620:一塊顯卡PV支持分割12個(gè)VF。
2、摩爾線程MTT S3000:一塊顯卡PV支持分隔32個(gè)VF。
3.3 API轉(zhuǎn)發(fā)
在苦等PCIe SR-IOV期間,業(yè)界出現(xiàn)了基于API轉(zhuǎn)發(fā)的GPU虛擬化方案。API轉(zhuǎn)發(fā)分為被調(diào)方和調(diào)用方,兩方對(duì)外提供同樣的接口(API),被調(diào)方API實(shí)現(xiàn)是真實(shí)的渲染、計(jì)算處理邏輯,而調(diào)用方API實(shí)現(xiàn)僅僅是轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)給被調(diào)方。其核心架構(gòu)示意如下圖:
在GPU API層的轉(zhuǎn)發(fā),業(yè)界有針對(duì)OpenGL的AWS Elastic GPU,OrionX,有針對(duì)CUDA的騰訊vCUDA,瓦倫西亞理工大學(xué)rCUDA;在GPU驅(qū)動(dòng)層的轉(zhuǎn)發(fā),有針對(duì)CUDA的阿里云cGPU和騰訊云pGPU。
? API轉(zhuǎn)發(fā)方案的優(yōu)點(diǎn):
①靈活性最高。通過(guò)API轉(zhuǎn)發(fā)的方式解耦應(yīng)用與GPU設(shè)備之后,可以通過(guò)軟件任意配置1塊GPU設(shè)備服務(wù)N個(gè)VM。也能做到靈活的GPU資源擴(kuò)縮容、遷移等等;
②不依賴GPU硬件廠商。
③不限虛擬化環(huán)境。
? API轉(zhuǎn)發(fā)方案的缺點(diǎn):
1.復(fù)雜度極高。同一功能有多套 API(渲染的 DirectX 和 OpenGL),同一套 API 還有不同版本(如 DirectX 9 和 DirectX 11),兼容性非常復(fù)雜。
2.功能不完整。如不支持媒體編解碼。
3.4 受控直通
受控直通方案是由Nvidia提出,并聯(lián)合Intel一起將相關(guān)的mdev提交到了Linux內(nèi)核4.0中。受控直通把會(huì)影響性能的訪問(wèn)直接透?jìng)鹘oGPU(如顯存),把性能無(wú)關(guān)功能部分(如CSR和部分MMIO寄存器)做攔截,并在mdev模塊中做模擬,使得系統(tǒng)層面能看到多個(gè)“看似”完整的多個(gè)GPU PCIe設(shè)備,即vGPU,它也可以支持原生GPU驅(qū)動(dòng)。
? 該方案的優(yōu)點(diǎn):
①具備1:N的靈活性;
②高性能;
③功能完備,3D渲染、通用計(jì)算、媒體編解碼都支持。
? 該方案的缺點(diǎn):宿主機(jī)的GPU驅(qū)動(dòng)相當(dāng)于在模擬GPU,而GPU的硬件不開(kāi)源,導(dǎo)致只有GPU廠商才能提供這一部分。
業(yè)界的受控直通實(shí)現(xiàn),有Nvidia的vGPU、Intel的GVT-g、摩爾線程的MT Mesh 2.0(MTT S3000顯卡)。