MoXing 助力垃圾佬用百元超廉价显卡本地运行omnicoder-2-9b模型结果也只有十几个tokens/s

前情提要:

MoXing:低预算场景用RX580显卡轻松运行Qwen3.5-9b-q4_k_m模型

Void + MoXing:低成本方案用RX580显卡本地运行qwen3.5:9B模型,打造类Cursor体验

MoXing新升级:直接夺舍 Ollama ,部分模型提速 50%

MoXing 和 Ollama 对比:从omnicoder-9b到更多模型

MoXing升级:同时运行多个模型实例

MoXing 速度最高达到 Ollama的 201% ,同模型同硬件的实测对比OmniCoder-2-9B 的 Q4_K_M 量化模型

我也是个「垃圾佬」,手上有好几个「上古玩物」:一块 Tesla P4(8GB 显存的老计算卡),一张 RX 580 2048SP(16GB 显存的本土特供矿卡),还有一颗 Xeon E5-2699 v3(18 核的老至强),如今试试跑本地大模型玩一下。

都有十年以上了。P4 是 2016 年的东西,功耗才 75W,连外接供电都不要。RX 580 也是差不多年代的,不过我这个是魔改的 16GB 显存的版本,显存比标准版翻了一倍。CPU 就更老了,Haswell-EP 架构,2014 年的产品。

但就是这些老家伙,搭配上 MoXing 这个 llama.cpp 的 Python 封装,跑起 9B 的模型来居然还能对付凑合了。

pip install moxing -u    # 更新安装
moxing download-binaries # 下载后端
moxing update-binaries   # 更新后端
moxing devices           # 查看设备
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
 ID      Name                              Backend   Memory      Free        Vendor   
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
 gpu0    Tesla P4                          CUDA      8.0GB       7.8GB       nvidia   
 gpu1    AMD Radeon RX 580 2048SP          VULKAN    15.8GB      15.8GB      amd      
 cpu     CPU                               CPU       63.9GB      53.4GB      cpu      
└────────┴──────────────────────────────────┴──────────┴────────────┴────────────┴──────────┘

昨晚上肚子疼,于是花了几个小时,用 OmniCoder-9B 模型(Q4_K_M 和 Q5_K_M 两种量化),把这三块东西 + 三种后端组合(CUDA、Vulkan、CPU)挨个测了一遍。每条跑三次取平均,一共八组数据。

这篇文章就是把这些数据摊开来聊聊。

手里这三块东西,到底啥情况

先说说硬件。这仨东西的底细得讲清楚。

Tesla P4 是 NVIDIA 当年给数据中心做的推理卡。Pascal 架构,2560 个 CUDA 核心,8GB GDDR5 显存,带宽 192 GB/s。这卡有个好处,它是 TCC 驱动模式,绕过 Windows 的显示栈,延迟比普通显卡低一截。但 Pascal 架构有个硬伤:FP16 算力只有 FP32 的 1/64,等于说半精度基本废了,只能靠量化后的 INT8/INT4 干活。

RX 580 2048SP 这东西其实不是标准版 RX 580。它是本土市场特供的,核心用的是 Polaris 20(跟 RX 570 一样),只有 2048 个流处理器,标准 RX 580 是 2304 个。但这个是一个魔改版本,显存给到了 16GB GDDR5,带宽大约 256 GB/s——比 P4 的 192 GB/s 高了一截。在 Windows 上 ROCm 后端用不了,只能走 Vulkan。Polaris 架构是 GCN 4.0,也没有 AI 加速单元,全是通用计算硬扛。

Xeon E5-2699 v3 18 核 36 线程,基频 2.3GHz,四通道 DDR4 内存,理论带宽约 68 GB/s。支持 AVX2 和 FMA3 指令集,这两个对 llama.cpp 的 CPU 推理很关键。但 CPU 那点内存带宽跟 GPU 显存带宽比,差了三四倍。

Image

三台设备的具体参数我就不列表了。大家心里有个数就行:P4 算力最强但显存最小,RX 580 显存最大但架构最老,CPU 啥都好就是慢。

