跳到正文
北京时间
原文
Hacker News 热门(buzzing.cc 中文翻译)· GreenGames·· 2026-04-21精选AI 评分70

我们在RTX 3090上运行Qwen3.5-27B,获得了207 tok/s的性能

AI 导读

开发者在单张RTX 3090显卡上成功运行Qwen3.5-27B模型,实现了每秒207个token的生成速度。该项目已在GitHub平台开源,展示了消费级硬件运行270亿参数大语言模型的高性能潜力。相关成果在Hacker News获得105个点赞,引发技术社区对本地大模型部署效率与优化方案的关注。

推荐理由

Lucebox 把 Qwen3.5-27B 在 3090 上推到了 207 tok/s,靠的是定制投机解码和 KV 压缩,做本地推理的开发者值得照着配一遍,虽然调试门槛不低。

正文 · AI 翻译

专为速度打造的本地 LLM 推理服务器。采用自定义内核、推测性预填充与解码。我们引擎中的每一项优化都针对特定的模型系列和硬件目标。

推理引擎优化

每个优化都独立成篇,附有设置说明和基准测试注释。

支持的模型与草稿模型

所有加速倍数均与 vendored llama.cpp(-fa 1,匹配 KV 量化)对比测量。综合加速倍数为两个阶段(TTFT × 解码)的几何平均值;若仅测试单阶段,则使用该阶段的加速倍数。草稿模型发布在 huggingface.co/Lucebox。

-fa 1

模型 加速倍数 Qwen 3.5-0.8B(Megakernel)~2× Qwen 3.5-27B + DDTree 3.43× Qwen 3.6-27B + PFlash ~5.6× Qwen 3.6-27B + DDTree 4.84× Laguna-XS.2 33B + PFlash 5.4× @128K Qwen 3.5-27B HIP ~2.6× Gemma-4-26B-A4B 1.31× 草稿模型阶段 Qwen3.6-27B 解码 gemma-4-26B-A4B 解码 gemma-4-31B 解码 Qwen3-0.6B 预填充

模型 加速倍数 Qwen 3.5-0.8B(Megakernel)~2× Qwen 3.5-27B + DDTree 3.43× Qwen 3.6-27B + PFlash ~5.6× Qwen 3.6-27B + DDTree 4.84× Laguna-XS.2 33B + PFlash 5.4× @128K Qwen 3.5-27B HIP ~2.6× Gemma-4-26B-A4B 1.31×

草稿模型阶段 Qwen3.6-27B 解码 gemma-4-26B-A4B 解码 gemma-4-31B 解码 Qwen3-0.6B 预填充

Qwen3.6-27B

gemma-4-26B-A4B

gemma-4-31B

Qwen3-0.6B

测试机器(GPU/APU)

参考目标:RTX 3090(Ampere sm_86)——所有核心数据均以此为准。其他 NVIDIA 架构由 CMake / setup.py 自动检测;AMD HIP 后端单独处理(Strix Halo 部分)。

setup.py

架构 GPU 最低 CUDA / ROCm 状态 基准测试 Ampere sm_86 RTX 3090, A系列 CUDA 12.0 ✅ 参考 megakernel · dflash Blackwell sm_120 RTX 5090 CUDA 12.8 ✅ 205 tok/s, 4.84× ↗ Blackwell sm_121 DGX Spark / GB10 CUDA 12.9 ✅ megakernel NVFP4 ↗ Turing sm_75 RTX 2080 Ti CUDA 12.0 ✅ 53 tok/s DFlash ↗ Ada sm_89 RTX 40xx CUDA 12.0 🟡 社区 WSL2 基准测试 ↗ — Blackwell sm_110 Jetson AGX Thor CUDA 13.0 🟡 已构建,未测试 — Volta sm_70 / Pascal sm_61 V100, P40 CUDA 12.0 🟡 回退路径,未测试 — RDNA3.5 gfx1151 Ryzen AI MAX+ 395 / Strix Halo ROCm 6+ ✅ 37 tok/s HIP ↗ RDNA3 gfx1100 Radeon RX 7900 XTX ROCm 6+ ✅ 50 tok/s HIP ↗

sm_86

sm_120

