一、RPC 分布式推理的核心原理
llama.cpp 的 RPC 模式基于一个非常朴素的想法:大模型是一层一层叠起来的,不同层可以在不同机器上算。
Transformer 模型的每一层计算相对独立——上一层算完把结果传给下一层。这就给了分布式推理一个天然的切分点。
llama.cpp 的做法是把模型按层数切成 N 段,主节点负责输入输出层以及结果聚合,Worker 节点各自负责中间若干层。
客户端 主节点 Worker 集群
│ │ │
│ HTTP POST │ │
│ /v1/chat/completions │ │
├────────────────────────▶│ │
│ │ 加载完整模型到内存 │
│ │ 检测所有 RPC Worker │
│ │ │
│ │ Layer 0-5 (输入层) │
│ │ ┌─────────────────┐ │
│ │ │ 本地 GPU/CPU │ │
│ │ └─────────────────┘ │
│ │ │
│ │ Layer 6-17 gRPC ────▶│ Worker 1 (i5-4460)
│ │ Layer 18-29 gRPC ────▶│ Worker 2 (如果有)
│ │ Layer 30-35 gRPC ────▶│ Worker 3 (如果有)
│ │ │
│ │ Layer 36-40 (输出层) │
│ │ ┌─────────────────┐ │
│ │ │ 结果聚合 │ │
│ │ └─────────────────┘ │
│ │ │
│ JSON Response │ │
◀─────────────────────────┤ │
这个架构有几个非常精妙的设计:
第一,Worker 不需要模型文件。 主节点加载完整的 GGUF 模型后,会自动把对应层的权重通过 RPC 发送给 Worker。Worker 收到数据就开始算,算完把中间结果传回来。这意味着 Worker 节点可以是一台”裸机”——什么都不用装,启动 rpc-server.exe 就行。
第二,完全兼容 OpenAI API。 llama-server 暴露的就是标准 /v1/chat/completions 端点。任何兼容 OpenAI SDK 的应用(ChatBox、Open WebUI、自己写的脚本)都能无缝接入,完全不需要感知后面是个分布式集群。
第三,开箱即用,零依赖。 llama.cpp 官方预编译包里 llama-server.exe(主节点)和 rpc-server.exe(Worker)都在一起。下载、解压、运行——三步搞定。
二、为什么 RPC 比你想的更高效
很多人会直觉认为”把计算拆到两台机器,网络传输的开销会把加速吃掉”。实际上,llama.cpp 的 RPC 协议在这方面设计得很聪明:
传输的不是完整激活值。 在 Transformer 推理中,每一层的输出是一个 [batch, seq_len, hidden_dim] 的张量。对于 14B 模型,hidden_dim 约 5120。在 ctx=2048 时,一个层的输出大约只有几 MB。千兆局域网传输几 MB 数据只要几十毫秒——而计算这几 MB 数据在 CPU 上需要几百毫秒。传输时间远小于计算时间。
通信模式是”请求-响应”,不是持续流。 每个 Worker 收到一层数据 → 算完 → 传回结果 → 等待下一层。这避免了复杂的流控和背压问题。
这与 GPU 集群的 NVLink/NCCL 全互联不同——后者处理的是数百 GB/s 的梯度同步,而 RPC 模式下传输量小得多,所以千兆以太网完全够用。