后端 构建版本 Git Commit 加载的 ggml 后端
CUDA 9045 a00e47e42 CUDA, CPU (Haswell)
Vulkan 9030 a09a00e50 Vulkan, CPU (Haswell), RPC
CPU 8676 482d862bc CPU (Haswell), RPC

版本差异说明: CUDA 构建版本最新(9045),包含最新的 CUDA kernel 优化。Vulkan 构建版本次之(9030),支持 RPC(Remote Procedure Call)后端用于分布式推理。CPU 构建版本较旧(8676),但 Haswell 优化保持稳定。

测的啥模型,怎么测的

模型用的是 Tesslate 的 OmniCoder-9B-GGUF,一个 9B 参数的代码生成模型。两种量化格式:

模型文件 量化方式 文件大小 参数量
omnicoder-2-9b-q4_k_m.gguf Q4_K_M (4-bit K-quant Medium) 5.34 GB ~9B
omnicoder-2-9b-q5_k_m.gguf Q5_K_M (5-bit K-quant Medium) 6.08 GB ~9B

模型来源: Tesslate/OmniCoder-9B-GGUF 基础架构: 基于 9B 参数量的代码生成模型

Q4_K_M 文件大小 5.34 GB,网上说大约需要这么些显存。Q5_K_M 文件 6.08 GB,体积多了 13.9%,但输出质量未必就更高很多。

测试设置比较标准:提示词是一个 36 token 的英文句子("Write a detailed explanation of how neural networks work..."),固定生成 128 个 token。上下文窗口开 4096,KV 缓存用的 Q4_0 量化(这个能省大概 75% 的 KV 缓存显存)。GPU 层全部卸载到显存上。

每条组合跑三轮,预热一轮,取平均值。

启动命令长这样:

# CUDA + Tesla P4 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu0 -b cuda -n 128 -r 3 -w --json

# Vulkan + Tesla P4 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu0 -b vulkan -n 128 -r 3 -w --json

# Vulkan + RX 580 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu1 -b vulkan -n 128 -r 3 -w --json

# CPU + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d cpu -b cpu -n 128 -r 3 -w --json

# CUDA + Tesla P4 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu0 -b cuda -n 128 -r 3 -w --json

# Vulkan + Tesla P4 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu0 -b vulkan -n 128 -r 3 -w --json

# Vulkan + RX 580 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu1 -b vulkan -n 128 -r 3 -w --json

# CPU + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d cpu -b cpu -n 128 -r 3 -w --json
参数 说明
提示词 "Write a detailed explanation of how neural networks work..." 标准测试提示词 (36 tokens)
生成 token 数 128 固定生成长度
上下文窗口 4096 最大上下文长度
批处理大小 512 --batch-size
微批次大小 512 --ubatch-size
GPU 卸载 all (-ngl auto) 全量卸载到 GPU
KV 缓存量化 Q4_0 -ctk q4_0 -ctv q4_0
连续批处理 启用 --cont-batching
KV 碎片整理阈值 0.1 --defrag-thold 0.1
统一 KV 缓存 启用 --kv-unified
运行轮数 3 每组合运行 3 轮取平均

Q5_K_M 也是同样的套路,把模型文件名换一下就行。

K-quant 量化是 GGML/GGUF 格式的核心特性,采用混合精度策略对模型权重进行压缩 [2]。Q4_K_M 和 Q5_K_M 的具体特征如下:

  • Q4_K_M: 使用 4-bit 量化为主,部分重要层(如注意力输出层)保留 6-bit 精度。在 perplexity 损失和速度之间取得良好平衡。
  • Q5_K_M: 使用 5-bit 量化为主,重要层保留 8-bit 精度。相比 Q4_K_M 提供更高的输出质量,但模型体积增加约 14%。
设备 显存容量 Q4_K_M (5.34GB) Q5_K_M (6.08GB) Q8_0 (~10GB)
Tesla P4 8.0 GB ✅ 全量 GPU ✅ 全量 GPU
RX 580 2048SP 16.0 GB ✅ 充裕 ✅ 充裕 ✅ 全量 GPU

测试中启用了 KV 缓存量化(-ctk q4_0 -ctv q4_0),将 KV 缓存从 FP16 压缩至 4-bit,在 4096 上下文窗口下节省约 75% 的 KV 显存占用。

