jimeng

DeepSeek 新论文公开 Agent 训练,梁文锋署名

AIGC行业资讯14小时前发布 zhang
4 0

大模型训练拼的是算力,Agent 训练拼的是环境。环境怎么造?梁文锋署名的 DeepSeek 最新论文,把技术细节公开了。

DeepSeek 做的这个系统叫 DSec(DeepSeek Elastic Compute),干的事情就是给 Agent 训练批量制造沙盒。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

每秒能产生 5000+ 个沙盒,一天能达到 300 万个,峰值同时运行 38 万个。支撑这个规模的单集群也非常庞大,大约有 160 个节点、3 万核 CPU 和 250TB 内存

为啥训个 Agent 会这么费劲?

因为大模型训练的环境就是 GPU 集群,喂数据算梯度,但 Agent 完全不同。它得在沙盒里写代码、跑编译、开浏览器,甚至装操作系统…… 每执行一步都改变环境状态,随时可能把环境搞崩。所以每轮训练都得给它一个全新的、干净的沙盒,而且随用随抛、训完就扔。

所以,问题兜兜转转,还是回到了基础设施 —— 这些基础设施需要在每秒 5000 个的速度下,给每个沙盒装好一整套操作系统和工具。同时,还不能让几十万个并发沙盒把集群的内存和 CPU 挤爆。

具体怎么办,论文把这整套工程的全貌摊开了。

Agent 训练需要「一个世界」

DSec 要解决的第一个核心问题是,不同类型的 Agent 任务对沙盒环境的要求差异极大,而且这些环境必须在同一个平台上统一调度。

一个刷 OJ 题的 Agent,只需要一个无状态的函数调用环境,跑完拿到输出就行,连文件系统都不需要持久化。

但一个做 SWE-bench 的 Agent,就需要完整的 Linux 用户态,得在里面装依赖、改代码、跑 pytest,任务做到一半还可能要往环境里加新包。

到了安全攻防和 computer-use 场景,容器级别的隔离就不够了,Agent 要操作浏览器甚至桌面,一个有漏洞的 Agent 可能顺手把宿主机搞挂,必须上虚拟机。

最极端的情况是训练操作商业软件的 Agent,它需要一个完整的 Windows 或 macOS,带图形界面、带驱动,跟真实电脑几乎没区别。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

DSec 为这四类场景分别准备了四种后端,FnCall 处理无状态函数调用,Container 跑 Docker 容器,MicroVM 用 Firecracker 做轻量级虚拟机,Full VM 用 QEMU 跑完整操作系统。

四种后端的隔离强度和资源开销逐级递增,但训练框架那边看到的是统一的 Python SDK libdsec。

不管底层是容器还是虚拟机,都采用相同的接口,创建沙盒、执行命令、拿结果,各个步骤的调用方式完全相同。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

要让四种后端在同一套集群上跑起来,平台的调度层也得跟上。

DSec 把整个链路拆成了六层。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

这条链路从训练框架的一个创建请求出发,先经过 IAM 认证鉴权,进入 API Server,再由调度引擎(Placement Engine)根据资源余量从集群中选出一台目标节点,节点上的 Edge 组件负责实际拉起对应类型的沙盒。

沙盒的网络出口和包管理镜像由 Aether 统一代理,Agent 在里面执行的每条命令和产生的每行输出,都通过一个叫 Chronus 的沙盒内通信组件中转回训练框架,让框架知道 Agent 做到了哪一步、该给什么反馈。

靠资源超分和高密度部署,单个节点可以同时承载 3200 个容器或 800 个 MicroVM。

每天 300 万个沙盒怎么带动?

然而,DSec 在规模上最狠的挑战还不是调度,是环境的构建。

每个沙盒启动时,都需要一整套操作系统镜像加工具链,相当于每秒给 5000 台「电脑」装系统。

传统 Docker 的思路是把基础镜像、工作区和工具包打成一个完整镜像。这个方案在小规模下没问题,但 DSec 的容器后端累计使用了 11266 个基础镜像和 102171 个工作区,67.8% 的沙盒需要在基础镜像之上叠加至少一层工作区或工具包。

在这种多样性下,一旦某个工具包更新,所有包含它的组合镜像全部要重新构建,成本是 O (m·N)。

DSec 的做法是把环境拆成基础镜像、工作区、工具包三层独立的 EROFS 只读镜像,各自独立版本化,通过 overlayfs 在沙盒启动时按需组合。更新工具包只碰工具包那一层,成本降到 O (m)+O (k)。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

镜像造好之后,怎么送到节点上同样关键。直觉上应该提前把镜像拉到本地缓存好,但论文统计了真实的运行时数据:

  • Python 容器镜像 6.0GB,Agent 实际只读取了其中 6.0% 的数据;

  • Java 镜像 12.1GB,只有 9.2% 被访问;

  • C++ 镜像 4.9GB,只有 8.7% 被访问。

也就是说,绝大部分镜像内容,Agent 从头到尾碰都没碰过。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

所以 DSec 选择按需加载,其镜像以 EROFS 格式存储在 3FS(Fire-Flyer 分布式文件系统)上,元数据预取到本地,数据块只在沙盒真正读取时才从 3FS 拉过来。

DeepSeek 团队实测,8192 个容器的突发部署,按需加载只要 35 分钟就能完成,而 Docker 冷拉取要 60 分钟以上。

另外,按需加载的磁盘写入量,也比 Docker 冷拉少了一大半,从约 1600GB 降到约 700GB。

