DeepSeek 重點分解 – MOE 小整理

DeepSeek 另外一個重點是 MOE (mixure of Expert). 從抽象觀念來理解, 就是說: 既然 Model 裡面有很多個 Expert, 問問題的時候, 只要把特定的專家叫起來回答就可以省能量, 加快反應速度.

LLM 的專家能力體現在 feed forward network (FFN) 這個部分. 以我的理解來說, 過去我們認為的類神經網路的確可以存儲知識, 只是差在沒有 transformer 來理解和表達語意. 人類的大腦也是分化為很多特定區域 [1], 因此動腦的時候的確不需要火力全開. 把 model 分為多個 expert 是很直覺的事.

好, 那麼誰決定選哪一些 expert 起來工作呢? 我們把它叫做 routed expert. 這個路由專家根據 input 把負責 sub-network 的串起來. 不過, 萬一串錯了, 雞同鴨講怎麼辦? 沒關係, 還有 shared expert, 它其實是個通才.

在下面的式子中, ut 代表第 t 個 token 對 FFN 的輸入. FFN(s) 代表 shared expert FFN, FFN(r) 代表 routed expet FFN, 看起來雖然有一點小複雜, 但其實 ht‘就是原始輸入 + routed FFN + shared FFN.

要加哪幾個 routed expert, 取決於 gi,t, 這個是什麼呢? 我們先解釋一下 e, 其他就很好理解了. e 表示 expert 的質心 (the centroid of the routed expert), 可以理解為 expert 的 “代表矩陣". 可能就像我們以前做 clustering, 每個 cluster 都要有一個中心 mean, 這樣才能分群.

當輸入 uT和 e 做矩陣相乘, 直覺可以知道它在判斷輸入 u 和 expert e 是否相似? si,t 就是這個輸出的 softmax 正規化. 既然有值就可以比大小, 最大的 k 個 (top k) si,t 個專家, gi,t不等於 0 就表示會被召喚.

到目前為止, 一切都很直覺. DeepSeek 最厲害在哪裡呢? 除了它把專家切得很細, 還要求挑選的專家要跨 device 做 load-balance. 當 device 數 >= 3, 效果會比較好. 為什麼要搞這個呢? 我認為就是美國不賣它厲害的 GPU 嘛! 每個 GPU 的 memory 都有限制, 所以當然產生了 3 個臭皮匠勝過一個諸葛亮的架構!

為了防止只有某幾個臭皮匠過勞, 或是臭皮匠集中在一起產生工作熱區, 或是遠距溝通但產生通訊熱區. DeepSeek 設計了一些 load balance 的機制. 因此我認為老美的管制是有效的. 如果有水冷的高級 GPU array 和 NPU, 基本上錢砸下去就有了. 因此相關的段落可以跳過. 但是 token dropping [2] 的部分值得一提.

即使上面已經盡力去做 load balance, 還是有可能某些 device 在 “訓練時" 超過運算 budget. 此時就把最沒有親和力 (affinity score, 與上下文相關性) 的 token 丟掉, 丟到平衡為止. 同時又保證至少 training sequence 中的 10% 絕對不能丟.

we drop tokens with the lowest affinity scores on each device until reaching the computational budget. In addition, we ensure that the tokens belonging to approximately 10% of the training sequences will never be dropped. 

有了 MLA 和 MOE, DeepSeek 的兩大武器都稍微提到了. 隱藏在演算法後面的, 算是人海戰術清理訓練資料吧? Microsoft 的 PHI-2 系列就證明過: 只學有用的東西就好, 叫 AI 學一堆垃圾, 卻硬要訓練到收斂根本不環保. 下面稍微列出該論文 [3] 對 pre-trained 下的功夫, 我對於 DeepSeek 的追蹤就暫時告一段落.

While maintaining the same data processing stages as for DeepSeek 67B 
(DeepSeek-AI, 2024), we extend the amount of data and elevate the data quality. In order to enlarge our pre-training corpus, we explore the potential of the internet data and optimize our cleaning processes, thus recovering a large amount of mistakenly deleted data. Moreover, we incorporate more Chinese data, aiming to better leverage the corpus available on the Chinese internet. In addition to the amount of data, we also focus on the data quality.