组合编号 设备 后端 量化格式
1 Tesla P4 (gpu0) CUDA Q4_K_M
2 Tesla P4 (gpu0) Vulkan Q4_K_M
3 RX 580 2048SP (gpu1) Vulkan Q4_K_M
4 CPU CPU Q4_K_M
5 Tesla P4 (gpu0) CUDA Q5_K_M
6 Tesla P4 (gpu0) Vulkan Q5_K_M
7 RX 580 2048SP (gpu1) Vulkan Q5_K_M
8 CPU CPU Q5_K_M

结果:谁快谁慢,一目了然

Q4_K_M 量化结果

设备/后端 生成速度 (tok/s) 提示处理速度 (tok/s)
Tesla P4 + CUDA 17.80 5.01
Tesla P4 + Vulkan 9.51 2.67
RX 580 2048SP + Vulkan 9.75 2.74
CPU + CPU 2.38 0.67

Q5_K_M 量化结果

设备/后端 生成速度 (tok/s) 提示处理速度 (tok/s)
Tesla P4 + CUDA 16.37 4.60
Tesla P4 + Vulkan 8.91 2.51
RX 580 2048SP + Vulkan 8.88 2.50
CPU + CPU 2.14 0.60

量化格式对比

指标 Q4_K_M (CUDA/P4) Q5_K_M (CUDA/P4) 差异 变化率
模型大小 5.34 GB 6.08 GB +0.74 GB +13.9%
生成速度 17.80 tok/s 16.37 tok/s -1.43 tok/s -8.0%
提示处理速度 5.01 tok/s 4.60 tok/s -0.41 tok/s -8.2%

后端对比 (Tesla P4)

指标 CUDA Vulkan CUDA 优势
Q4_K_M 生成速度 17.80 tok/s 9.51 tok/s 1.87x
Q4_K_M 提示速度 5.01 tok/s 2.67 tok/s 1.88x
Q5_K_M 生成速度 16.37 tok/s 8.91 tok/s 1.84x
Q5_K_M 提示速度 4.60 tok/s 2.51 tok/s 1.83x

GPU 对比 (Vulkan 后端)

指标 Tesla P4 (8GB) RX 580 2048SP (16GB) 差异
Q4_K_M 生成速度 9.51 tok/s 9.75 tok/s RX 580 快 2.5%
Q4_K_M 提示速度 2.67 tok/s 2.74 tok/s RX 580 快 2.6%
Q5_K_M 生成速度 8.91 tok/s 8.88 tok/s 基本持平
Q5_K_M 提示速度 2.51 tok/s 2.50 tok/s 基本持平
显存容量 8 GB 16 GB RX 580 多 100%

详细评价

CUDA 为什么比 Vulkan 快这么多? 核心原因就三个。第一, CUDA kernel 优化了很多年,针对 NVIDIA GPU 的线程块配置、共享内存使用都调得很细。Vulkan 后端要兼容 NVIDIA、AMD、Intel 三家,没法像 CUDA 那样针对单一架构深挖。第二,CUDA 的统一虚拟内存可以自动在 CPU 和 GPU 之间搬数据,Vulkan 得手动管,多了开销。第三,P4 在 TCC 模式下 CUDA 驱动直接管 GPU,绕过 Windows 显示管理器;Vulkan 还要走 WDDM 调度,延迟更高。

RX 580 Vulkan 为啥没比 P4 Vulkan 快多少? RX 580 的显存带宽比 P4 高 33%,按理说生成阶段(自回归解码)是吃带宽的,应该更快才对。但实际只快了 2.5%。问题出在 Vulkan 后端上:它对 GCN 架构的优化不够,没法把 256 GB/s 的带宽优势转化成实际性能。P4 虽然带宽低,但 Vulkan 后端对 Pascal 的支持稍好一些,把差距抹平了。

CPU 为什么慢那么多? 主要是内存带宽。CPU 四通道 DDR4 理论带宽 68 GB/s,实际还不到这个数。P4 显存带宽 192 GB/s,是 CPU 的将近三倍。AVX2 指令集帮忙提了点速度,但杯水车薪。CPU 推理的定位很明确:没有 GPU 时候的备胎。

