之前写了在 Fedora 44 上编译支持 CUDA 的 llama.cpp 的过程,这次记录一下用编译好的二进制运行 Qwen 3.5 9B 模型的完整经历,包括踩坑和性能测试结果。

硬件与模型

项目 配置
CPU AMD Ryzen 7 7840HS
GPU NVIDIA RTX 4060 Max-Q 8GB
内存 32GB DDR5
系统 Fedora 44 (Linux 7.0.9)
模型 Qwopus3.5-9B-coder-Exp-IQ4_XS.gguf (5.2GB)
视觉投影器 mmproj.gguf (921MB)

模型是 Qwen 3.5 系列的 9B 参数编码变体,IQ4_XS 量化后体积约 5.2GB。Qwen 3.5 是混合架构,同时使用 Transformer 注意力机制和 Mamba 状态空间模型(SSM),其中只有部分层(第 3、7、11、15、19、23、27、31 层)使用完整注意力,其余为 Mamba 层。这种设计使得 KV cache 占用比纯 Transformer 模型小得多。

编译产物在 /home/insidentally/Documents/shell/llama-cpp/bin/,模型文件在 /home/insidentally/Documents/shell/llama-cpp/model/

启动服务

最基础的启动命令:

1
2
3
4
5
6
7
8
9
10
cd /home/insidentally/Documents/shell/llama-cpp/bin
export LD_LIBRARY_PATH="$(pwd):/usr/local/lib/ollama/cuda_v13:$LD_LIBRARY_PATH"

./llama-server \
-m /home/insidentally/Documents/shell/llama-cpp/model/Qwopus3.5-9B-coder-Exp-IQ4_XS.gguf \
-ngl 99 \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
--flash-attn on

踩坑 1:CUDA runtime 找不到

编译好的 llama-server 依赖 libcudart.so.13,但系统没有独立安装 CUDA Toolkit。本机的 CUDA 库来自 Ollama 自带的版本,位于 /usr/local/lib/ollama/cuda_v13/。需要在 LD_LIBRARY_PATH 中显式加入这个路径。

踩坑 2:--flash-attn 参数格式变了

早版本 llama.cpp 中 --flash-attn 是一个布尔开关,不带参数。当前版本(b9161)要求显式指定 onoffauto

1
2
3
4
5
# 旧写法,会报错
--flash-attn

# 新写法
--flash-attn on

上下文长度的权衡

模型原生支持的上下文长度为 262144(262K),但 8GB 显存是硬约束。我测试了几种配置:

配置 上下文 视觉模型 GPU 占用 能否运行
A 4096 加载 6534 MiB 正常
B 65536 (64K) 不加载 7336 MiB 正常
C 65536 (64K) 加载 - OOM 崩溃

64K 上下文加上 mmproj 视觉模型会超出显存。最终选择了方案 B:64K 上下文,不加载视觉模型。

对于混合架构的 Qwen 3.5 来说,Mamba 层的内存占用是 O(1) 的(固定大小状态),只有注意力层的 KV cache 随上下文长度线性增长。这使得 64K 上下文在 8GB 显存上成为可能。纯 Transformer 的 9B 模型在这个显存下大概只能跑到 8K-16K。

性能测试

用 OpenAI 兼容 API 进行测试:

1
2
3
4
5
6
7
8
curl -s http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.5-9b",
"messages": [{"role": "user", "content": "你好,请用中文简单介绍一下你自己,50字以内。"}],
"max_tokens": 500,
"temperature": 0.7
}'

结果:

指标 数值
Prompt 处理速度 433.6 tokens/s
Token 生成速度 46.3 tokens/s
单 token 延迟 21.6 ms
Prompt 处理延迟 2.3 ms/token

46 tokens/s 的生成速度在笔记本 GPU 上算是不错的表现,日常对话基本感觉不到延迟。

注意事项

Qwen 3.5 默认开启思考模式(thinking mode),模型会先在 reasoning_content 字段输出推理过程,再在 content 字段输出正式回复。如果 max_tokens 设得太小,可能所有 token 都花在思考上,导致实际回复为空。建议至少设 300-500。

服务管理

启动后可以通过以下方式使用:

  • 聊天页面:http://localhost:8080(默认自带 WebUI,如果你 llama.cpp 没有编译 WebUI 则无法访问)
  • OpenAI 兼容 API:http://localhost:8080/v1/chat/completions
  • 健康检查:http://localhost:8080/health

后台运行可以用 nohup 或 systemd user service。

总结

在 8GB 显存的笔记本上运行 9B 参数的混合架构模型,体验比预期好。IQ4_XS 量化在体积和质量之间取得了不错的平衡,混合架构的内存效率让 64K 上下文成为可能。主要限制是视觉模型和大上下文不能同时启用,以及量化级别不宜再低(否则质量下降明显)。

如果需要视觉能力,可以切换回 4K 上下文 + mmproj 的配置。两种方案各有取舍,根据实际需求选择即可。