前言:把 AI 塞進信用卡大小的電腦

你大概聽過「大語言模型要跑在顯卡上」,但你有沒有想過,一台只要 35 美元的 Raspberry Pi 也能跑 70 億參數的 Qwen3?

這聽起來像魔法,但背後的技術其實很樸實——GGUF 量化(GPT-Generated Unified Format)。它把原本需要 16 GB 記憶體的模型壓縮到 4 GB,還不需要任何獨顯,純粹用 CPU 就能跑。

這篇文章會帶你走完整流程:從模型下載、量化選擇、到在 Raspberry Pi 上實際跑起來。無論你是硬體玩家、邊緣運算愛好者,還是單純想省錢跑 AI 的窮人,這篇都適合你。

- 廣告 -

什麼是 GGUF?為什麼它能讓你省記憶體?

GGUF 是 llama.cpp 專案開發的模型格式。它的核心思想很直接:把模型的權重用更少的 bit 來表示

一般 PyTorch 模型用的是 FP16(16 位元浮點數),一個參數佔 2 bytes。但如果你把精度降到 4 bit(也就是 0.5 bytes),模型檔案就能縮小到原來的四分之一。

不過別急著喊「砍掉重練」——GGUF 的量化不是「一刀切」。它採用混合精度量化(K-quants),讓重要權重保持高精度、不重要的權重用低精度。這就像用不同粗細的筆來畫畫:重要的線條用細筆、背景用粗筆,整體看起來幾乎沒差。

量化格式7B 模型大小所需記憶體品質損失
BF16(原始)~15.6 GB~17 GB
Q8_0~8.3 GB~10 GB<0.1%
Q6_K~6.4 GB~8 GB~0.1%
Q4_K_M~4.8 GB~6 GB~1.7%
Q3_K_M~3.9 GB~5 GB~6%
Q2_K~3.1 GB~4 GB~15%

來源:llama.cpp 官方 perplexity 測試。Q4_K_M 是品質與大小的最佳平衡點,也是這篇文章的推薦格式。

Qwen3 模型簡介

Qwen3 是阿里巴巴通義千問團隊在 2025 年推出的最新一代密集模型(Dense Model)。它的架構規格如下:

  • 參數總數:8.2B(非嵌入參數 6.95B)
  • 隱藏層維度:4096(8B 版本)/2560(4B 版本)
  • 注意力頭數:32(GQA 架構,KV 頭為 8)
  • 層數:36
  • 詞表大小:151,936
  • 原生上下文長度:32,768 tokens(透過 YaRN 擴展至 131,072)
  • 授權:Apache 2.0

Qwen3 最大的特色是在同一個模型內支援「思考模式」與「非思考模式」的無縫切換。思考模式適合複雜推理(數學、程式碼),非思考模式適合日常對話。這個特性讓它在同一個模型中兼顧了推理能力與效率。

小提醒:Qwen3 官方 Hugging Face 倉庫(Qwen/Qwen3-8B)只包含 PyTorch 權重,GGUF 格式需要從第三方轉換。目前最完整且公開的 GGUF 倉庫是 unsloth/Qwen3-8B-GGUF,提供從 BF16 到 IQ1_S 共 25 種量化格式。

硬體準備:Raspberry Pi 5 夠跑嗎?

我們以 Raspberry Pi 5(8 GB 版本) 作為目標平台。它的規格如下:

  • CPU:Broadcom BCM2712,四核心 Cortex-A76 @ 2.4 GHz(ARMv8-A 64-bit)
  • 記憶體:8 GB LPDDR5X
  • 儲存:MicroSD 卡或 NVMe SSD(強烈建議 NVMe,SD 卡讀寫太慢)
  • 網路:Gigabit Ethernet + WiFi 6
  • 功耗:約 7-10W(建議搭配散熱風扇)

為什麼選 Pi 5 而不是 Pi 4?

Pi 4 的 LPDDR4X 記憶體頻寬只有 40 GB/s,而 Pi 5 的 LPDDR5X 達到 42.7 GB/s。對於 LLM 推理這種「記憶體受限」的任務,頻寬差一點,速度就差很多。此外,Pi 5 的 PCIe 2.0 x1 介面讓你接 NVMe SSD,這比 SD 卡快上 10 倍以上。

記憶體配置建議

8 GB 記憶體跑 Qwen3-8B 的 Q4_K_M(~4.8 GB GGUF 檔)是可行的,但你要留給作業系統和其他程序約 2-3 GB。如果你只有 4 GB 版本的 Pi 5,建議改跑 Qwen3-4B 的 Q4_K_M(~2.4 GB)。

第一步:編譯 llama.cpp

在 Raspberry Pi 5 上,你需要從原始碼編譯 llama.cpp,因為預編譯的 x86_64 版本無法在 ARM64 上運行。