sm_121

sm_75

sm_89

sm_110

sm_70

sm_61

gfx1151

gfx1100

server/(DFlash)使用 CMake 3.18+ 和 --recurse-submodules 构建,基于 Luce-Org/llama.cpp@luce-dflash —— 无需 PyTorch。optimizations/megakernel/ 是唯一需要 PyTorch 2.0+ 的组件(CUDAExtension 链接到 torch C++ 库)。功耗调节:sudo nvidia-smi -pl 220(RTX 3090 甜点值,其他显卡需重新扫描)。

server/

--recurse-submodules

Luce-Org/llama.cpp@luce-dflash

optimizations/megakernel/

sudo nvidia-smi -pl 220

测试框架快速入门

harness/ 目录包含 RTX 3090 客户端启动器和回归测试脚本,用于验证 Lucebox 服务器的兼容性。可在 Claude Code、Codex、OpenCode、Hermes、Pi、OpenClaw 或 Open WebUI 中运行 Lucebox,或检查服务器变更是否仍能与这些客户端正常配合。

harness/

客户端启动器 Claude Code run_claude_code.sh Codex run_codex.sh OpenCode run_opencode.sh Hermes run_hermes.sh Pi run_pi.sh OpenClaw run_openclaw.sh Open WebUI run_openwebui.sh

客户端启动器 Claude Code run_claude_code.sh Codex run_codex.sh OpenCode run_opencode.sh Hermes run_hermes.sh Pi run_pi.sh OpenClaw run_openclaw.sh Open WebUI run_openwebui.sh

run_claude_code.sh

run_codex.sh

run_opencode.sh

run_hermes.sh

run_pi.sh

run_openclaw.sh

run_openwebui.sh

所有启动器都会启动原生 C++ HTTP 服务器(dflash_server)。可通过环境变量覆盖默认配置:

dflash_server

DFLASH_SERVER_BIN=server/build/dflash_server \ DFLASH_TARGET=server/models/Qwen3.6-27B-Q4_K_M.gguf \ DFLASH_DRAFT=server/models/draft/dflash-draft-3.6-q4_k_m.gguf \ MAX_CTX=32768 BUDGET=22 VERIFY_MODE=ddtree \ harness/clients/run_codex.sh

对于无需草稿模型的目标(如 Gemma),仅设置 DFLASH_TARGET 或传递 DRAFT=none;测试框架不会将默认的 Qwen 草稿附加到自定义目标上。

DFLASH_TARGET

DRAFT=none

启动器脚本会在 .harness-work/ 目录下自动安装缺失的真实客户端 CLI。如需自行预装:

.harness-work/

python3 harness/client_test_runner.py install --clients codex,hermes,openwebui

如需获取针对运行中服务器的直接 TPS/TTFT 数据:

python3 harness/client_test_runner.py bench \ --url http://127.0.0.1:8000 \ --suite he,agent \ --n-sample 3

Docker 快速入门

GHCR 上的预构建镜像跟踪主分支。无需 CUDA 工具包或构建步骤。拉取镜像,挂载权重文件即可提供服务。在 :8000 端口提供 OpenAI 兼容 API。

main

GPU 镜像标签 NVIDIA(CUDA 12+)::cuda12 AMD(ROCm 6+)::rocm 先将 GGUF 模型目标文件放入 server/models/ 目录,然后访问 :8000/v1/chat/completions。完整教程请参阅 Docker 博客。

GPU 镜像标签 NVIDIA(CUDA 12+)::cuda12 AMD(ROCm 6+)::rocm

:cuda12

:rocm

先将 GGUF 模型目标文件放入 server/models/ 目录,然后访问 :8000/v1/chat/completions。完整教程请参阅 Docker 博客。

server/models/

:8000/v1/chat/completions

安装并运行:

