DeepSeek 重點分解 – PTX和蒸餾

先前做了一些 DeepSeek 算法上的研讀, 不過其實它的亮點還有很多. 這邊補充一小一大兩個東西. 第一個是 PTX, 第二個是蒸餾.

先前在 “輝達之道" 那篇稍微提到 PTX (Parallel Thread Execution). 在還沒有 CUDA 之前, 輝達就可以使用 Cg, OpenGL 或是 PTX 寫程式. 根據幾篇報導 [1-2] 指出, 這次 DeepSeek 不使用 CUDA, 直接使用 PTX 所以榨出更多的效能.

效能問題只是一個角度, 就好像說我的 code 都是用組合語言寫的, 所以效能更好. 人家可能說你神經病. 但跳過 CUDA 確實不一樣. 很多人認為, 就算大陸做出一個新模型, 效能更好, 還是逃不開輝達的 CUDA, 所以輝達的護城河仍在!像是我相當佩服得美投君 [3] 的新片也是這樣想.

[3] 影片 8’37″

不過我更願意相信, DeepSeek 有意擺脫 CUDA, 而不只是單純為了提升效能. 首先 PTX 類似 Java, 是 just in time 的編譯器 (virtual ISA), 針對不同的硬體可以做二次移植. 其次是 AMD GPU 和華為的 NPU 都支援 DeepSeek [4]. 華為的 Huawei Ascend NPU [5] 是什麼概念呢? 它可以中國產商不買輝達 GPU, 美國掐不住它的脖子 [6-7].

其次談一下蒸餾 (distillation). 我們知道這是一個老師教學生的演算法, 大模型教小模型, 小模型甚至能青出於藍, 但計算量就省下來了! DeepSeek 是一個大模型, 就算 MOE 等方法可以讓它只激活部分參數, 那還是很巨大啊!

但讓世人震撼的另外一面是 DeepSeek R1! 現在如果問 DeepSeek 關於它自己的技術, 它會有點故意誤導, 不知道是不是政治干擾? 根據 HuggingFace 上的說明: “DeepSeek-R1-Zero & DeepSeek-R1 are trained based on DeepSeek-V3-Base." [8] 但 DeepSeek 自己倒是說 “R1 可能是 DeepSeek 的早期版本或基础版本", 連自己的身世都胡扯, 哈!

回到正題, R1 比 V3 更強大 [8], 它對標的是 OpenAI o1 – 1217. V3 是最右邊偏矮的那一個. AI 要做得好, 除了硬體和演算法, 就是要靠好的教材. V3 反映了演算法, R1 彰顯的就是好的教材.

R1 有兩個版本, DeepSeek R1 和 DeepSeek R1- Zero. 在官網講得有點不清楚, 我先引用曲博的影片 [9], 再補充名詞解釋.

R1-Zero = V3 + RL => 無盡的重複、可讀性差、語言混雜 => 有缺點.

R1 參考下圖.

[9] 17’19″

其中:

  • RL = large-scale reinforcement learning, SFT = supervisor fine tuning,
  • cold start = 通常是指參數是未訓練過、隨機的. 但 SFT 後再 cold start 有點怪怪的. 這部分還不理解.
  • GRPO (group relative Policy Optimization) = 群內相對評比. 也就是標準答案不從外面給, 而是自己比較哪個答案好? 例如寫兩段 code, 誰的效率高自己知道.

接下來就是蒸餾的部分, DeepSeek 推出了它當老師教小模型的版本. 其中交 Qwen2.5-32B 就已經很厲害, 教 Llama 70B 的部分, 在下表 [8] 的比試幾乎全勝! 只有 CodeForces rating 這項還輸 o1-mini 而已.

這表示什麼呢? 這說明就算你的系統還跑不了 V3 或是更優化的 R1, 只要用它去教小模型, 小模型也堪用. 像是它教出來的 Qwen 只有 1.5B, 好幾項測試都還贏 OpenAI 的 Claude 3.5 Sonnet, 這個還要花錢買耶 (我! QQ). Qwen 卻是 open source.

所以我感覺 DeepSeek 的發布不只是火力展示, 它的目的是要從算法、數據 (能教人是好老師) 兩方面展示不輸老美的優勢. 強強相爭, 以後 AI 會進步地更快吧! 只要不消滅人類都是好事!

[後記]

寫完之後, 發現老高也來評論了 [11]. 他講到一個值得補充的地方. ChatGPT 4o 對標 DeepSeek V3, 訴求全能. ChatGPT 01 對標 DeepSeek R1, 訴求推理過程 (chain of thought).

[REF]

  1. DeepSeek 绕开 CUDA 垄断,针对英伟达 PTX 进行优化实现最大性能,英伟达护城河还在吗
  2. https://technews.tw/2025/01/29/deepseek-bypass-cuda-and-using-ptx-for-better-optimization/
  3. https://www.youtube.com/watch?v=81cbmeXTQcg
  4. https://huggingface.co/deepseek-ai/DeepSeek-V3
  5. https://medium.com/huawei-developers/world-of-huawei-ascend-future-with-npus-5843c18993f3
  6. https://blog.csdn.net/qq_54958500/article/details/144064251
  7. https://udn.com/news/story/7333/8022387
  8. https://huggingface.co/deepseek-ai/DeepSeek-R1
  9. https://www.youtube.com/watch?v=spoPf8CjjBo
  10. https://www.bnext.com.tw/article/79507/claude-3.5-sonnet-best-ai?
  11. https://www.youtube.com/watch?v=uKBI1Ea8VO0

Tesorflow on Windows 10 小筆記

