當初覺得自己不玩遊戲,用不到獨立顯卡何必浪費錢浪費電?工作機選了迷你主機,靠 CPU 內顯應付日常開發已綽綽有餘。殊不知這兩年 AI 議題興起,不管 AI 生圖還是ChatGPT ,全靠數以萬計的 GPU 提供算力。想跟上潮流自己在家裡玩玩 LLM 模型,沒有一張夠力的顯卡,寸步難行。

最近研究後有新發現,靠著開源社群的神人加持,在沒有 GPU 的電腦上純用 CPU 跑 LLM,其實也不是那麼遙不可及。我還學到另一件事 - 要執行數百上千億個參數的大型語言模型,有多少 GPU 核心反而不是重點,顯示卡有多少記憶體才是關鍵,大小很重要!!

以 FB 公司 Meta 釋出的 LLaMA 2 模型為例,它有 7B、13B、34B 跟 70B 四種參數規模不同的大小模型,參數愈多自然愈聰明,表現愈好。但它們需要的顯卡記憶體容量也極可觀,每個參數為 FP32 浮點數要用掉 4 Bytes,70B 等同 280 GB,目前消費市場最貴的 Nvidia 顯卡 4090 只有 24GB,要 12 張也才有 288GB(就算花得起 80 萬買 12 張 4090,你也找不到可以插 12 張顯卡的主機板啊),所以這個領域一向是傳說中八卡機(8 張 A100 80GB,共 640GB)的戰場。

所幸,有一些降低硬體需求的技術,能讓大型語言模型有機會飛入尋常百姓家。(註:身為中期才加入湊熱鬧的鄉民,網路上的參考資料超級豐富,下面提到各技術會以前輩的精彩分享為主,簡單帶過)

第一個是量化 (Quantization)。參考:LLM Note Day 14 - 量化 Quantization by 大歐派蘿莉

模型訓練一般會使用 32 Bits (FP32) 或 16 Bits 浮點數 (FP16) 儲存數列資料。以 [1.2, 0.3, -0.1, -0.8] FP32 儲存為例,會佔用 16 Bytes,量化概念類似 JPG 照片,是一種有損壓縮縮。方法是透過正規化 (Normalize) 先取得數列的最小值 -0.8 及最大值 1.2,將最小值及最大值對映 -128 及 127,可得公式 (v - -0.8) / (1.2 - -0.8) * 255 - 128 公式將原始數列量化成四個 INT8 (1 Byte) [127, 12, -39, -128]。量化結果並可反向量化回 [1.2, 0.298, -0.102, -0.8],會損失一些精確度,但空間由 16 Bytes (FP32 * 4) 縮小到 4 Bytes,但需額外記錄 2 個 FP32(最大及最小值)。進一步透過取絕對值再計算(AbsMax Quantization),額外記錄資料可由最大最小值再減少成單一量化常數(Quantization Constant)。

總之,概念就是透過量化,將原本的 32 Bits 空間轉成 16 Bits、8 Bits,甚至 4 Bits,天下沒有白吃的午餐,縮到愈小資料精準度損失愈大,但若你的記憶體有限,這是必要的取捨。

目前已發展出一些常見的量化技術,例如 BNB、HF 4-Bit、GPTQ... 等(這些名詞有些會模型資料檔名中出現),藉此降低顯卡記憶體需求,讓 24GB GPU 顯卡也玩得動 34B 模型 (原本需要 136GB)

量化縮小了模型尺寸,但我的電腦沒有獨立顯卡,連 1GB 都沒有該怎麼辦?

超級英雄出現了!

有位神人 Georgi Gerganov 用 C++ 語言寫一個開源專案 llama.cpp,並發明了 GGUF 檔案格式(GG 即 Georgi Gerganov 縮寫)方便儲存及快速載入 LLM 模型,最重要的是 llama.cpp 能只用 CPU 跑 LLM 模型(但也支援用 GPU 運算加速),讓無顯卡跑 LLM 不再只是夢想。GGUF 有多種量化方式,共有 Q2_K、Q3_K_S、Q3_K_M、Q3_K_L、Q4_0、Q4_K_S、Q4_K_M、Q4_1、Q5_0、Q5_K_S、Q5_K_M、Q5_1、Q6_K、Q8_0 等 14 種選擇,一般推薦使用 Q5_K_M,最能保留模型性能,要省記憶體則可改用 Q4_K_M。參考:[Day 15] - 鋼鐵草泥馬 🦙 LLM chatbot 🤖 (6/10)|GGML 量化 LLaMa by chihying

換言之,只要有 llama.cpp 跟拿到 GGUF 檔,就算沒有 40X0 顯卡也能跑 LLM 模型嚐鮮。而提到 GGUF 檔,就不得提另一位佛心的神人 - Tom Jobbins,他固定會將大家常用的 LLM 模型轉成 GPTQ、AWQ、GGUF... 等量化格式放上 Hugging Face (可想像成 AI 界的 Github) 供大家免費下載,並且持續更新到最新版。

總之,學會了 llama.cpp 及 GGUF 檔,我便在迷你電腦上完成 LLaMA 2 處女航,讓台灣在地版 13B LLaMA 2 模型跟我聊天... 參考:Three steps to run a Llama-2-7B-Chat model on any CPU machine by Nirmal Patel))

我先用 CLI 互動模式測試無 Prompt 生成,看一下執行速度:

工作機的 12 代 i5 CPU 表現差強人意,12 核幾近滿載下差不多一秒一個字:

為了對照,我試了 32 核的 Azure VM,明顯流暢不少,一秒可輸出兩三個字。

改跑 llama.cpp 伺服器模式,用 32 核跑網頁介面問答,結果還不錯。

順便看了 12 代 i5 的速度:

台灣版 LLaMA 2 模型蠻酷的(雖然它沒有真的搞懂 PTT 五樓的意思 XD),而能在我只有內顯的迷你主機跑,更酷! (llama.cpp 好威呀!!)

由以上測試,驗證沒有 GPU 也是可以跑 LLM 模型的,但速度很難說流暢(有試跑了 70B,想寫個慘字),也許真有特定場合可實際上陣,但大部分情況,要得到預期效果還是得課金買裝備吧!(例如:RTX-4090 24GB +9 雙手劍)


Comments

# by egg

Rex 3090也有24GB

# by Tom

如果有 GPU 的話,用 llama.cpp 來跑 LLM 會比較快嗎?

# by Jeffrey

to Tom, llama.cpp 有個 -ngl 參數可以將部分 Layer 丟給 GPU 跑加速,會比用 CPU 快 https://blog.gslin.org/archives/2023/05/15/11185/llama-cpp-%E9%96%8B%E5%A7%8B%E6%94%AF%E6%8F%B4-gpu-%E4%BA%86/

# by Jeffrey

to egg, 3090 現在應該很難買到了

# by MF

llamafile也是不錯的選擇方便後面串接

# by 小熊子

下次po文是否變成「LLM世代主機採購」,期待開團

# by Jim

OLlama 是簡單方便的好選擇

# by wellxion

原來是這樣,等RK1到手之前可以拿自己電腦先玩玩XD

# by yoyo

看了一下 llama.cpp ,應該也支援Intel 內顯加速?

Post a comment