# 安裝編譯工具
sudo apt update
sudo apt install -y git build-essential cmake

# 取得 llama.cpp 原始碼
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp

# 編譯 Release 版本
cmake -B build
cmake --build build --config Release --j 4

編譯完成後,你會在 build/bin/ 目錄下得到以下關鍵執行檔:

  • llama-cli:命令列推理工具,適合測試和互動
  • llama-server:HTTP API 伺服器,提供 OpenAI 相容的端點
  • llama-quantize:量化轉換工具
  • llama-perplexity:perplexity 測試工具

小提醒:如果你需要更快的速度,可以加上 -DGGML_AARCH64=ON 編譯選項,這樣會針對 ARM NEON 指令集做最佳化。

第二步:下載 GGUF 模型

從 unsloth 的公開倉庫下載 Qwen3-8B 的 GGUF 模型。推薦使用 Q4_K_M 格式:

# 建立模型目錄
mkdir -p ~/models

# 下載 Q4_K_M 量化版本(約 4.8 GB)
cd ~/models
wget https://huggingface.co/unsloth/Qwen3-8B-GGUF/resolve/main/Qwen3-8B-Q4_K_M.gguf

如果你想要更激進的壓縮(適合 4 GB 記憶體版本):

# Q3_K_M(約 3.9 GB,品質稍差)
wget https://huggingface.co/unsloth/Qwen3-8B-GGUF/resolve/main/Qwen3-8B-Q3_K_M.gguf

或者更保守的高品質版本:

# Q5_K_M(約 5.6 GB,需要 Pi 5 8GB 版本)
wget https://huggingface.co/unsloth/Qwen3-8B-GGUF/resolve/main/Qwen3-8B-Q5_K_M.gguf

第三步:用命令列測試推理

下載完成後,用 llama-cli 來測試模型是否正常運作:

cd ~/llama.cpp/build/bin

./llama-cli \
  -m ~/models/Qwen3-8B-Q4_K_M.gguf \
  -p "請用繁體中文介紹大語言模型的基本概念:" \
  -n 512 \
  -t 4 \
  --temp 0.7 \
  --top-p 0.8

參數說明:

參數說明
-mGGUF 模型路徑
-p提示詞(prompt)
-n最多生成 token 數
-t 4使用 4 個執行緒(Pi 5 有 4 核心)
--temp 0.7溫度參數,越高越隨機
--top-p 0.8nucleus sampling 閾值

執行後,你會看到模型逐字輸出回答。這就是最基礎的互動方式了。

互動模式:如果你想要像聊天一樣對話,可以加上 -i 參數進入互動模式:

./llama-cli -m ~/models/Qwen3-8B-Q4_K_M.gguf -i -t 4 --temp 0.7 --top-p 0.8

第四步:啟動 HTTP API 伺服器

如果你想要用程式碼呼叫模型(比如接進 Python 腳本、Streamlit 網頁、或其他工具),llama-server 會派上用場。它提供與 OpenAI API 相容的端點:

cd ~/llama.cpp/build/bin

./llama-server \
  -m ~/models/Qwen3-8B-Q4_K_M.gguf \
  -t 4 \
  --host 0.0.0.0 \
  --port 8080 \
  --ctx-size 4096

啟動後,你可以用 curl 測試:

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b",
    "messages": [
      {"role": "user", "content": "用一句話解釋什麼是量子計算"}
    ],
    "temperature": 0.7,
    "max_tokens": 256
  }'

這個 API 端點可以接進任何支援 OpenAI API 的客戶端,包括 Open WebUIText Generation WebUI 等。

第五步:自訂量化(進階)

如果你不想用現成的 GGUF 檔,也可以從 Hugging Face 的 PyTorch 權重自行轉換和量化。這讓你能選擇任一種量化格式:

# 1. 下載 PyTorch 權重
pip install transformers sentencepiece
python ~/llama.cpp/convert_hf_to_gguf.py ~/models/Qwen3-8B --outfile ~/models/Qwen3-8B-f16.gguf --outtype f16

# 2. 量化到 Q4_K_M
./llama-quantize \
  ~/models/Qwen3-8B-f16.gguf \
  ~/models/Qwen3-8B-Q4_K_M.gguf \
  Q4_K_M

你也可以一次量化多種格式來比較:

for quant in Q4_K_M Q5_K_M Q6_K; do
  ./llama-quantize \
    ~/models/Qwen3-8B-f16.gguf \
    ~/models/Qwen3-8B-${quant}.gguf \
    ${quant}
done

效能實測:Pi 5 跑 Qwen3 有多快?

以下是 Raspberry Pi 5(8 GB)上跑 Qwen3-8B Q4_K_M 的實測數據:

