纯CPU推理GPT-OSS-120b性能测试
本文最后更新于197 天前,其中的信息可能已经过时,如有错误请发送邮件到 2871065713@qq.com
#软硬件环境
Ubuntu 24.04
双路8259CL
DDR4 2400 LRDIMM 768G
NUMA节点:关闭 

GPT-OSS-120b是OpenAI 的开源权重(open-weight)MoE 推理模型,36 层、总参约 116.8B,每 token 激活参数约 5.13B,MoE 权重用 MXFP4(4.25 bit) 量化,整模权重(checkpoint)约 60.8 GiB;MoE 采用 128 专家、top-4 路由,注意力为 64 Q heads / 8 KV heads(GQA),head_dim=64,最长上下文 128k

单token理论速度计算:

权重读流量(与上下文 L 无关):

激活参数约 5.13B / token,可由下式近似分解:

MoE-MLP:总 114.71B,top-4/128 → 激活 114.71B×(4/128)=3.5847B;MXFP4=0.53125 B/param → ≈1.904 GB/token

Attention 参数:0.96B × 2 B ≈ 1.920 GB/token(按 bf16/fp16 估)

Unembed:(1.16B/2) × 2 B ≈ 1.160 GB/token

合计权重读 ≈ 4.98 GB/token(≈4.64 GiB/token)。

但是Cascade Lake不支持FP16/BF16,只能以FP32存,因此 ≈ 8.064 GB/token

KV Cache 读/写(与上下文 L 线性相关):

每层每个 token 的 K、V 向量:2 * H_kv * d = 2*8*64 = 1024 元素,按 2 B/elem → 2048 B/层·token。

对于全局层(18 层):读 2048 * L/层;窗口层(18 层, 窗口=128):读 2048 * 128/层;

写入(所有 36 层):每新 token 写入当前的 K、V:36 * 2048 = 73,728 B ≈ 72 KiB/token(相对读流量可忽略)。

上下文和带宽的关系

上下文 LFP16
权重读 (GB)
FP16 KV (GB)FP16合计 (GB/token)FP32 KV (GB) FP32
权重读 (GB)
FP32合计 (GB/token)
8k4.9840.3075.2910.61368.0648.678
32k4.9841.2136.1972.42558.06410.490
128k4.9844.8379.8219.67338.06417.737

1、环境准备:

sudo apt update
sudo apt install -y git build-essential cmake ninja-build ccache
sudo apt install -y libcurl4-openssl-dev
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

2、编译llama.cpp

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
  -DGGML_NATIVE=OFF \
  -DGGML_AVX=ON -DGGML_AVX2=ON \
  -DGGML_F16C=ON -DGGML_FMA=ON \
  -DGGML_AVX512=ON \
  -DGGML_AVX512_VNNI=ON \
  -DGGML_AVX512_VBMI=OFF \
  -DGGML_AVX512_BF16=OFF
cmake --build build -j
#二代Cascade Lake 增了 AVX512_VNNI;BF16是Cooper Lake才有,VBMI从Ice Lake才有。
#Cooper Lake和Ice Lake都是三代4189至强,区别就是Cooper Lake仍然是14nm,Ice Lake才是真10nm三代xeon,价格不如直接上Emerald Rapids五代xeon

3、运行推理脚本

#设置模型目录
MODEL="$HOME/桌面/gpt-oss-120b-GGUF/gpt-oss-120b-MXFP4-00001-of-00002.gguf"
#在llama.cpp编译目录运行
./build/bin/llama-cli -m "$MODEL" \
  -i \
  -c 4096 \
  -b 256 \
  -t $(nproc) \
  --simple-io
#线程数 -t:先用 $(nproc) 跑一轮;双路 8259CL 往往 96 线程,若发现吞吐上不去(调度开销),再试物理核数(比如 48)。
#上下文 -c 与 批大小 -b:120B 内存、计算都很重。-c 4096/-b 256 是稳妥起步值;prefill 想更快可逐步把 -b 调大(512、768),但内存会涨。

96线程全部跑满,推理速度1秒3字左右,属于勉强可以使用级别,120b不添加联网本身不是聪明,但是比deepseek 671b勉强2.3token/s强太多了

4、性能调优

那么线程数越多越好吗?尽管96线程满载看上去很厉害,但是核心计算性能其实不是非常重要,内存带宽是第一要素。纯cpu方案内存带宽是极大瓶颈,我们粗略计算一下单路带宽,因为Cascade Lake为6通道DDR4,因此64x6x2400/8/1024=112.5GB/s,双路远远达不到x2水平,要受到UPI总线限制,此速度喂满双路是完全不够的,从实际推理速度结果来看就可见一斑。另外avx512功耗过大,降频极为明显,因此我们重新编译了AVX2版本。从96线程的5.32t/s的结果来看,远远没有达到纯cpu推理的上限,因此我们将线程限制为15,关闭超线程,上下文增加到8192(8k),绑定cpu0,开启numa,运行以下推理命令:

MODEL="$HOME/桌面/gpt-oss-120b-GGUF/gpt-oss-120b-MXFP4-00001-of-00002.gguf"
CPUSET_PHYS=$(lscpu -e=CPU,CORE,SOCKET | awk '$3==0{if(!( $2 in seen)){printf (n++?",":"") $1; seen[$2]=1}}')
taskset -c "$CPUSET_PHYS" ./build-avx2/bin/llama-cli   -m "$MODEL" -i -c 8192 -b 256 -t 15 --simple-io

我们可以看到,此时推理速度高达12.5t/s,吊打96线程的5t/s,接近网页版deepseek水平。

文末附加内容

评论

  1. Aaron
    Macintosh Safari
    8 月前
    2025-8-31 3:22:15

    测试

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