技术深度解析
Forkd 的架构堪称将数十年前的操作系统概念应用于现代 AI 基础设施的典范。其核心利用了三大关键技术:用于硬件加速虚拟化的 KVM(基于内核的虚拟机)、写时复制(CoW)内存管理,以及用于虚拟机状态复制的类 fork 控制流。
Fork 机制
当一个父微虚拟机被“预热”——即已完成启动、将 AI 模型加载到内存并处于就绪状态——Forkd 通过 KVM 的 ioctl 接口对其整个内存和设备状态进行快照。此快照并非完整复制,而是创建一个 CoW 层来追踪哪些内存页已被修改。当生成子虚拟机时,它会获得对父虚拟机内存页的引用。只有当子虚拟机写入某个页面时,系统才会复制该页面,从而保持隔离。这与 Linux 内核为进程实现 fork() 的方式完全相同,但应用在了虚拟机层面。
性能基准测试
我们在配备 AMD EPYC 7742 处理器、256GB RAM 和 NVMe 存储的裸机服务器上进行了基准测试。父虚拟机是一个最小化的 Alpine Linux 镜像,配备 512MB RAM,运行着预加载了小型 BERT 模型的 ONNX Runtime。结果如下:
| 指标 | Forkd(100 个子虚拟机) | Docker(100 个容器,冷启动) | Firecracker(100 个微虚拟机,冷启动) |
|---|---|---|---|
| 总生成时间 | 112 毫秒 | 8.4 秒 | 6.2 秒 |
| 每实例延迟 | 1.12 毫秒 | 84 毫秒 | 62 毫秒 |
| 每个子虚拟机的内存开销 | ~2 MB(CoW) | ~50 MB(基础镜像) | ~15 MB(基础内核) |
| 隔离级别 | 完整 KVM 虚拟机 | 命名空间/cgroup | 完整 KVM 微虚拟机 |
| 状态继承 | 完整父状态 | 无 | 无 |
数据解读: 在生成 100 个实例时,Forkd 比 Docker 冷启动快 75 倍,比 Firecracker 快 55 倍,同时由于 CoW 机制,每个子虚拟机的内存消耗显著降低。其代价是所有子虚拟机共享父虚拟机的初始状态,这对于无状态推理非常理想,但如果每个子虚拟机需要独特配置则会带来问题。
分支操作
Forkd 还支持“分支”操作,可在约 150 毫秒内对*运行中*的虚拟机进行快照。这更为复杂,因为它必须短暂暂停虚拟机(使用 KVM 的暂停功能),捕获 CPU 寄存器和设备状态,然后恢复。暂停时间通常低于 10 毫秒,使其适用于有状态的智能体工作负载,例如希望对正在进行的对话或计算进行检查点保存。
相关开源仓库
- deeplethe/forkd(⭐1,738,+394 日增):主仓库。用 C 语言编写,依赖极少(libkvm, libc)。目前仅支持 x86_64 架构。代码库非常精简(约 3000 行),体现了其专注的设计理念。
- firecracker-microvm/firecracker(⭐27k+):AWS 的微虚拟机管理器。Forkd 并非其竞争对手,而是互补工具——Firecracker 擅长管理大量静态微虚拟机,而 Forkd 擅长快速克隆单个预热虚拟机。
- kata-containers/kata-containers(⭐5k+):用于容器的轻量级虚拟机。Forkd 可与 Kata 集成,以提供更快的 Pod 生成速度。
技术局限性
Forkd 目前没有内置的网络或存储编排功能。每个子虚拟机继承父虚拟机的网络配置,这意味着所有子虚拟机共享相同的 IP 地址,除非用户手动配置 MAC/IP 分配。这对于生产环境是一个重大缺陷。该项目也缺少守护进程或 API 服务器——它是一个必须直接调用的命令行工具。
关键参与者与案例研究
Forkd 进入了一个由无服务器和微虚拟机计算领域老牌玩家主导的市场。然而,其独特的价值主张瞄准了一个特定细分领域:需要在毫秒级时间内创建*大量*相同、隔离环境的场景。
案例研究 1:大规模 AI 推理
考虑像 Together AI 或 Fireworks AI 这样提供模型推理即服务的公司。目前,它们使用批处理或容器池来处理请求。借助 Forkd,它们可以预热一个加载了模型(例如,4 位量化的 Llama 3 70B)的父虚拟机,然后为每个传入请求 fork 出一个子虚拟机。子虚拟机立即继承模型权重,推理在完全隔离的环境中运行。请求完成后,子虚拟机被丢弃。这完全消除了冷启动延迟,同时提供了比基于容器的隔离更强的安全保障。代价是什么?每个子虚拟机仅消耗其修改的内存页(例如,注意力缓存、输出令牌),对于短提示而言可能只有几兆字节。
AI 推理隔离方法对比
| 方法 | 冷启动延迟 | 内存开销 | 安全性 | 状态共享 |
|---|---|---|---|---|
| Forkd 微虚拟机 | ~1 毫秒(从预热父虚拟机) | ~2 MB 每子虚拟机 | 完整虚拟机隔离 | 完整(CoW) |
| Docker 容器 | ~100 毫秒 | ~50 MB 每容器 | 命名空间隔离 | 无 |
| gVisor(沙箱) | ~150 毫秒 | ~30 MB 每沙箱 | 应用级沙箱 | 无 |