Ch 20 · DSec
第四部分 · 后训练 · 20

DSec — 代码沙箱与安全护城河

为什么 V4 后训练必须自建沙箱平台而不能用现成 Docker 集群,"四衬底 + 单 SDK"如何用一个抽象同时满足"零冷启动函数调用"和"完整 OS 隔离"两个极端,3FS + EROFS + overlaybd 三层叠出来的镜像存储如何让 10w+ 沙箱共享同一份基础层,以及为什么 trajectory log 是 sandbox 级 WAL 的关键。

名词速通 · 一分钟看懂"DSec"

DSec = DeepSeek 自研代码沙箱平台:四种执行衬底(Function / Container / microVM / fullVM)背后是统一 SDK libdsec;分层镜像存储(EROFS + overlaybd)架在 3FS 上;trajectory log 提供 client fast-forward + 抢占恢复 + deterministic replay

一句话:把"沙箱"工程化到与训练框架同一抽象层级。 agentic post-training 每条 trajectory 都要在隔离环境里执行 bash / 改文件 / 跑测试,单集群同时跑 10w+ 沙箱才能跟上 OPD 的 rollout 吞吐。"用现成 Docker 起容器"在 1000 并发就开始崩,10w 是另一个量级 —— 必须重写镜像存储、装箱密度、抢占恢复每一层。

Sandbox(沙箱)
隔离的执行环境,一次 agentic rollout 对应一个 sandbox。模型生成命令 → 在 sandbox 里执行 → 把 stdout/stderr 喂回模型 → 下一步生成。必须隔离:模型可能跑 rm -rf /、可能尝试访问其它训练任务的文件、可能 fork bomb。生命周期与 GPU 训练 step 同步。
Function Call 衬底(DSec 第 1 档)
常驻容器池分发:维护几千个预热好的容器,agent 调用时分配一个,用完归还。零冷启动(毫秒级),无状态。适合简单工具调用(calculator、format checker、纯函数 API)。缺点:不能装新依赖,环境固定。
Container 衬底(DSec 第 2 档)
Docker + EROFS 分层镜像。每个 agent 任务有独立 container,按需加载镜像层。大多数 agent 任务都用这一档:可以装 pip、apt 包、跑测试。冷启动几百毫秒(取决于镜像层下载量)。
microVM 衬底(DSec 第 3 档)
Firecracker(AWS Lambda 同款)+ overlaybd 磁盘格式。VM 级隔离 + 容器级启动速度(亚秒),用 KVM 虚拟化但裁掉了 QEMU 大部分功能。适合安全敏感 + 高密度场景 —— 敌对代码、不可信网络访问。
fullVM 衬底(DSec 第 4 档)
QEMU 全虚拟化。能跑任意 guest OS(Windows、BSD、自定义 kernel)。冷启动秒级,开销最大但最通用。极少数任务需要(系统级测试、跨架构编译)。
libdsec(统一 SDK)
Python 接口,一行参数切换衬底。背后抽象掉 (1) 命令执行;(2) 文件传输;(3) TTY 交互 三件事。Agent 代码不感知底层是 Function 还是 microVM —— 这是工程上 fail-soft 的关键:高密度任务出问题时可以快速降级到更重的衬底。
EROFS(Enhanced Read-Only File System)
Linux 内核里的只读文件系统,专为 immutable 镜像设计。Container 衬底的基础层用它挂载到 overlayfs lowerdirs,写操作落到 upper 层。多个 sandbox 共享同一份只读基础层,节省海量重复存储。
overlaybd(Overlay Block Device)
microVM 衬底用的块设备级分层格式,类比 EROFS 但工作在 block 而非 file 层。只读基础层在 3FS 上跨实例共享,写操作落到本地 copy-on-write 层。VM 不能用 overlayfs 因为它需要 file system 层访问,overlaybd 是 VM 等价物。
3FS(DeepSeek Fire-Flyer File System)
DeepSeek 自研分布式文件系统(V3 时代已开源)。本章把它用作沙箱镜像层的后端存储 + 训练 / KV checkpoint 后端。横向扩到上千节点,提供 RDMA 直读。让单集群 10w+ 沙箱共享同一份镜像 base 成立。
Memory Reclamation(内存回收)
虚拟化环境下页缓存常被重复占用(host kernel 一份、guest kernel 一份),10w 并发时浪费数 TB。DSec 的优化让 host 能定期回收 guest 不再使用的页,把 overcommit 安全可行 —— 物理内存能装下的 sandbox 数翻倍。
Spinlock 抢占(spinlock contention)
container runtime(runC、containerd)内部有大量 spinlock,并发起多个 container 时线程在 lock 上自旋等待,单 sandbox CPU 开销主要来源。DSec 改写关键路径让锁竞争降到极低,per-host 装箱密度大幅提升
Trajectory Log(轨迹日志)
每个 sandbox 维护一份全局有序日志,每条命令调用 + 结果都持久化。承担三件事:(1) Client Fast-Forwarding —— 训练抢占时 sandbox 资源保留,恢复时直接 replay 已完成命令的缓存结果;(2) Provenance —— 每个状态变更可追溯;(3) Deterministic Replay —— 任何历史 session 完全可复现。是 sandbox 级 WAL,与 Ch19 token-WAL 同思路
一句话定位:DSec 把 agentic 工作流的执行环境提升到与训练框架同等抽象级别。"四衬底 + 单 SDK + 3FS 后端 + trajectory log"四件事少一件 OPD 就跑不到 10w+ 并发。这是 V4 在非模型层构建的最大工程资产。

