RPC: [create_node] invalid data ptr — split scheduler ships compute-flagged views to the wrong RPC worker (reproduced with deepseek4 and glm

这个报错发生在 llama.cpp 通过 RPC 将模型拆分为 2 个及以上 worker 并行推理时,调度器把带有 compute 标记的视图(view)分配给不拥有其底层缓冲区的远程 worker。优先升级到包含 PR #26500 的最新 master 版本,该修复已确认可解决此问题。

快速结论:这个报错发生在 llama.cpp 通过 RPC 将模型拆分为 2 个及以上 worker 并行推理时,调度器把带有 compute 标记的视图(view)分配给不拥有其底层缓冲区的远程 worker。优先升级到包含 PR #26500 的最新 master 版本,该修复已确认可解决此问题。

适用环境:llama.cpp master 分支(已验证提交 74ce15741、f1793c1c4 可复现);6× NVIDIA DGX Spark(GB10,aarch64,128GB 统一内存),CUDA 13.0;1 个 head(llama-server)+ 5 个 worker(ggml-rpc-server),200 GbE 网络;支持 TCP 与 RDMA 传输,传输方式不影响问题。

最快修复方案:升级到包含 PR #26500(“rpc: avoid serializing buffers from other servers”)的构建版本。该修复在 master 1548a240e 上已验证可解决 GLM-5.3 跨 5 个 RPC worker 的确定性崩溃。

注意事项:DeepSeek-V4-Pro 复现未在修复后重跑(权重已下线),但报错 tensor 属于同一类跨 worker 缓冲区视图,预计同样被修复;未验证前如需临时方案,可尝试关闭 offload(原 Issue 中的 workaround 在新版本中已不再需要)。

问题场景

在 llama.cpp 中使用 RPC(Remote Procedure Call)模式运行大型 MoE(Mixture-of-Experts)模型时,将模型层(layer)拆分到 2 个或更多 RPC worker 上并行推理。触发时模型加载或预热(warmup)阶段崩溃,与具体模型架构无必然关联——已在使用不同调度策略的 DeepSeek-V4-Pro 和 GLM-5.3(glm-dsa)上复现。

报错原文

RPC: [create_node] invalid data ptr — split scheduler ships compute-flagged views to the wrong RPC worker

Head: ggml/src/ggml-rpc/ggml-rpc.cpp:566: Remote RPC server crashed or returned malformed response
(earlier builds: E recv failed (bytes_recv=0, size_to_recv=8), then ggml_abort in graph_compute)

Worker (error locally instrumented to print tensor identity):
# deepseek4:
[create_node] invalid data ptr: name=dsv4_csa_state_kv_l16 (view) op=VIEW type=f32
  ne=[1024,32,1,1] data=0xf4101ca00000 buffer_id=0xc7b4b5d9e320 view_src_id=0x... view_offs=0 flags=16
# glm-dsa:
[create_node] invalid data ptr: name=top_k-40 (view) op=VIEW type=i32
  ne=[256,2,1,1] ... view_offs=0 flags=16
[graph_compute] failed to create graph node 30

原因分析

根因在客户端侧序列化张量(serialize_tensor)时,会随视图发送远程缓冲区句柄。当 ggml_backend_sched_split_graph 调度器将消费节点分配给与缓冲区所在设备不同的 RPC worker 时,接收端 worker 无法解析该外部缓冲区句柄,于是在 create_node 中正确拒绝(表现为 result->buffer == nullptr && result->data != nullptr),主动断开连接,head 端因此中止报错。

更深层的问题是调度器允许带有 GGML_TENSOR_FLAG_COMPUTE(flags=16)且预先分配的视图输入跨 RPC 设备被调度。由于 ggml_backend_rpc_device_supports_op 目前实现为直接返回 true(代码中留有 TODO),算子支持度无法引导分配决策。问题已被 PR #26500 修复,其方案是:仅当缓冲区属于接收端 RPC socket 时才在序列化中包含远程缓冲区指针,从而阻止跨 worker 写入。

环境排查

  • llama.cpp 版本:确认版本是否已包含 PR #26500(在 2026-09-05 之后合并,建议使用 master 1548a240e 或更新)。若版本为 74ce15741 或 f1793c1c4,则大概率触发。
  • workers 数量:确认是否 ≥ 2。单 worker(即使使用 MOE 拆分或 CPU offload)不会崩溃。
  • 模型架构:大型 MoE 模型(带每层状态压缩或动态稀疏注意力)更易触发;纯 vanilla MoE 或无限流压缩器调度的同系列模型则无此问题。
  • 任务拆分方式:检查拆分策略(纯层拆分即可触发,无需 -ot--cpu-moe 配置)。
  • Transport:TCP 或 RDMA 均可触发,传输方式不是关键变量。

解决步骤

  1. 升级 llama.cpp 源码到包含 PR #26500(rpc: avoid serializing buffers from other servers) 的提交(如 master 1548a240e 或更新)并重新编译。
  2. 若暂时无法升级,可优先尝试原 Issue 中验证的 workaround(关掉相关 offload,即 --no-offload 或类似参数);注意验证新版本中已标记此 workaround 不再需要。
  3. 重新运行原本会崩溃的启动命令(llama-server + 多个 ggml-rpc-server,包含相同的模型拆分参数),并在加载与生成阶段观察是否还有崩溃。特别建议用 GLM-5.3(glm-dsa)进行回归验证,因为它在修复前是确定性崩溃的。

验证方法

确认之前的确定性崩溃已消失。在 5 个 RPC worker + 纯层拆分运行 GLM-5.3 562GB 模型,模型加载阶段不再报 Remote RPC server crashedcreate_node invalid data ptr,单路输出与并发 multi-slot 解码在 TCP 和 RDMA 环境下均正常生成且无中断。

参考来源

ggml-org/llama.cpp #28047

ggml-org/llama.cpp PR #26500:rpc: avoid serializing buffers from other servers

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注