硬體
RTX 3060 12GB,安裝在一台Intel 6核心與64GB主記憶體的Unraid NAS上頭。
軟體
llama-swap,運行於docker容器中,推論引擎是llama.cpp,使用Cuda backend。
模型
Gemma 4 26B A4B QAT與12B QAT,選擇它是因為它是相對來說知識較廣泛的模型。
運作參數,這是寫在llama-swap的設定檔中
llama-server
--port ${PORT}
--host 0.0.0.0
--fit-target 1331
-np 1
--no-webui
-c 131072
-ctk q8_0
-ctv q8_0
--model /models/gemma-4-26B-A4B-it-qat-UD-Q4_K_XL.gguf
--temp 1.0
--top-p 0.95
--top-k 64
--jinja
--chat-template-file /models/g4-chat_template.jinja
--spec-type draft-mtp --spec-draft-n-max 3
--model-draft /models/mtp-gemma-4-26B-A4B-it-qat.gguf
--mmproj /models/mmproj-Gemma-4-26b-a4b-bf16.gguf
--image-max-tokens 1120
--ubatch-size 1536
--no-mmproj-offload
- –fit-target是要保留多少VRAM,單位MB,因為-fit參數不會把MTP與mmproj模型納入計算,所以經常會在載入模型時出現OOM的情況,因此改使用–fit-target參數預先保留VRAM來載入這些模型。
- -np 1,平行處理推論的數量,預設是4。這個參數有個副作用,比如設定為4,context size設定為128k,實際上每個client能夠使用的context size是32k,也就是128k/4=32k。只有一個人在使用的話,強烈建議設定為1
- -c 131072,把context size設定為128k,這會需要佔用VRAM,越大用的越多。
- -ctk與-ctv是指KV快取,預設的資料儲存格式是f16,改成q8_0可以減少KV快取佔用VRAM的量(大約是原本的53%,而且資料精度幾乎是無損),可以把這些多出來的VRAM拿去載入更多tensor層數或者加大context size。需要注意q4_0或者使用不對稱的設定(q8_0搭配q4_0)會降低品質或者額外的副作用。
- –image-max-tokens是模型在做影像識別時,可使用的預算上限。Gemma 4建議設定為1120
- –ubatch-size是指prefill階段送給模型處理的批次大小,預設是512。因為調整了–image-max-tokens的大小,這個值也必須增加到至少超過1120。加大這個值會需要額外佔用VRAM,但也有好的一面,如果GPU的性能不錯,prefill的處理性能也會相應增加。對於agentic workflow來說,prefill的性能很重要。
- –no-mmproj-offload是指不要把圖像辨識模組載入到VRAM,而是載入到主記憶體,缺點是圖像辨識會比較慢,優點則是可以把多出來的VRAM拿去載入更多tensor層數或者加大context size。
根據我的測試,使用上面的參數,Prefill的速度大約在1000t/s上下,而Decode則是在40~5x左右。Prefill是指把提示詞送給模型運算的階段,而Decode則是模型開始回答的階段。假設提示詞有35k token,那prefill階段就得花上至少35秒以上,這是因為prefill的處理性能會隨著提示詞長度下降,一開始有1000,但是很快就會下降到9xx。
Hermes Agent建議的context長度至少要有64k,這也是建議-np設定為1的原因,而且設定為2以上的話,經常會導致快取失效,因為有可能接到不同的cache slot,明明是在同一個對話(session),prefill階段都要重新計算完整長度的提示詞,而不是後來增加的部份,效率大幅降低。
You must log in or register to comment.
