上一篇文章指出,企業級 AI 的下一個真正限制將出現在利用率而非智慧程度,並提到目前尚未出現成熟的 GPU 管理實踐指南。這篇文章將分享我們的經驗。
我們開發了一個具備限制感知能力的 GPU 分配器,並在七種基準測試情境下,將其與先進先出 (FIFO) 排程器進行比較。在相同的硬體上執行相同的工作負載,GPU 利用率最高提升了 33 個百分點,而優先權加權產出在所有情境中都有所提升,最高達 105%。硬體本身沒有任何改變,改變的只是分配決策的順序。
在深入探討數據之前,先說明一下測量方式。以下所有增益都表示為在相同情境下相對於 FIFO 結果的改進。利用率以百分點表示;價值則以優先權加權產出的百分比增長來表示。
「讓 GPU 保持忙碌」並非系統能直接執行的決策。更精確且困難的決策是:哪個 GPU 在哪個時間步執行哪個任務,以及其優先權為何。形式上,這是一個針對 GPU、任務和時間步組合的二元選擇,其產出是一個網格,涵蓋整個排程週期的每個 GPU,每個單元格中填入任務名稱或留空。
四種工作負載類型爭奪這個排程網格:訓練、即時推論、批次推論和量化。它們分為兩種分配形狀,而這種區分正是困難所在。訓練、批次推論和量化屬於批次型任務:一旦啟動,每個任務都需要連續的 GPU 區塊,且在任務完成前不能中斷。即時推論則相反:它具有彈性,由每個時間步變化的需求曲線驅動,隨著流量的增減而擴張或縮小。
兩種不相容的形狀在相同的時間步內爭奪相同的硬體,這是核心問題。第二種異質性存在於單一類型內部:對於相同的基礎模型,訓練任務的時長從數小時到數天不等,所需的 GPU 數量也從一個到數十個不等。
本文的比較基準是基於 FIFO 的排程器:即時推論從固定預留中提供服務,而所有其他任務則按到達順序放置,不考慮優先權。
在適當的條件下,這是一個合理的策略。當叢集有閒置容量時,分配順序不會造成利用率損失,所有任務都能按序容納,因此 FIFO 和任何更複雜的排程器都能填滿相同的資源池比例。然而,在資源爭用時,這種排序成本就不再隱形,並開始消耗容量。此時,它會以兩種獨立的方式變得昂貴,值得我們逐一探討。
預留機制。即時推論無法等待容量;GPU 必須在流量需要時立即可用。一個按到達順序放置任務的排程器,沒有機制可以在低谷時釋放 GPU,並在下一個尖峰來臨前重新收回它們。因此,唯一能保證可用性的方法是,將每個即時應用程式當天的最大需求量預留給它一整天。
其成本體現在非尖峰時段的每個小時。一個在中午需要六個 GPU、凌晨四點需要兩個 GPU 的應用程式,會佔用全部六個 GPU 長達二十四小時,而其中四個閒置的 GPU 在一整天內都無法供任何批次任務使用。它們既沒有被使用,也沒有被釋放。這就是為什麼在預留佔主導地位的兩個情境中,基準線接近叢集一半的原因:混合控制情境為 51.6%,訓練密集型情境為 53.6%。
大約一半的資源池,其中大部分閒置的一半是被預留而非空閒的。無論叢集是否處於爭用狀態,這項成本都會產生,爭用只會使其變得可見。
排程順序。在真正的資源爭用下,哪些任務能被容納,取決於你放置它們的順序,而不僅僅是存在多少容量。順序並非在容量問題解決後才應用的決勝因素,順序本身就是一個容量決策。FIFO 按任務到達的順序放置每個任務,不權衡該任務的價值,也不檢查在排程週期內還有哪些任務需要容納。因此,高優先權的工作會排在任何先提出請求的任務之後,而容量則被分配給後續任務無法使用的位置。
這兩者相互加劇。為一天中即時需求的最高峰預留的區塊,在每個小時內都無法供佇列中的任何批次任務使用,而剩餘的容量則按請求到達的順序分配出去。
這就像航空公司將飛機分配給最先預訂的包機,結果卻發現沒有飛機可以執行真正賺錢的航線。而那些為持續數小時的尖峰需求而預留一整天的 GPU,正是前一篇文章中提到的「停飛的飛機」最真實的寫照:它們處於待命狀態,沒有產生任何收益,也無法供其他人使用。
在為真正資源爭用而設計的五個基準測試情境中,我們的分配器同時改善了兩個面向。利用率從 52–85% 的區間提升到 72–88% 的區間。優先權加權價值提升了 24.6% 到 105.1%,平均為 52%。每個情境,兩個指標都得到改善,沒有任何權衡需要解釋。
最強勁的單一案例是 8 個 GPU 上的訓練密集型工作負載:利用率從 53.6% 提升到 87.0%,價值更是翻了一倍多,增長 105%。透過回收預留的待命容量並按優先權順序放置其餘任務,一個固定且已經折舊的資產,其利用率提升了 33 個百分點。(此數據反映了單一基準排序。)
該分配器消除了這兩種行為。即時需求被視為一條曲線而非上限,根據每個時間步的需求進行分配,批次型任務則佔用低谷時段,並受限於即時任務在連續時間步之間可交換的 GPU 數量上限。而批次型任務則根據整個排程週期的優先權而非到達順序進行放置。本文的其餘部分將解釋其運作方式。
利用率是必要條件,但優先權才能將其轉化為價值。利用率衡量的是佔用率:可用 GPU 時間中有多少比例被分配給了任務。它不包含關於該任務價值多少的資訊。有一個情境完全將兩者分開,且其差距方向很容易被忽略。
在規模測試中,64 個 GPU 上運行 30 個任務,FIFO 和分配器產生了相同的利用率,均為 44.9%,吞吐量也相同,完成了 30 個任務中的 27 個。然而,分配器提供了 15.9% 更多的優先權加權價值。每個儀表板讀數都相同,但叢集卻產生了實質上不同的產出。
一個不考慮優先權的目標,可以將叢集填滿到完全相同的水平,完成完全相同數量的任務,但仍然提供較低的價值。上一篇文章指出佔用率並不能很好地衡量叢集是否產生收益;這就是該主張的測量版本。
替代方案並非一長串啟發式規則。有些限制只有在全球範圍內才有意義,任何局部規則都無法表達它們:例如連續區塊、整個排程週期內可接受的 GPU 轉換預算,以及保證正在運行的任務永不被搶佔。為了遵守這些限制,問題必須被公式化為一個整體。
五個限制定義了合法的分配:
1. 每個 GPU 在每個時間步最多服務一個任務。
2. 每個任務都遵守其需求範圍,並且繼承並保留已在運行的任務。
3. 批次型任務佔用連續的 GPU 區塊,大小為二的冪次。
4. 即時任務在連續時間步之間可交換的 GPU 數量有硬性上限。
5. 已啟動的任務不能被中斷。
目標函數有兩項。將 GPU 分配給批次型任務會獲得與其優先權乘以時間衰減權重相等的獎勵。未能滿足即時需求會產生與短缺大小成比例的懲罰。
這些權重的相對大小就是整個服務水準政策,以一個數字表示。即時懲罰權重是分配權重的 5 到 10 倍。因此,一個單位未滿足的即時需求,其成本相當於 5 到 10 個相同優先權批次任務的 GPU 時間步成本。這種不對稱是故意的,這意味著延遲義務是在與放置批次任務相同的優化過程中強制執行的,而不是由一個與排程器爭奪相同 GPU 的獨立自動擴展器來完成。
這也是使即時需求的彈性處理變得安全的原因。分配器可以在低谷時將 GPU 交給批次任務,因為之後未能滿足即時需求的成本遠高於該批次任務所能帶來的收益,懲罰,而非靜態預留,才是保護可用性的關鍵。時間權重在排程週期內衰減,其原因僅在線上系統中有意義:到下一次排程運行時,新的任務將會到達。現在使用的容量比承諾稍後使用的容量更有價值。
形式化模型定義了合法且評分良好的分配是什麼樣子。回應傳入的請求是一項獨立的任務,屬於一個獨立的組件。這是一個 NP 困難的組合分配問題,排程器在每次任務到達時都會被重新調用,因此決策必須在兩個 API 請求之間的間隙內返回。這個延遲預算就是架構設計所圍繞的固定限制,這就是為什麼啟發式演算法位於熱路徑上,而形式化模型則作為啟發式演算法必須滿足的規範,位於其後。
該啟發式演算法並非通用的貪婪分配器。它的規則就是形式化模型的結構性限制,這意味著它產生的每個網格在建構上都是合法的分配。它不是「通常有效」,而是「設計上即為有效」。
這種設計,應用於整個排程週期而非一次一個到達的任務,產生了利用率的提升。分配器在放置任何任務之前會看到所有佇列中的任務,它可以將閒置資源池保持為剩餘任務實際可以佔用的形狀,一個需要特定大小連續區塊的批次任務在輪到它時仍然有空間。優先權決定了誰首先佔用這個空間。
FIFO 則沒有這種視角:它將容量分配給最先提出請求的任務,而一個稍後到達且需要特定形狀的任務可能會發現沒有適合的空間,因此它未被排程,而它本應消耗的 GPU 小時數也未被利用。
它在五個資源爭用情境中運行時間為 1 到 2 毫秒,在 64 個 GPU 和 30 個任務的情境中為 15 毫秒,足夠快,可以在每個傳入請求上運行。
系統提供兩種模式。快速模式單獨運行分配器並返回其網格;這是熱路徑。完整模式則使用該網格作為形式化模型的起點,該模型會嘗試對其進行改進,適用於定期審查而非每個請求的決策。
結果
| 情境 | 利用率 | 價值 | 價值增益 | 延遲 |
| :----------------- | :---------------- | :--------------- | :------- | :--- |
| 混合控制 (8 GPU, 10 任務) | 51.6% → 72.4% | 7,093 → 10,980 | +54.8% | 1 ms |
| 即時爭用 (8 GPU, 8 任務) | 75.0% → 80.2% | 3,233 → 4,029 | +24.6% | 1 ms |
| 訓練密集型 (8 GPU, 16 任務) | 53.6% → 87.0% | 8,553 → 17,545 | +105.1% | 2 ms |
| 大型混合 (14 GPU, 16 任務) | 76.8% → 82.7% | 13,977 → 20,101 | +43.8% | 2 ms |
| 超額訂閱 (8 GPU, 9 任務) | 85.4% → 87.5% | 4,311 → 5,760 | +33.6% | 1 ms |
| 規模測試 (64 GPU, 30 任務) | 44.9% → 44.9% | 44,233 → 51,248 | +15.9% | 15 ms |
| 統一優先權 (14 GPU, 16 任務) | 76.8% → 87.5% | 25,219 → 31,052 | +23.1% | 2 ms |
除了一個情境外,所有情境的利用率都得到了改善,該情境的利用率完全持平。所有七個情境的價值都得到了改善。
規模測試之所以重要,是因為它證明了在大型環境下的有效性:64 個 GPU,30 個任務,15 毫秒的運行時間,卻帶來了 15.9% 的價值增益。
統一優先權測試之所以重要,是因為它解決了顯而易見的質疑。即使將所有任務的優先權設為相同,沒有任何優先權訊號可以區分它們,分配器仍然能將利用率從 76.8% 提升到 87.5%,價值也增加了 23.1%。這項增益並非單純是排序的結果。