We enrich our pre-training corpus with high-quality data from various sources, and meanwhile improve the quality-based filtering algorithm. The improved algorithm ensures that a large amount of non-beneficial data will be removed, while the valuable data will be mostly retained. In addition, we filter out the contentious content from our pre-training corpus to mitigate the data bias introduced from specific regional cultures. A detailed discussion about the influence of this filtering strategy is presented in Appendix E.

[REF]

  1. 我讀 «大腦超載時代的思考學» – 2
  2. C. Riquelme, J. Puigcerver, B. Mustafa, M. Neumann, R. Jenatton, A. S. Pinto, D. Keysers, and N. Houlsby. Scaling vision with sparse mixture of experts.In Advances in Neural Information Processing Systems 34: Annual Conference on Neural Information Processing Systems 2021, NeurIPS 2021, pages 8583–8595
  3. https://arxiv.org/html/2405.04434v5

DeepSeek 重點分解 – MLA 小整理

DeepSeek [1] 重點之一是 MLA (Multi-head Latent Attention) . 它可以單獨使用. 解釋它時, 若和 MHA (Multi-Head Attention) 對比會更好理解, 所以先回顧一下 MHA.

1. 原始的注意力計算

一般的注意力機制中, 主要有 q、k、v 三個矩陣. 分別代表 query, key, 和 value. W 是權重矩陣, h 是 hidden state. 下標 t 表示第 t 個 token.

加入多頭機制後: d 是 embedded dimension, nh = attension head 數, , dh 是每個 head 的 dimension. 其中 d = nh * dh , j 是從第一個到第 t 個 token 的 index, i 是第一到第 nh 個 head 的 index.

Attention o 當然也分為第幾個頭的第幾個 token. 故表示為 ot,i. 同樣多頭都用 o 權重矩陣 Wo 轉出 output ut.

一般認為 k, v 的值太多, 是造成計算量和記憶體過多的元凶. 但是不記住這些東西, transformer 就發揮不出造句的能力. 科學家想了各種解法想要簡化 k,v. 但是操作不好就會降低 LLM 的性能. DeepSeek 使用的 MLA 看起來可以兩全其美.

2. MLA 中的計算流程

2.1 Low-Rank Key-Value Joint Compression

在 MLA 中, 首先對 hidden state 壓縮. 從前面的 MHA 的段落可以得知, q, k, v 共用 hidden state 但不共用權重. 那麼我們壓縮 h 再還原就可以節省參數量了. c 矩陣由 ht 乘 WDKV 而來. 顧名思義, D 代表 down projection, kv 矩陣意義跟先前相同. 做完下投影再做上投影, 理解為壓縮解壓縮即可. 所以 WUK 還原 k, WUV 還原 v. 其中 U 就代表 up projection.

我們已經知道這是濃縮再還原的果汁. 為了確定風味不變太多. 損失的部分要要別的方法補回來. 甚至 DeepSeek 為了減少 active node, 連你問的問題 q = query 都壓縮了. 這個猛! 表示我跟它說 “請、謝謝、對不起" 都是多餘的.

2.2 Decoupled Rotary Position Embedding

上面那招還不是全貌. 但是要講第二招就要先講 RoPE (Rotary Position Embedding) [2]. 我們知道原本 transformer 就要記錄 token 的相對位置關係. 畢竟"你愛我" 跟 “我愛你" 是兩碼子事. RoPE 這個演算法就是用來把位置編碼專屬的維度給省了, 但它結 “繩" 記事, 還記得相對位置.

不過這招和 2.1 壓縮那招有衝突, 壓縮完再解壓就不符合交換律. 所以又衍生出 decouple 的輔助算法, 再浪費一點空間. 為 RoPE 額外產生的 dimension 為 dhR. 多出來的 qtR 和 ktR 加在原來的矩陣後面. 式子大致上都一樣.

3. 效能比較

假如我們比對 MHA 和 MLA, 就會發現它的 KV cache 比較少, 而且實測效果更好. 至於 GQA 和 MQA 是來陪榜的. 用論文 [1] 中的圖解帶過.