1. 为什么需要专门的沙箱平台

V4 的 post-training 阶段 OPD 与 RL 都依赖 agentic rollout:模型生成"调 bash 跑测试"、"读 README 写代码"这种 trajectory,每条都需要一个隔离执行环境。论文给出四个动机:

  • Workload 极度异构:从 5ms 的 calculator 调用到几小时的完整 software engineering pipeline,单一衬底覆盖不了;
  • Image 又多又大:N 个领域 specialist × M 个工具版本 = 数千份镜像,每份数 GB,必须 lazy 加载;
  • 高密度部署:rollout 吞吐要求 10w+ 并发 sandbox / 集群;
  • 生命周期与训练协同:rollout 被 preempt 时 sandbox 状态要保留、checkpoint 时要能恢复 —— 与 Ch19 的 WAL 是同一姿态在 sandbox 层的体现。
数值演练 · 为什么 10w 是另一个量级 普通 Kubernetes 集群单节点 ~100 pods 是上限。10w sandbox / 集群假设 1000 节点 → 100 sandbox/节点 → 看起来 OK。但:
  • 每 sandbox 平均寿命 ~30 秒(rollout step 时间),每秒新建 / 销毁 ~3000 个
  • 普通 Docker daemon 单进程吞吐 ~10 启动/秒,差 300×
  • 每镜像 ~5GB,3000/秒 × 5GB = 15TB/s 镜像传输 → 远超任何单机网络。
普通方案根本起不来,必须把"镜像 base 层共享"做到极致 + 把"启动 / 销毁"做到亚毫秒。这就是 DSec 整章的存在理由。

2. 四种执行衬底,一套 SDK

DSec 通过 Python SDK libdsec 暴露一致接口,背后由四种衬底承接,按"启动延迟 → 隔离强度"排成谱系:

衬底底层典型用途冷启动隔离强度
Function Call常驻容器池分发无状态简单调用~ms(零冷启动)进程级
ContainerDocker + EROFS大多数 agent 任务~100-500ms容器级
microVMFirecracker + overlaybd安全敏感、高密度~亚秒VM 级
fullVMQEMU需要任意 guest OS~秒完整 VM

切换衬底只需改 SDK 一个参数 —— Agent 代码不感知。这条抽象的工程价值:fail-soft。Function Call 衬底跑某个任务出现资源不足 → SDK 自动 fallback 到 Container;Container 撞到 syscall 黑名单 → fallback 到 microVM。失败的代价是慢一点而非崩溃

Demo · 四种衬底在 4 个维度上的权衡(点切换 task 类型看推荐衬底)
交互
当前 task:简单工具调用 需要的优先维度: 推荐衬底:Function Function Container microVM fullVM

读图法:雷达图四轴分别是启动速度(上)/ 隔离强度(右)/ 兼容性(下)/ 密度(左)。每种衬底在四轴上有自己的能力轮廓。
点不同 task 按钮看:简单工具调用优先快 → Function;不可信代码优先隔离 → microVM;需要特定 OS 优先兼容性 → fullVM。四衬底不是冗余而是覆盖了一个 2D 决策空间的四个角

3. 分层镜像存储:让 10w 沙箱共享同一份 base

如果每个 sandbox 独立装一份 5GB 镜像,10w 并发 = 500TB 存储 + 海量重复传输。DSec 的核心优化:"只读基础层 + 写时复制 upper 层"的两级分层,base 层在所有 sandbox 间共享。

  • Container 衬底:base image 与 filesystem commit 作为只读 EROFS 层挂载到 overlayfs lowerdirs;3FS 提供后端存储;元数据放本地、数据块按需 fetch;
  • microVM 衬底:使用 overlaybd 磁盘格式 —— 只读基础层在 3FS 上跨实例共享,写操作落到本地 copy-on-write 层;
  • 这种 snapshot 是可链式的:base → middle → leaf,迭代镜像版本时新版只需新增一层 middle,几毫秒就能起一个新 sandbox。
