上一篇挑戰相關議題的文章是3月份寫的這一篇
那時的情況是,小參數21B以下就是不行
中等參數30B以上的,家裡最強電腦上慢得像龜一樣
跑的太勉強(5~7 tokens/秒),也是跟沒用差不多
沒想到技術發展之快,5月初得知MOE有特殊用法時[1]
Claude Code搭配MOE模型就來到能用的範圍了
目前這篇寫的大部分設定都是那時候搞定的
不過對於我工作用的電腦沒屁用
因為MOE技術要卸載無法上VRAM的模型到一般記憶體中
只有16GB RAM的工作電腦辦不到這件事
家裡那台可以,但沒必要
在家跑Claude Code時,除了個人隱私外,都是沒機密性的東西
乾脆用Claude code直接連Opus或是Sonnet還比較好用
加上5月忙到6月中,就沒有更進一步寫成blog留存了
直到最近工作暫告一段落,又想回頭來測試這一塊
測了一下4月底發表,最近官方自己壓縮的Gemma4-E4B QAT模型發現算是可以跑了
讓我一開始開心了一下,也開啟這篇文章的撰寫
只是嚴格說來這算假象,小參數模型進步算非常大,但工具調用仍然不穩定
即便克服了工具問題了,以產出程式碼品質來說,它的下限仍然不到及格線
要稱得上穩定可用,還是得更多參數的Gemma4-12B這種等級
可是工作用電腦其實跑不太動
有再降階換Qwen3.5-9B測試,不過程式碼產出的表現依然不穩定
測到這裡,因為沒達成預期目標,本來想把這篇給廢了
後來想想寫都寫了,其實上一篇也是失敗的記錄
而之前也確實沒記錄Claude Code怎麼搭配llama.cpp(llama-server)
就還是把資料整理整理,重改一下文章內容後推出
以下就是記錄與說明這次測試的狀況
首先,為什麼不是繼續使用Ollama來連線
因為Ollama在效能與調整參數上,實在是輸llama.cpp一大載啊
簡單來說,就是Ollama是初學者工具,但llama.cpp是進階工具
llama.cpp能隨著每台硬體與使用模型不同,手動調整參數壓榨出最佳的效能
尤其是MOE模型上,Ollama目前就是無法支援加速跑法的功能
在同樣Qwen3.6-35B-A3B的模型,Ollama就算能跑也只能出5~7 tokens/秒
llama.cpp調整後卻可以衝上22 tokens/秒,這差距可謂不少啊
所以現在我已經移除Ollama了,全部都用llama.cpp了
當然還是要感謝Ollama在過去一年多,帶我進入離線LLM的世界
不然要直接用llama.cpp這麼生硬的工具,學習曲線真的蠻硬的
再來談模型選用的部分
一開始首選是Gemma4-E4B的QAT版[2]
原因無他,只有這款模型能全載入到6GB VRAM中跑
在工作上電腦開網頁介面測起來,有25 tokens/秒的速度
甚至開了MTP[3]後,可以擁有60 tokens/秒的極速
想說笨了點就多跑幾次看能不能補起來,結果是不行
先是撞上Claude的Edit/Update工具對修改格式要求太嚴格
Opus 4.8給的說明如下
"Edit/Update(也就是 str_replace 類的工具)有一條硬性規定:
你給的 old_string 必須跟檔案裡的內容一字不差、且唯一地對上。"
這對小參數模型來說很難100%達成,最後是依這篇
在 8GB VRAM 筆電讓 Claude Code 串接 Gemma 4 E4B:Ollama + LiteLLM 完整踩坑紀錄
設定-temp 0.0 --repeat_penalty 1.15的參數
「再」加上下命令要Claude Code使用Write工具才解掉
不過就算是解掉小參數模型無法操控工具的問題
實際輸出的內容會出現完全錯誤的無法使用的程式碼這點
才是覺得這樣的組合會是失敗的主因
在超長文的狀況下,Gemma4-E4B就是會有失焦,產不出需要程式碼的狀況
最後是開啟Gemma4 12B去測試,才不得不承認,就是真的參數不足造成的
同樣的指令下法,Gemma4 12B就是沒問題啊
即便產出有錯,餵一次錯誤碼,下次就修正了
不像Gemma4-E4B,要它修正它說知道了,然後跑出根本不相干的廢程式碼出來
或是空白產出根本沒內容,卻說程式改好了...
只是Gemma4 12B能用是能用,速度就是跟龜一樣的4~6 tokens/秒
想了一想,就載了Qwen3.5-9B來測試一下
這實際跑來到12~13tokens/秒
一開始在Claude Code的掌握下,讀與寫似乎也沒什麼問題
不過一樣進入較長上下文後,中途就出現無法使用的狀況
一樣的症狀,說已經輸出main.py的程式碼,然後其實是空的
是真的有寫入,因為檔案修改時間有變,但是是空的...
這樣還是不行啊,所以勉強要在工作的電腦跑個樣像的產程式用AI Agent
只能跑龜速的Gemma4-12B...
測試的過程就這樣,下面就來介紹詳細的技術使用
llama-server的必要的執行參數如下(使用Powershell執行,以gemma4-12b為主):
.\llama-server -m gemma-4-12b-it-qat-q4_0.gguf `
--alias "gemma4-12b-qat" `
-ngl 30 `
-t 8 '
-fa 1 `
-ctk q8_0 -ctv q8_0 `
-b 1024 `
-c 65536 `
--temp 0.0 --top-k 64 --top-p 0.95 `
--jinja `
--repeat_penalty 1.15 '
--port 8000 `
--no-mmap
一行一行解說就是(以下斜粗體部分):
載入Gemma4模型
將這個命名為gemma4-12b-qat(非必要)
將模型部分載入VRAM中
剩下用CPU的8個核心處理
開啟flat attention功能
將上下文的快取都量化為Q8(壓縮上下文記憶)
批次處理使用1024參數(我自己測起來這個比較快一點)
上下文開放到65535的大小(這台硬體配12B的極限了)
Gemma4的使用參數,特別是temp要調到0.0(前面說輸出會比較守格式)
使用官方的jinja模版
打開重複輸出逞罰,數值1.15(前面說輸出會比較守格式)
開port定在8000
禁用記憶體映射,強制模型一定要放在實體記憶體中
大概是這樣
主要的AI模型設定結束了,剩下的就是claude的環節了
claude要用之前,也需要再設定一些環境參數
之前用Ollama是它直接提供給claude,現在用llama.cpp就是要自己來
先說好,在Windows的環境下,官方推薦使用Powershell進行
所以以下的設定都是用Powershell
那麼進入Powershell環境後
請輸入這三行
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:8000" $env:ANTHROPIC_AUTH_TOKEN = "dummy" $env:ANTHROPIC_MODEL = "gemma4-12b-qat"
設好之後,再開啟claude,就可以發現模型已經指定為本地的gemma4-12b了
如果不希望每次進到Powershell都要輸入一次這些參數
那麼可以這樣下指令寫到註冊表
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "http://127.0.0.1:8000", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "dummy", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_MODEL", "gemma4-12b-qat", "User")
這樣下次重開Powershell時就會自動載入了
不過這是全域的設定
如果只希望個人帳號會執行,那麼就要將設定寫入這個帳號的powershell設定檔
先在powershell下執行
Test-Path $PROFILE
如果回傳False
那麼就建一個新的PROFILE
New-Item -ItemType File -Path $PROFILE -Force
建完之後,再開筆記本將最初的那三行
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "http://127.0.0.1:8000", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "dummy", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_MODEL", "gemma4-12b-qat", "User")
貼進去再存檔就可以重開Powershell使用了
現在我們就有了近乎可以無限燒tokens的claude code了,萬歲
只是速度好慢啊 Orz
另外,使用上還要注意的一點,就是上下文長度的問題
如前面所提,使用上是設成65536
講真的不多啊,在下完第一個指令後,可以用/context查上下文容量
差不多都會接近30K
換言之,如果一次對話吃掉3K的話,10次左右就接近極限了
解決方法就是關掉claude code後,再重開重來
或是下/clear指令,清掉Session內容
只是清空那些上下文記憶,再叫claude處理時
會再重花30K的上下文去建立新的KV Cache,這實在很浪費時間啊
尤其還是用4~6 tokens/秒的速度跑時,那更是讓人覺得崩潰
每次大概要花3~4分鐘以上
因為這樣,後來我有跟Opus 4.8討論出一個奇招
那就是將初次建立的KV Cache直接存入硬碟(SSD)中,有需要再載入
雖然仍然要將大量的資料載入記憶體中,但只是載入而不用再運算(推論)
初次起動就會快非常多
當然,這樣的功能需要建立在
1.claude.md內容不動的情況下
2.初始的指令一樣,且不會去讀程式碼內容
3.claude code沒改版,系統prompt不變
這樣KV cache的內容才會大致相同
讀取後才不會大部分內容不同還是要推倒重來
至於怎麼使用,那就要用上--slot-save-path與REST API功能
在原本的參數上加上
--slot-save-path "資料夾位置"
讓llama-server知道檔案要從這個資料夾存取
接下來使用REST API格式對llama-server下命令就可以進行KV cache的檔案讀寫
上面這樣講很模糊,以實作來說明比較好
llama-server的參數加上
--slot-save-path "D:\llama"
然後開起claude code進行第一次的命令後
靠Powershell的Script功能,向伺服器發送RESI API的命令
就可以得到KV Cache的檔案了
要求寫入的Script命名為kv_write.ps1,內容是這樣:
$body = @{ filename = "claude-code-warmup.bin" } | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8080/slots/0?action=save" `
-Method Post `
-ContentType "application/json" `
-Body $body
而讀取的Script則是kv_read.ps1,內容是這樣:
powershell$body = @{ filename = "claude-code-warmup.bin" } | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8000/slots/0?action=restore" `
-Method Post `
-ContentType "application/json" `
-Body $body
下次在開claude code之前,先讀取,就可以省下那幾分鐘
Opus4.8甚至還提供了更完整的範本,讓llama-server開機後
到自動載入KV cache,都不用一步一步來
# 1. 啟動 llama-server(在背景)
$serverProcess = Start-Process -FilePath ".\llama-server.exe" `
-ArgumentList "-m", "gemma-4-12b-it-qat-q4_0.gguf", `
"--alias", "gemma4-e4b-qat", `
"-ngl", "30", `
"-t", "8", `
"-fa", "1", `
"-ctk", "q8_0", "-ctv", "q8_0", `
"-b", "1024", `
"-c", "65536", `
"--temp", "1.0", "--top-k", "64", "--top-p", "0.95", `
"--jinja", `
"--port", "8000", `
"--repeat_penalty", "1.15", `
"--no-mmap" '
-PassThru -NoNewWindow
# 2. 等 server 就緒
Write-Host "等待 server 啟動..."
do {
Start-Sleep -Seconds 3
$ready = $false
try {
$null = Invoke-RestMethod "http://localhost:8000/health" -ErrorAction Stop
$ready = $true
} catch {}
} until ($ready)
# 3. 立刻載入之前儲存的 KV cache
Write-Host "還原 KV cache..."
$body = @{ filename = "claude-code-baseline.bin" } | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8000/slots/0?action=restore" `
-Method Post -ContentType "application/json" -Body $body
Write-Host "Ready!可以開 Claude Code 了,不用等 5 分鐘"
只是先說好,這招好用歸好用
除了KV cache的量化,使用的模型與提示詞要一致之外
也不能在有開多模態的情況下使用
也就是說想靠模型讀圖的話,這招也不能用
有開多模態下,加入--slot-save-path參數就會跳異常了
就這樣,真可惜花了一堆時間測試後
最終Gemma4-E4B甚至是Qwen3.5-9B都是相對比較不能用的狀況
還是會持續再測試一下,不能寫程式後,還可以做些什麼
其實在讀取專案內容與撰寫開發計畫上,這兩款都還蠻有模有樣的
只是功能偏離了我想要的部分
近兩個月玩AI的成果大概是這樣
最後這邊的專有名詞有點多,以下是重要的註解
[1] MOE模型,全名Mixture of Experts
這種混合專家模型與傳統模型差異在於實際運作時的參數量較少
只有需要時才會去動用到部分的專家模型
所以在低VRAM時的有效運作模式就變成將主要的運作層留在VRAM
然後專家層可以放到一般RAM當中,有需要再調用
這樣速度至少可以拉到3倍以上
以我6GB的VRAM也變得可以跑得動35B的大模型
[2]QAT量化,全名Quantization-aware-training
簡單地說,就是在訓練時,就進行量化的預先處理
讓量化後的結果更貼近全精度的輸出品質
更詳細的說明就是,原本是全精度的資料給全精度的模型訓練輸出
現在變成用量化後的資料,訓練全精度的模型
這樣量化後,會因為已經對量化輸入特化,而有可能維持原輸出精準度
[3] MTP,多詞預測,全名Multi-Token Prediction
用一個低精度的草稿模型先猜多個輸出
然後再給實際執行的模型驗證,過了就可以省掉大量運算的時間
以我用gemma4 e4b的狀況,可以從原本的25 tokens/秒最多再拉2倍多
來到平均60 tokens/秒上下
可惜gemma4-12b就算開了也討不到什麼便宜


沒有留言:
張貼留言