RX 580 16GB 显存的价值在哪? 虽然速度上 RX 580 没赢,但它的 16GB 显存是个大杀器。P4 的 8GB 刚好能装下 Q4/Q5 的 9B 模型,稍微大一点的就装不下了。RX 580 不仅能装,还能开更大的上下文窗口。KV 缓存量化后,16GB 大概能撑 16384 到 32768 的上下文,P4 只能到 4096-8192。如果你需要跑长对话或者高质量推理,RX 580 的显存优势是实打实的。

到底该咋选?

应用场景 推荐设备/后端 推荐量化 实测速度
实时对话 (<60ms/token) Tesla P4 + CUDA Q4_K_M 17.80 tok/s
代码生成 (质量优先) Tesla P4 + CUDA Q5_K_M 16.37 tok/s
大上下文对话 (16K+) RX 580 + Vulkan Q4_K_M 9.75 tok/s
离线批处理 CPU Q4_K_M 2.38 tok/s
无 GPU 环境 CPU Q4_K_M 2.38 tok/s

看完数据,我的建议是这样:

如果你有 NVIDIA 显卡,别犹豫,直接上 CUDA 后端。P4 这种老卡都能跑 17.80 tok/s,跟人聊天完全够了。量化格式选 Q4_K_M 就行,除非你对输出质量要求特别高才上 Q5,代价是慢 8%。

如果你只有 AMD 的古老显卡(Windows 上),走 Vulkan 后端,大概能到 9-10 tok/s。比 CUDA 慢,但好歹能用。

如果你啥显卡都没有,CPU 也能跑,就是得忍 2-3 tok/s 的速度。适合离线批处理或者对延迟完全不敏感的场景。

说点实话

这次测试有不少局限。只测了一个 9B 的模型,7B、13B、70B 都没碰。上下文也只测了 4096,更大的窗口是啥表现不知道。AMD 在 Linux 上能用的 ROCm 后端,但 RX580 已经不被支持了。

RX 580 16GB 这张卡挺有意思。速度上跟 P4 的 Vulkan 差不多,但显存翻倍,能跑更大的模型和更长的上下文。在二手市场上这东西不算贵,如果只是想搭个本地 AI 环境玩玩,是个有点意思的选项。

最后说一句 MoXing,本质上就是个 llama.cpp 的 Python 包装,但把设备检测、模型下载、后端选择这些琐事都帮你处理好了。一条命令就能起服务,不用自己去折腾命令行参数,省了不少事。

附录 符号与缩写对照表

符号/缩写 全称 说明
LLM Large Language Model 大语言模型
GGUF GGML Unified Format GGML 统一模型格式
KV Key-Value 注意力机制中的键值缓存
tok/s Tokens per second 每秒生成的 token 数
Q4_K_M 4-bit K-quant Medium 4-bit 混合精度量化
Q5_K_M 5-bit K-quant Medium 5-bit 混合精度量化
TCC Tesla Compute Cluster NVIDIA 专用计算驱动模式
WDDM Windows Display Driver Model Windows 显示驱动模型
FP16/FP32 16/32-bit Floating Point 半精度/单精度浮点
SIMD Single Instruction Multiple Data 单指令多数据流
AVX2 Advanced Vector Extensions 2 Intel 256-bit SIMD 指令集
MoE Mixture of Experts 混合专家模型架构
RPC Remote Procedure Call 远程过程调用
UVM Unified Virtual Memory NVIDIA 统一虚拟内存

写到这,数据都在上面了。

预览时标签不可点

Close

更多

Name cleared

微信扫一扫赞赏作者

Like the AuthorOther Amount

赞赏后展示我的头像

作品

暂无作品

Like the Author

Other Amount

¥

最低赞赏 ¥0

OK

Back

Other Amount

更多

赞赏金额

¥

最低赞赏 ¥0

1

2

3

4

5

6

7

8

9

0

.

大语言模型 · 目录

大语言模型

上一篇MoXing 速度最高达到 Ollama的 201% ,同模型同硬件的实测对比OmniCoder-2-9B 的 Q4_K_M 量化模型下一篇超强的本地小模型OmniCoder-9B的安装与使用指南

Close

更多

搜索「」网络结果

Close

调整当前正文文字大小

更多

100%