
两根雷电线,把笔记本拼成大模型集群
两根雷电线,把笔记本拼成大模型集群
分布式推理的门槛,很多时候不是显卡,是那张几万块的 InfiniBand 网卡。有人用一坨内核代码加几根雷电线,把它干掉了:两台 128GB 的 Strix Halo 机器,跑 230B 的 MoE 模型,20 tok/s。
项目叫 donnerkeule,fork 自 hellas-ai 的 thunderbolt-ibverbs,一个研究性质的 Linux 内核模块加用户态库。它干的事一句话说清:把 USB4/Thunderbolt 4 的 DMA 通道,伪装成一个标准 InfiniBand RDMA 设备。不买网卡,不买交换机,你的 vLLM、NCCL、UCX 照常以为自己在用真 IB。
先泼冷水:README 第一屏就写着「this is a research driver. It is buggy, it is insecure, it is not for production」。我喜欢这种诚实——一个研究项目把警告写在自己脸上,比藏着掖着强多了。
先看它解决什么问题
RDMA 是分布式大模型的多机命脉:张量并行时,每层计算完都要把激活值在 GPU 间搬来搬去,走以太网 TCP 的话延迟和 CPU 占用都受不了。问题是,IB 网卡贵、IB 交换机更贵,消费级设备根本没有这东西。
这个项目的思路是不绕路:你的笔记本主板上本来就有 Thunderbolt 4 / USB4 控制器,它有 DMA 能力,点对点带宽每条 rail 大约 10-11 Gbit/s。那就让内核直接用这些 DMA 通道跑传输,再在 /sys/class/infiniband 下注册一个虚拟 IB 设备出来——上层全套 RDMA 生态原样能用,下层实际走的是雷电线。
实测效果(两台 128GB Strix Halo):
- 230B MoE 推理约 20 tok/s,单机塞不下这个模型
- Llama-3.1-8B TP=2,比单机更快
- 12B 模型全量微调,比走以太网快 11 倍
主执行链路:从 vLLM 到雷电线的完整路径
flowchart TD
A["vLLM / NCCL / UCX<br/>标准 RDMA 应用"] --> B["libibverbs<br/>标准 Verbs API"]
B --> C["userspace provider<br/>donnerkeule 用户态库"]
C --> D["内核模块<br/>ioctl 交互"]
D --> E{"WRITE ≥ 64 KiB ?"}
E -- "是 → 切条带并行" --> F["多 rail DMA ring<br/>雷电/USB4 线缆 ×N"]
E -- "否 → 直发" --> F
F --> G["对端按 PSN 归位内存<br/>单 ACK 随到达 rail 返回"]关键在于中间那层伪装做得足够标准:QP、CQ、内存注册这些 verbs 概念一个不少,应用层零改动。NCCL 不需要知道自己调用的 ibv_post_send 最后变成了 DMA ring 上的帧。
新分支干了什么:写条带化,单 QP 从 6G 到 44G
这是这次要讲的重点。fork 作者 neuhaus 的 feat/write-striping 分支,解决一个很具体的瓶颈。
上游版本有个限制:一个 QP 的数据只走一条 rail,大约 6 Gbit/s。想跑满带宽?可以,让 NCCL 配置多个 IB 设备、应用层自己分流——但那只对 NCCL 这类「懂行」的应用有效。vLLM 这类通过 UCX 走单 QP 的,就卡死在 6G。
write striping 把分流下沉到驱动层:
- 块条带化 WRITE:≥64 KiB 的写请求(阈值可调)切成每个 rail 一个连续块,片段带偏移和总长(F_BLOCK 标记)
- 接收端无锁放置:无论从哪个 rail 到,直接按偏移拷进目标内存区,按 PSN 顺序补齐后完成消息
- 每消息单 ACK:ACK 跟着最后到达的 rail 走,不搞每片段确认
- rail 池化:到同一台机器的所有线缆组成一个 QP 的 rail 池,HELLO 协议 v2 标识链路归属
效果,直接看数:
| 场景 | 上游 | write-striping 分支 |
|---|---|---|
| WRITE 1 MiB 单向 | ~6 Gbit/s | 44 Gbit/s |
| WRITE 4 MiB 双向 | – | 85 Gbit/s |
| WRITE 64 KiB 单向 | – | 32 Gbit/s |
| 4 KiB 双向 | 7.9 Gbit/s | 13.3 Gbit/s |
最有说服力的对比是这个:TP=2 跑推理,prefill 吞吐达到 ConnectX-3(PCIe 3.0 x4)FDR InfiniBand 链路的 96%,decode 达到 95%。几根雷电线,逼近一张正经 FDR 网卡九成半的水平。
里面有什么:模块拆解
flowchart TD
A["kernel/<br/>内核模块:IB 设备注册 · DMA ring · 写条带化"] --> B["userspace/<br/>libibverbs provider:QP/CQ/内存注册"]
B --> C["proto/<br/>HELLO v2:链路与主机标识"]
C --> D["bench/<br/>perftest 与模型实测基线"]
D --> E["packaging/<br/>DKMS · Nix flake · NixOS 模块 · CI"]几句话补完边界内的信息:
跨端边界。 只支持 Linux,内核 6.14 起,内核侧 GPL-2.0。物理层依赖 TB4/USB4 控制器的 DMA——也就是说,机器没有雷电口就没戏,Windows 完全不沾边。网络形态是点对点直连,两台机器到头了,不存在交换组网,别想拿它拼八机集群。
数据与状态流。 内存先注册成区域,发送侧有一次拷贝进帧(README 明说下一步做零拷贝),到 rail 后按 PSN 哈希表 O(1) 查找归位。状态大头在 QP 和 rail 池的映射上,HELLO v2 握手时建立,v1 兼容解析。
配置边界。 核心就一个开关:模块参数 native_write_striping=1 打开条带化;native_write_stripe_min_bytes 调切分阈值(默认 64 KiB);native_domain_mask 选哪些 USB4 控制器参与。带宽上限 = 线缆数 × 单 rail 带宽,你插四根线就是四条 rail。
谁该玩,谁别碰
扩展点:发送侧零拷贝(内存区页直接 DMA)、READ 侧的条带化(现在单条 READ 流只走一个 rail)、更多 rail 聚合。这个 fork 的 IMPROVEMENTS.md 写得清楚,是很好的内核网络开发学习材料。
风险点,认真说:它是研究驱动,buggy 且 insecure;DMA 直通意味着没有传输层的完整性保护;已知问题包括 >512 KiB 的 RDMA READ 会失败、开条带化后 >512 KiB 的 SEND 也失败、超长小 READ 序列偶发 retries exceeded。生产环境别想。
我的判断:适合两类人。一是有多台雷电口机器、想玩分布式推理的极客——这是目前最便宜的多机方案,没有之一;二是想学 RDMA 语义和内核网络驱动的工程师——一个能跑的「软件 IB」,比读十遍 verbs 规范管用。其他人,看个热闹就好,真要多机推理,老老实实买网卡。
你手上有几台带雷电口的机器?配置拉出来,评论区聊聊这套方案的可行性。
项目地址:https://github.com/neuhaus/donnerkeule/tree/feat/write-striping(fork 自 hellas-ai/thunderbolt-ibverbs)
