他看到Kimi K3開源、還有人只用29GB記憶體就跑起來的消息,很興奮地想在自己那台64GB記憶體的舊MacBook上試試看,證明『不用花錢租伺服器,自己的筆電也能碰到最前沿的巨獸模型』
Kimi K3是一個2.78兆參數的開源大模型,體積驚人,轉換成WASTE能讀的格式後檔案有982GB。一般的做法是把整個模型全部載進記憶體才能運算,但消費級電腦的記憶體通常只有幾十GB,模型檔案卻大上十幾倍,照傳統做法一律是『記憶體不足』直接失敗,連開始運算的機會都沒有。
但K3其實是一種MoE(混合專家模型)把一個大模型拆成很多個小『專家』模組,每次只喚醒其中一小部分來運算,而不是整個模型一起動架構:每處理一個token,路由器(router)MoE模型裡負責『這一步該交給哪幾個專家處理』的小模組,等於是決定每次要喚醒誰的調度員只會挑出全部專家裡大約4%出來動用,剩下96%在那個當下根本用不到。既然用不到,何必逼它一直待在昂貴又有限的記憶體裡?
WASTE的做法,就是把每個token都一定會用到的『主幹』部分放進常駐記憶體從程式一啟動就一直待在RAM裡的資料,隨時能拿來用,不用再等它從硬碟讀進來,至於數量龐大、但每次只用一小撮的『專家』權重(模型參數)模型裡那些在訓練過程中被調整出來、用來決定輸出結果的數字,模型檔案的大小基本上就是這些數字的總量,則留在硬碟上,等真的被路由器點名要用時才即時讀進來,讀完之後放進一塊大小固定、滿了就要按規則踢人的快取空間。
這個做法換來的是『跑得動』,但代價也很直接:實測的命中率大約38%(9038次命中、14514次未命中),代表六成多的時候都得多花一次硬碟讀取,換算下來速度只剩每秒0.45到0.62個字,一句話要等二十幾秒。作者自己也說得很白:這不是免責聲明,是事實——正確、但慢。
| 模型 | 轉換後容器大小 | 最低需要的記憶體 | 實測速度 |
|---|---|---|---|
| Kimi K3(2.78兆參數) | 982 GiB | 29.05 GiB | 每秒 0.45–0.62 個字 |
| Kimi-Linear(480億參數) | 19 GiB | 1.87 GiB | 每秒 10.7 個字 |
這段是簡化過的示意程式碼,把文章描述的『有限快取+隨選讀取硬碟』行為抽出來寫成一個小型的ExpertCache類別,方便理解WASTE的核心邏輯——它不是WASTE的真實原始碼(WASTE是用C寫的),只是把概念翻成好讀的Python。
class ExpertCache: def __init__(self, capacity_gb): self.capacity_gb = capacity_gb self.resident = {} self.recent_order = [] def used_gb(self): return sum(self.resident.values()) def get(self, expert_id, size_gb, read_from_disk): if expert_id in self.resident: self._mark_recent(expert_id) return 'hit' read_from_disk(expert_id) self._admit(expert_id, size_gb) return 'miss' def _mark_recent(self, expert_id): self.recent_order.remove(expert_id) self.recent_order.append(expert_id) def _admit(self, expert_id, size_gb): while self.used_gb() + size_gb > self.capacity_gb: oldest = self.recent_order.pop(0) del self.resident[oldest] self.resident[expert_id] = size_gb self.recent_order.append(expert_id)