跳到主要內容

16GB ROCm 本地 LLM-as-a-Verifier 實測數據:Qwen3.5-9B 跑起來到底多快

TL;DR: 用 Qwen3.5-9B(Q4_K)在單張 16GB AMD GPU 上跑本地 LLM-as-a-Verifier,每次 code comparison 約 0.5–2 秒,cache hit rate 66%,正確程式碼穩定給 1.0 分,有 bug 的給 0.0–0.14 分。16GB 跑 9B 模型綽綽有餘,還有空間跑其他服務。 這篇是實測續篇,前兩篇分別講了 架構設計 和 Docker 封裝 。前兩篇講的是「做什麼」跟「怎麼做」,這篇來量「到底多快」。 1. 測試環境 在一台 homelab Linux(CachyOS)上跑的: 項目 內容 GPU AMD 16GB(15.9 GiB)via ROCm 模型 Qwen3.5-9B(8.95B 參數,Q4_K ~5.7GB GGUF) 後端 llama.cpp(llama-server,ROCm HIP build) Verifier Docker container(llm-verifier),port 8010 模型 VRAM ~10.2 GB(模型本身 + 動態 KV cache) GPU 使用率 78% 系統 RAM 62 GB;使用 27 GB(swap 用了 9.3 GB) Context window 131,072 tokens MIN_SCORE 0.8 後端跑在另一台機器上,走 local Gigabit 網路連線。 2. Verifier 在幹嘛 docker-llm-as-a-verifier 包裝了 LLM-as-a-Verifier 這個研究套件,讀取 token-level log probability 來算連續分數,不是簡單的 yes/no 判斷。 Container 開了 7 個 HTTP endpoint: Endpoint Method 用途 /health GET 健康檢查 /v1/compare POST 兩組答案比對評分 /v1/select POST Best-of-N 選最佳 /v1/track POST Agent 軌跡分數追蹤 /v1/directed POST 導...

16GB ROCm 本地 LLM-as-a-Verifier 實測數據:Qwen3.5-9B 跑起來到底多快

TL;DR: 用 Qwen3.5-9B(Q4_K)在單張 16GB AMD GPU 上跑本地 LLM-as-a-Verifier,每次 code comparison 約 0.5–2 秒,cache hit rate 66%,正確程式碼穩定給 1.0 分,有 bug 的給 0.0–0.14 分。16GB 跑 9B 模型綽綽有餘,還有空間跑其他服務。

這篇是實測續篇,前兩篇分別講了架構設計Docker 封裝。前兩篇講的是「做什麼」跟「怎麼做」,這篇來量「到底多快」。

1. 測試環境

在一台 homelab Linux(CachyOS)上跑的:

項目 內容
GPU AMD 16GB(15.9 GiB)via ROCm
模型 Qwen3.5-9B(8.95B 參數,Q4_K ~5.7GB GGUF)
後端 llama.cpp(llama-server,ROCm HIP build)
Verifier Docker container(llm-verifier),port 8010
模型 VRAM ~10.2 GB(模型本身 + 動態 KV cache)
GPU 使用率 78%
系統 RAM 62 GB;使用 27 GB(swap 用了 9.3 GB)
Context window 131,072 tokens
MIN_SCORE 0.8

後端跑在另一台機器上,走 local Gigabit 網路連線。

2. Verifier 在幹嘛

docker-llm-as-a-verifier 包裝了 LLM-as-a-Verifier 這個研究套件,讀取 token-level log probability 來算連續分數,不是簡單的 yes/no 判斷。

Container 開了 7 個 HTTP endpoint:

Endpoint Method 用途
/health GET 健康檢查
/v1/compare POST 兩組答案比對評分
/v1/select POST Best-of-N 選最佳
/v1/track POST Agent 軌跡分數追蹤
/v1/directed POST 導向式 (A→B) 偏好比較
/v1/score-pairs POST 批次 pairwise 評分
/v1/usage GET 累計 token 統計

每個 /v1/compare 實際做 3 次 LLM inference:先評 A,再評 B,最後比較兩者分數給 verdict。

3. 實測數據

3.1 Latency

從 verifier 自己的 log timestamp 撈的:

操作 後端呼叫數 總時間 每次平均
Compare(一般) 3 ~1,000 ms ~330 ms
Compare(命中 cache) 3 ~800 ms ~270 ms
Select(N=3, pivots=2) 6 ~1,200 ms ~200 ms
單次 inference 1 200–800 ms 200–800 ms

Cache hit rate 66.4% — 80 次 request 裡 22,417 個 prompt tokens 被 cache 住(總共 33,768)。verifier 的 fine_grained_reward 模組會把評分結果 cache 到 disk(verifier-cache Docker volume),同樣的 code snippet 重複比對時直接跳過 LLM。

3.2 評分品質