[REF]

  1. https://arxiv.org/abs/2405.04434
  2. . J. Su, M. Ahmed, Y. Lu, S. Pan, W. Bo, and Y. Liu.Roformer: Enhanced transformer with rotary position embedding.Neurocomputing, 568:127063, 2024.

我讀 «輝達之道»

這個年假原本打算讀兩本書、 校稿兩篇專利 (?)、 準備一些美金看美股有沒有便宜可以撿、最後再看一下同事介紹的 DeepSeek 在幹啥?

不料就在年假的第一個周末, DeepSeek AI 突然直接攻佔各種新聞版面, 變得幾乎無人不知無人不曉. 週一晚上的美股 – 尤其是輝達價格大跳水! 這下我的好幾件事都連結在一起了. 因為我想讀的其中一本書就是 “輝達之道".

這本書原名 “The Nvidia Way", 作者是金泰 (Tae Kim), 譯者是洪世民和鍾玉玨. 本書非常值得推薦, 雖然翻譯有幾處比較不通順 – 不知道副詞子句是在講主詞還是受詞, 但整體可讀性沒問題. 每個人看這本書的觀點可能有些不同, 它可以是勵志的新創公司成功記、可以是黃仁勳發跡故事的側寫、或是一本 GPU 簡史. 對我來說, 它就是 Q&A. 解惑了我好幾個問題.

Q1. Nvidia 為何沒有變成一代拳王? MTK 蔡明介想過這個問題, 黃仁勳也想過. 兩個人遇到的狀況不同, 解法也不一樣. 黃仁勳認為會有一代拳王的是因為大家技術差不多, 但開發一顆 IC 要一年半的時間. 所以當你暫時領先, 對手的新產品就會比你厲害! 假設產品規格並沒有太大的改變, 只要規格疊得高, 那一代新人換舊人就是理所當然的.

黃仁勳解決這個問題的方法是成立不同 project, 開發週期彼此交錯, 共用資源和資訊, 隨時調整規格, 並且準時交貨. 從外界來看, Nvidia 推出產品的時間自然而然就縮短了, 對手很難在兩代產品交接的空檔中找到切入點! 當然這是在 graphic card 大混戰的時代才適用的策略. 如果大勢已定呢? MTK 理所當然去找下一個明星產品, 而老黃則是直接把現在的產品調整到直指未來.

他怎麼做到的呢? 當然就不是兩三句話那麼簡單. 總之我認為他好好地接受了不平凡的建議, 又壓榨出了驚人的成果. 像是光追, tensor, CUDA, NPU, GPU (替代 graphic card) 這些都是底下的人想出來, 再透過老黃鋼鐵的意志實現它. 底下會提到 Nvidia 發明了 GPU 這個名詞來和 graphic card 區隔.

Q2. 為何要叫做 GPU? Nvidia 的產品經理認為他們 graphic card 可以同時處理 4 個 pixel, 能做圖形的旋轉平移, 這些都取代了原本的 CPU 程式, 所以應該叫做 GPU. 於是老黃就在 1988 年 8 月宣稱他們的 GeForce 256 是全世界第一顆 GPU, 即使那顆 GPU 還是要下 register 才能叫它做事, 還不能真的寫高階程式語言.

Q3. 為何雲端運算需要 GPU? 這要先從高速運算說起. Nivia 的團隊在設計 Geforce 3 時, 為了解決 render 上較複雜的計算, 開發者藏了一些可編程的運算單元在圖形處理之中. 當然這代表 GPU 就有了一些浮點矩陣運算的能力. 即便只能用 OpenGL 或是 Nvidia 的 Cg (C for graphic) 來 coding, 至少硬體非常強大.

高速運算原本是 CPU 的市場, 強大的 CPU array 就是超級電腦. 當學者或研究單位擁有超級電腦, 就可以快速地完成複雜的計算. 但沒有被分配到這類珍貴資源的學者, 就算有很好的想法也無法領先發表論文, 輸家就永遠是輸家. 久而久之就形成了學術壟斷.

2002 年, 有位馬克哈里斯 (Mark Harris) 研究員發現許多科學家開始用 GPU 做 “非圖形" 的研究. 狀況就跟現在很多公司、大學都用 RTX4090 而不是 DGX B200 做 AI 實驗是一樣的道理 [1]. 所以他就架了一個 GPGPU.org (generla purpose GPU) 的網站, 幫助大家活用 GPU 來代替買不起的超級電腦. 接著 Nvidia 發現了這個網站, 招募哈里斯加入 NV50 (G80) 團隊.