📖 为什么 EROFS 与 overlaybd 是两件事

它们工作在不同抽象层:

  1. EROFS(文件系统层):Container 衬底是 Linux namespace + cgroup,guest 进程直接访问 host kernel 的 file system。所以分层用文件粒度 overlay:base 层提供只读文件树,upper 层接收写。简单高效,但需要 host kernel 信任 guest
  2. overlaybd(块设备层):microVM 衬底是真正的 VM,guest 看到的是虚拟硬盘。host 不能直接给 file system,必须给"块设备"。所以分层在block 粒度:base 层是只读 disk image,upper 层接收 block 级 CoW。开销稍高,但隔离更彻底(guest 不能 escape 到 host fs)

合起来:同一份 base 镜像在 3FS 上存一次,被任意多个 Container(通过 EROFS)和 microVM(通过 overlaybd)共享。3FS 的角色是"中央分布式存储",和 Ch19 teacher weight offload 是同一个 3FS 集群 —— 复用基础设施。

4. 高密度优化:把单节点装箱推到 ~100

要把单集群推到 10w+ 并发 sandbox,DSec 攻克两个非显然的瓶颈:

  1. 页缓存重复:虚拟化环境下 host kernel 与 guest kernel 各自缓存同一份磁盘 page,10w 并发浪费数 TB 物理内存。DSec 通过 memory reclamation 让 host 可以定期回收 guest 不再使用的 pages → overcommit 安全可行 → 同样物理内存能装的 sandbox 数翻倍;
  2. Spinlock 抢占:container runtime(runC、containerd)的内部锁是单 sandbox CPU 开销的主要来源。10w 并发起停时,工作线程在锁上自旋的时间能占到总 CPU 的 30%+。DSec 改写了关键路径让锁竞争大幅下降 → per-host 装箱密度提升数倍。
数值演练 · 装箱密度的物理上限 单节点 384 核 + 1.5TB DRAM:
  • 每 sandbox 平均 1 核 + 8GB DRAM(保守估计);
  • 核数限制:384 个;
  • 内存限制:1.5TB / 8GB = 192 个;
  • 合计上限 192 sandbox/节点;
  • 10w 并发 → 至少 ~520 节点 → 集群规模可承担;
没有 page-cache reclamation 时每 sandbox 实际占 ~16GB(host + guest 双份缓存),密度降到 96 → 集群规模翻倍 → 成本翻倍。这就是为什么"看似边缘"的 memory reclamation 是装箱密度的关键。

5. Trajectory Log:sandbox 级 WAL

Ch19 §3 的 token 粒度 WAL 解决rollout 推理的抢占恢复。DSec 在沙箱执行层有完全对应的设计:每个 sandbox 维护全局有序的 trajectory log,每条命令调用 + 结果都持久化。承担三件事:

  1. Client Fast-Forwarding(抢占恢复):训练任务被 preempt 时 sandbox 资源保留;恢复时 client(agent)重新连接到 sandbox,直接 replay 已完成命令的缓存结果,避开 non-idempotent 重放错误(不会重新跑 rm -rf temp/ 一遍);
  2. Fine-Grained Provenance(细粒度溯源):每个状态变更都可追溯到具体 trajectory 与 step。debug 训练数据时关键 —— "为什么这个 specialist 学到了奇怪行为",可以一路回溯到具体的 sandbox session;
  3. Deterministic Replay(确定性重放):任何历史 session 都能完全复现。这条与 Ch9 的 bit-identical 是同一思路:训练出问题,只有可复现才能 debug
为什么这是 V4 的"隐形护城河"

Ch18 OPD 的算法在原理上不复杂;难的是同时跑 10+ 个 trillion teacher + student + reward + 10w+ sandbox 仍能 24/7 不掉链子。DSec 把"执行环境"工程化到与训练框架同一抽象层级,是 agentic post-training 真正能规模化的前提。
竞争对手可以读论文学 OPD 算法,但要复刻 V4 的 post-training 吞吐,必须自己重写一个 DSec 等价物 —— 这是开源社区里几乎没人做过的工程量级。

6. 一句话总结

把整章压成一句话

DSec 把"沙箱"从 OPD 工作流的外部依赖提升到与训练框架同等抽象级别 —— 四衬底覆盖"快"到"重"的全谱、单 SDK 让 agent 代码不感知底层、3FS + EROFS + overlaybd 让 10w+ sandbox 共享同一份 base、trajectory log 让抢占恢复 / 溯源 / 重放都成立。Part 4 至此结束 —— 从 Ch16 的 specialist 备料到 Ch20 的沙箱执行,五章合起来定义了 V4 在后训练阶段"算法 + 工程 + 沙箱"三位一体的护城河。