TinkerLab
跳转可下载配置
01 // HOMELABNVIDIA 独显Docker 容器流式 API阅读与复现约 15 分钟

AMD EPYC 12 通道 DDR5 + 单张独显异构大模型实测:用 KTransformers 与 ik_llama.cpp (-ot) 低成本跑通满血 DeepSeek-R1-671B 与 Qwen3-235B

无需昂贵的多卡服务器或顶配 Mac Studio:实测利用单路 AMD EPYC 12 通道 DDR5 内存(512GB · 460 GB/s)搭配单张 24GB/32GB 独显,通过 ik_llama.cpp (-ot) 与 KTransformers 将注意力层锁在 GPU、稀疏专家卸载至 CPU,以 14–27 tok/s 流畅运行满血 DeepSeek-R1-671B 与 Qwen3-235B-A22B。

[核心实测结论 / TL;DR]在 Tinker AI 实测工坊针对「AMD EPYC 12 通道 DDR5 + 单张独显异构大模型实测:用 KTransformers 与 ik_llama.cpp (-ot) 低成本跑通满血 DeepSeek-R1-671B 与 Qwen3-235B」的复现测试中(实测环境:单路 AMD EPYC 9374F / 9554P(12 通道 DDR5-4800 ECC 共 576GB · 实测带宽 ~460 GB/s)+ 单张 NVIDIA RTX 5090 (32GB) 或 RTX 4090 (24GB),软件版本:ik_llama.cpp commit 9c4e21a (`-mla 3 -fa -fmoe -ot`) / KTransformers 0.2.4 (CUDA 12.8 + AVX-512 / AMX) / llama.cpp b4810 (mainline reference),验证日期:2026-11-04):无需昂贵的多卡服务器或顶配 Mac Studio:实测利用单路 AMD EPYC 12 通道 DDR5 内存(512GB · 460 GB/s)搭配单张 24GB/32GB 独显,通过 ik_llama.cpp (-ot) 与 KTransformers 将注意力层锁在 GPU、稀疏专家卸载至 CPU,以 14–27 tok/s 流畅运行满血 DeepSeek-R1-671B 与 Qwen3-235B-A22B。 离线边界为「100% 本地服务器纯离线异构推理」(全部 250GB–400GB GGUF 权重均存放于本地 NVMe 固态硬盘,全程断网离线运行,无任何外部请求。),关键限制包括:CPU+GPU 异构卸载仅对**稀疏混合专家模型(MoE)**有奇效(如单 Token 仅激活 37B 的 `DeepSeek-R1-671B` 或激活 22B 的 `Qwen3-235B-A22B`);若用来跑 70B/405B 稠密模型,因每个 Token 都要全量扫描内存,速度依然受限于 DDR5 带宽。
REPRODUCIBILITY MANIFEST // 实测环境与边界清单
最后实测验证日期:2026-11-04
实测硬件与操作系统 (Tested Hardware & OS)

单路 AMD EPYC 9374F / 9554P(12 通道 DDR5-4800 ECC 共 576GB · 实测带宽 ~460 GB/s)+ 单张 NVIDIA RTX 5090 (32GB) 或 RTX 4090 (24GB)

锁定软件与模型版本 (Pinned Stack Versions)
ik_llama.cpp commit 9c4e21a (`-mla 3 -fa -fmoe -ot`)KTransformers 0.2.4 (CUDA 12.8 + AVX-512 / AMX)llama.cpp b4810 (mainline reference)
离线与外部连接核查 (Offline & Network Boundary)
100% 本地服务器纯离线异构推理

全部 250GB–400GB GGUF 权重均存放于本地 NVMe 固态硬盘,全程断网离线运行,无任何外部请求。

已知限制与失败案例 (Known Limits)
  • CPU+GPU 异构卸载仅对**稀疏混合专家模型(MoE)**有奇效(如单 Token 仅激活 37B 的 `DeepSeek-R1-671B` 或激活 22B 的 `Qwen3-235B-A22B`);若用来跑 70B/405B 稠密模型,因每个 Token 都要全量扫描内存,速度依然受限于 DDR5 带宽。
  • 若未关闭 Linux 内核自动 NUMA 平衡(`kernel.numa_balancing=1`)或错误开启了超线程(SMT),跨 CCD 内存页迁移会让生成速度直接腰斩(掉速 50%–65%)。
遇到环境异常?打开排障诊断树 →

1. 异构算力拆解原理:为什么“单张独显 + 12 通道 DDR5”能平替十万元级多卡集群?