G80 的 GPGPU 能力比過去更強大, 不再使用 Cg, 而是推出了 CUDA (Compute Unified Device Architecture). CUDA 呼叫 GPU 的 PTX 指令集, 讓大家不需要特別去學這個架構的組合語言, 而是有專屬的 compiler 可用. 黃仁勳說: “CUDA 讓我們的成本大為增加". 但是他們達到了目的: (1) 讓所有的人都可以用 CUDA, (2) 讓 CUDA 適用於所有領域. 於是有愈來愈多人發掘出 GPU 的用途, 從模擬新藥、挖礦 (虛擬貨幣) 到訓練 AI.

當然 Nvidia 的故事也不是都這麼正面. 他們發現科學家工程師只買電腦版 500 USD 的 GPU, 而不買他們更貴的伺服器版 2,000 USD 的 Tesla (p. 378). 於是 Nvidia 自己宣稱他們 PC 版的 floating 不太準, 伺服器版才準. 在被沃克教授證實並沒有不準後, Nvidia 改為在不影響圖形輸出的程度下把它改成不準. 沃克和它的團隊又再把它 patch 回來! 並且在他在藥廠的新工作中,買了成千上萬的電腦級 GPU 來建立 data center.

Q4. 為何大家都用 Nvidia 的 GPU 訓練 AI? 別家的卻不行? 這個問題一半的答案就是 CUDA, 它不是一張繪圖卡或是遊戲卡, 而是算力卡. 若只是要畫出滿屏的圖形, Intel 自己就可以做到了. Nvidia 預先看到這一點, 因此用 GPU 和圖形輸出做出區隔. 並且賣得超級貴. 別人的產品都是 ASP (平均銷售單價) 愈來愈低, Nvidia 主打愈賣愈高, “買愈多省愈多"!

回歸 AI 這個主題. 過去的 Machine Learning 都是先找特徵, 然後統計特徵值, 根據統計原理做分類. 直到 AlexNet 出現, 才有不找特徵, 讓系統根據 label 過的資料, 自己找出規則的 Deep Learning. 當然這就不得不歸功於當初 labeling 這些 database 的先驅李飛飛. 發明 AlexNet 的多倫多大學團隊 (當然包括其中一個學生叫做 Alex) 就是使用輝達的 GeForce 500 做訓練, 他們在第三屆 ImageNet 大賽, 成果遙遙領先其他舊演算法 10% 以上 (p.425).

從此以後, 大家都知道要用 GPU 做 Deep Learning (DL). Nvidia 也看到這個 AI 商機特別大. 因此再推出 CuDNN (CUDA Deep Neural Network) 強化對 AI 的支持度. 對於一般高速運算的市場, 硬體需要支援 FP32 或 FP64 (浮點 bit 數). 但是對於 Neural Network 的訓練來說, FP16 就夠用了. 因此 Nvidia 的 GPU 從 2016 年開始都支援 FP16. 而且還加入了 Tensor Core. 書上提到老黃臨時在 tape out 前幾個月說要加 Tensor, 大家怎麼趕工達標. 這個不是本文的重點就先略過.

Tensor Core 有什麼好處呢? 因為 DL model 裡面都是矩陣運算, 而 CUDA Core 只是浮點乘加器, 需要 CUDA compiler 來優化計算流程. 假如矩陣運算有特別的硬體, 那麼採用 CuDNN 來編 code 就可以更加地優化. P.433 說到,有 Tensor 快 3 倍. 這就解釋了為何大家都愛用 Nvidia 的 GPU 來開發 AI 軟體, 而不用市售的 NPU. 市售的 NPU 對於常用運算子的軟硬體優化差了 Nvidia 一大截. 所以做某些推論應用 (inference) 還可以, 整體而言是事倍倍功半半.