最近想要自己安裝 tensorflow 到 Windows 10 底下, 找了一篇很好的文章來參考 [1].  不過實際動手做的時候, 遇到一些小問題, 所以另外做個筆記紀錄一下.

首先我們要安裝 Python [2], 這點沒有疑慮. 到官網抓下來安裝. 然後手動把路徑加到系統環境即可. 但接下來分岔成兩種作法: A 和 B:

(A) 在 Python 環境下安裝 tensorflow.

pip3 install –upgrade tensorflow-gpu

安裝過程一切順利, 但是在 python 提示號下, 可能會遇到 ctypes.WINDLL 找不到 cudart_dll_XXX 的問題. 理論上安裝完 cuda 就會好.  值得注意的是 cuda 和 cuDNN 的版本要搭配 tensorflow-gpu 的版本. 現在的 python 3.6 要搭 cuda 9.0 和 cuDNN 7.0, 這個組合試過沒問題. 但我也曾經試過 cuda 9.1 搭 DNN 9.1, 結果失敗了. 不敢說這組合一定不行, 但我不打算再試了, 先退版本再說.

安裝完 cuda, 用 “nvcc -V" 可以看 cuda driver 是否正確安裝? 但安裝 driver之前, cuda 安裝程式會說 “找不到相容的顯示卡, 但是沒關係可以先安裝." 這讓我擔心了一下. 難道說有兩張顯卡的話會亂抓? 於是我又另外下載 cuda-Z [3] 來驗證. 實測發現讓 Intel UHD 620 和 GTX-1050 共存, 或是把 620 關掉; cuda-z 都可以正確找到 GTX-1050. 

最後一個提醒點是, 如果在 windows 的 command shell 打 python 出現的  shell 底下無法正常使用 import tensorflow, 但是在 python 安裝時自己產生的 command shell 就沒這個問題. 可見得還是有些小地方設定不同.

網路教學 [1] 說可以用矩陣乘法測試 tensorflow, 但實測起來, 老舊的桌機跑 CPU only 反而比 CPU + GPU 快! 問題出在這個 interpreter 會動態去偵測 CPU 和 GPU, 花了不少時間去優化環境. Your CPU supports …. AVX2, found device…GeForce 1050 … Total Memory 2.00GiB…etc.   

tensorflow-1-768x329

(2B) 用 anaconda3 的環境. 安裝它的好處是不會獨佔 python 的環境, 它可以用 anaconda prompt interpreter, 或者用 IDE (integrated development environment) 來寫程式. 從 anaconda navigator 進去, 然後點選 Spyder, 就可以自己寫 python 程式 compile 來跑.

spyder-1-768x636

安裝 anaconda 時會要求順便安裝 Visual Code, 安裝  Visual Code 和 Visual studio 時又會推薦同時安裝 git. 所以這個家族人數不少.  安裝 Visual Studio 的好處是 cuda 有一些 sample code, 可以跑來看看. 不過這裡面有一大敗筆是 sample code 只支援到 MSC_VER 1911, 最新的 Video studio 2017 已經是 MSC_VER 1912, 我看要改得地方太多, 決定放棄.

[Reference]

  1. http://blog.csdn.net/u010099080/article/details/53418159#%E5%AE%89%E8%A3%85-cudnn
  2. https://www.python.org/downloads/release/python-364/, download 連結在下方.
  3. http://cuda-z.sourceforge.net/

萊特幣小註解

萊特幣 (Litcoin) 是除了比特幣之外, 另一個比較多人在挖的"幣".它的原理和比特幣差不多, 只是工具有點不一樣.

首先它有另外一個錢包要 download.

然後它也要找挖礦軟體、礦池、 以及註冊帳號. 不過比起比特幣, 它的資源真的比較少. 如果只是要玩一玩, 那麼可以下載極少數有 GUI 的 Litecoi n 挖礦軟體.

ScryptMiner GUI – Simple GUI for Litecoin mining

這個軟體有一個 bug, 那就是它 start mining 一次就會起一個 task, 以至於後面按了半天沒反應, 其實第一個 task 就已經卡住了. 把那些正 idle 的 task 都砍光, 才能夠正常運作.

至於礦池, 可以先找個台灣的. 在挖礦軟體中, server 輸入: http://litecoin.tw, port 設為 9327. user 設成 Litecoin-qt 錢包中的收帳地址, 密碼隨便亂填, 基本上就可以了.

如果各位看倌會用 DOS 的 .bat 檔, 只要做個 batch 檔, 內容是這樣就行了.

cgminer –scrypt -o http://litecoin.tw:9327 -u 收錢地址 -p 密碼

參數其實還有更多 [3], 但是程式默認會優化, 所以不如不要寫參數.

此外, 也有針對 Nvidia 的 CUDA 所寫的 cudaminer [4], 用法和先前一樣, 把 cgminer 換成 cudaminer 就可以了. 

不過, 不知道是這個 cudaminer 寫得太爛, 還是 CUDA 沒有 OpenCL 厲害. 總之, 它的效能只有 170 K Hash/sec. 比起 bitcoin by OpenCL 的 98 M Hash /s, 簡直是 COBOL 對上組合語言!

因此, 傳說中 cgminer 是萊特幣唯一的挖礦好軟體, 可能所言不虛. 另外人家說 ATI 網卡比 Nvidia 好用, 可能也是這個原因.

[ref]

1. Litecoin.org

2. 萊特幣台灣礦池 Litecoin.tw

3. cgminer运行参数详解

4. A new Litecoin mining application

如果大家下載了此處的 cudaminer, 它執行的時候會抱怨找不到 MSVCP100.dll 之類的. 莫驚慌害怕, 只要把 cgminer 目錄裡面的同名檔案 copy 過來就好了.