候選程式 分數 結果
正確的程式碼 0.97–1.0 ACCEPTED
明顯的 bug 0.0–0.02 REJECTED
微妙的 bug 0.02–0.14 REJECTED

MIN_SCORE=0.8 設下去,即使最接近正確的 buggy code(0.14)還是被正確擋掉。正反案例的分數落差很乾淨,沒有模糊地帶。

3.3 Token 用量

80 次 verifier request 的累計數字:

項目 數值
Prompt tokens 總計 33,768
— 其中 cache hit 22,417(66.4%)
Completion tokens 總計 47,538
總 token 數 81,306
Reasoning tokens 0(Qwen 不是 R1)
後端請求數 80

Reasoning tokens 是 0,確認 Qwen3.5-9B 是 dense model,不是 reasoning/R1 系列。Verifier 直接用模型的 log-probability 輸出,不走 chain-of-thought。

3.4 VRAM & GPU 使用率

項目 數值
VRAM 總容量 15.9 GiB
VRAM 使用量 10.2 GiB(64%)
GPU 使用率 78%
Context window 131,072 tokens

9B 模型 Q4_K 量化後只佔 ~5.7 GB,還有 ~5.7 GB 給 KV cache 和其他服務。131K context window 是 llama.cpp 的預設值,verifier 實際 prompt 小很多(~400–800 tokens)。

4. 真正的架構長這樣

實際跑起來的 pipeline 比第一篇架構圖簡單:

Agent(OpenCode)
  │ 送出修改提案
  ▼
guardrail-mcp
  │ commit_token → validate → consume
  │ apply_patch(cargo check / tsc syntax 驗證)
  │ softguard(HTTP → verifier)
  ▼
llm-verifier(Docker :8010)
  │ POST /v1/directed(比對舊程式 vs 新程式)
  ▼
llama.cpp(ROCm)
  │ Qwen3.5-9B Q4_K inference

guardrail-mcp 提供的工具:

  • commit_token:2PC 生命週期(create → validate → consume → revoke),SHA-256 綁定 proposal,30 分鐘 TTL,綁定 git revision
  • apply_patch:套用 patch 前先用 compiler 驗證(cargo check / tsc),通過才寫入
  • inspect_context:Tree-sitter 結構化萃取,讓 patch 更精準
  • softguard:HTTP verifier 呼叫器,可設定 endpoint、timeout、API key

關鍵設計:LLM verifier 是 soft guard,負責抓 syntax 檢查抓不到的語意 bug。cargo check / tsc 這種便宜的確定性檢查先做第一關,通過的才送 LLM 做語意審查。

5. 已知限制

這些數字是單次 session 的 benchmark,不是正式的 evaluation suite:

  • 沒有併發測試:80 個 request 是循序跑的,不是同時。真實 TPS 會更低。
  • 沒有雲端 baseline:OpenRouter free route 還沒測,本地 ROCm vs 雲端 API 的比較還欠著。
  • 沒有 VL 數據:多模態 vision endpoint(9B VL)還在開發中,這些數字只適用 text-only 的 code comparison path。
  • 沒有 Track 1 short-circuit 率:第一篇提到的 AST 結構檢查是 aspirational 的。目前 guardrail-mcp 用 syntax validation(cargo check / tsc)當確定性閘門,不是專屬的 AST structural checker。
  • 沒有精確成本:0.5–2s per comparison 在 78% GPU 使用率下,大概不到 1 塊台幣的電費,但這是粗估,不是實測。

6. 結論

一張不到 15,000 台幣的 16GB AMD GPU,就能跑本地 LLM-as-a-Verifier 做 code review 的 guardrail:

  • Qwen3.5-9B Q4_K 塞得進去還有空間(10.2 GB / 15.9 GB)
  • Compare latency:~0.5–2s,interactive guardrail 夠用
  • Cache hit rate:66%,重複比對幾乎免費
  • 評分品質:正確(1.0)跟錯誤(0.0–0.14)分得很開

不需要雲端 API key,沒有月費,沒有資料外洩問題。

下一步是 benchmark OpenRouter free route 做雲端 baseline,以及量併發 throughput。但即使沒有對照組,本機路徑已經夠日常使用了。

Repository:

留言

這個網誌中的熱門文章

有點誇張的準專業機.Minolta Alpha 7 (Dynax 7、Maxxum 7).2000