1. 拉取适用于你 GPU 的镜像 docker pull ghcr.io/luce-org/lucebox-hub:cuda12 # NVIDIA docker pull ghcr.io/luce-org/lucebox-hub:rocm # AMD # 2. 将目标模型下载到 server/models/ 目录,将 DFlash 草稿模型下载到 # server/models/draft/ 目录(入口点只会自动发现该目录下的草稿模型; # 如果没有草稿模型,服务器运行速度会变慢,仅使用目标模型) hf download unsloth/Qwen3.6-27B-GGUF Qwen3.6-27B-Q4_K_M.gguf \ --local-dir server/models/ hf download Lucebox/Qwen3.6-27B-DFlash-GGUF dflash-draft-3.6-q4_k_m.gguf \ --local-dir server/models/draft/ # 3a. NVIDIA(CUDA 12+) docker run --rm --gpus all -p 8000:8080 \ -v "$PWD/server/models:/opt/lucebox-hub/server/models" \ ghcr.io/luce-org/lucebox-hub:cuda12 # 3b. AMD(ROCm 6+,Strix Halo / RX 7900) docker run --rm --device /dev/kfd --device /dev/dri \ --group-add video --group-add render --security-opt seccomp=unconfined \ -p 8000:8080 -v "$PWD/server/models:/opt/lucebox-hub/server/models" \ ghcr.io/luce-org/lucebox-hub:rocm

然后访问 :8000/v1/chat/completions(兼容 OpenAI 接口)。

:8000/v1/chat/completions

运行服务器

默认配置:Qwen 3.6-27B Q4_K_M 目标模型 + Lucebox Q4_K_M DFlash 草稿模型,运行于 RTX 3090。DDTree 预算=22,TQ3_0 KV 缓存,滑动 FA 窗口 2048。在 :8000 端口提供兼容 OpenAI 的 HTTP 服务。

构建(CUDA 12+,CMake 3.18+) git clone --recurse-submodules https://github.com/Luce-Org/lucebox-hub && cd lucebox-hub cmake -B server/build -S server -DCMAKE_BUILD_TYPE=Release cmake --build server/build --target dflash_server -j # 默认权重(约 18 GB) hf download unsloth/Qwen3.6-27B-GGUF Qwen3.6-27B-Q4_K_M.gguf --local-dir server/models/ hf download Lucebox/Qwen3.6-27B-DFlash-GGUF dflash-draft-3.6-q4_k_m.gguf --local-dir server/models/draft/ # 运行(TQ3_0 KV 自动启用;设为 0 可禁用) DFLASH27B_KV_TQ3=1 \ ./server/build/dflash_server server/models/Qwen3.6-27B-Q4_K_M.gguf \ --draft server/models/draft/dflash-draft-3.6-q4_k_m.gguf \ --ddtree --ddtree-budget 22 --fa-window 2048 --port 8000

服务端参数

核心

参数 默认值 作用 --draft — DFlash 草稿 GGUF,推测解码必需 --port N 8000 HTTP 端口 --host H 127.0.0.1 绑定地址 --max-ctx N 自动适配 KV 缓存大小;设置过大将拖慢预填充(FA 步幅会跨越未使用的 KV) --max-tokens N 模型卡片 生成上限 --model-name S filename OpenAI 模型字段 --chat-template-file 自动检测 覆盖 Jinja 模板

--draft

--port N

--host H

127.0.0.1

--max-ctx N

--max-tokens N

--model-name S

model

--chat-template-file

解码(DFlash + DDTree)

参数 默认值 作用 --ddtree 关闭(链式) 启用树验证 --ddtree-budget N 22 树大小。3090 上为 22(默认),5090 上为 40,GB10 上需重新扫描 --fa-window N 2048 滑动 FA 窗口;0 表示全注意力 --draft-residency {auto,persistent,request-scoped} auto 草稿权重何时从显存中驱逐。request-scoped 在每个请求的草稿工作完成后将其驻留/释放(在显存紧张的 GPU 上为目标模型腾出显存);persistent 使其在请求间保持驻留;auto 保留当前行为,同时遵循低显存 / --lazy-draft 提示。通过 /props.runtime.draft_residency 报告。 --lazy-draft 关闭 --draft-residency=request-scoped 的旧别名(将草稿加载推迟到第一个请求到来时,之后释放)

--ddtree

--ddtree-budget N

--fa-window N

--draft-residency {auto,persistent,request-scoped}

auto

request-scoped

persistent

auto

--lazy-draft

/props.runtime.draft_residency

--lazy-draft