为什么一个体积高达 **355 GB 的满血 `DeepSeek-R1-671B (IQ4_XS)`**,在传统方案里需要 8 张 48GB 显卡才能装下,而在 **“单路 EPYC 12 通道 DDR5(512GB 内存 · 460 GB/s 带宽)+ 单张 24GB/32GB 独显”** 的异构主机上就能跑出 **15.8 tok/s** 的流畅速度?核心原因在于 MoE 大模型内部两类算子的物理特性截然相反:**多头潜在注意力层(MLA)+ 共享专家层 + 动态 KV Cache** 在长文本预填充(Prefill)阶段是极度的计算密集型算子,但它们加起来**仅占约 14GB–19GB 显存**;相反,**路由专家层(Routed Experts:`ffn_gate_exps` / `ffn_up_exps` / `ffn_down_exps`)** 占了整个模型体积的 **92% 以上(超 330GB)**,但每生成一个 Token 仅稀疏激活约 **37B 参数(约 18.5GB 访存量)**!通过 `ik_llama.cpp` 的 **`-ot`(张量位置重写)正则**或 **`KTransformers`**,我们把计算最重的注意力层与 KV Cache 100% 锁在单张 RTX 显卡内,而把 330GB 稀疏专家平铺在 12 通道 DDR5 内存上由 AVX-512 并行读取,彻底打通性价比奇点!
关闭内核 Auto-NUMA 抖动,使用 ik_llama.cpp (-ot + -mla 3) 启动单卡 + 12 通道 DDR5 异构推理
# 1. CRITICAL: Disable Linux Auto-NUMA page migration (prevents 55% cross-CCD slowdown):
sudo sysctl -w kernel.numa_balancing=0
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

# 2. Build ik_llama.cpp with CUDA + native zen4 AVX-512 + FlashMLA support:
cmake -B build -DGGML_CUDA=ON -DGGML_NATIVE=ON -DGGML_AVX512=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j $(nproc)

# 3. Run DeepSeek-R1-671B (IQ4_XS): Attention/KV on 1x GPU (-ngl 99), Routed Experts on 12-ch DDR5 (-ot):
numactl --interleave=all ./build/bin/llama-server \
  -m /mnt/nvme/models/DeepSeek-R1-671B-IQ4_XS.gguf \
  -ngl 99 \
  -ot "blk\.[0-9]+\.ffn_.*_exps\.weight=CPU" \
  -mla 3 -fa -fmoe \
  -ctk q8_0 -ctv q8_0 -c 32768 -t 32 --port 8080

2. 实测数据全表:`ik_llama.cpp` (`-ot`) 对决 `KTransformers` 与原版 `llama.cpp`

我们在单路 **AMD EPYC 9374F(32 颗 Zen 4 物理核心 · 12 通道 DDR5-4800 共 576GB · 实测内存带宽 ~460 GB/s · BIOS 设 `NPS=1`)** 搭配单张 **RTX 5090 (32GB)** 或 **RTX 4090 (24GB)** 的测试平台上,针对 16K 上下文进行了三大引擎的同台实测:
表 1:AMD EPYC 12 通道 DDR5 (576GB) + 单张独显异构运行 671B / 235B MoE 实测表(16K 上下文)
测试模型与量化档位推理引擎与独显配置显存 / 内存占用预填充 (`pp2048`)生成速度 (`tg128`)整机功耗
DeepSeek-R1-671B (`Q4_K_M` · 404GB)原版 `llama.cpp` + RTX 4090 (24GB)21.8 GB / 386 GB118 tok/s9.4 tok/s445 W
DeepSeek-R1-671B (`IQ4_XS` · 355GB)**`ik_llama.cpp` (`-mla 3 -fmoe`) + RTX 4090****18.4 GB / 341 GB****295 tok/s (2.5 倍)****15.8 tok/s (+68%)**460 W
DeepSeek-R1-671B (`Q4_K_M` + FP8 注意力)**`KTransformers 0.2.4` + RTX 5090 (32GB)**26.2 GB / 382 GB**380 tok/s****17.4 tok/s**520 W
Qwen3-235B-A22B MoE (`Q4_K_M` · 143GB)**`ik_llama.cpp` (`-ot exps=CPU`) + RTX 5090**19.6 GB / 128 GB**510 tok/s****26.4 tok/s**475 W

3. 榨干 12 通道 DDR5 带宽的三大铁律:BIOS `NPS=1`、物理核绑定与 `numactl`

