原创 twt社区
【摘要】在數位化高度普及的時代,智慧AI能力的應用已成為企業提升服務品質與效率的重要手段,GPU強大的運算能力可以加速自然語言處理模式的訓練與推理過程,將GPU算力高效率的應用到合適的場景中,可以為企業提供低成本且高品質的服務。但因現在客觀存在GPU算力供應鏈卡脖子問題,GPU高階卡取得途徑有限,中低端卡供應也出現供不應求,算力價格持續走高,算力資源尤為珍貴,在此背景下,GPU資源的高效利用顯得尤為重要。如何有效運用GPU資源、提高資源利用率、降低系統的營運成本,以更低的成本為客戶提供更好的服務,成為近年金融企業聚焦的熱門地點。考慮提升GPU使用效率的方案,主要有加強資源監控,避免資源閒置以及做好資源使用、進行GPU池化與虛擬化。
【作者】哲哲蛙(筆名),某城商行技術經理,長期服務於資訊科技部門,熟悉大型企業的IT資料中心基礎平台的建置與維護工作。
一、GPU資源監控
1.1 GPU監控為了提升GPU資源利用效率,必須做好對資源使用效率的監控,避免應用程式對於GPU資源使用的「高配低效」。
一些應用開發廠商或維護人員,為了確保自己的程式運行,可能存在「圈地」思想,放大對於資源需求的評估,但實際運行並不需要那麼大的資源,或者程式並非7*24小時都在相對高負載運行,而是每天大多數時間段均空負載處於閒置狀態。因此算力管理員就需要做好GPU資源監控,以便更好的掌握資源使用狀況,及時評估管理珍貴的GPU算力資源。
此外,GPU的監控對於提升應用能力,還能發揮更多正向作用。透過GPU監控,確保模型訓練和推理過程中GPU資源的穩定供應,加速模型的訓練和更新速度,及時調整風險評估策略。透過監控GPU資源的使用情況,優化相關模型的訓練與部署。保障系統穩定性:銀行的許多業務關鍵系統如風險評估、詐欺偵測等依賴GPU的強大運算能力來處理大量複雜資料。透過即時監控GPU的溫度、使用率、記憶體佔用等指標,維運人員可及時發現潛在問題,避免系統崩潰或效能下降,確保銀行業務的持續穩定運作。
最佳化資源分配:銀行通常有多種業務同時運行,對GPU資源的需求各異。監控GPU的使用情況有助於了解不同業務在不同時段對GPU資源的佔用,進而根據業務的優先順序和資源需求動態分配GPU資源,提高資源利用率,降低營運成本。
提升業務效率:在人工智慧和大數據分析廣泛應用於銀行業務的背景下,快速且準確的GPU監控能夠幫助銀行更快地訓練和部署機器學習模型,如信貸風險評估模型、市場趨勢預測模型等,進而提升業務決策的速度與準確性,增強銀行的市場競爭力。
1.2 GPU 監控的常用工具和技術目前金融客戶市場中主流的GPU仍然是英偉達,國內一些國產GPU也開始有了應用,國產GPU有圖形渲染GPU和高效能運算GPU(GPGPU)兩種。其中圖形渲染GPU例如寒武紀MLU370、摩爾線程MTT S80;另一類高效能運算GPU,例如壁仞科技BR100、沐曦MXN AI和MXC GPGPU、中科曙光DCU以及近年來生態穩步提升的華為昇騰顯示卡等。目前針對GPU的監控,有硬體廠商自己提供的產品方案以及開源方案兩種,例如NVIDIA官方提供的nvidia-smi工具,可用於查詢和監控N卡GPU的狀態信息,包括GPU的使用率、記憶體使用狀況、溫度、風扇轉速等基本指標,硬體廠商提供的監控方案,通常有一定的限制,只能提供針對自己的產品的監控能力。
另外,一些開源方案例如GPUSTAT,則是基於Python 的輕量級命令列工具,利用nvidia-smi獲取數據,並以命令列輸出形式呈現GPU的狀態和效能,支援自訂刷新率、選擇要監視的GPU以及與其他監控系統集成,適用於自動化腳本和持續集成流程。目前國內部分平台監控GPU資源採用此方案較多,透過開源Prometheus 配置採集GPU的相關指標數據,配合Grafana進行圖形化展示,將採集到的GPU數據以直覺的圖表形式展示,採用此方案的通常打造成一個通用的平台,提供多種GPU的監控能力。
以某城商行採用的監控方案為例,其企業探索採用的Prometheus結合Grafana監控方案,是在GPU Kubernetes集群中,透過部署kube-prometheus stack建構監控體系實現監控。其主要原理還是透過容器搭建管理平台,並透過容器的agent採集,向平台匯總資料如下:
(a)每個運行vGPU組件的Kubernetes節點上部署DCGM-Exporter,定期從GPU設備中獲取資料並通過HTTP介面暴露出來供Prometheus進行讀取存取。建立ServiceMonitor資源對象,定義如何透過vGPU調度器收集指標。
(b)部署了Prometheus定期抓取包括GPU算力、顯存、溫度等各種指標數據,將其儲存在時間序列資料庫中。
(c)系統整合了Grafana視覺化展示工具,配置Prometheus為資料來源,並導入專為GPU監控設計的儀表板,提供了針對虛擬化GPU的關鍵效能指標,如算力利用率、顯存使用等。透過視覺化介面維運人員可以即時查看詳細的GPU監控訊息,從而及時發現潛在問題並優化資源配置策略,並且可以設定警告閾值,當GPU利用率過高、溫度過高等情況發生時,自動發送警告通知,從而及時發現和處理潛在問題。
二、GPU資源的虛擬化技術在GPU資源昂貴的背景下,採用GPU虛擬化技術,是提高資源使用率的一大利器。
GPU 資源的虛擬化技術主要有基於硬體輔助的虛擬化、基於驅動隔離、基於 API 轉送以及基於容器的GPU虛擬化幾類。其中前兩類主要是由硬體廠商提供的方案,而基於 API 轉送以及基於容器的GPU虛擬化主要是使用者態實現的虛擬化方案。基於硬體輔助的虛擬化借助GPU硬體本身俱備的虛擬化功能來實現資源的高效分配和共享。
例如,一些GPU晶片內部設定專門的虛擬化模組,這些模組可以直接對GPU的核心、顯存、快取等重要資源進行精細的劃分和管理,將一個GPU顯示卡物理上分割成多個小型顯示卡提供服務。以AMD 的部分GPU產品為例,其硬體輔助的虛擬化技術能夠將GPU的運算單元、顯存等依照預先設定的規則分配給不同的虛擬機器或應用,實現硬體層面的資源隔離與共用。基於硬體輔助的虛擬化效能優勢明顯,由於是在硬體層面直接進行資源分配和管理,減少了軟體層面的干預,能夠最大程度地降低虛擬化帶來的效能損失,提高GPU資源的利用效率,可以依實際需求對GPU的各項資源進行配置,滿足不同業務場景的要求。但這種方式最主要的短板在於對GPU硬體本身是否具備硬體劃分能力要求較高,只有具備相應硬體虛擬化功能的GPU才能採用,且通常劃分的顆粒度較粗。
基於驅動隔離的虛擬化,主要是透過對GPU驅動進行改造,使其能夠在多個虛擬機器或容器之間提供隔離的執行環境。 GPU廠商透過自己的驅動虛擬化,提供不同的VM 或容器各自獨立的驅動實例,這些實例共享實體GPU的硬體資源,不同的使用者或應用在各自的虛擬環境中都能像獨佔GPU一樣使用驅動功能。
基於驅動隔離的虛擬化,提供了較好的隔離性,不同虛擬環境之間的干擾較小,能保障應用的穩定性與安全性。可根據不同虛擬環境的需求靈活配置驅動參數,並提高資源利用效率。對驅動的改造需要GPU廠商的支持,而且不同版本的驅動和GPU型號可能需要針對性的適配工作,開發和維護成本相對較高。
基於 API 轉送的虛擬化,主要是透過在虛擬機器(VM)和實體GPU之間攔截並轉送圖形應用程式介面(API)調用,實現多個 VM 對GPU的共用。
例如,當 VM 中的應用程式發出 DirectX 或 OpenGL 等 API 呼叫時,中間層軟體會截取呼叫指令,然後將其轉送到實體GPU上執行,並將執行結果傳回 VM 中的應用程式。基於API 轉送的虛擬化實作相對簡單,不需要對GPU硬體進行深度修改,能較好地支援多種現有的圖形API,相容性較強,但由於涉及API 呼叫的攔截和轉發,可能會帶來一定的效能開銷,尤其在高負載場景下,對圖形處理的即時性可能會有影響。
以容器為基礎的GPU虛擬化是利用容器技術來實現對GPU資源的虛擬化管理,其本質其實是容器與API呼叫劫持結合的方案。容器透過與宿主機的GPU驅動和相關管理工具配合,將GPU資源分配給各個容器使用。例如,在使用 Docker 容器管理GPU資源時,透過安裝特定的 NVIDIA Docker 外掛程式等方式,讓容器能夠存取和使用宿主機上的GPU資源。
採用容器技術實現的虛擬化屬於輕量級實現方案,啟動速度快,相比虛擬機,容器在創建和運行過程中消耗的資源更少,能夠更快速地部署應用並投入使用。資源共享靈活,容器可以根據自身的需求從宿主機的GPU資源池中靈活取得所需資源,實現了GPU資源在多個容器之間的動態分配。但是容器的隔離性相對虛擬機器較弱,在某些對安全性和隔離性要求極高的應用場景中可能需要採取額外的措施來保障。如下圖所示採用的是一種基於容器和CUDA劫持結合的實現方式,實現GPU core和memory隔離,透過細粒度地切分和隔離GPU核心與內存,它允許在同一物理GPU上運行多個容器,從而更有效地利用硬體資源,提高Kubernetes環境中GPU資源的使用率。其整體實作主要元件及工作原理如下:

