RTX 3060 12GB 跑大模型:TurboQuant 离线编译与全模型调优实战

📋 前言

手里有一台闲置的服务器,配置如下:

硬件 型号
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
2
3
4
5
6
# CUDA 编译器(太旧)
nvcc --version
# CUDA compilation tools, release 12.0, V12.0.140

# 编译工具
cmake 3.28.3, gcc 13.3.0

第一个坑:CUDA 12.0 太旧

直接编译 TurboQuant 会报两种错:

atomicmilkshake fork(带 TriAttention):

1
2
/usr/bin/ld: undefined reference to `turbo_innerq_mark_tensor_updated'
collect2: error: ld returned 1 exit status

TheTom fork(纯 TurboQuant):

1
2
Segmentmentation fault (core dumped)
Illegal instruction (core dumped)

都是因为 CUDA 12.0 的 nvcc 编译器不支持 TurboQuant 的 CUDA 代码,需要至少 CUDA 12.4+


📦 离线升级 CUDA Toolkit

服务器无外网,不能 apt install。解决方案:只下载 nvcc 编译器相关的 deb 包(约 50MB),不需要完整 CUDA Toolkit(4GB+)。

下载依赖包

在本机通过 SOCKS5 代理下载:

1
2
3
4
5
6
7
8
9
10
11
12
13
# NVIDIA 下载经常断,需要断点续传
BASE="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64"

# 4个核心包(30MB + 17MB + 77KB + 1MB)
cuda-nvcc-12-6_12.6.77-1_amd64.deb
cuda-nvvm-12-6_12.6.77-1_amd64.deb
cuda-crt-12-6_12.6.77-1_amd64.deb
cuda-cudart-12-6_12.6.77-1_amd64.deb

# 加上3个依赖包
cuda-cudart-12-6_12.6.77-1_amd64.deb
cuda-cccl-12-6_12.6.77-1_amd64.deb
cuda-driver-dev-12-6_12.6.77-1_amd64.deb

💡 踩坑:版本号不是直觉的 .85 而是 .77,需要先列出仓库目录找到正确版本。cuda-cudart-dev 依赖 cuda-cudartcuda-ccclcuda-driver-dev,需要递归下载。

传到服务器安装

1
2
3
4
5
6
7
8
9
# 上传所有 deb
scp *.deb [email protected]:/tmp/

# 安装(会报一些 dpkg warning,但 nvcc 可用)
sudo dpkg -i cuda-*.deb

# 验证
/usr/local/cuda-12.6/bin/nvcc --version
# CUDA compilation tools, release 12.6, V12.6.77 ✅

🔨 编译 TurboQuant

在本机克隆源码

1
2
3
4
5
6
# TheTom 的版本(更稳定)
git clone https://github.com/TheTom/llama-cpp-turboquant.git /tmp/turboquant-thetom

# 打包传到服务器
tar czf turboquant-src.tar.gz turboquant-thetom/
scp turboquant-src.tar.gz [email protected]:/tmp/

服务器上编译

1
2
3
4
5
6
7
8
9
10
11
12
cd /tmp/turboquant-thetom
mkdir build && cd build

# 关键:指定新版的 nvcc
cmake .. \
-DGGML_CUDA=ON \
-DCUDA_ARCHITECTURES="86" \
-DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.6/bin/nvcc \
-DGGML_CCACHE=OFF

# 6核编译(约 10 分钟)
make -j6 llama-server

编译成功!生成 13MB 的二进制:

1
2
ls -lh bin/llama-server
# -rwxrwxr-x 1 chenpeng chenpeng 13M llama-server

验证 TurboQuant 参数

1
2
3
./bin/llama-server --help | grep -i turbo
# --cache-type-k turbo2, turbo3, turbo4
# --cache-type-v turbo2, turbo3, turbo4

🚀 参数调优策略

核心发现:--fit on 是游戏规则改变者

传统方式手动指定 --n-gpu-layers,需要反复试错。TurboQuant 版本支持 --fit on自动计算最优 GPU 层数以适配显存。

对于 MoE 模型(Qwen3.5-35B、Gemma-4 等),配合 --n-cpu-moe 99 效果惊人:

1
2
3
4
5
6
7
8
9
10
# 旧配置(手动调参)
--n-gpu-layers 16 --n-cpu-moe 6 --parallel 2
# 速度: 11.6 t/s, 显存: 7.9GB

# 新配置(fit on)
--fit on --n-cpu-moe 99 --parallel 1 --cont-batching \
--batch-size 8192 --ubatch-size 2048 --kv-unified \
--repack --op-offload --warmup
# 速度: 22 t/s, 显存: 4.2GB
# 🚀 速度翻倍!显存降47%!

为什么这么快?

--n-cpu-moe 99所有 MoE 专家网络放到 CPU,GPU 只做注意力计算。虽然 CPU 推理专家比较慢,但:

  1. 显存大幅释放(7.9GB → 4.2GB)
  2. GPU 专注做擅长的矩阵运算
  3. --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
2
3
4
5
6
7
# 默认用 TurboQuant 版本
./switch-model.sh 9b # Qwen3.5-9B
./switch-model.sh 35b # Qwen3.5-35B-A3B
./switch-model.sh glm # GLM-4.7-Flash

# 用 -o 切回原版
./switch-model.sh -o 9b

系统监控

装了 bottom(Rust 写的 btop 替代品):

1
~/btm  # 启动,按 q 退出

💀 踩坑总结

1. CUDA 版本不兼容

  • 现象nvcc Segmentation faultundefined 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
2
cd /home/chenpeng
./switch-model.sh 9b # TurboQuant + 最优参数

🔗 参考资料