Q5. Nvidia 怎麼搭上 DPU? Mellanox 這家公司把 InfiniBand 這個標準做成高速網卡, 在數據中心可以 offload CPU 對網路封包處理的算力消耗. 雖然生意不錯, 但這家公司太小, 負擔不起高昂的研發費用, 最後只好賣公司. Nvidia, Intel, Xilinx 三家競標之下, Nvidia 看到它在數據中心的綜效, 因此花了每股 125 美元 (共 69 億美金) 標下股價 76.9 的 Mellanox.

接下來, 老黃又出來說我們發明了第一個 DPU. 當然, Nvidia 敢這樣講, 就是他們又投資了更多加速的軟硬體, 跟一般的 SmartNIC 做出區隔. 想要再重演一次“GPU 不等於繪圖卡”的劇本。

這本書的內容當然不只於此。或許可以用創業和經營事業的觀點再重新詮釋一次。像是保持扁平團隊,保証訊息一致,還有老黃偏執地好學等等。這部分就等我看完張忠謀自傳再來匯整好了。畢竟兩大管理者可以互相輝映。

[REF]

  1. https://www.cool3c.com/article/218920

BentoML 小整理

趁著尾牙等摃龜的空檔,把這篇的草稿丟給AI 重寫。雖然變得有點 WIKI化,不過稍微調整順序, 潤飾文字後,感覺還是滿易懂的。

BentoML [1] 是一個開源的 ML 模型服務框架,名字源自日文「便當」,代表將所有組件打包在一起。相較於 Google Cloud 的 Kubeflow 解決方案 [2],BentoML 提供了不綁定特定雲服務的部署方式。

核心特點

  1. 模型管理
  • 統一打包(模型 + 依賴)
  • 版本控制
  • 自動追蹤環境配置
  1. 框架支援
  • 支援主流 ML 框架
    • PyTorch
    • TensorFlow
    • scikit-learn
    • XGBoost
  • 多框架共存部署
  1. 服務效能
  • 高性能 API 服務器
  • 批量推理支援
  • 自動負載均衡
  1. 部署便利性
  • Docker 容器自動生成
  • Kubernetes 整合支援

實作流程

1. 模型訓練與保存

# 訓練模型
from sklearn import svm, datasets
iris = datasets.load_iris()
clf = svm.SVC()
clf.fit(iris.data, iris.target)

# 保存模型
import bentoml
bentoml.sklearn.save_model("iris_clf", clf)

2. 模型管理

# 查看最新版本
bentoml models get iris_clf:latest

# 列出所有版本
bentoml models list

3. 預測方式

3.1 直接載入

loaded_model = bentoml.sklearn.load_model("iris_clf:latest")
result = loaded_model.predict([[5.9, 3.0, 5.1, 1.8]])

3.2 使用 Runner(推薦)

# 建立 Runner 實例
runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
runner.init_local()
result = runner.predict.run([[5.9, 3.0, 5.1, 1.8]])

4. 服務部署

  1. 建立服務檔案 (service.py):
import numpy as np
import bentoml
from bentoml.io import NumpyNdarray

iris_clf_runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
svc = bentoml.Service("iris_classifier", runners=[iris_clf_runner])

@svc.api(input=NumpyNdarray(), output=NumpyNdarray())
def classify(input_series: np.ndarray) -> np.ndarray:
    return iris_clf_runner.predict.run(input_series)
  1. 定義部署配置 (bentofile.yaml):
service: "service.py:svc"
labels:
  owner: bentoml-team
  project: gallery
include:
- "*.py"
python:
  packages:
    - scikit-learn
    - pandas

5. 本地測試服務

bentoml serve service.py:svc --reload
  1. Web UI: 訪問 http://127.0.0.1:3000 或者
  2. API 調用:
$headers = @{"Content-Type" = "application/json"}
$data = "[[5.9, 3, 5.1, 1.8]]"
Invoke-WebRequest -Uri "http://127.0.0.1:3000/classify" -Method POST -Headers $headers -Body $data

6. 容器化部署

# 建立 Bento
bentoml build

# 容器化
bentoml containerize iris_classifier:latest

# 運行容器
docker run -p 3000:3000 iris_classifier:<tag>

7. 注意事項

  • Docker 安裝需要提前準備,過程可能較長且需要重啟.
  • 本地測試時需要注意防火牆設置.
  • Runner 模式提供更好的資源管理和效能優化.

