DSec — 代码沙箱与安全护城河
为什么 V4 后训练必须自建沙箱平台而不能用现成 Docker 集群,"四衬底 + 单 SDK"如何用一个抽象同时满足"零冷启动函数调用"和"完整 OS 隔离"两个极端,3FS + EROFS + overlaybd 三层叠出来的镜像存储如何让 10w+ 沙箱共享同一份基础层,以及为什么 trajectory log 是 sandbox 级 WAL 的关键。
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 同思路。
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 层的体现。
- 每 sandbox 平均寿命 ~30 秒(rollout step 时间),每秒新建 / 销毁 ~3000 个;
- 普通 Docker daemon 单进程吞吐 ~10 启动/秒,差 300×;
- 每镜像 ~5GB,3000/秒 × 5GB = 15TB/s 镜像传输 → 远超任何单机网络。
2. 四种执行衬底,一套 SDK
DSec 通过 Python SDK libdsec 暴露一致接口,背后由四种衬底承接,按"启动延迟 → 隔离强度"排成谱系:
| 衬底 | 底层 | 典型用途 | 冷启动 | 隔离强度 |
|---|---|---|---|---|
| Function Call | 常驻容器池分发 | 无状态简单调用 | ~ms(零冷启动) | 进程级 |
| Container | Docker + EROFS | 大多数 agent 任务 | ~100-500ms | 容器级 |
| microVM | Firecracker + overlaybd | 安全敏感、高密度 | ~亚秒 | VM 级 |
| fullVM | QEMU | 需要任意 guest OS | ~秒 | 完整 VM |
切换衬底只需改 SDK 一个参数 —— Agent 代码不感知。这条抽象的工程价值:fail-soft。Function Call 衬底跑某个任务出现资源不足 → SDK 自动 fallback 到 Container;Container 撞到 syscall 黑名单 → fallback 到 microVM。失败的代价是慢一点而非崩溃。
读图法:雷达图四轴分别是启动速度(上)/ 隔离强度(右)/ 兼容性(下)/ 密度(左)。每种衬底在四轴上有自己的能力轮廓。
点不同 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(文件系统层):Container 衬底是 Linux namespace + cgroup,guest 进程直接访问 host kernel 的 file system。所以分层用文件粒度 overlay:base 层提供只读文件树,upper 层接收写。简单高效,但需要 host kernel 信任 guest;
- 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 攻克两个非显然的瓶颈:
- 页缓存重复:虚拟化环境下 host kernel 与 guest kernel 各自缓存同一份磁盘 page,10w 并发浪费数 TB 物理内存。DSec 通过 memory reclamation 让 host 可以定期回收 guest 不再使用的 pages → overcommit 安全可行 → 同样物理内存能装的 sandbox 数翻倍;
- Spinlock 抢占:container runtime(runC、containerd)的内部锁是单 sandbox CPU 开销的主要来源。10w 并发起停时,工作线程在锁上自旋的时间能占到总 CPU 的 30%+。DSec 改写了关键路径让锁竞争大幅下降 → per-host 装箱密度提升数倍。
- 每 sandbox 平均 1 核 + 8GB DRAM(保守估计);
- 核数限制:384 个;
- 内存限制:1.5TB / 8GB = 192 个;
- 合计上限 192 sandbox/节点;
- 10w 并发 → 至少 ~520 节点 → 集群规模可承担;
5. Trajectory Log:sandbox 级 WAL
Ch19 §3 的 token 粒度 WAL 解决rollout 推理的抢占恢复。DSec 在沙箱执行层有完全对应的设计:每个 sandbox 维护全局有序的 trajectory log,每条命令调用 + 结果都持久化。承担三件事:
- Client Fast-Forwarding(抢占恢复):训练任务被 preempt 时 sandbox 资源保留;恢复时 client(agent)重新连接到 sandbox,直接 replay 已完成命令的缓存结果,避开 non-idempotent 重放错误(不会重新跑
rm -rf temp/一遍); - Fine-Grained Provenance(细粒度溯源):每个状态变更都可追溯到具体 trajectory 与 step。debug 训练数据时关键 —— "为什么这个 specialist 学到了奇怪行为",可以一路回溯到具体的 sandbox session;
- Deterministic Replay(确定性重放):任何历史 session 都能完全复现。这条与 Ch9 的 bit-identical 是同一思路:训练出问题,只有可复现才能 debug。
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 在后训练阶段"算法 + 工程 + 沙箱"三位一体的护城河。