--draft-residency=request-scoped

预填充压缩(PFlash)

Flag / env Default Effect --prefill-compression {off,auto,always} off 何时对提示词进行评分与压缩 --prefill-threshold N 32000 在 auto 模式下,触发单次提示词压缩的提示词 token 数量阈值。也是 FlowKV 在多轮请求中压缩老化消息时,每条消息必须超过的最小值。如果你希望 FlowKV 对更短的历史记录生效,可以降低此值(例如 1024)。--prefill-keep-ratio F 0.05 保留的源 token 比例(128K 时为 0.02,32K 时为 0.10)--prefill-curve T:R [T:R ...] off(固定保留比例)分段保留比例曲线,在(token 数量,比例)断点之间线性插值,例如 10000:0.5 40000:0.2 100000:0.1(10K 时 2 倍压缩,40K 时 5 倍,100K+ 时 10 倍)。覆盖 --prefill-keep-ratio;按会话的 bandit 覆盖仍然优先。--prefill-drafter 如果使用 Drafter 权重(Qwen3-0.6B BF16 GGUF)则必填 --prefill-skip-park off 在请求之间保持 Drafter 驻留(更多显存,更快)PFLASH_FREEZE_HOT_WINDOW=N 2 FlowKV:保留多少条最近的消息原样不变。比此窗口更早的所有内容(但在系统提示词之后)会被压缩一次并缓存。值越大,保留的未压缩近期上下文越多。DFLASH_FP_USE_BSA=1 0 通过 BSA(sm_80+)调度稀疏 FA;实现标题中 10.4 倍加速所需 DFLASH_FP_ALPHA=0.85 0.12 块选择阈值;越高 = 越严格 = 更少的 K 块 DFLASH_FP_PROFILE=1 0 各阶段计时日志

--prefill-compression {off,auto,always}

off

--prefill-threshold N

auto

--prefill-keep-ratio F

0.05

--prefill-curve T:R [T:R ...]

(token 数量,比例)

10000:0.5 40000:0.2 100000:0.1

--prefill-keep-ratio

--prefill-drafter

--prefill-skip-park

PFLASH_FREEZE_HOT_WINDOW=N

DFLASH_FP_USE_BSA=1

DFLASH_FP_ALPHA=0.85

0.12

DFLASH_FP_PROFILE=1

启用压缩时,请求路径会自动从三种模式中选择一种,因此它们不会叠加:第一轮对话原样发送(系统提示词作为稳定的缓存锚点),多轮连续对话使用 FlowKV(仅压缩较早的历史内容,最近几轮对话原样保留,因此来自 `--prefix-cache-slots` 的磁盘前缀缓存能持续命中),而单个超长提示词且无先前轮次时,则对整个提示词使用 PFlash。关闭 `--prefill-compression` 后,请求路径与未启用压缩的构建版本完全相同。

`--prefix-cache-slots`

`--prefill-compression off`

KV 缓存

标志 / 环境变量 默认值 效果 `--cache-type-k` / `--cache-type-v` 环境变量驱动 按端侧覆盖量化类型:`f16,bf16,q4_0,q4_1,q5_0,q5_1,q8_0,tq3_0` `DFLASH27B_KV_TQ3=1`(默认) 预设 TQ3_0 K+V(3.5 bpv,24 GB 显存可容纳 256K) `DFLASH27B_KV_Q4=1` 关闭 Q4_0 K+V(4.5 bpv,旧版,约 128K 上限) `--prefix-cache-slots N` — 实时前缀缓存槽数量 `--kv-cache-dir` — 将前缀缓存持久化到磁盘 `--kv-cache-budget N` — 磁盘缓存大小上限

`--cache-type-k`

`--cache-type-v`

`f16,bf16,q4_0,q4_1,q5_0,q5_1,q8_0,tq3_0`

`DFLASH27B_KV_TQ3=1`

`DFLASH27B_KV_Q4=1`

`--prefix-cache-slots N`

`--kv-cache-dir`

`--kv-cache-budget N`

有界 KV 驻留(KVFlash)

