隨著大數(shù)據(jù)、人工智能技術(shù)的發(fā)展,越來(lái)越多的用戶(hù)產(chǎn)生了獲取擁有GPU算力的彈性計(jì)算服務(wù)的需求,GPU云主機(jī)具有突出的圖形處理和高性能計(jì)算能力,適用于科學(xué)計(jì)算、視頻處理、深度學(xué)習(xí)等應(yīng)用場(chǎng)景,受到了市場(chǎng)的青睞。
本期智匯華云,特別邀請(qǐng)到華云數(shù)據(jù)OpenStack開(kāi)發(fā)工程師傅成超為大家?guī)?lái)“OpenStack 虛擬機(jī) GPU 性能優(yōu)化”。
首先為大家簡(jiǎn)單介紹一下 NUMA 的概念。NUMA 是一種解決多 CPU 工作的技術(shù)方案,在此之前,市面上主要采用 SMP 和 MPP 兩種架構(gòu)。
SMP 技術(shù)
計(jì)算機(jī)技術(shù)發(fā)展初期,服務(wù)器都是單 CPU 結(jié)構(gòu),隨著技術(shù)的不斷發(fā)展,多 CPU 結(jié)構(gòu)開(kāi)始流行起來(lái),為了滿(mǎn)足多 CPU 共同工作的需求,SMP 技術(shù)應(yīng)運(yùn)而生。
如圖所示,多個(gè) CPU 通過(guò)一個(gè)總線訪問(wèn)存儲(chǔ)器,因此無(wú)論在什么時(shí)候,處理器只能為內(nèi)存的每個(gè)數(shù)據(jù)保持或共享唯一一個(gè)數(shù)值。
SMP 的缺點(diǎn)是十分明顯的,即擴(kuò)展性有限,因此在存儲(chǔ)接口達(dá)到飽和的時(shí)候,增加處理器的數(shù)量并不能獲得更高的性能,因此 SMP 架構(gòu)支持的 CPU 數(shù)量十分有限。
MPP 技術(shù)
MPP 則是一種分布式存儲(chǔ)器模式,它能將更多的處理器納入一個(gè)系統(tǒng)的存儲(chǔ)器。一個(gè)分布式存儲(chǔ)器具有多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有自己的存儲(chǔ)器,單個(gè)節(jié)點(diǎn)相互連接形成了一個(gè)總系統(tǒng)。MPP 可以近似理解為一個(gè) SMP 的橫向擴(kuò)展集群。
NUMA 技術(shù)
NUMA 是目前最常用的技術(shù),在 NUMA體系中每個(gè)處理器都有自己的存儲(chǔ)器,同時(shí),每個(gè)處理器也可以訪問(wèn)其他處理器的存儲(chǔ)器。
下圖為多核 NUMA CPU 架構(gòu)
如上文所說(shuō),每個(gè)處理器既可以訪問(wèn)自己的存儲(chǔ)器,也可以訪問(wèn)其他處理器的存儲(chǔ)器,事實(shí)上,前者的速度要比后者最高快到100倍之多。在 Linux 中,系統(tǒng)默認(rèn)采用自動(dòng) NUMA 平衡策略,所以 NUMA 調(diào)優(yōu)的目的就是讓處理器盡可能地訪問(wèn)自己的存儲(chǔ)器,以提高計(jì)算速度。
在 OpenStack 中,可以采用 virsh numatune 命令查看和修改虛擬機(jī)的 NUMA 配置,反映在 XML 文件上的便是和 < numatune > 中的 id 保持一致。
那么在 GPU 云主機(jī)中,是否可以采用相同的思路進(jìn)行性能調(diào)優(yōu)呢?答案自然是肯定的。
在進(jìn)行 GPU 性能優(yōu)化前,我們還需要進(jìn)一步了解一下 render-nodes 的概念。
render-nodes 是一種用于訪問(wèn)具有 DRI 能力的 GPU 非特權(quán)功能的 DRM 接口,在 Linux 內(nèi)核中,DRM 驅(qū)動(dòng)程序通過(guò) render-node 接口公開(kāi)其用戶(hù)空間 API 的非特權(quán)部分,并作為一個(gè)單獨(dú)的設(shè)備文件 (/dev/dri/renderDXX) 存在。信息技術(shù)變革日新月異,如今,客戶(hù)端已不再需要運(yùn)行合成器或圖形服務(wù)器來(lái)使用 GPU ,通過(guò) render-node 即可實(shí)現(xiàn)對(duì) GPU 資源的訪問(wèn)。
將 render-node 和所在的 NUMA 綁定,可以有效防止跨片 PCIE 訪問(wèn)帶來(lái)的性能損耗。
通過(guò) lspci –vvvs bus_id 命令便可查看 GPU 所在的 NUMA 節(jié)點(diǎn),即 /dev/dri/renderDXX 與 NUMA 的對(duì)應(yīng)關(guān)系。以我本機(jī)為例,renderD128 對(duì)應(yīng) NUMA 0,renderD129 對(duì)應(yīng) NUMA 1,此時(shí)我們便可以使用 numactl 進(jìn)行綁定。
然而在一個(gè) OpenStack 云環(huán)境中可能會(huì)運(yùn)行著成百上千的云主機(jī),云主機(jī)創(chuàng)建完成后逐一進(jìn)行手動(dòng)綁定明顯不是一個(gè)現(xiàn)實(shí)的方案,此時(shí)可以通過(guò)修改 /nova/virt/libvirt/driver.py中的相關(guān)邏輯。當(dāng)程序獲取到 vcpu 被分配的 NUMA 節(jié)點(diǎn)后,通過(guò)設(shè)備之間的映射關(guān)系,在添加 GPU 設(shè)備階段為其綁定對(duì)應(yīng)的 render-node。這樣虛擬機(jī)在創(chuàng)建之初便擁有了卓越的性能,無(wú)需后期進(jìn)行人工綁定。
結(jié)束語(yǔ)
本文從 NUMA 出發(fā),為大家簡(jiǎn)單介紹了多 CPU 的常用技術(shù)架構(gòu),并以此為延伸,分享了 GPU 虛擬機(jī)的性能調(diào)優(yōu)方案。目前,華云數(shù)據(jù)公有云產(chǎn)品線中已經(jīng)包含具有超強(qiáng)計(jì)算能力的 GPU 型云主機(jī),在新基建的風(fēng)口,推動(dòng)中國(guó)企業(yè)全面上云,助力客戶(hù)實(shí)現(xiàn)數(shù)字化轉(zhuǎn)型。