RTX 3060 12GB 跑大模型:TurboQuant 离线编译与全模型调优实战
RTX 3060 12GB 跑大模型:TurboQuant 离线编译与全模型调优实战
[email protected]📋 前言
手里有一台闲置的服务器,配置如下:
| 硬件 | 型号 |
|---|---|
| CPU | Intel i5-9400 @ 2.90GHz(6核6线程,无超线程) |
| GPU | NVIDIA GeForce RTX 3060 12GB |
| 内存 | 32GB DDR4 |
| 系统 | Ubuntu 24.04 LTS |
| 网络 | ❌ 完全无法访问外网 |
核心挑战:服务器在内网,没有任何外网访问能力,所有安装包都需要在本机(Mac mini)下载后通过 scp 传到服务器。
本文记录了从升级 CUDA 到编译 TurboQuant、再到 8 个大模型全面调优的完整过程,包含踩坑记录和最终性能数据。
🎯 什么是 TurboQuant?
TurboQuant 是 llama.cpp 的一个 fork(由 ggml-org 官方开发者 TheTom 维护),核心创新是 KV Cache 量化。
传统 KV Cache 每个 token 的 Key 和 Value 存储为 FP16(16 bit),占用大量显存。TurboQuant 将其量化到:
- turbo2:约 2 bit,极省显存
- turbo3:约 3 bit,平衡方案
- turbo4:约 4 bit,更高质量
好处:
- 显存占用大幅降低 → 可以跑更大的模型或更长的上下文
- MoE 模型速度翻倍 → 通过
--n-cpu-moe 99把专家全放 CPU,GPU 专注注意力计算 - 输出更长 → KV Cache 不再是瓶颈,模型可以输出更多 token
🔧 环境准备
服务器已有环境
1 | # CUDA 编译器(太旧) |
第一个坑:CUDA 12.0 太旧
直接编译 TurboQuant 会报两种错:
atomicmilkshake fork(带 TriAttention):
1 | /usr/bin/ld: undefined reference to `turbo_innerq_mark_tensor_updated' |
TheTom fork(纯 TurboQuant):
1 | Segmentmentation fault (core dumped) |
都是因为 CUDA 12.0 的 nvcc 编译器不支持 TurboQuant 的 CUDA 代码,需要至少 CUDA 12.4+。
📦 离线升级 CUDA Toolkit
服务器无外网,不能 apt install。解决方案:只下载 nvcc 编译器相关的 deb 包(约 50MB),不需要完整 CUDA Toolkit(4GB+)。
下载依赖包
在本机通过 SOCKS5 代理下载:
1 | # NVIDIA 下载经常断,需要断点续传 |
💡 踩坑:版本号不是直觉的
.85而是.77,需要先列出仓库目录找到正确版本。cuda-cudart-dev依赖cuda-cudart、cuda-cccl、cuda-driver-dev,需要递归下载。
传到服务器安装
1 | # 上传所有 deb |
🔨 编译 TurboQuant
在本机克隆源码
1 | # TheTom 的版本(更稳定) |
服务器上编译
1 | cd /tmp/turboquant-thetom |
编译成功!生成 13MB 的二进制:
1 | ls -lh bin/llama-server |
验证 TurboQuant 参数
1 | ./bin/llama-server --help | grep -i turbo |
🚀 参数调优策略
核心发现:--fit on 是游戏规则改变者
传统方式手动指定 --n-gpu-layers,需要反复试错。TurboQuant 版本支持 --fit on,自动计算最优 GPU 层数以适配显存。
对于 MoE 模型(Qwen3.5-35B、Gemma-4 等),配合 --n-cpu-moe 99 效果惊人:
1 | # 旧配置(手动调参) |
为什么这么快?
--n-cpu-moe 99 把所有 MoE 专家网络放到 CPU,GPU 只做注意力计算。虽然 CPU 推理专家比较慢,但:
- 显存大幅释放(7.9GB → 4.2GB)
- GPU 专注做擅长的矩阵运算
--batch-size 8192 --ubatch-size 2048让 GPU 充分利用
完整参数说明
| 参数 | 作用 | 建议值 |
|---|---|---|
--fit on |
自动计算 GPU 层数 | ✅ 必开 |
--fit-ctx |
fit 保留的最小上下文 | 模型上下文大小 |
--flash-attn on |
Flash Attention | ✅ 必开 |
--kv-unified |
统一 KV Cache | ✅ 推荐 |
--n-cpu-moe 99 |
MoE 专家全放 CPU | ✅ MoE 模型必开 |
--parallel 1 |
单 slot | ✅ 节省显存 |
--cont-batching |
连续批处理 | ✅ 推荐 |
--batch-size |
批大小 | 8192 |
--ubatch-size |
微批大小 | 2048 |
--repack |
权重重打包 | ✅ 推荐 |
--op-offload |
算子卸载 | ✅ 推荐 |
--warmup |
预热 | ✅ 推荐 |
--cache-type-k |
K 量化级别 | turbo2 或 turbo4 |
--cache-type-v |
V 量化级别 | turbo2 或 turbo4 |
📊 全模型调优结果
测试环境:RTX 3060 12GB + i5-9400 + 32GB RAM + TurboQuant (TheTom fork)
测试任务:1000 tokens 代码生成
结果汇总
| 模型 | 参数量 | 模型大小 | 最优速度 | 显存占用 | 推荐 KV | 适用场景 |
|---|---|---|---|---|---|---|
| Qwen3.5-4B | 4B | 2.6GB | ⚡ 76.9 t/s | 4.9GB | turbo2 | 快速问答 |
| Qwen3.5-9B | 9B | 5.3GB | ⚡ 47.6 t/s | 7.2GB | turbo2 | 日常编码 |
| Qwen3-14B | 14B | 8.4GB | 32.3 t/s | 10.0GB | turbo2 | 复杂推理 |
| Qwen3.5-27B | 27B | 16GB | ❌ 启动失败 | - | - | TT版不支持 |
| Qwen3.5-35B-A3B | 35B MoE | 16GB | 22.2 t/s | 4.2GB | turbo4 | 重度任务 |
| Qwen3.6-35B-A3B | 35B MoE | 20GB | 20.0 t/s | 3.8GB | turbo4 | 最强能力 |
| Gemma-4-26B-A4B | 26B MoE | 16GB | 15.4 t/s | 4.0GB | turbo2 | MoE 备选 |
| GLM-4.7-Flash | 未知 | 18GB | 24.4 t/s | 10.9GB | turbo2 | 中文能力 |
关键数据对比
MoE 模型优化前后(Qwen3.5-35B-A3B)
| 对比项 | 旧配置 | TurboQuant 新配置 | 提升 |
|---|---|---|---|
| 速度 | 11.6 t/s | 22.2 t/s | +91% 🚀 |
| 显存 | 7.9GB | 4.2GB | -47% 💾 |
| GPU 层数 | 16(手动) | 自动(fit on) | 更智能 |
| CPU MoE 层 | 6 | 99(全部) | 更激进 |
turbo2 vs turbo4 对比
大部分模型 turbo2 更快,但 MoE 模型例外:
- Qwen3.5-35B-A3B:turbo2 = 21.3 t/s,turbo4 = 22.2 t/s ✅
- Qwen3.6-35B-A3B:turbo2 = 16.4 t/s,turbo4 = 20.0 t/s(快 22%)✅
- 非 MoE 模型:turbo2 通常更快或持平
显存效率
最惊人的是 MoE 模型的显存效率:
- Qwen3.6-35B-A3B(20GB 模型)只用了 3.8GB 显存!
- 这意味着 12GB 显卡跑 35B MoE 完全无压力
🛠️ 实用工具
模型切换脚本
写了一个一键切换脚本 switch-model.sh:
1 | # 默认用 TurboQuant 版本 |
系统监控
装了 bottom(Rust 写的 btop 替代品):
1 | ~/btm # 启动,按 q 退出 |
💀 踩坑总结
1. CUDA 版本不兼容
- 现象:
nvcc Segmentation fault或undefined reference to turbo_innerq_* - 原因:CUDA 12.0 太旧,TurboQuant 需要 12.4+
- 解决:离线安装 CUDA 12.6 nvcc(只装编译器,不动驱动)
2. NVIDIA 下载不稳定
- 现象:4GB 的 CUDA Toolkit run 文件频繁断开
- 解决:只下载单独的 deb 包(~50MB),支持断点续传
3. dpkg 依赖地狱
- 现象:
cuda-nvcc依赖cuda-cudart-dev依赖cuda-cudart依赖cuda-toolkit-config-common… - 解决:递归下载所有依赖 deb,版本号需要查仓库目录确认
4. 服务器终端不支持 Unicode
- 现象:btop 的进度条
█░─显示为x/? - 解决:改用 bottom(纯 ASCII 也能正常显示)
5. Qwen3.5-27B 启动失败
- 现象:
failed to load model - 原因:TheTom fork 可能不支持该模型架构,且 16GB 模型 + fit on 可能需要更多内存
- 状态:未解决,27B 需要等官方主线支持
6. SSH 长连接超时
- 现象:编译或等待时 SSH 连接断开
- 解决:用
nohup+ 后台运行,分步轮询检查结果
📈 最终推荐
日常使用推荐:
| 需求 | 推荐 | 速度 |
|---|---|---|
| 快速问答 | Qwen3.5-4B | 77 t/s |
| 编码开发 | Qwen3.5-9B | 48 t/s |
| 复杂推理 | Qwen3-14B | 32 t/s |
| 重度任务 | Qwen3.5-35B-A3B | 22 t/s |
| 最强能力 | Qwen3.6-35B-A3B | 20 t/s |
| 中文场景 | GLM-4.7-Flash | 24 t/s |
一键启动命令:
1 | cd /home/chenpeng |
🔗 参考资料
- TheTom/llama-cpp-turboquant - TurboQuant CUDA 12.6 fork
- atomicmilkshake/llama-cpp-turboquant - TurboQuant + TriAttention
- llama.cpp TurboQuant Discussion #20969 - 社区讨论
- r/LocalLLaMA - 35B-A3B on 12GB - 12GB 显卡调参方案
- bottom - 系统监控工具