通过一个固定的 GPU 槽位池对注意力 KV 缓存进行分页管理;冷数据(64 token 块)驻留在主机 RAM 中,保持比特精确且可召回。解码速度不再依赖于上下文长度,且在任何上下文长度下,驻留 KV 的大小都保持在池大小范围内。默认关闭;适用于所有模型家族。草稿模型评分驻留策略是所有模型家族的默认策略:服务器会找到模型旁边的 Qwen3-0.6B 草稿模型(或通过 `--prefill-drafter` 指定),并将其延迟加载为相关性评分器,用于决定哪些块应保持驻留——对于非 qwen 目标模型(如 laguna、gemma4),会通过重新对上下文文本进行分词以桥接分词器差异,供草稿模型使用。当没有草稿模型时,LRU 作为回退策略,或通过 `--kvflash-policy lru` 显式选择。各模型的具体数值请参见 Luce KVFlash →。

`--prefill-drafter`

`--kvflash-policy lru`

标志 / 环境变量 默认值 作用 --kvflash <tokens|auto> off 驻留池大小。auto 会根据 GPU 自动调整:在模型权重和预留空间之后,取剩余显存的一半,按模型的 KV 密度计算,上限设定在解码速度接近平坦最优值的位置(默认 16384,可通过 DFLASH_KVFLASH_MAX_POOL 覆盖),同时不超过 --max-ctx。显式指定的值会四舍五入到 256,限制在 --max-ctx 以内,并受保护最小值约束,确保驱逐时总有可淘汰对象。--kvflash-policy {drafter,lru} drafter 驻留策略。lru 会退出 drafter 探测/加载机制(仅基于最近使用进行分页,不额外占用显存)。--kvflash-tau N 64 重新选择间隔下限(仅 drafter 策略有效);实际间隔会随历史记录增长,以限制重新评分开销。DFLASH_KVFLASH=N off --kvflash 的环境变量等效项。DFLASH_KVFLASH_TAU=N 64 --kvflash-tau 的环境变量等效项。

--kvflash <tokens|auto>

auto

DFLASH_KVFLASH_MAX_POOL

--max-ctx

--max-ctx

--kvflash-policy {drafter,lru}

drafter

lru

--kvflash-tau N

DFLASH_KVFLASH=N

--kvflash

DFLASH_KVFLASH_TAU=N

--kvflash-tau

思考预算

标志 默认值 作用 --think-max-tokens N 模型卡片 内部最大 token 数…… --default-max-tokens N 模型卡片 默认响应上限 --hard-limit-reply-budget N 4096 硬性上限;接近限制时注入结束标记 --reasoning-effort-{low,medium,high,x-high,max} N 模型卡片 OpenAI 风格的推理努力等级

--think-max-tokens N

--default-max-tokens N

--hard-limit-reply-budget N

--reasoning-effort-{low,medium,high,x-high,max} N

多 GPU / IPC

标志 / 环境变量 默认值 作用 --target-device cuda:0 目标后端(例如 cuda:0、hip:0) --draft-device 与目标相同 草稿后端;混合后端需要 --draft-ipc-bin --target-gpu N 0 目标 GPU 索引 --draft-gpu N 与目标相同 草稿 GPU 索引;将草稿模型卸载到第二块 GPU --target-devices / --target-layer-split 单 GPU 在多个 GPU 之间按层拆分目标 --draft-ipc-bin — 进程外草稿二进制文件(混合 CUDA/HIP) --peer-access off 启用目标 GPU 之间的 P2P 通信 --chunk N 后端默认值 预填充批次大小 --no-cors CORS 开启 禁用 CORS 头 DFLASH_TARGET_GPU=N 0 --target-gpu 的环境变量等效项 DFLASH_DRAFT_GPU=N 与目标相同 --draft-gpu 的环境变量等效项

--target-device

cuda:0

cuda:0

hip:0

--draft-device

--draft-ipc-bin

--target-gpu N

--draft-gpu N

--target-devices

`--target-layer-split`

`--draft-ipc-bin`

`--peer-access`

`--chunk N`

`--no-cors`

`DFLASH_TARGET_GPU=N`

`--target-gpu`

`DFLASH_DRAFT_GPU=N`

来源:Hacker News 热门(buzzing.cc 中文翻译) · github.com