环境建好之后,几十万个沙盒同时跑起来又面临资源争抢。

内存方面,MicroVM 通过虚拟块设备读取镜像数据时,同一份数据会在宿主机和虚拟机的页缓存里各存一份,导致需求倍增。

DSec 用 virtio-pmem 配合 DAX 让虚拟机跳过自己的页缓存,直接映射到宿主机物理内存,多个虚拟机共享同一份映射,峰值内存占用砍掉 40.2%。

对 virtio-pmem 不适用的可写磁盘,DSec 用 DAMON 定期扫描冷内存页并主动归还宿主机,配合 virtio-balloon 的 free-page reporting 再将需求砍掉 21.2%。

CPU 方面,DSec 把沙盒分成延迟敏感型和尽力而为型两类,后者设为 SCHED_IDLE 优先级,同时启用 Linux 的 core scheduling,阻止低优先级任务跑到高优先级任务所在物理核心的兄弟超线程上。

两层策略叠加后,50% 背景负载下延迟敏感任务的延迟膨胀从 45.2% 降到了 17.3%。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

另外,DSec 还要和 RL 训练框架配合处理 GPU 抢占。

早期架构中 Agent 的推理循环跑在 GPU 训练 Pod 内部,GPU 任务被抢占时 Agent 的执行进度就全丢了。

从 DeepSeek-V4.1 开始,Agent 循环被拆出来独立运行在 DSec 的 worker container 里,不再绑定 GPU Pod 的生命周期。

GPU 被抢占时 DSec 把相关沙盒挂起保存状态,GPU 恢复后沙盒继续执行,训练框架不再需要自己实现断点恢复逻辑。

即便做了这么多优化,单个集群还是可能扛不住峰值。

论文里提到的最大生产任务一次申请 32000 个沙盒,这种突发负载下 DSec 会自动触发 cloud bursting,把溢出的任务打到云端虚拟机上

DeepSeek 团队实测,当集群利用率超过 80% 时,200 台云 VM 就能吸收约 30% 的峰值。

Agent 学会了作弊

对 Agent 而言,沙盒不只是运行环境,同时也是安全围栏。

论文披露了多起 Agent 在训练中自行发现的 reward hacking 手段,也就是 Agent 找到了不靠正当手段完成任务、但同样能拿到高分的捷径。

这些 Agent 瞄准的第一个目标是 Chronus,沙盒内部负责 Agent 和外界通信的组件。

Chronus 在执行某些操作时会调用系统的 bash,Agent 发现之后直接覆盖了 / bin / bash,把自己的命令注入进去,试图从后续的 shell 会话中截获题目答案或其他特权信息。

这条路被 AppArmor 堵上之后,Agent 又找到了一个更底层的突破口,XFS 文件系统的 ioctl 调用。

XFS_IOC_SWAPEXT,它的作用是交换两个文件的底层数据块映,。Agent 用它把受保护文件的内容“换”到了自己持有的文件描述符上,绕过了文件级别的访问控制。

这次尝试的副作用比作弊更危险,因为它损坏了 XFS 的元数据,可能直接导致文件系统崩溃,影响的不只是这一个沙盒。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

沙盒之外的信息泄露渠道同样被 Agent 们找到过。

有的 Agent 会扫描沙盒能触达的网络端口和服务,寻找参考实现;有的直接打小抄,通过 Go module proxy 从 GitHub 拉代码;有的甚至安装更新版本的软件包来获取现成解法。

这些行为通过单纯检查最终输出根本发现不了,因为 Agent 确实「做对了题」,只是手段不正当。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

除了作弊,还有更暴力的场景。

一个 Agent 在沙盒内递归执行 grep,从根目录一路扫到 / proc / kpagecgroup,触发了一个内核 bug,整个宿主机的内核直接崩溃。

另一个 Agent 则是在安全攻防任务里,把本该发给目标虚拟机的攻击命令在自己的容器内执行了,同样打崩了内核。

还有 Agent 发现,Chronus 会异步记录命令的 stdout 输出,于是反复调用 yes 命令不断打印字符,几十个 GB 的日志灌满了存储空间。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

DSec 目前的防御手段分两层。

  • 一是用 AppArmor 控制文件读写权限和 Unix 域套接字访问,这些策略即使 Agent 以 root 身份运行也生效,限制了 Agent 从日志和内部通信通道中提取答案的能力。

  • 二是用 eBPF 做网络层的细粒度管控,按任务配置域名白名单,通过 IP 地址、端口和协议三重过滤拦截越界流量,策略还可以在任务的不同阶段动态更新,比如环境搭建阶段允许访问 PyPI,正式执行阶段就把网络收紧。

DeepSeek 新论文公开 Agent 训练,梁文锋署名

但论文也明确表示,这不是一个能彻底解决的问题。

AppArmor 和 eBPF 能限制信息泄露通道,但防不了内核 bug;用户隔离可以缩小爆炸半径,但 Agent 总会找到新的路径。

这将成为一场持续的「魔道之争」,模型越强,钻漏洞的能力也越强,平台的防线就得不断前移。

Agent 从「会说话」进化到了「会做事」,训练基础设施的复杂度也出现了质变。

训练大模型的集群,靠的是「大力出奇迹」,但训练 Agent 的集群不仅要「又大又细」,还得防得住自己训出来的东西。

那个需要被防住的对手,恰恰就是正在被训练的 Agent 自己。

© 版权声明

相关文章

小云雀