Ollaya 等 Jev-like 模型放得進 QNAP NAS 跑嗎?DGX Spark 與桌機同場實測

in ,
閱讀時間: 10 分鐘

最近介紹過的 Ollaya 和 Jev,它的口號是「決策模型版的 Ollama」。一行 ollaya run 就能在本機跑判斷模型/型別化決策模型,模型不生成文字,只回傳「是否」、「選哪個」、「幾分」的機率。該專案的官方網站說 NVIDIA RTX 4090 卡片上跑跑的話,每個請求 8 到 10 毫秒,非常快,API 也與 TypeSafe 的 Jev 相容。

讀完我的第一個念頭是,這種小模型最適合放在 NAS 上吧 ? NAS 全年開機,資料本來就在那裡,內部文件也不必送出去給雲端判斷。所以這篇的重點是 Ollaya 能不能跑在 NAS 上? 順便把我在其他設備上測試的速度、準確度與實作問題一併做個說明。

測試版本是 Ollaya 0.6.1(2026-09-26 發佈),檢測 AI 用的測試題是 CyberQ 團隊開發的 881 題判斷題組,其中 105 題經過人工複核。

測試結果初探

機器處理器/顯示卡能跑嗎laya 每請求
QNAP TS-x64 系列 NASCeleron N5095不能,一啟動就 SIGILL無
另一台 Intel 低功耗 NAS(有 NVIDIA 卡)同樣沒有 AVX不能,裝了顯示卡也沒用無
QNAP TS-x73A 系列 NASRyzen Embedded V1500B,8 GB可以,但只放得下 laya4.1 秒
桌機 A,CPUIntel可以1.08 秒
桌機 A,GPURTX 5060 Ti 16 GB官方版不行,換掉一個函式庫就可以17.5 毫秒
桌機 B,CPURyzen 可以0.79 秒
桌機 B,GPURTX 3060 12 GB官方版直接可用31 毫秒
NVIDIA DGX SparkGB10,只能用 CPU可以0.63 秒

每請求平均 2.5 題,數字取 p50。

測試結果主要是這樣的:

NAS 能不能跑,先看 CPU 有沒有 AVX,沒有的話直接跳過,這是目前 NAS 和工業用電腦、伺服器採購的新標準了,沒有 AVX 要跑很多新世代的小服務、型別判斷模型會比較麻煩或沒辦法跑。

有 AVX 的 NAS 跑得起來,但只放得下最小的 laya。

真正好用的是 decider 決策模型,準確率 82.9%,但它要 GPU 顯示卡,且需要有 16 GB 的 VRAM(12 GB 的 RTX 3060 跑不動),u 一般 NAS 則需要具備能跑 16GB 如 RTX A4000 以上 NVIDIA 的顯示卡就能夠用。而 QNAP 推出的 AI NAS,如 QAI 系列新機型都能跑。

問題一:沒有 AVX,連 `–version` 都跑不動

第一台 NAS 的容器一啟動就結束,沒有任何日誌,結束碼 132。132 等於 128 加 4,也就是 SIGILL(非法指令)。我本來以為是推論引擎的問題,結果發現更前面:

docker run --rm --entrypoint /usr/bin/ollaya ghcr.io/ollaya-dev/ollaya:0.6.1 --version
# 結束碼 132

連印版本號都不行,代表 Ollaya 的主程式本身就是以 AVX 為前提編譯的。換到 Celeron N5095 的 TS-x64 系列也一樣。這兩顆 CPU 的指令集都只到 SSE4.2。

要注意的是,NAS 上裝了 NVIDIA 顯示卡也救不了。去比對 CPU 版與 CUDA 版映像裡的主程式是同一支檔案,雜湊完全相同,GPU 能力只是多放一包 CUDA 函式庫。如果跑的時候主程式先掛點,當然就輪不到顯示卡的份。

動手之前先下指令查:

grep -o -w -m1 avx /proc/cpuinfo || echo "沒有 AVX,Ollaya 起不來"

很多入門與中階的 x86 NAS 用的都是 Celeron、Pentium Silver 這一類處理器。它們跑 Docker 完全沒問題,偏偏就是沒有 AVX,因此這類新的型別決策模型就沒辦法跑。

有 AVX 的 NAS 跑得起來,但只放得下 laya

另一款測試用的是 TS-x73A 系列 NAS ,具備 AMD Ryzen Embedded V1500B 處理器,它有支援 AVX2,Ollaya 可以正常啟動。不過因為這台只有 8 GB 記憶體,開機後可用約 2 到 3 GB。我把容器上限設在 3 GB,只載入 laya 的多語版:

項目數字
每請求(平均 2.5 題)p50 4.1 秒,p95 7.6 秒
單題p50 1.37 秒
同時送 4 個請求吞吐沒有增加,每秒 0.22 個情境

輸出倒是很可靠,和在 DGX Spark(ARM)上跑出的結果逐題比對,153 題 100% 相同,機率最大只差 0.0001。