量化格式模型大小tokens/sec(單 token 生成)記憶體使用
Q4_K_M~4.8 GB~3-5 tok/s~5.5 GB
Q3_K_M~3.9 GB~4-6 tok/s~4.5 GB
Q5_K_M~5.6 GB~2-4 tok/s~6.5 GB

注意:這些數字是單 token 生成速度(inference speed),也就是模型每產生一個字元需要多久的時間。這個速度取決於 CPU 頻寬、量化格式和上下文長度。

影響速度的關鍵因素

  1. 記憶體頻寬:Pi 5 的 LPDDR5X 頻寬約 42.7 GB/s,這直接限制了模型權重從記憶體讀取的速率。
  2. 量化格式:Q4_K_M 比 Q5_K_M 快,因為 4-bit 的權重佔的記憶體少,讀取速度更快。
  3. 上下文長度--ctx-size 設越大,需要載入的 KV cache 越多,速度越慢。
  4. 執行緒數:Pi 5 有 4 個物理核心,-t 4 通常是最佳設定。超執行緒(如果有)對矩陣運算幫助不大。

跟其他平台對比

平台速度(tok/s)備註
Raspberry Pi 5(Q4_K_M)~3-5CPU only,ARM NEON
Apple M3 Max~50Metal 加速
AMD 7950X + OpenBLAS~35x86_64,AVX-512
Intel i9-13900K~30AVX2
RTX 4090(全量化)~120GPU offload

Pi 5 的速度當然比桌面 CPU 和 GPU 慢,但考慮到它只要 35 美元、功耗不到 10W,這個表現已經相當驚人。

進階優化技巧

使用 NEON 最佳化編譯

在編譯 llama.cpp 時,加入 ARM NEON 最佳化:

cmake -B build -DGGML_AARCH64=ON -DGGML_NEON=ON
cmake --build build --config Release --j 4

調整上下文長度

如果你不需要長上下文,縮小 --ctx-size 可以顯著提升速度:

# 預設 512 tokens,改成 2048 或 4096
./llama-server -m ~/models/Qwen3-8B-Q4_K_M.gguf -t 4 --ctx-size 2048

用 NVMe SSD 加速載入

Pi 5 的 PCIe 2.0 x1 介面支援 NVMe SSD。把 GGUF 模型放在 NVMe 上,模型載入時間可以從幾十秒縮短到幾秒。

思考模式 vs 非思考模式

Qwen3 支援 /think/no_think 指令來切換思考模式:

>>1/5t!hi=n1k15>,!3/0n7o,_6t7h4i,n3k68,00.0./.think8

思考模式會產生額外的推理內容(<think>...</think> 區塊),適合複雜問題,但會增加輸出長度和延遲。日常對話建議用 /no_think

常見問題排解

1. Out of Memory(記憶體不足)

如果 Pi 5 8 GB 版本跑 Q4_K_M 時出現 OOM,可以:

  • 改用 Q3_K_M(~3.9 GB)
  • 縮小上下文:--ctx-size 2048
  • 關閉其他不必要的服務(systemctl stop bluetooth 等)
  • 考慮使用 swap 空間(雖然會慢一些)

2. 輸出亂碼或品質差

  • 確認使用的是 Q4_K_M 或更高精度
  • 調整 --temp--top-p 參數
  • 嘗試 Q5_K_M 或 Q6_K

3. 速度太慢

  • 確認編譯時啟用了 NEON 最佳化
  • 確認使用 NVMe SSD 而非 SD 卡
  • 縮小 --ctx-size
  • 改用更低的量化格式(Q3_K_M)

4. 編譯失敗

  • 確保系統是最新的:sudo apt update && sudo apt upgrade
  • 確保 cmake 版本 >= 3.22:cmake --version
  • ARM 平台編譯可能需要更多時間,耐心等待

總結:Edge LLM 的未來

把 Qwen3 8B 塞進 Raspberry Pi 5 並不難——從零開始到跑起來,大約只需要 1-2 小時。關鍵在於理解 GGUF 量化的原理,以及根據你的硬體條件選擇合適的量化格式。

這篇文章的重點回顧:

  • GGUF 量化是 Edge LLM 的核心技術,讓大模型能在資源受限的裝置上運行
  • Q4_K_M 是品質與大小的最佳平衡點,推薦作為起始選擇
  • Raspberry Pi 5(8 GB) 可以跑得動 Qwen3-8B Q4_K_M,速度約 3-5 tok/s
  • NVMe SSD + NEON 最佳化 能顯著提升效能
  • Qwen3 的思考模式切換 讓同一個模型兼顧推理與效率

Edge LLM 的趨勢正在加速。隨著 ARM 架構 CPU 效能提升、量化技術進步,未來我們可能會看到更多「在口袋裡跑大模型」的應用。Raspberry Pi 5 跑 Qwen3 只是開始,不是終點。

- 廣告 -

參考資源