題外話,去年幫朋友標了這台,遲遲未寫一篇介紹,其實是有私心的,好東西少一點人知道比較不會搶。 上個禮拜因為自己要 幫朋友拍攝一場婚禮 ,無巧不巧原本服役的 707si 掛了,於是跟朋友商借了 Alpha 7 來拍,拍過之後就一直放在身邊,說實在的有點捨不得還,快門聲,手感,強大的性能,實在是有點誇張。 拿 Alpha 7 拍我女兒的時候,因為有 LCD,我女兒會說我要看,而不是問我 把拔這台是底片的嗎 ?讓我解釋半天她也不相信,直指著 LCD 要看照片,很妙,但是個識貨的女孩,一眼就看出這台相機的特點,機背有 LCD。 於 1998 年推出頂級機 Alpha 9 之後,2000 年推出的 Alpha 7 除了快門速度和連拍速度緊挨著機皇而沒有強過頭,卻在準專業定位的 Alpha 7 身上加入多項先進的功能,其中許多 Alpha 9 所沒有的,相當驚人,整理於下: ※ 全新開發之 CDC912 對焦系統,九點寬域對焦,排列為黃金矩陣 ,宣稱為世界首快之 AF 對焦;機背轉盤可選擇對焦點並直接對焦。(Alpha 9 為三點寬域自動對焦) ※ 首見機背大型點矩陣式 LCD 大幅增加人機溝通性能,若採垂直控制拍攝時LCD會隨之轉為垂直。 ※ DMF (Direct Manual Focus) 功能 :透過機身可讓鏡頭全時手動,無須撥動AF/MF鈕 ※ 世界首見 STF (Smooth TransFocus) 特效 ,可使每支鏡頭作出特殊背景鬆濛感,類似Minolta STF 135mm f/2.8[T4.5]的效果 (作用原理:相機自動切換為多重曝光,並於曝光時逐漸縮小光圈葉片)。[Custom 3] ※搭配新一代納入距離編碼器的鏡頭時,Alpha 7 可採 ADI (Advanced Distance Intergration) 測光模式 ,或配合 TTL 4 區閃燈測光。 ※一推出即支援 SAM 超音波馬達鏡頭。(Alpha 9 需要更新韌體) 功能很多很強大,底下就先挑一些比較有意思的設計做介紹。 》十四區蜂巢式測光,LCD 顯示 當同時按下 AE 曝光鎖 (AEL) 與 LCD 顯示選擇鍵 (DISP) 時,會顯示 14 區各分區的相對EV值,與灰色部份比較,白色的為正值,黑色的為負值,以上圖為例,畫面最暗的地方是 –2.3,最亮的地方是 ...

[古典相機] M 系列快門最速.ME MX 合體.Pentax ME Super.1980

Pentax M 系列機身中,快門速度達到 1/2000 秒的,就只有 ME Super 以及需搭配特殊鏡頭 AF 35-70 f2.8 自動對焦的 ME-F 。 為什麼要說 ME Super 是 MX 以及 ME 的合體呢? MX 是只有曝光手動控制, ME 是只有光圈先決,另有幾台 M 系列 1980 年代出的 MG、MV、MV1,也都只有提供光圈先決,除了改變 EV 值外,沒辦法手動調整快門速度,ME Super 是整個 M 系列機身第一台同時可以手動設定快門也能 Auto 快門的機身,或許是因為希望機身維持像 ME 一樣小,所以在快門設定的功能上,並不像其他家是用機頂轉盤的方式 (OM-2 是用機身接環前的轉環),Pentax ME Super 的快門設定是機頂上的兩個鈕,只能在觀景窗內,透過 LED 指示燈顯示所選用的快門速度,同時也會顯示是否 Over 或者 Under。 機身的設計與 ME 幾乎相同,除了機頂右邊的轉盤處加了兩個手動設定快門速度的鈕,其他都相同,寬度和高度就比 ME 多了一點點,真的只有一點點,就各多個 0.5mm,但重量卻比 ME 更輕,猜想是使用了更輕量的機身結構吧,而可搭配的捲片馬達手把也能通用 (ME、ME II)。 MX 與 ME、ME Super 之比較》 機型 生產 體積 (mm) 重量 快門速度 閃燈同步快門 MX 1976-1985 135.8 x 82.5 x 49.3 495g 1 ~ 1/1000, B 1/60 ~ 1, B ME 1976-1980 131 x 82.5 x 49.5 460g 8 ~ 1/1000, B 1/100 ~ 8, B ME Super 1980-1987 131.5 x 83 x 49.5 445g 4 ~ 1/2000, B 1/125 ~ 4, B ...

Nikon D7000 的感光元件 Sony 做的,官方不公開承認,chipworks 拆給你看!

(圖片來源: Teardown of the Nikon D7000 DSLR by chipworks ) Sony IMX071 The Nikon D7000 comes equipped with a DX format (APS-C) sensor fabricated by Sony, the IMX071. With a 16.2 Mp resolution, this is the second highest resolution of any Nikon DSLR, behind the 24 Mp D3X (dpreview.com). This image sensor features a pixel size of 4.8 µm x 4.8 µm (as seen in the Bayer patterned RGB color filters). The sensor displays improvements in pixel layout and process features, as compared to previous generations of Sony DSLR sensors. 有圖有真相,完整拆解請直上: Teardown of the Nikon D7000 DSLR by chipworks