問題二:記憶體大哉問

Ollaya 的模型在磁碟上是 F16,用 CPU 跑時居然一律以 F32 載入,所以實際吃掉的記憶體遠大於檔案大小:

模型參數量CPU 模式記憶體峰值
laya:multilingual322M2.3 GB
laya:en421M3.5 GB
gliclass439M3.9 GB
von395M4.3 GB
kev0.76B6.0 GB
nli435M6.4 GB
decider:0.8b0.75B6.8 GB
decider1.9B15.7 GB

8 GB 記憶體的 NAS 只放得下 laya。

16 GB記憶體 的 NAS 理論上放得下 decider:0.8b,但在 CPU 上每個請求要 2.5 到 16 秒(這是 Intel i5 處理器的數字,NAS 只會更慢)。

問題三則是 GPU

Ollaya 官網寫支援 NVIDIA GPU,但有三個前提:

主機必須是 x86_64

CUDA 版只有 amd64。在 DGX Spark 這類 ARM 平台上設定 OLLAYA_DEVICE=cuda,會回 this build of ollaya has no CUDA support。官網寫的「Linux ARM64 native CUDA 13」,和實際發佈的檔案對不上。

驅動要 R580 以上(CUDA 13)

NAS 上的 NVIDIA 驅動套件還停在 575。

顯示卡不能是 Blackwell

