本地部署 Gemma 4 並實作模型量化:從 Hugging Face 到 Ollama 的完整流程

gemma4 banner

近一年來,愈來愈多開發者開始嘗試將大型語言模型部署到本地端。一方面是因為本地推理能降低長期 API 成本,另一方面則是出於更實際的需求:希望自行掌握模型、資料與執行環境,讓模型不只是「可呼叫的服務」,而是真正可被調校、測試與整合的基礎設施。

這篇文章記錄的是一次完整的本地部署流程。我使用的模型是 Gemma 4 26B A4B Instruct,從 Hugging Face 下載原始權重開始,接著轉換為 GGUF 格式、執行量化,最後透過 Ollama 建立本地可執行模型。


為什麼需要進行量化?

很多人第一次接觸本地 LLM 時,最常見的想法是:「我已經下載到模型了,為什麼不能直接丟進 Ollama 跑?」
原因在於模型檔案格式推理引擎格式部署框架格式並不相同。

以 Hugging Face 上下載到的模型為例,它通常是給 Transformers 生態系使用的,權重會以 safetensors 儲存,搭配 config.jsontokenizer.json 等檔案。這種格式非常適合訓練、微調與 Python 推理,但並不是 llama.cpp 與 Ollama 最直接使用的格式。若你想讓模型在本地端以較低資源執行,通常會走向 GGUF 與量化這條路。

所以,整個流程其實是在處理四件不同的事:

Hugging Face 權重下載
→ 轉換為 llama.cpp 可讀的 GGUF
→ 進行量化,降低模型資源需求
→ 匯入 Ollama,建立推理用 runtime

我的GPU是NVIDIA GeForce RTX 4060 Ti,VRAM 只有16G,以這樣的硬體條件來看,如果不經過量化,直接下載並執行 Gemma 4 26B A4B Instruct 幾乎不可行。

26B 等級的模型,本身參數量就非常大,若維持原始較高精度格式,例如 FP16,模型權重本體就會占用非常可觀的記憶體空間;而在實際推理時,除了模型權重之外,還需要額外預留 KV cache、runtime buffer,以及框架本身的載入開銷。也就是說,模型並不是「剛好塞進 16GB VRAM」就能順利執行,而是通常還需要更多餘裕,才能支撐穩定推理。


根據 Google 官方網站的 Gemma 4 記憶體需求表,Gemma 4 26B A4B InstructBF16 / 16-bit 精度下,推理所需的 GPU 記憶體大約是 48 GB;即使降到 SFP8 / 8-bit,也仍然需要約 25 GB,而 Q4_0 / 4-bit 則約為 15.6 GB。這也說明了,對只有 16GB VRAM 的 RTX 4060 Ti 而言,若不經過量化,26B 模型幾乎不可能完整載入並穩定執行;即使到了 4-bit 量化,也已經非常接近顯存上限,因此量化對我來說不是單純的優化手段,而是讓這顆模型真正有機會在本地端落地的前提。


模型來源:從 Hugging Face 下載 Gemma 4

這次使用的模型為:

google/gemma-4-26B-A4B-it

連結: https://huggingface.co/google/gemma-4-26B-A4B-it

Step 1:安裝 Hugging Face CLI

 

先確認你有 Python,然後安裝:

pip install huggingface_hub
sudo apt install -y git build-essential cmake python3 python3-pip
pip3 install transformers sentencepiece safetensors accelerate

Step 2:登入 Hugging Face

 
hf auth login
 

貼你的 token(去 HuggingFace 網站拿)

Step 3:下載模型

完成這些準備後,即可使用以下指令下載模型:

hf download google/gemma-4-26B-A4B-it

下載完成後,資料夾大致會長成這樣:

gemma4-f16/
 ├── config.json
 ├── generation_config.json
 ├── tokenizer.json
 ├── tokenizer_config.json
 ├── model-00001-of-000xx.safetensors
 ├── model-00002-of-000xx.safetensors
 ├── ...

這裡最重要的是那些 .safetensors 檔案。它們就是模型權重本身,而其餘的 configtokenizer 則負責描述模型結構與文字切分方式。


下載完成後,拿到的是什麼?

這一步的成果,並不是「可以直接丟到 Ollama 執行的模型」,而是原始權重。更準確地說,你拿到的是一份適合 Transformers 生態系使用的 checkpoint。

在這個階段,模型通常是以 FP16(16-bit floating point) 的精度儲存。FP16 的優點是保留相對高的數值精度,對模型表現比較友善;缺點則是檔案很大、推理時對記憶體與顯存的需求也很高。

以 26B 這種等級的模型來說,如果你完全保留原始精度,對一般本地工作站並不算輕量。這也是為什麼後面一定會進入 GGUF 與 quantization 這兩個步驟。


為什麼還要轉成 GGUF?

Hugging Face 的模型格式適合 Python 與 Transformers 使用,但如果你要把模型交給 llama.cpp 或 Ollama,最常見的做法是先轉為 GGUF