(1)Webhook:用於在Kubernetes中註冊和驗證自訂的資源請求,主要實現GPU虛擬化軟體與Kubernetes API交互,並實現GPU資源的管理和調度。 Webhook的工作原理是當使用者建立一個請求vGPU資源的Pod時,kube-apiserver根據MutatingWebhookConfiguration設定呼叫Webhook。 Webhook會檢查Pod中的資源請求,如果發現是請求由GPU虛擬化軟體管理的vGPU資源,則將Pod的SchedulerName欄位改為vgpu-scheduler。此時該Pod就會由vgpu-scheduler進行調度。對於特權模式的Pod或指定了nodeName的Pod,Webhook會直接跳過或拒絕。 (2)Scheduler:GPU虛擬化軟體包括自己的調度器(Scheduler),在創建Pod時做出決策,如何將GPU資源分配給不同的Pod。 Scheduler (vgpu-scheduler)的工作流程是Vgpu-scheduler使用的是Kubernetes預設的kube-scheduler鏡像,但透過設定KubeSchedulerConfiguration,它會呼叫一個名為Extender Scheduler的插件。該插件作為Vgpu-scheduler Pod中的另一個容器提供服務,實現自定義的調度邏輯,該調度邏輯具體來說包含三部分:(a)打分機制:根據每個節點上的已使用的GPU核心和記憶體資源與總資源的比例來計算得分,分數越高表示剩餘資源越少。這有助於選擇最合適的節點來放置Pod。 (b)高階排程策略:包含Spread、Binpack和Random三種調度策略,其中spread策略,傾向於將負載分散到不同的節點上以優化整體效能;而binpack策略則盡量集中負載,減少空閒資源,random則採用隨機分配。 (c)非同步機制:包含GPU感知邏輯,透過定期回報Node上的GPU資源並寫入Node的Annotations中,確保調度器能夠取得最新的資源資訊。 (3)GPU Device Plugin:GPU虛擬化軟體透過自訂的GPU Device Plugin來實現對NVIDIA GPU的感知和資源分配,其主要功能包括:(a)GPU資訊獲取:使用NVML庫獲取節點上的GPU訊息,包括型號、UUID、記憶體等,並根據配置對這些資訊進行處理,例如調整記憶體大小。 (b)資源複製:為了符合Kubernetes的資源分配邏輯,會對實體GPU進行複製,產生多個虛擬設備供不同Pod使用,實現了GPU卡虛擬化復用能力。 (c)環境變數設定:在分配GPU給Pod時,Device Plugin會設定一些環境變量,如CUDA_DEVICE_SM_LIMIT和CUDA_DEVICE_MEMORY_SHARED_CACHE,以及掛載必要的庫文件,如libvgpu.so,以便替換容器中的原生驅動。 (4)vGPU-Core:GPU虛擬化軟體透過攔截CUDA API來實現GPU資源的隔離和限制。這意味著它可以控制每個Pod所使用的GPU資源,實現細粒度的GPU隔離。 vGPU-Core是實現GPU資源隔離的關鍵部分,透過重寫CUDA庫(libvgpu.so)並替換容器中的對應庫文件,實現對CUDA API的攔截。這樣可以精確控制每個Pod存取的GPU核心數和記憶體大小,防止資源爭搶。此外,vGPU-Core也處理了CUDA快取共享等細節,確保多個Pod可以有效率地共享同一塊GPU。例如原生libvgpu.so 在進行記憶體分配時,只有在GPU 記憶體真的用完的時候才會提示CUDA OOM,但是對於vGPU-Core實現的libvgpu.so來說,偵測到Pod 中使用的記憶體超過了Resource中的申請量就直接返回OOM,從而實現資源的一個限制。在執行 nvidia-smi 指令查看 GPU 資訊時,也可傳回 Pod Resource 中申請的資源,這樣在檢視時也會進行隔離。

三、總結整體而言,在GPU資源依然昂貴的今天,GPU資源的高效利用仍然是眾多企業追求的目標,並且企業中國產GPU卡和N卡並存的局面仍將長期存在,採用各硬體廠商提供的監控軟體進行監控,可能帶來更高的管理複雜度,此時建立一個整合有多路線的GPU監控能力的平台進行監控,透過監控資料合理規劃和管理資源的使用,是可以便捷有效促進企業降本增效的方案。同時,在容器化轉型浪潮中,企業也可以結合企業的雲端平台或專業開源平台,透過容器與API呼叫結合的方案,建構GPU資源池並實現資源的虛擬化共享使用,相較硬體廠商提供的軟硬虛擬化方案,也能提供更好的集中管理,並起到資源的靈活、高效利用的效果。
如何提高GPU使用效率-淺析GPU資源監控及虛擬化
by
Tags:
Leave a Reply