Janas:在筆記本上以 SSD 流式載入專家,實現 80B 引數 LLM 的即時執行
Janas: Run LLMs larger than RAM by streaming experts from SSD
Janas 讓筆記本能在 32GB 記憶體下執行 80B 引數的混合專家 LLM。
- 核心特性:專家模型以 SSD 直連流式載入,記憶體只需存放熱專家。
在筆記本上以 SSD 流式載入專家,突破記憶體限制,讓 80B 引數模型可即時使用,並提供跨平臺 CLI 及 HTTP API,方便開發者快速整合。
譯文尚未完整,完整內容請切換至原文。
在 32 GB 記憶體的筆記型電腦上,Qwen3-Next-80B(48 GB 模型)以 37 tok/s 的速度執行,未使用草稿時為 24 tok/s,llama.cpp 只管理 2.8 tok/s;讀取提示時為 62 tok/s,對比 16 tok/s。 Janas-LLM 在同一臺筆記型電腦 (Debian 13 Linux, Intel Core Ultra 9 185H, 其整合 Arc GPU, 32 GB, NVMe SSD; 2026年10月9-11日; 整臺機器 以下) 的每個模型都比 llama.cpp 更快。
| 模型 | 閱讀 1,024 個 token:Janas-LLM | llama.cpp | 寫入:Janas-LLM | llama.cpp |
|---|---|---|---|---|
| Qwen3-Next-80B-A3B (48.4 GB,超過記憶體) | 62 tok/s | 16 tok/s | 24 tok/s | 2.8 tok/s |
| Qwen3-Coder-Next (48.4 GB,超過記憶體) | 66 tok/s | 14 tok/s | 22 tok/s | 2.2 tok/s |
| Qwen3.6-35B-A3B | 104 tok/s | 79 tok/s | 19 tok/s | 12 tok/s |
| Qwen3-30B-A3B | 135 tok/s | 122 tok/s | 32 tok/s | 15 tok/s |
| Gemma-4-26B-A4B-it | 84 tok/s | 76 tok/s | 18 tok/s | 12 tok/s |
| Gemma-4-12B-it | 65 tok/s | 46 tok/s | 9.9 tok/s | 7.1 tok/s |
| Qwen3.5-9B | 111 tok/s | 78 tok/s | 14 tok/s | 8.7 tok/s |
| Gemma-4-E4B-it | 122 tok/s | 109 tok/s | 20 tok/s | 15 tok/s |
| Qwen3-4B | 193 tok/s | 164 tok/s | 27 tok/s | 18 tok/s |
| Gemma-4-E2B-it | 191 tok/s | 150 tok/s | 38 tok/s | 19 tok/s |
| Qwen3.5-2B | 441 tok/s | 323 tok/s | 52 tok/s | 28 tok/s |
| Qwen3.5-0.8B | 799 tok/s | 519 tok/s | 109 tok/s | 32 tok/s |
| Qwen3-0.6B | 939 tok/s | 670 tok/s | 130 tok/s | 45 tok/s |
其他手上相同模型,在旁邊的目錄中:
| 模型 | 閱讀 1,024 個 token:Janas-LLM | llama.cpp | 寫入:Janas-LLM | llama.cpp |
|---|---|---|---|---|
| Qwen3-30B-A3B,bartowski 的 Q4_K_M(重要性矩陣) | 131 tok/s | 122 tok/s | 32 tok/s | 16 tok/s |
| Qwen3-30B-A3B,unsloth 的 UD-Q3_K_XL(3 位) | 100 tok/s | 112 tok/s | 36 tok/s | 11 tok/s |
| Qwen3-4B,bartowski 的 Q4_K_M(重要性矩陣) | 191 tok/s | 160 tok/s | 26 tok/s | 18 tok/s |
一個例外:3 位 Qwen3-30B 在讀取提示時比 llama.cpp 慢,因為其 Q3_K 權重尚未送到 GPU 的快速提示;但寫入速度快三倍。
它們的測量方式以及使用草稿時的速度:現在可用功能。在另一臺機器上,數值會不同:janas-bench 測量你的。
嘗試它 在 Linux x86-64(Ubuntu 22.04、Debian 12 及以後版本):
curl -LO https://github.com/prabanta-dev/janas/releases/latest/download/janas-linux-x86_64.tar.gz tar xf janas-linux-x86_64.tar.gz && cd janas ./janas-chat # the models it knows: pick one, it is downloaded and checked
或在 Windows 10(1903 或更新)和 11,x86-64:下載 janas-windows-x86_64.zip,解壓,並在其 janas 資料夾的終端機中執行 .\janas-chat。在同一臺筆記型電腦上,Windows 11(2026年10月12日)下 Janas-LLM 的寫入速度與 Linux 相同(Qwen3-4B 25.6 tok/s,Qwen3-30B-A3B 34.2),讀取提示速度也相同,混合模型(Qwen3-30B-A3B 132 tok/s)以及 1.8 倍於稠密模型(Qwen3-4B 346 tok/s 對 193),其整個區塊都送到 GPU,透過 Intel 自家的 Windows 驅動。
模型已經從 Hugging Face 轉換好;從原始碼構建:入門。
▄███████████▄
▄███████████████▄
███ ▄ █████ ▄ ███ ▄ J A N A S
███▄▄▄█████▄▄▄████
▀█████▄▀▀▀▄█████▀ ▀ a family of tools for artificial intelligence, in C
█████████████
█ █ █ █ █ █ █ █
▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀
Janas 是一套人工智慧工具,使用 C 語言編寫,僅依賴 C 標準函式庫。其第一個元件,Janas-LLM,可在普通電腦上執行大型混合專家語言模型,是否使用 GPU 不影響:權重保留在磁碟上,所需的專家權重以 NVMe SSD 流式載入,並且返回的部分會保留在記憶體中。80 億引數模型可在 32 GB RAM 的筆記本上執行並回應。
由 Maurizio "camauri" Cammalleri 設計並撰寫。
⚠️ 請先閱讀此內容
這是一個實驗,而非產品。
| 階段 | 早期開發。公共 API 和命令列 會無通知變更,且每週會變更數次。模型檔案除外:在 Hugging Face 上發布的 .jns 檔案(格式版本 2)將被所有後續版本的 Janas-LLM 讀取。 |
| 穩定性 | 尚未驗證。 引擎對機器的要求很高:它用專家快取佔滿空閒記憶體,並以全速讀取磁碟,使用 O_DIRECT。若機器的餘量低於預估,桌面可能被推進 swap,變慢或無回應。曾有一次使用 GPU 造成驅動程式重置,桌面亦跟著失效。 |
| 資料 | 它只寫入 ~/.cache/janas(記錄它對你機器的學習結果,以及已閱讀的系統訊息,以免再次閱讀)以及你指定放置轉換後模型的位置。它不會改動所讀取的模型檔案。 |
| 硬體 | 開發並執行於 一臺 機器(以下)。在其他環境未經測試:可能較慢、拒絕模型或行為不正常。 |
若發生錯誤,Ctrl-C 會停止回覆,Ctrl-D 會離開聊天;--cache <GiB> 對佔用記憶體設定硬限制,JANAS_GPU=0 則完全不使用 GPU。
它成長的機器
本倉儲中的所有內容均於以下環境編寫與測量:
- Linux Debian 13(trixie),x86-64,kernel 6.12.107;GPU 驅動 Mesa 26.1.6(Vulkan);使用 GCC 14.2 編譯
- Intel Core Ultra 9 185H(6 個效能核心、8 個效率核心、2 個低功耗核心;AVX2、FMA、F16C、AVX-VNNI;整合 Arc GPU)
- 32 GB DDR5 記憶體
- 1 TB NVMe SSD(讀取速度約 5.7 GB/s)
Windows 版本在同一臺筆記型電腦上執行,作業系統為 Windows 11(build 26300),使用 Intel 自家圖形驅動:測試在此環境通過,速度詳見上方的 或在 Windows。
引擎所做的一切皆根據測量結果決定,其他機器會做出不同選擇——此部分設計為可攜。尚未嘗試的仍是其他 CPU(尤其缺少 AVX-VNNI 或 AMD)、獨立 GPU、較慢磁碟、更多或更少記憶體。若你在其他環境執行,janas-bench 的報告將是你能回報的最有價值資訊(參見 協助它在更多硬體上執行)。
目前可用功能
Janas-LLM 今日可執行的模型與功能:docs/features.md。
在上述機器上,未執行其他程式,janas-bench 報告如下(測量於 2026 年 10 月 10 日,使用自該日以來引擎預設的快速提示):
| 模型 | 讀取提示 | 寫出回覆 | 在聊天中擬稿 |
|---|---|---|---|
| Qwen3.5-2B(dense,1.3 GB) | 395 tok/s | 50 tok/s | 67 tok/s |
| Qwen3-4B(dense,2.5 GB) | 220 tok/s | 28 tok/s | 見 --draft 之下 |
| Qwen3.5-9B(dense,5.7 GB) | 103 tok/s | 14 tok/s | 24 tok/s |
| Qwen3-30B-A3B(18.6 GB) | 133 tok/s | 34 tok/s | — |
| Qwen3-6-35B-A3B(22.3 GB) | 86 tok/s | 25 tok/s | 34 tok/s |
| Qwen3-Next-80B-A3B(48.4 GB) | 64 tok/s | 22 tok/s | 37 tok/s |
| Gemma-4-E2B-it(3.1 GB) | 211 tok/s | 38 tok/s | 52 tok/s |
| Gemma-4-E4B-it(5.0 GB) | 133 tok/s | 20 tok/s | 32 tok/s |
| Gemma-4-12B-it(dense,7.1 GB) | 71 tok/s | 10 tok/s | 14 tok/s |
| Gemma-4-26B-A4B-it(18.3 GB) | 90 tok/s | 18 tok/s | 26 tok/s |
每個數值都是三輪平均,不是最佳輪次,這些數值代表引擎為每種通過類別自行選擇的配置——聊天所用的配置:256 令牌的提示,然後 64 令牌的輸出。在此整合 GPU 讀取每個提示(下方的快速提示),引擎選定的執行緒為每個提示和幾乎所有模型的單個令牌使用 12 個效能核心,將所有可用核心(效能與節能核心,非低功耗核心)一次使用於少量令牌。在另一臺機器上,引擎可能會選擇其他執行緒:每種通過的前幾輪嘗試所有核心,每個效能核心一個執行緒以及效能核心的執行緒,保留最快的,之後偶爾嘗試其他執行緒,這樣機器熱身後可以改變判斷(在 i9-14900HX 上,每個執行緒的回覆速度不到效能核心 16 的一半)。輪次以交替順序執行,使機器熱身和快取填充對每個設定的影響相同。預期在不同跑次之間會有幾個百分點差異,首次跑時則會更少,因為快取仍在填充。沒有 GPU(JANAS_GPU=0)時 Qwen3-4B 以 85 tok/s 讀取相同提示,寫入速度為 27.
最後一欄是預測下一個令牌的草稿,模型會檢查它們,這與同樣文本但更高速度的情況相同——整個過程在 --mtp 下說明:Qwen3.5、Qwen3.6 模型以及 Qwen3-Next 自己的預測區塊,Gemma 4 的助手(自有的小型草稿模型)。測量基於聊天回覆:一個普通的英文問題("explain how bread is made at home"),回答 64 個令牌,作為聊天樣本抽樣。草稿的價值取決於文本:在 Qwen 模型和 Gemma 的兩個較大模型上,草稿存活率為 74-89%,在 Gemma 的 E2B 和 E4B 上為 63-72%;在義大利語散文中,Qwen3.5-2B 只保留大約三分之一,幾乎沒有增益。64 令牌的一輪在此處噪音較大,跑次之間差異約十分之一。Qwen3-30B-A3B 沒有此類區塊,密集型 Qwen3 亦無;密集型 Qwen3.5 在其原始檢查點中有一個,hf2jns_mtp 轉換了它(MODELS.md)。
此欄位直到 2026 年 9 月 26 日才正確,且數值更高:它測量了繼續重複段落的區塊,模型會複製並且區塊幾乎每次都能猜對——Qwen3.5-2B 為 107 tok/s,Qwen3.5-9B 為 26。當時的 MoE 數值(29 和 30)恰好低於今天;ChangeLog 內有詳細說明。
本頁頂部與 llama.cpp 的比較測量方式如下:llama.cpp(2026 年 9 月 18 日的 build 2b18470)使用其 Vulkan 後端,在相同的整合 GPU 上執行,所有內容都在其上(llama-bench -p 1024 -n 16 -ngl 99 -t 12;其他情況下是最大模型,見下文),對比 janas-bench --prompt 1024 --gen 16 在相同檔案、相同日期(2026 年 10 月 9-11 日)下的測試(llama.cpp 的最佳配置,Janas-LLM 自己的選擇;10 月 11 日每個模型進行三輪,llama-bench -r 3 和 janas-bench --rounds 3,針對 Qwen3-0.6B、Qwen3.5-0.8B、Qwen3.6-35B-A3B 以及其他手段的模型;Qwen3-Coder-Next 以 Qwen3-Next-80B 形式,見下文)。
在 Qwen3-Next-80B-A3B 上,其檔案大小超過此筆記本的 30 GB,llama.cpp 以其常規編譯在 GPU 參與時即耗盡記憶體,即使專家模型留在 CPU 上 (-ngl 99 -ncmoe 48):其 CPU 後端會將權重複製到自身記憶體以重新打包,而 Vulkan 後端則將留給 CPU 的權重複製到系統無法回收的緩衝區。它以不重新打包的編譯 (GGML_CPU_REPACK=OFF) 並加上兩個額外選項 --no-host 1 -lm mmap 執行,這些選項將專家模型保留在檔案中,透過頁面快取讀取:GPU 讀取速率 16 tok/s,僅 CPU 寫入 2.8 (含 GPU 為 2.0);這是表格中的兩個數值。Janas-LLM 在沒有自訂選項的情況下執行相同模型,最常使用的專家模型佔約 19 GB 的快取,其餘則從磁碟讀取。Janas-LLM 的數值為一次完整迴圈;寫入欄位兩邊均未包含草稿。兩個工具的測量方式並不完全相同 (llama-bench 在前面不寫提示;janas-bench 在 1,024 個 token 後寫入),且皆在同一臺機器上。llama.cpp 的 CPU 後端在此筆記本上的讀取表現 (Qwen3-4B 70 tok/s 20 執行緒) 甚至不如其 Vulkan 後端,寫入表現亦相同。
先在閒置機器上試試。 專家快取會佔用模型開啟時空閒的記憶體,剩餘模型則在回答時從磁碟讀取,其他程式也會分攤這部分記憶體。它的降效較為平滑,而非直接失效:測試時同時開啟瀏覽器與編輯器,模型仍保持約四分之三的速度,磁碟等待時間則延長五倍。但你首先看到的應該是機器的實際速度,任何想要傳給他人的測量都必須以該機器自身為基準。
檔案
- INSTALL.md — 編譯所需、模型準備方式,以及首次執行說明
- ChangeLog.md — 變更紀錄,最新優先
- MODELS.md — 轉換模型的授權方式,以及可再發布的內容
- CONTRIBUTING.md — 如何貢獻與簽署說明
- src/services — Janas 的服務,每個都有其頁面,位於
janas-chat及其他 MCP 使用者端 - docs/features.md — Janas-LLM 今日執行的功能,逐模型與逐功能說明
- docs/models.md — 取得模型:
janas-get,或轉換後的 GGUF 檔 - docs/chat.md — 使用
janas-chat、其服務與 MCP 伺服器的工具 - docs/library.md — 從程式使用,支援 C 或 FreeBASIC
- docs/serving.md — 將模型提供給 MCP 使用者端 (
janas-mcp) 與 HTTP (janas-server) - docs/code-completion.md — 在 VSCodium 與 VS Code 中的程式碼補完,透過
janas-server - docs/tools.md — 轉換器、檢查器與基準測試
- docs/hardware.md — 測量機器、協助其在更多硬體上執行
- AUTHORS — 撰寫者與其所借鑑的內容
- LICENSE — GNU GPL 3 或更新版
快速上手
sudo apt install build-essential # Debian/Ubuntu sudo apt install libvulkan-dev glslang-tools vulkan-tools # optional, GPU sudo pacman -S vulkan-headers glslang vulkan-tools # the same, Arch ./build.sh # everything into bin/x86_64-linux/ ./build.sh release test # and run the tests
取得模型
下載已轉換為 janas-get 的模型,或自行轉換 GGUF 檔,並檢查哪些檔案已被驗證:docs/models.md。
使用聊天功能
janas-chat:其選項與指令、草稿、Janas 的服務、MCP 伺服器工具,以及在閱讀時觀察的長提示:docs/chat.md。
填寫程式碼
janas-server 在編輯器遊標位置填入程式碼,使用像 Qwen3-Coder-30B-A3B 這樣的程式碼模型:OpenAI 的 /v1/completions 搭配 suffix,以及 llama.cpp 的 /infill,這是 llama.vscode 所要求的。每次敲擊都會傳送一個視窗,並保持不移動,讓一次敲擊只讀取其變更的內容:在筆記型電腦上,1.5-2.2 秒的提案,其中視窗滑動一行再次被讀取需要 17 秒。如何在 VSCodium 與 VS Code 中設定,使用 llama.vscode 或 Continue,以及測量結果:docs/code-completion.md。
從程式使用
C、FreeBASIC 與 BASIC MODERN 的庫,以及從程式提供的 MCP 伺服器:docs/library.md。
Janas 作為 MCP 伺服器
janas-mcp:將模型作為 Claude Code、編輯器及其他 MCP 客戶端的工具:docs/serving.md。
透過 HTTP 使用
janas-server:遵循 OpenAI 的 HTTP API,以及可在瀏覽器中嘗試的聊天頁面:docs/serving.md。
測量你的機器
janas-bench:它測量什麼,以及產生的報告:docs/hardware.md。
工具
附加於程式的轉換器、檢查器與基準測試:docs/tools.md。
協助其在更多硬體上執行
最需要哪些機器,單一指令嘗試 Janas 並產生報告,以及要傳送什麼:docs/hardware.md。
致謝
Janas 由 Maurizio "camauri" Cammalleri 設計並撰寫 (LinkedIn, Substack)。
它基於他人工作,並說明:
- 模型 由它執行的作者:Qwen3、Qwen3.5、Qwen3.6 以及 Qwen3-Next(由阿里雲 Qwen 團隊)、Gemma 4(由 Google); GGUF 量化由 Qwen、bartowski 和 unsloth 完成 (MODELS.md 包含所有來源)。
- llama.cpp 與 ggml 是引擎驗證的參考(logits、tokens、速度);其程式碼不包含於 Janas。從 ggml 取用的唯一專案是定義格式的資料:IQ3_S 網格,位於
src/llm/iq3s_grid.h,遵循 ggml 的 MIT 許可證。 - Unicode 字元資料庫 為分詞器提供表格(
tools/gen_unicode),而 OpenAI 的 OpenAPI 規範 為janas-server提供路由表(tools/openapi_routes)。 - GNU libmicrohttpd、yyjson 與 Mbed TLS 已編譯進入以下列出的程式。
janas-flights從 adsb.lol(資料遵循 Open Database License)以及 adsb.fi 讀取飛機位置,從 adsbdb.com 讀取航線,並使用使用者的金鑰從 AviationStack 讀取時間表;其地點資料表來自 OurAirports(公有領域)、GeoNames(CC BY 4.0)與 Natural Earth(公有領域)。janas-quakes從 INGV(Istituto Nazionale di Geofisica e Vulcanologia,CC BY 4.0)讀取義大利及其海域的地震,從 USGS(公有領域)讀取其他地區的地震,並從 Nominatim(© OpenStreetMap 貢獻者,ODbL)讀取地點。janas-weather從 Open-Meteo(CC BY 4.0)與 MET Norway(CC BY 4.0)讀取預報與海洋資訊,從 aviationweather.gov(NOAA)讀取站點報告,從 MeteoAlarm(EUMETNET)讀取警報,從 Dipartimento della Protezione Civile(CC BY 4.0)讀取義大利警戒等級。若未指定地點,服務會詢問 GeoJS 或 ipwho.is 以取得網路連線位置。janas-maps讀取 OpenStreetMap 的資料 (© OpenStreetMap contributors, ODbL) 透過 Nominatim, Photon, Valhalla 和 OSRM 在 FOSSGIS 的伺服器上,以及 Overpass API(在繁忙時使用 Private.coffee's instance),並透過 Transitous 讀取公共交通路線,使用營運商的開放時刻表。janas-prices讀取 European Central Bank(透過 Frankfurter)、CoinGecko(資料由 CoinGecko 提供)和 Coinbase、Alpha Vantage(使用使用者金鑰)、Eurostat 以及 World Bank(CC BY 4.0)、New York Fed、Bank of England 和 Swiss National Bank、energy-charts.info(Fraunhofer ISE;區域在 CC BY 4.0,來自 Bundesnetzagentur 的 SMARD),以及義大利 MIMIT(IODL 2.0)、法國 prix-carburants、西班牙 ministry 和奧地利 E-Control 的燃油價格;地點透過 Nominatim。janas-githubreads GitHub's REST API;janas-gitruns git.janas-wiki讀取 Wikipedia 透過其 API;文字為 Wikipedia 的內容,遵循 CC BY-SA 4.0,且每個答案都提供該頁面地址。- The people who tried it on their own machines 並在本倉庫的 issue 報告他們看到的內容:他們的報告多次更改了引擎(它選擇的執行緒、提示的進度、GPU 的診斷)。
授權
版權所有 © 2026 Maurizio \"camauri\" Cammalleri.
Janas 是自由軟體,採用 GNU General Public License, version 3 or later — 參見 LICENSE。每個原始碼檔案都包含其 SPDX 行。
janas-server,而且僅此一個,內建兩個其他庫,原始碼未變更,位於 src/third_party/,並附上其授權與來源:GNU libmicrohttpd 1.0.10(LGPL 2.1 或更高,或 eCos 授權不含 HTTPS,因其在此處構建)和 yyjson 0.13.0(MIT)。libjanas_mcp 以及與其一起的程式,使用 Mbed TLS 4.2.0 搭配 TF-PSA-Crypto(Apache-2.0 或 GPL-2.0-or-later),供 https:// MCP 伺服器。libjanas_llm 沒有。
模型不在此授權範圍內。 轉換後的 .jns 檔案是模型的衍生物,而非 Janas,並保留其作者所授權的授權;MODELS.md 說明本專案將與不會重新發布的內容,以及在轉交轉換模型前須檢查的事項。
貢獻
CONTRIBUTING.md。簡短版:來自沒有人擁有的機器的測量值比大多數補丁更有價值,每一次提交都需要一條 Signed-off-by 行(git commit -s)。
來源:Hacker News (official RSS) · github.com