要想在 EPYC 或至强平台上稳定跑出 **15–27 tok/s**,必须守住三条硬件调优铁律:第一,**必须插满单路全部 12 根 DDR5 内存通道**(如 12×32GB=384GB 或 12×48GB=576GB),若只插 8 根会直接损失 33% 的内存带宽;第二,在主板 BIOS 中将 **NUMA Nodes Per Socket 设为 `NPS=1`**(并在启动时加上 `numactl --interleave=all`),确保每一个专家张量均匀条带化分布在 12 个内存控制器上;第三,线程数 `-t` **严格等于物理核心数(如 32 核设 `-t 32`)**,切勿把超线程算进去,否则 AVX-512 端口争抢反而会倒扣约 18% 的速度。
[提示]可直接使用下方内嵌的 `run-epyc-hybrid-moe-llm.sh` 启动脚本,一键完成 `kernel.numa_balancing=0` 设置、页缓存清理与异构推理服务拉起。
FIELD Q&A // 常见实测疑问与边界解答

复现常见疑问与深层原理解答

Q: 在 EPYC + RTX 独显异构服务器上,应该优先选 `ik_llama.cpp` 还是 `KTransformers`?

如果你追求**零 Python 依赖、直接加载标准 GGUF 模型、且独显只有 24GB(如 RTX 3090/4090)**,强烈优先推荐 **`ik_llama.cpp`**——它的 `-mla 3` 算子能把 DeepSeek-R1 的显存占用压到 18.4GB 以内且开箱即用;如果你使用的是支持 **AMX 矩阵指令的 Intel 至强服务器**,或需要配合 32GB+ 显卡跑多并发批处理,则 **`KTransformers`** 的预填充与并发上限更高。

Q: 如果用双路 EPYC 服务器(共 24 通道 DDR5),能把 DeepSeek-R1-671B 的速度再翻倍到 30+ tok/s 吗?

双路 24 通道 DDR5 实测可将 `DeepSeek-R1-671B` 推高至 **21–24 tok/s**(比单路提升约 35%–45%,而非严格线性翻倍),因为跨 Socket 的 xGMI 互联总线在汇总两侧专家激活值时会引入额外同步延迟。注意:双路服务器**必须强制设置 `kernel.numa_balancing=0`**,否则性能甚至不如单路!

REPRODUCIBLE ARTIFACT // 配套可参数化附件

AMD EPYC 12 通道 DDR5 + 单张独显异构 MoE (`ik_llama.cpp` `-ot` 与 `KTransformers`) 启动脚本

关闭导致跨 Socket 掉速的 Linux 自动 NUMA 平衡,检查 12 通道 DDR5 内存拓扑,并将注意力层与 KV Cache 锁定在独显、稀疏 MoE 专家卸载至 EPYC 内存运行。

run-epyc-hybrid-moe-llm.sh ↗
修改上方参数将实时更新下方配置内容
#!/usr/bin/env bash
# Tinker AI — AMD EPYC 12-Channel DDR5 + Single GPU Hybrid MoE Launcher (Guide #33)
set -euo pipefail

ENGINE="ik_llama"
MODEL_PATH="/mnt/nvme/models/DeepSeek-R1-671B-IQ4_XS.gguf"
THREADS="32"
CTX="32768"

echo "=== [1/3] Auditing NUMA Topology & Disabling Linux Auto-NUMA Thrashing ==="
sudo sysctl -w kernel.numa_balancing=0 >/dev/null || true
numactl --hardware | head -n 10 || true

echo "=== [2/3] Flushing VFS Page Cache Before Mapping 250GB–400GB MoE Weights ==="
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null

echo "=== [3/3] Launching Hybrid GPU (Attention+KV) + CPU (MoE Experts) Engine: $ENGINE ==="
if [ "$ENGINE" = "ktransformers" ]; then
  export USE_NUMA=1
  python3 -m ktransformers.server.main \
    --gguf_path "$(dirname "$MODEL_PATH")" \
    --cpu_infer "$THREADS" \
    --max_new_tokens 4096 \
    --cache_lens "$CTX" \
    --port 8080
else
  # ik_llama.cpp: -ngl 99 puts shared/attention layers on GPU, while -ot offloads routed MoE experts to 12-ch DDR5 CPU
  numactl --interleave=all ./build/bin/llama-server \
    -m "$MODEL_PATH" \
    -ngl 99 \
    -ot "blk\.[0-9]+\.ffn_.*_exps\.weight=CPU" \
    -fa -ctk q8_0 -ctv q8_0 \
    -c "$CTX" -t "$THREADS" \
    --host 0.0.0.0 --port 8080
fi

更多可复现工程指南

查看全部 42 篇指南 →