[REF]

  1. https://github.com/nogibjj/mlops-template
  2. Google 的 flow

IC 設計公司營收排名 2024

去年的統計更新了. 幾個重點整理如下:

  1. 聯發科持續成長, 大者恆大.
  2. 瑞昱又再次超車聯詠, 螃蟹公司證明它上次搶到第二名不是偶然.
  3. 老牌公司信驊, 矽統, 世紀民生繳出倍數的成長. 世紀民生成長高達 659.47%.
  4. 業績成長或衰退雙位數的比個位數的還多. 表示競爭激勵, 不進則退.
  5. 因為幣別的關係, 譜瑞-KY 去年就放錯位置, 深感抱歉! 現在往前追溯修正.
  6. 美金最近還在漲, 以下官方如果沒有特別引用匯率, 我就用 32.5:1 來計算.
排名公司股號2024 (K NTD)成長率 (%)
1聯發科2454530,585,88622.41
2瑞昱2379113,393,69819.14
3聯詠3034102,787,751-6.92
群聯 [*]829958,935,51322.2
4世芯-KY366151,976,78265.45
5奇景光電HIMX40,300,00042.43
新唐 [*]491931,923,290-9.69
擎亞 [*]809628,157,01625.47
6慧榮SIMO26,325,0000.2748
旺宏 [*]233725,883,475-6.3
7創意344325,044,192 -4.56
8瑞鼎359224,376,80232.87
9天鈺496119,224,74618.12
10達發科技652619,122,10440.86
11矽力-KY641518,450,37519.6
12矽創801617,826,5056.6
13譜瑞496616,246,76617.99
14威盛238815,910,68625.81
15敦泰354514,538,9877.15
16晶豪科300613,485,16813.47
17義隆245812,695,8625.29
18智原303511,064,852-7.53
19原相32278,362,27343.08
20致新80818,252,6644.32
21祥碩52698,081,07126.24
22聯陽30146,632,5785.67
23信驊52746,459,666106.35
24凌陽24016,434,08624.01
25茂達61386,089,50412.43
26昇佳電子67324,940,6838.76
27神盾64624,790,32824.47
28愛普65314,176,356-0.94
29宜特 [*]32894,345,52614
30力智67193,697,96321.75
31立積49683,679,34823.28
32力旺35293,605,96818.22
33鈺創53513,473,21730.48
34創惟61043,178,69026.36
35偉詮24363,094,6197.25
36富鼎82612,918,3812.36
37大中64352,716,0852.24
38晶焱64112,744,6844.06
39松翰54712,744,4665.15
40盛群62022,501,630-3.64
41尼克森33.172,468,2610.15
42凌通49522,461,89513.61
43安國80542,192,58810.17
44沛亨62911,824,248-26.39
45凌陽創新52361,817,92710.17
46研通62291,796,99663.24
47聚積35271,792,664-3.43
48威鋒電子67561,700,310-16.45
49杰力52991,691,956-2.38
50揚智30411,628,22413.08
51系微62311,614,58820.27
52晶宏31411,507,390-18.65
53M3166431,480,903-8.15
54通嘉35881,453,90627.36
55晶心科65331,381,50730.6
56九齊64941,345,3000.92
57點序64851,261,971-25.09
58普誠6129 1,150,966-30.64
59倚強32191,137,860-1.67
60宏觀65681,065,4916.97
61海德威3268972,915-7.38
62類比科3438963,3709.51
63禾瑞亞3556955,594-16.39
64亞信3169852,618-3.94
65虹冠3257816,028-24.01
66矽統2363 738,560294.56
67迅杰6243716,549-18.14
68九暘8040644,041-10.3
69世紀民生5314643,931659.47
70驊訊6237448,7417.45
71金麗科3228424,69640.73
72旺玖6233417,22515.73
73笙泉3122364,666-1.78
74笙科5272 331,795-0.52
75鑫創3259239,109-13.25
76佑華微8024224,068-6.29
77通泰5487194,27720.6
78聯傑3094165,860-31.62
79凱鈺5468120,5681.52
80點晶328881,779-16.62
81合邦610354,87513.98
82太欣530213,91213.46