4060跑35B方案

在 **RTX 4060 8GB 显存 + 大内存**的组合下,用 llama.cpp 跑 Qwen 35B-A3B 并实现 100K-256K 上下文,核心路径是明确的:**用 MoE 专家卸载(`--n-cpu-moe`)把大部分权重交给 64GB 内存,GPU 只保留注意力层和当前激活的专家,再配合 KV Cache 量化把长上下文的显存开销压到最低。**

### 🎯 核心策略:MoE 架构是长上下文的“入场券”

35B-A3B 是 MoE 模型,总参数约 35B,但每个 token **只激活约 3B 参数**。这意味着 llama.cpp 不需要把全部 35B 权重塞进 8GB 显存——它可以把**非活跃的专家层留在 64GB 系统内存**,GPU 只负责注意力计算和当前被路由到的少量专家。这是 8GB 卡能跑 35B 级模型的根本原因。

显存占用对上下文的敏感度也因此远低于 Dense 模型。实测数据显示,35B MoE 在 Q4 量化下:**128K 上下文时显存约 22GB,256K 时约 25GB**——这里的数字是“如果全部装入显存”的需求;在 8GB 卡上,实际是**部分层驻留 GPU + 其余在内存**,GPU 侧占用可以控制在 7-8GB 以内。

### ⚙️ 最佳实践参数配置(INI 预设)

以下配置整合了社区在 4060 8G 上的实测经验,以 llama.cpp 的 INI 预设格式呈现,可直接用于 `--models-preset`:

```ini
version = 1

[*]
parallel = 1
n-gpu-layers = 999          # 注意力层尽量全上 GPU,MoE 专家由 n-cpu-moe 控制
flash-attn = on             # 长上下文必开,显著降低注意力计算的显存和延迟
cache-type-k = q8_0         # KV Cache 量化,8G 卡跑长上下文的必需项
cache-type-v = q8_0
threads = 8                 # 7840U 的物理核心数
threads-batch = 8
batch-size = 1024
ubatch-size = 512
jinja = true                # Hermes 工具调用必需
reasoning = off             # Agent 场景关闭推理链,减少无谓 token
no-mmap = true              # 配合 n-cpu-moe,避免 mmap 带来的内存管理开销
load-on-startup = true
stop-timeout = 10

[qwen35-a3b-longctx]
model = /models/Qwen3.5-35B-A3B-Q4_K_M.gguf
ctx-size = 131072           # 128K 起点;256K 需进一步压缩 KV 或降低部分层
n-cpu-moe = 35              # 关键:将约 35 层专家卸载到 CPU 内存
```

**关键参数拆解**:

- **`n-gpu-layers = 999` + `n-cpu-moe = 35`**:社区在 4060 上跑 35B-A3B 时,常见组合是 `--n-gpu-layers 430 --n-cpu-moe 35` 来冲击 **190K 上下文和 51 tok/s** 的速度。`n-cpu-moe` 的具体数值需根据你的量化版本和显存余量微调,原则是**让 GPU 显存占用稳定在 7.2–7.6GB 之间**,留出少量余量给 CUDA 上下文。
- **`cache-type-k/v = q8_0`**:KV Cache 量化是 8GB 卡跑长上下文的**必选项**。Q8_0 量化对精度的损失在可接受范围内,却能大幅降低长上下文下的显存占用。如果仍显不足,可以降到 `q4_0`,但长文本推理的精度风险会上升。
- **`flash-attn = on`**:长上下文场景下显著降低注意力计算的内存访问量,对 prefill 和 decode 都有帮助。
- **`threads = 8`**:7840U 是 8 核 16 线程,推理线程对齐物理核心数,避免 SMT 争抢。

### 🚀 进阶技术:用 MTP 和 TurboQuant 把速度拉起来

如果标准 llama.cpp 下的速度不够理想,有两个社区验证过的“加速器”值得考虑:

**1. MTP(多 Token 预测)**:如果选用带有 MTP 头的 Qwen3.6-35B-A3B-APEX-MTP 量化版,可以在 INI 中启用自投机解码,显著提升 decode 速度:

```ini
spec-type = draft-mtp
spec-draft-n-max = 3
cache-type-k-draft = q8_0
cache-type-v-draft = q8_0
```

社区实测在 4060 台式机(64GB 内存)上,**生成速度可达 35–38 tok/s**,代码任务可达 **45–50 tok/s**。代价是 MTP 头本身占用少量额外显存,需要稍微调低 `n-cpu-moe` 或上下文长度来平衡。

**2. TurboQuant fork**:有用户使用 **TurboQuant 优化过的 llama.cpp 分支**,在 4060 8GB + 32GB DDR5 上跑到 **190K 上下文、37–43 tok/s,调参后可达 51 tok/s**。TurboQuant 专门优化了 KV Cache 的量化策略(“turbo4”模式),在精度和显存之间找到了比标准 `q8_0` 更高效的平衡点。如果你愿意接受 fork 的维护成本,这是目前 8GB 卡冲击 256K 上下文最激进的路径。

### 📊 性能预期(务实区间)

| 配置 | 上下文 | 预期速度 | 说明 |
| :--- | :--- | :--- | :--- |
| 标准 llama.cpp,Q4_K_M,`n-cpu-moe` | 128K | **~8–15 tok/s** | 最保守的基线,依赖 CPU 计算卸载的专家层 |
| 标准 llama.cpp + MTP(APEX-MTP 量化) | 64K–128K | **~35–40 tok/s** | MTP 投机解码大幅提升 decode,台式机 PCIe 直连优势明显 |
| TurboQuant fork,Q5 量化 | **190K–256K** | **~37–51 tok/s** | 需要特定 fork,对内存带宽敏感(DDR5/LPDDR5X 有利) |

**关键提醒**:**台式机 PCIe 内置显卡明显优于 USB4 外接显卡**,在长上下文 prefill 阶段差距可达 3-4 倍。如果你的 4060 是通过 Oculink/外接坞连接的,长上下文的 prefill 速度会明显低于原生 PCIe 插槽,需要对此有预期。

### 💎 给你的落地建议

1. **先跑通基线**:用标准 `server-cuda` 镜像 + 上面的 INI(`ctx-size = 131072`,`n-cpu-moe = 35`,KV q8_0),确认 Hermes 能正常调用、工具调用不中断。这是你的“功能基线”。
2. **如果速度不够,上 MTP**:切换到 APEX-MTP 量化版,在 INI 里加 `spec-type = draft-mtp`,预期 decode 速度从个位数/十几 tok/s 跃升到 **35+ tok/s**。这是性价比最高的加速手段。
3. **如果确实需要 200K+ 上下文**:再考虑 TurboQuant fork,但需要接受 fork 的维护成本和潜在的精度差异。你的 **64GB LPDDR5X** 内存带宽对这条路径是利好,TurboQuant 对高带宽内存的收益更明显。
4. **监控显存**:用 `nvidia-smi dmon` 或 `docker stats` 确认推理峰值时 GPU 显存不超过 **7.6GB**。如果溢出,优先**降低 `ctx-size`** 或**提高 `n-cpu-moe`**(多卸载几层专家),而不是盲目降量化——Q4_K_M 在这个规模上已经是质量和体积的甜点。