瘋了!居然有人試圖讓我搞懂,什么是 DeepGEMM
DeepSeek開源周,繼DeepEP之后,開源了第三彈DeepGEMM。
今天簡單來說說:
- 吃瓜:DeepGMEE是干嘛的?
- 技術:DeepGMEE是怎么做到的?
- 普通人有什么用:對寫提示詞有什么啟示?
DeepGMEE是干嘛的?
DeepGMEE,General Matrix Multiplication,一個FP8通用矩陣乘法庫(library)。
畫外音,FP8:8-bit Floating Point,8位浮點格式。
關于FP8通用矩陣乘法
一個矩陣乘法的優化而已,寫了這么多年代碼都沒用過矩陣乘法,值得這么吹流弊嗎?
額,我竟無言以對。
矩陣乘法是現代AI計算的基石。
- 矩陣是數據表示的核心工具:神經網絡中的權重,特征,參數傳遞等都使用矩陣表示;
- 矩陣乘法占大模型中90%的計算量:Transformer基操QKV運算,卷積計算,分層全連接計算等;
- 硬件優化的核心目標就是矩陣乘法計算;
傳統AI的矩陣乘法怎么算?
傳統一般使用NVIDIA開源的CUDA C++模板庫CUTLASS。
傳統方法通常采用FP16/FP32,存在一些潛在的不足:
- 占顯存資源:FP32占顯存是FP8的4倍;
- 資源利用率低:強制要求矩陣為2次冪尺寸(例如:128*128),容易出現顯存碎片;
- 不支持MOE模型的分組矩陣計算;
- 部署復雜度高:需要編譯,需要配置;
那為什么之前不直接采用FP8呢?
FP8雖然占用資源少,資源利用率高,但會帶來精度損失。
這個問題程序員最好理解。
高精度乘法:1.2 * 3.4 = 4.08
如果直接降低精讀,用整數表示浮點數,變為1 * 3 = 3,精讀損失是無法接受的。
那有沒有彌補精讀不足的問題?
我們可以對浮點數進行整數化編碼處理:
- 步驟一:1.2用(12, 1)表示,其中1是小數位數;
- 步驟二:3.4用(34, 1)表示;
- 步驟三:1.2 * 3.4 = (12, 1) * (34, 1) = (12*34, 1+1) = (408, 2)
如此一來,就沒有精度損失啦。
當然,矩陣乘法的精度補償比這個復雜,其核心思路是:使用低精度乘法矩陣快速計算,高精度加法補足。
結論就是:deepseek使用FP8就能完成FP16/FP32的計算,降低顯存占用+提高顯存利用率的同時,仍然能夠保持高精度。
DeepGMEE的特點
Git介紹中對DeepGMEE有三個關鍵形容詞:
- 簡潔(clean)
- 高效(efficient)
- 高精度(fine-grained scaling)
為什么說DeepGMEE簡潔?
- 核心代碼300行,而CUTLASS數千行;
- 零依賴(除CUDA),無需預編譯,無需復雜環境配置;
- 注釋清晰,便于學習與二次開發;
畫外音:我看了一下,調整數據分塊策略,只需要修改10-20行代碼。
為什么說DeepGMEE高效?
這是FP8對比FP16/FP32的天然優勢,相比GUTLASS:
- 顯存占用下降50%+;
- MOE推理延時下降60%+;
- 計算密度(TFLOPS)提升了270%+;
為什么說DeepGEMM高精度?
采用FP8矩陣乘法加速計算,BF16累加修正精讀的方法,平衡了速度與精讀。
除此之外,DeepGEMM還有不少特色:
- 針對MOE優化,支持MOE分組矩陣乘法;
- 針對硬件加速;
- 動態編譯JIT:運行時根據矩陣大小與硬件條件優化;
- 矩陣靈活尺寸對齊(例如:可以支持112*128矩陣);
上面種種,DeepGMEE本次最大的創新,我認為是:FP8優化,JIT優化,以及MOE優化。
DeepGMEE是怎么做到的?
信息密度太大,頭疼,有點學不過來了,感興趣的同學去官網看吧,我Copy一下git的信息:
- Persistent warp-specialization
- Hopper TMA features
- A unified and optimized block scheduler
- Fully JIT design
- Unaligned block sizes
- FFMA SASS interleaving
- Common detail optimizations
畫外音:其實你也不想知道這些how?
了解GEMM對普通人寫提示詞有什么啟示?
沒有啟示,這東西和提示詞沒關系。
結尾
對于DeepGEMM,我的思考是:
- 之前各大玩家都卷硬件,而忽略了軟件的優化;
- 僵化思維真的很要命,一直以來都是FP16/FP32,大家也都用CUTLASS,它就一定是最優嗎?
- 寫代碼,搞架構,少即是多:多寫這類300行優美的代碼,而不要在垃圾公司堆shi山;
先睡了,共勉!
畫外音:球球deepseek,明天不要開源新東西了。