异构 CPU+GPU 大模型 (`NUMA` 掉速 / `-ot` 爆显存) 与边缘 NPU (`Hailo-10H` / `RK3588 CMA`) 排障
排查 EPYC/至强服务器跑 KTransformers 与 ik_llama.cpp 时的跨 NUMA 节点掉速、-ot 专家卸载正则不匹配导致 24GB/32GB 独显爆显存、树莓派 5 AI HAT+ 2 (Hailo-10H) 驱动冲突,以及 RK3588 NPU CMA 连续内存分配失败。
你当前排查的是多通道 DDR5 CPU + 单张独显异构服务器(使用 `KTransformers` 或 `ik_llama.cpp` 跑 671B/235B MoE),还是边缘 NPU 硬件(树莓派 5 `Hailo-10H` / 瑞芯微 `RK3588`)?
numactl --hardware 2>/dev/null || lspci | grep -i hailo
「异构 CPU+GPU 大模型 (`NUMA` 掉速 / `-ot` 爆显存) 与边缘 NPU (`Hailo-10H` / `RK3588 CMA`) 排障」的全部 3 步终端探测命令与分支判据
无需逐层点击交互,以下列出本故障决策树每一层的宿主机只读探测命令、预期基线提示与输出流向。
你当前排查的是多通道 DDR5 CPU + 单张独显异构服务器(使用 `KTransformers` 或 `ik_llama.cpp` 跑 671B/235B MoE),还是边缘 NPU 硬件(树莓派 5 `Hailo-10H` / 瑞芯微 `RK3588`)?
numactl --hardware 2>/dev/null || lspci | grep -i hailo
- • 异构 CPU+GPU 服务器(EPYC / 线程撕裂者 / 至强 + RTX 独显):生成速度异常缓慢 (<5 tok/s) 或加载时报错 `CUDA out of memory`
→ q-hybrid-numa-or-ot-oom - • 边缘 NPU 开发板(树莓派 5 AI HAT+ 2 `Hailo-10H` 或 `RK3588`):`hailo-ollama` 或 `rknn_init` 加载模型报错
→ q-edge-hailo10h-or-rk3588
在使用 `ik_llama.cpp` 或 `KTransformers` 启动 `DeepSeek-R1-671B` 或 `Qwen3-235B-A22B` 时,出现了哪种现象?
cat /proc/sys/kernel/numa_balancing && nvidia-smi --query-gpu=memory.used,memory.free --format=csv
- • 模型能正常加载,但生成速度骤降至 3–5 tok/s,且 `top` 中可见内核迁移线程占用大量 CPU
→ sol-epyc-numa-balancing-and-smt-fix - • 在加载权重阶段直接崩溃,报错 `failed to allocate ... CUDA out of memory`
→ sol-ik-llama-ot-regex-vram-oom
你的边缘设备终端输出了以下哪种报错特征?
hailortcli fw-control identify 2>/dev/null || grep -i "Cma" /proc/meminfo
- • 树莓派 5 + AI HAT+ 2 (`Hailo-10H` 8GB):报 `HAILO_INVALID_FIRMWARE`、找不到设备,或 `hailo-ollama` 卡在 ~4 tok/s
→ sol-pi5-hailo10h-driver-and-pcie-gen3 - • 瑞芯微 RK3588(香橙派 5 / Rock 5B):报 `rknn_init failed (-1)`、`DMA_BUF_IOCTL_ALLOC` 或 `Cannot allocate memory`
→ sol-rk3588-rkllm-cma-and-memlock
「异构 CPU+GPU 大模型 (`NUMA` 掉速 / `-ot` 爆显存) 与边缘 NPU (`Hailo-10H` / `RK3588 CMA`) 排障」包含的 4 类根因、修复代码与验收命令
修复方案:关闭 `kernel.numa_balancing=0`、开启全通道内存交织并仅绑定物理 AVX-512 核心
sol-epyc-numa-balancing-and-smt-fix在多 NUMA 节点(如 NPS2/NPS4 或双路)的 AMD EPYC / 至强服务器上,Linux 默认开启的自动 NUMA 平衡 (`kernel.numa_balancing=1`) 会在每次推理激活不同专家时,疯狂跨节点搬移数百 GB 的 4KB 内存页,直接打满 Infinity Fabric 总线并造成 50%–65% 的吞吐暴跌;同时误用超线程(SMT)会导致 AVX-512 寄存器争抢。
- 立即执行 `sudo sysctl -w kernel.numa_balancing=0` 关闭内核自动 NUMA 页迁移(并写入 `/etc/sysctl.d/99-llm-numa.conf` 持久化)。
- 使用 `numactl --interleave=all` 启动 `ik_llama.cpp`(或在 `KTransformers` 中设置 `export USE_NUMA=1`),让全部 12 通道 DDR5 内存控制器并行提供带宽,并将线程数 `-t` 严格设为物理核心数(切勿包含超线程)。
# 1. Disable Linux Auto-NUMA page thrashing immediately: sudo sysctl -w kernel.numa_balancing=0 # 2. Flush VFS page cache so 350GB MoE weights map cleanly into DDR5: sync && echo 3 | sudo tee /proc/sys/vm/drop_caches # 3. Launch ik_llama.cpp interleaved across all 12-ch DDR5 channels (physical cores only): 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
[边界说明]关闭 `kernel.numa_balancing=0` 并开启内存交织后,12 通道 DDR5 EPYC 跑满血 DeepSeek-R1-671B (`IQ4_XS`) 的生成速度从 6.1 tok/s 直接跃升至 15.8 tok/s。
sysctl kernel.numa_balancing && numactl --hardware | head -n 6修复方案:修正 `-ot` 专家张量卸载正则表达式,并为 24GB/32GB 显卡预留 KV Cache 空间
sol-ik-llama-ot-regex-vram-oom在单张 24GB/32GB 独显上对 671B/235B 模型开启 `-ngl 99` 时,若 `-ot` 正则未正确匹配全部路由专家张量(`ffn_gate_exps`、`ffn_up_exps`、`ffn_down_exps`),引擎会试图把数百 GB 专家塞进显存而立即 OOM;此外在 24GB 显卡上若未开启 `-mla 3` 与 `q8_0` KV Cache,61 层注意力与共享专家加上长上下文也会撑爆 24GB 显存。
- 确保使用标准正则 `-ot "blk\.[0-9]+\.ffn_.*_exps\.weight=CPU"`,将全部稀疏路由专家锁定在系统 DDR5 内存中,仅把注意力层与共享层留在 GPU。
- 在 24GB 显存卡(RTX 3090 / 4090)上,务必加上 `-mla 3 -fa -ctk q8_0 -ctv q8_0` 压缩 MLA KV Cache;若需开 64K 以上超长上下文,可通过正则将后几层的共享层一并卸载至 CPU。
# Fit DeepSeek-R1-671B Attention + 32K KV Cache cleanly inside a single 24GB/32GB GPU: ./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
[边界说明]开启上述 `-ot` 正则与 `-mla 3 -ctk q8_0` 后,DeepSeek-R1-671B 在 32K 上下文下仅占用约 **18.4 GB** 显存,单张 24GB RTX 3090/4090 或 32GB RTX 5090 / PRO 4500 即可稳稳装下。
nvidia-smi --query-gpu=name,memory.used,memory.free --format=csv修复方案:卸载旧版 `hailo-all` 改装 `hailo-h10-all` (HailoRT 5.x),并开启树莓派 5 PCIe 3.0
sol-pi5-hailo10h-driver-and-pcie-gen3树莓派 AI HAT+ 2(搭载带 8GB 独立显存的 `Hailo-10H` 生成式 NPU)必须使用 **HailoRT 5.x 驱动栈 (`hailo-h10-all`)**;若系统残留了面向一代视觉卡 Hailo-8/8L 的 `hailo-all` (HailoRT 4.x) 包,会导致固件加载失败或无法调用 8GB 板载内存。
- 卸载一代驱动包 `sudo apt purge -y hailo-all hailort`,安装专用于 Hailo-10H 的 `sudo apt update && sudo apt install -y hailo-h10-all` 并执行冷重启。
- 在 `/boot/firmware/config.txt` 中加入 `dtparam=pciex1_gen=3` 开启 PCIe 3.0 (8 GT/s),消除模型加载与长 Prompt 传输瓶颈。
# 1. Switch from legacy Hailo-8 stack to Hailo-10H GenAI stack on Raspberry Pi 5: sudo apt purge -y hailo-all hailort sudo apt update && sudo apt install -y hailo-h10-all # 2. Enable PCIe Gen 3.0 speed on Raspberry Pi 5: grep -q "pciex1_gen=3" /boot/firmware/config.txt || echo "dtparam=pciex1_gen=3" | sudo tee -a /boot/firmware/config.txt sudo reboot # 3. Verify Hailo-10H firmware & launch hailo-ollama: hailortcli fw-control identify hailo-ollama run qwen2.5-instruct:1.5b
[边界说明]切换至 `hailo-h10-all` 后,`Qwen2.5-1.5B` 将完全运行在扩展板自带的 8GB 独立内存中(实测 ~19.4 tok/s),树莓派 5 本机 CPU 占用率低于 5%。
hailortcli fw-control identify | grep -i "Hailo-10H"修复方案:解除 `ulimit -l unlimited` 锁页限制、清理页缓存并扩大 RK3588 CMA 连续内存池
sol-rk3588-rkllm-cma-and-memlock瑞芯微 RK3588 的 6 TOPS NPU 驱动 (`rknpu` + `rkllm-runtime`) 在加载 `.rkllm` 模型时必须申请物理连续的 DMA/CMA 内存块并锁定内存页;若当前 Shell 的 `ulimit -l` 默认限制过小,或物理内存碎片化导致连续块不足,即便 `free -h` 显示还有 10GB 空闲内存也会报 `rknn_init failed` 或 `DMA_BUF_IOCTL_ALLOC` 失败。
- 在启动 `rkllm_server` 前,先执行 `ulimit -l unlimited`,并运行 `echo 3 | sudo tee /proc/sys/vm/drop_caches && echo 1 | sudo tee /proc/sys/vm/compact_memory` 整理出连续物理内存块。
- 将 RK3588 的 NPU 与 DMC 内存控制器频率策略锁定为 `performance`(若 `/proc/meminfo` 中 `CmaFree` 不足,可在 `/boot/armbianEnv.txt` 中添加 `extraargs=cma=512M`)。
# 1. Unlock memlock limit and defragment physical RAM for RK3588 NPU DMA: ulimit -l unlimited sync && echo 3 | sudo tee /proc/sys/vm/drop_caches echo 1 | sudo tee /proc/sys/vm/compact_memory grep -i "Cma" /proc/meminfo # 2. Lock RK3588 6 TOPS NPU & DMC memory controller to maximum frequency: echo performance | sudo tee /sys/class/devfreq/fdab0000.npu/governor 2>/dev/null || true echo performance | sudo tee /sys/class/devfreq/dmc/governor 2>/dev/null || true
[边界说明]完成内存碎片整理并将 NPU 与 DMC 内存控制器定频至 `performance` 后,RK3588 运行 `Qwen2.5-3B-W4A16.rkllm` 的生成速度可从 8.4 tok/s 提升至 12.6 tok/s。
ulimit -l && grep -i "CmaFree" /proc/meminfo异构 CPU+GPU 大模型 (KTransformers / ik_llama.cpp) 与边缘 NPU (Hailo-10H / RK3588) 排障指南:解决跨 NUMA 掉速、-ot 正则爆显存与 CMA 报错
针对异构 CPU+GPU 大模型服务器与新一代边缘 NPU 的深度排障手册:彻底解决 EPYC/至强双路服务器 Auto-NUMA 页面迁移导致掉速 60%、`ik_llama.cpp -ot` 正则写错爆显存、树莓派 5 AI HAT+ 2 (`Hailo-10H`) 驱动冲突与 RK3588 NPU CMA 内存分配失败。
AMD EPYC / Intel 至强多通道 DDR5 + 单张 RTX 独显 | 树莓派 5 + AI HAT+ 2 (Hailo-10H 8GB) | 瑞芯微 RK3588 开发板
ik_llama.cpp & KTransformers 0.2.4 (`numactl` / `sysctl`) · HailoRT 5.1.0 (`hailo-h10-all`) + `hailo-ollama` · RKNN-LLM 1.2.1 (`rknpu` driver v0.9.8)
100% 本地内核、NUMA 拓扑与 NPU 驱动诊断 — 所有 NUMA 内核参数调整、`-ot` 张量卸载与 CMA 物理内存整理均在本地断网完成。