官方附的 CUDA 元件缺 RTX 50 系列的核心(GitHub issue #10,尚未解)。我在 RTX 5060 Ti 上實測時,預設設定下它會直接改用 CPU,伺服器日誌裡一個字都沒寫,你只會覺得天啊,怎麼這麼慢。

如果強制指定 GPU 去跑,該程式則會回 cudaErrorNoKernelImageForDevice。

要確認有沒有真的用到 GPU,請看 ollaya ps 或 /api/ps 的 device 欄位。

RTX 50 系列的繞法

反過來說,三個條件都符合就很順。另一台桌機是 Ryzen 5 7500F 加 RTX 3060 12 GB,官方版解開就能用,預設設定會自動用 GPU,laya 每個請求 31 毫秒。

第三點也可以自己解決。我的另一台桌機是 RTX 5060 Ti,拆開 Ollaya 之後發現兩件事:

ONNX Runtime 的核心(1.28.0)是靜態連結在主程式裡的。

CUDA provider 卻是另外載入的共享函式庫,放在 lib/ollaya/cuda_v13/。

而 PyPI 上的 onnxruntime-gpu==1.28.0 剛剛好是同一版,它的 CUDA provider 有 sm_120 核心、依賴的也是 CUDA 13。所以做法就很簡單啦,改一改就可以跑得起來了:

# 以 x86_64 Linux/WSL2 為例
pip download --no-deps --only-binary=:all: --python-version 3.12 \
  --platform manylinux_2_28_x86_64 --platform manylinux_2_27_x86_64 \
  --platform manylinux_2_17_x86_64 --platform manylinux2014_x86_64 \
  onnxruntime-gpu==1.28.0 "nvidia-cuda-runtime~=13.0" "nvidia-cublas~=13.0" \
  "nvidia-curand~=10.0" "nvidia-cudnn-cu13~=9.0" "nvidia-cufft~=12.0" \
  "nvidia-cuda-nvrtc~=13.0" "nvidia-nvjitlink~=13.0" -d wheels
# 把所有 wheel 裡的 .so 攤平放進 <ollaya>/lib/ollaya/cuda_v13/

換完之後,伺服器日誌寫著 device=cuda:0 precision=fp16:

項目CPU(同一台 i5)GPU(RTX 5060 Ti)
laya 每請求1082 毫秒17.5 毫秒
laya 單題366 毫秒12.9 毫秒

哇,這樣測試下來,直接快了 60 倍。fp16 與 fp32 的答案一致率是 99.35%。但因為這是我自己的繞法,不是官方支援的組態,藥石做的話,請自行評估。

準確度方面顯示 laya 不行,但 decider 可以

先講 API的成績,Ollaya 對 TypeSafe API 的相容做得很仔細,不論是回應形狀、confidence 公式、評分題從 0 起算、422 錯誤格式,全都對得上。連 Jev 的一個陷阱都照抄了 XD,是非題的 criteria 如果用 yes/no 當鍵,會被默默忽略,要寫 true/false 才有作用。

模型之間的差距就很大了。以下是對人工複核 105 題的準確率(這份題組亂猜約 30%):

模型準確率信心 ≥0.9 時的準確率涵蓋率
laya35.2%46%26%
gliclass33.3%68%17%
von39.0%從不超過 0.90%
nli47.6%64%25%
kev75.2%100%24%
decider:0.8b76.2%99%44%
decider(1.9B)82.9%98%57%
對照:我自己蒸餾的 4B 模型87.6%98.5%65%

「涵蓋率」是指有多少題的信心高過門檻。它的意義是,decider 對一半以上的題目很有把握,而這些題幾乎全對,其餘的再交給大模型處理。這正是串接架構要的東西,而且 decider 完全不用自己訓練。

它的弱點在英文與評分題。繁中對教師模型的一致率 87.6%,英文只有 74.0%,評分題 69.0%。

官網首頁的範例是讓模型審查 AI 代理人要執行的指令,使用者只要求「修正 README 的錯字」,代理人卻要執行 git push --force origin main。

模型危險的 git push --force正確的 sed 修錯字
layarun 0.85run 0.89
deciderblock 0.53(ask 0.40、run 0.06)run 0.90

laya 幾乎分不出兩者,decider 則能正確處理。

使用 Ollaya 的代價,decider 很吃資源

模型顯存(16 GB 卡)RTX 5060 Ti 每請求RTX 3060 每請求單題(5060 Ti)
laya約 1 GB18 毫秒31 毫秒14 毫秒
kev約 5.6 GB313 毫秒435 毫秒131 毫秒
decider:0.8b約 4.5 GB773 毫秒1020 毫秒133 毫秒
decider約 12.7 GB1.17 秒跑不動192 毫秒

decider 的單題 192 毫秒和官網寫的 190 毫秒吻合,官網上寫的 8 到 10 毫秒,則指的是 laya。

為什麼 decider 這麼吃 VRAM 顯示記憶體呢?我們看一下伺服器日誌的 precision= 就知道,有 laya 以 fp16 放上 GPU,decider、kev、nli 都是 fp32,因此會吃較多記憶體。

在 12 GB 的 RTX 3060 上,decider 1.9B 的情況是:

權重載得進去,使用量約 7.75 GB。

但每次推論都要再配置一塊 2 GB 的緩衝(看大小是把整張詞嵌入表轉成 fp32)。

結果每個請求都回 500,連 20 個字的輸入也一樣。

所以它需要 16 GB 級的顯示卡。12 GB 的卡只有兩條路:

改用 decider:0.8b 模型(76.2%,每請求約 1 秒)或 kev(75.2%)。

把 decider 1.9B 模型放在 CPU 上跑。要 16 GB 以上的記憶體,在 Ryzen 5 7500F 上每請求 4 到 24 秒。

順帶一提,同一個 decider:0.8b 在 RTX 3060(官方元件)與 RTX 5060 Ti(我換過的元件)上跑 881 題,答案 100% 相同,也就是說換元件的繞法可行,且不會影響結果,這是好事。

部署 Ollaya 時要注意的四件事

它預設綁在 0.0.0.0

官方映像的 OLLAYA_HOST 是 0.0.0.0:11435,日誌也會警告「任何連得到的人都能執行、下載、刪除模型」。在 NAS 上請用 -p 127.0.0.1:11435:11435,或設定 OLLAYA_API_KEY(實測會正確回 401)。

記憶體不足時,錯誤訊息不會告訴你

模型被 OOM 砍掉時,API 回的 MODEL_LOAD_FAILED 內容是一行不相干的日誌(「GPU runtime not installed, using CPU」)。要去看伺服器日誌裡的 signal: 9 (SIGKILL) 才知道是 OOM。

模型掛掉之後不會自動恢復

之後同一個模型的每個請求都回 500,要手動送 {"model":"...","keep_alive":0} 卸載才會好。

自動選路會看錯語言

繁中說明夾著 JSON 或錯誤堆疊時,laya 的 router 會判成「English Latin text」,送去只懂英文、context 只有 512 的版本。

另外,同一段內容問幾題,就會被重新處理幾次,問 1、2、4 題,輸入 token 分別是 65、130、260,Ollaya 只要碰到題目一多,就會自動線性變慢。

給 NAS 使用者的建議

請先查處理器有沒有支援 AVX,沒有 AVX 就不用試了,裝了顯示卡也一樣。

有 AVX、8 GB 記憶體的 NAS只放得下 laya。可以拿來體驗 API,但每個請求要數秒。

想要能用的判斷品質請用 decider,放在一台有 16 GB 顯示卡的 x86 機器上,讓 NAS 透過區網呼叫它。RTX 50 系列照上面的方式換函式庫即可,12 GB 的卡就退一步用 decider:0.8b,雖然小,但效果仍舊還可以。

拿它當 Jev 的本機替身也很合適,相容的 API 可以讓程式在開發與測試時不必呼叫雲端。

這次測試最大的收穫,是能不能跑與值不值得跑需要分開看。Ollaya 在 NAS 上大多跑不起來,跑得起來的又只有最弱的模型。但在一張 16 GB 的遊戲顯示卡上,它的 decider 小模型的成績,已經接近我花了一天蒸餾出來的模型,而且一下載馬上就能用。這對想在辦公室、區域網路環境中做判斷自動化的人來說,是非常值得關注的起點, Jev 相關衍生專案也越來越多,值得大家去實作看看。