週五晚上,她正要處理一台待維修主機,卻發現上面跑著好幾個「不可被打斷」的訓練工作
Ai2(艾倫人工智慧研究所)內部有一支 AI 基礎設施團隊,要管理數千張 NVIDIA 的 H100、B200、B300 GPU顯示卡晶片,原本畫圖用,現在是訓練 AI 的主力運算硬體,分成 88 到 1024 張不等的多個叢集,服務約 150 位研究員。這些叢集主要跑大型的 分散式訓練把一個超大的訓練工作切開,同時交給很多張 GPU 一起算。
問題在於需求遠大於供給:任何時刻,大家提出的需求量都是現有 GPU 的 2 到 3 倍。換句話說,每一個 GPU 小時,都有 2 到 3 個研究工作在搶。
他們原本用「優先權排程給每個工作標上高、中、低等級,等級高的先拿到資源」,還允許工作選擇「不可被搶佔」。結果出現兩種怪現象:有人佔著 GPU 不放(squatting),掛一個什麼都不做的工作,等需要時再接手;還有「優先權通膨」,最後 100% 的工作都標成 HIGH,低優先權的工作完全分不到 GPU。
於是他們換成新系統:GPU 時間預算每個專案每段時間可以使用多少 GPU 小時,像零用錢一樣先分配好、階層式公平分配資源不夠時,依事先約定的比例分,而不是誰喊得大聲誰拿走,再加上一份時間切片契約。結果是,「每個專案該拿多少 GPU 時間」從一件件臨時處理的維運工單,變成透明的行政預算流程。
| 面向 | 舊:優先權排程 | 新:預算+公平分配 |
|---|---|---|
| 資源怎麼決定 | 工作自己標優先權 | 事先分配 GPU 時間預算 |
| 標籤成本 | 免費,所以會通膨 | 有限額,用掉就沒有 |
| 爭議發生處 | 每天的維運工單 | 預算編列的行政流程 |
| 可預期性 | 低,要靠人協調關機 | 較高,依契約切片 |
這是「加權公平分配」的概念版:每隊依預算比例分 GPU,吃不完的額度會讓給還有需求的隊伍。這是用來理解原理的簡化版本,不是 Ai2 的實際程式。
def fair_share(budgets, demand, supply): got = {t: 0 for t in budgets} left, active = supply, set(budgets) while left > 0.01 and active: total = sum(budgets[t] for t in active) if total == 0: break used = 0 for t in list(active): give = min(demand[t] - got[t], left * budgets[t] / total) got[t] += give; used += give if demand[t] - got[t] < 0.01: active.discard(t) left -= used if used < 0.01: break return got