GGUF 可以視為一種針對本地推理優化的模型封裝格式。它不是單純把副檔名改掉而已,而是會把模型權重、metadata、tokenizer 資訊等整理成 llama.cpp 生態系容易存取與載入的形式。

Step 1:下載 llama.cpp

我們可以直接拉llama.cpp repo 至本地:

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

Step 2:編譯

cmake -B build
cmake --build build -j

Step 3:轉 GGUF

這一步通常使用 llama.cpp 提供的轉換腳本來完成:

python convert_hf_to_gguf.py ./gemma4-f16 \
  --outfile gemma4.gguf \
  --outtype f16

這裡的意思是:把 ./gemma4-f16 裡的 Hugging Face 模型,轉成一個名為 gemma4.gguf 的 GGUF 檔案,並保留 f16 精度。

這裡有一個很重要的觀念:轉換格式不等於量化

  • 格式轉換:處理相容性,讓模型能被新的推理框架讀取
  • 量化:處理精度與大小,讓模型更容易在有限資源下執行

 

量化是什麼?為什麼它是本地部署的關鍵?

量化(Quantization)可以用一句話概括:

將模型權重從較高精度的數值表示,轉換為較低精度的表示,以換取更小的模型體積與更低的推理成本。

若用比較直觀的方式理解,原本模型權重可能以 FP16 或 FP32 儲存,每個數值都保留比較細緻的小數表達能力;量化之後,這些權重會被壓縮到 8-bit、4-bit,甚至更低。數值變得沒那麼精細,但模型會變得更容易在消費級 GPU 或較有限的 RAM 環境中執行。

這是一種典型的 precision–efficiency trade-off
你犧牲一部分精度,換取可部署性與推理效率。

在大型語言模型的實務中,量化不是冷門技巧,而是一個非常核心的工程手段。因為如果沒有量化,很多模型根本無法離開雲端資源,在一般本地設備上實際落地。


為什麼說量化不是單純的「壓縮」?

如果只把量化理解成「把模型檔案變小」,其實會低估它的重要性。
量化真正影響的不只是磁碟空間,而是整體推理資源:

  • 模型載入所需 RAM / VRAM
  • 推理時每一層 tensor 的運算成本
  • token 生成速度
  • 本地 GPU 是否有機會承載該模型

也就是說,量化改變的是模型在系統中的「可運行性」,而不只是它在硬碟上的大小。

對 26B 這種等級的模型尤其如此。原始權重的體量太大,沒有量化的情況下,即使你完成了格式轉換,實務上仍然很難順利推理。


開始量化:將 GGUF 轉為 Q4

在這次實作中,我先做的是 Q4 量化。對應指令如下:

./build/bin/llama-quantize gemma4.gguf gemma4-q4.gguf q4_K_M

這行指令可以拆成三個部分理解:

  1. gemma4.gguf:原始 GGUF 模型
  2. gemma4-q4.gguf:量化後輸出的模型檔名
  3. q4_K_M:指定量化方法

這裡的 q4_K_M 並不是隨機命名,而是 llama.cpp 常見的一種量化策略。簡單理解即可:

  • q4 表示 4-bit quantization
  • K 表示一種 block-wise 的量化形式
  • M 通常代表 mixed / balanced 的變體,兼顧大小與效果

它之所以常被拿來當作入門實作的第一選擇,是因為它通常能在模型大小、推理速度與品質損失之間取得相對平衡


建立 Modelfile:讓 Ollama 知道怎麼讀你的模型

當你已經有量化完成的 GGUF 檔案,下一步就是把它交給 Ollama。
這裡 Ollama 不會直接讀資料夾裡的任意檔案,而是透過一個叫做 Modelfile 的設定檔,描述模型來源與推理參數。

建立方式如下:

nano Modelfile

內容可以先從最基本版本開始:

FROM ./gemma4-q4.gguf

告訴 Ollama這個模型是由目前資料夾下的 gemma4-q8.gguf 建立而來。

如果你想順便把推理參數一起寫進去,也可以在 Modelfile 中加入:

FROM ./gemma4-q4.gguf

PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096

這幾個參數分別控制:

  • temperature:輸出的隨機性
  • top_p:nucleus sampling 範圍
  • num_ctx:上下文視窗大小

從工程角度來看,Modelfile 可以視為 Ollama 的模型建置設定。它不是模型本體,而是模型的 runtime 描述方式。


用 Ollama 建立本地模型

當 Modelfile 準備好後,就可以正式把模型交給 Ollama:

ollama create gemma4-q4 -f Modelfile

這一步相當重要,因為它代表你不是只把檔案放在某個資料夾裡,而是正式在 Ollama 裡註冊了一個可執行模型。

到這裡為止,從 Hugging Face 原始 checkpoint 到 Ollama 本地模型的鏈路就完成了。

用ollama list 來看看
4Dd+de+zZT8H4AAAAASUVORK5CYII=
q4 只佔了16GB

看看GPU 使用狀況:
bpSUPuVYRgAAAABJRU5ErkJggg==
只用16G VRAM 就可以跑Gemma 26B模型囉!

Follow Me!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端