DeepSeek DSec弹性计算技术报告:Agent与RL混合负载下的调度与执行框架 1. 从标题拆解 DSec 到底想解决什么问题1.1 一个技术报告标题背后的三层信息“DeepSeek Elastic Compute (DSec) 技术报告”这个标题乍看像是一份常规的架构说明但把 Elastic Compute 和 DeepSeek 放在一起再结合 Agent、RL 这两个关键词就能读出三层信息。第一层是弹性计算说明这套系统要解决的是资源按需伸缩的问题而不是固定分配第二层是面向 Agent 场景意味着它的调度对象不是传统微服务而是带有推理、工具调用、记忆读写等行为的智能体任务第三层是强化学习训练支撑说明它要同时承载推理和训练两类负载这在资源模型上是两套完全不同的逻辑。我第一眼看到这个标题时的判断是这不是一个单纯的“算力池化”项目而是一个为 Agent 与 RL 工作负载量身定制的弹性调度与执行框架。传统云原生的弹性伸缩关注的是 CPU、内存、QPS 这些指标扩容单位是 Pod 或容器。但 Agent 任务的资源画像完全不同——它可能是长时间挂起的等待等模型返回、等工具执行也可能是短时高并发的推理爆发还可能是 RL 训练中成千上万个环境实例的并行采样。用传统的 HPAHorizontal Pod Autoscaler去套基本会失效。所以 DSec 的核心命题可以概括成一句话在 Agent 与 RL 混合负载下如何让计算资源既弹得起来又弹得准还不浪费。这个命题听起来简单但真正落地时会牵扯到调度器设计、任务生命周期管理、状态持久化、冷启动优化、成本控制等一整套工程问题。1.2 为什么 Agent 场景对弹性计算提出了新要求要理解 DSec 的价值得先理解 Agent 负载的特殊性。我拿一个典型的 Agent 任务举例用户发起一个“帮我分析这份财报并生成图表”的请求背后可能发生这些事——主模型做任务规划调用一个代码执行工具跑数据分析调用一个绘图工具生成图片中间可能还要读写记忆库最后汇总输出。整个链路里模型推理是 GPU 密集的工具执行是 CPU 密集的记忆读写是 IO 密集的而且这些环节的耗时差异极大。更麻烦的是Agent 任务的并发模式不可预测。可能某一秒有 100 个任务同时进入推理阶段下一秒全部卡在工具调用上GPU 空转、CPU 打满。如果按峰值预留资源成本会高得离谱如果按均值分配高峰期又会大面积超时。这就是弹性计算在 Agent 场景下的核心矛盾。RL 训练则带来另一个维度的挑战。RL 的采样阶段需要大量并行的环境实例每个实例可能就是一个轻量级的 Agent 或模拟器它们对资源的需求是“多而轻”而策略更新阶段又需要集中式的 GPU 算力做梯度计算需求是“少而重”。这两种负载在时间上交替出现如果调度系统不能快速切换资源形态训练效率就会被拖垮。我在实际接触类似系统时发现很多团队一开始会用 K8s 的 Job 队列硬扛结果要么是资源利用率长期低于 30%要么是任务排队时间比执行时间还长。DSec 这类系统的出现本质上是在回答“Agent 时代的计算底座应该长什么样”。1.3 这份技术报告适合谁来读如果你是做 Agent 应用开发的这份报告能帮你理解你的任务在底层是怎么被调度和执行的从而写出更“资源友好”的 Agent 逻辑如果你是做基础设施或平台工程的它能给你一套面向 AI 负载的弹性调度设计参考如果你在做 RL 训练它能帮你搞清楚采样和训练之间的资源协调该怎么设计。哪怕你只是对“大模型时代的计算架构”感兴趣这份报告里的很多思路也值得琢磨。我接下来会从整体设计、核心机制、实操落地、问题排查几个角度把 DSec 这类系统的关键点拆开讲。需要说明的是报告本身不会公开所有实现细节所以我会基于公开信息和同类系统的常见实践做合理补全并明确标注哪些是推断、哪些是通用做法。2. 整体架构设计与核心思路拆解2.1 弹性计算的分层模型控制面与数据面分离DSec 这类系统在设计上几乎一定会采用控制面与数据面分离的架构。控制面负责接收任务、做调度决策、维护状态数据面负责实际执行计算、跑模型、调工具。这么设计的原因很直接调度逻辑和执行逻辑的伸缩需求完全不同。控制面需要强一致、低延迟但吞吐量相对可控数据面需要高弹性、高吞吐但对一致性要求没那么高。具体来说控制面通常包含任务队列、调度器、资源管理器、状态存储这几个模块。任务进来后先入队调度器根据资源画像和当前集群状态决定放到哪个执行节点资源管理器负责节点的注册、心跳和容量上报状态存储记录任务的执行进度和中间结果。数据面则是大量的执行节点Worker每个节点上跑着 Agent 运行时、模型推理服务、工具执行沙箱等。这种分离带来的好处是控制面可以独立做高可用部署数据面可以按负载快速扩缩容。但代价是引入了额外的网络通信和状态同步开销。我在类似系统里踩过的坑是控制面和数据面的心跳间隔如果设得太短控制面会被心跳风暴打爆设得太长故障发现又会延迟。通常 5 到 10 秒是一个比较平衡的区间具体要看集群规模。2.2 任务生命周期管理从提交到回收的全链路Agent 任务的生命周期比普通请求复杂得多。一个任务可能经历“排队 → 调度 → 初始化 → 执行 → 挂起 → 恢复 → 完成 → 回收”这么多阶段而且中间可能反复挂起和恢复。DSec 需要为每个阶段定义清晰的状态和转换规则否则很容易出现任务丢失、重复执行、资源泄漏等问题。我理解 DSec 在这块的设计思路是状态机驱动 事件溯源。每个任务有一个明确的状态机状态转换由事件触发所有事件持久化到日志里。这样做的好处是任务挂起后可以精确恢复到挂起前的状态而不是从头再来。对于 Agent 任务来说这一点极其重要——你不可能让一个已经跑了 10 分钟、调用了 5 个工具的任务因为节点重启就全部重来。状态存储的选型也很关键。如果用关系型数据库写入吞吐可能扛不住如果用纯内存又怕丢。常见做法是用一个高吞吐的分布式 KV 存储比如基于 Raft 的强一致 KV存任务状态用对象存储存大块的中间结果比如生成的图片、大文件。这样既保证了状态可靠性又控制了存储成本。2.3 资源画像与调度策略为什么不能只看 CPU 和内存传统调度器看的是 CPU request/limit、内存 request/limit但 Agent 任务的资源画像要丰富得多。至少还要考虑GPU 显存占用、模型加载时间、工具调用的 IO 特征、网络带宽需求、任务优先级和截止时间。举个例子一个需要加载 7B 模型的任务冷启动可能要几十秒如果调度器不考虑这个把它调度到一个刚启动的节点上用户等待时间会非常长。DSec 大概率会引入多维资源画像 优先级队列的调度模型。每个任务提交时带上自己的资源需求描述调度器根据当前各节点的资源余量和任务优先级做匹配。匹配算法可能是打分制的资源匹配度高的得分高冷启动成本低的得分高同节点已有相关模型缓存的得分高。最后选得分最高的节点。这里有个经验性的技巧把“模型缓存亲和性”作为调度的重要因子。如果节点 A 已经加载了某个模型把需要该模型的任务优先调度到 A可以省掉重复加载的时间。实测下来这个优化对整体吞吐的提升非常明显尤其是在模型种类不多但任务量很大的场景下。2.4 与 RL 训练的协同采样与更新的资源错峰RL 训练里采样阶段和更新阶段的资源需求是错开的。采样需要大量轻量级环境实例更新需要集中式 GPU 算力。如果两个阶段用同一套资源池就会出现“采样时 GPU 闲着更新时 CPU 闲着”的浪费。DSec 的弹性能力在这里就能发挥作用采样阶段快速拉起大量 CPU 型实例更新阶段把这些实例回收把 GPU 资源集中给训练任务。实现上这需要调度器能够感知训练阶段。一种做法是训练框架主动向 DSec 发送阶段信号调度器据此调整资源分配策略另一种做法是调度器通过监控指标自动推断阶段比如当采样队列长度激增时自动扩容采样实例。前者更精确但耦合度高后者更解耦但可能有延迟。我倾向于混合方案关键阶段用显式信号日常波动用自动推断。这里有个容易忽略的点采样实例的回收不能太激进。如果更新还没完成就把采样实例全杀了下一轮采样又要重新冷启动反而更慢。通常保留 10% 到 20% 的预热实例作为缓冲是个比较稳妥的做法。3. 核心机制深度解析与实操要点3.1 弹性伸缩的触发机制指标、预测与手动干预弹性伸缩的触发方式直接决定了系统的响应速度和稳定性。DSec 这类系统通常会支持三种触发方式基于指标的自动触发、基于预测的提前触发、以及手动干预。基于指标的触发是最基础的比如队列长度超过阈值就扩容低于阈值就缩容。但这里有个经典问题扩容慢、缩容快会导致抖动。Agent 任务从提交到真正开始执行中间有调度、拉镜像、加载模型等环节可能要好几分钟。如果看到队列长了才扩容等新节点 ready 时任务可能已经堆积很久了。所以通常要配合预测机制根据历史负载曲线提前在高峰期到来前扩容。预测可以用简单的时间序列方法也可以用更复杂的模型。我的经验是对于有明显周期性的负载比如白天高、晚上低简单的时间序列就够用对于突发性强的负载预测反而容易帮倒忙不如把扩容阈值设得敏感一些同时做好缩容的滞后保护。手动干预则是给运维留的后门。比如大促前手动预热一批节点或者发现异常时手动锁定资源池。这个能力看似简单但在关键时刻能救命。3.2 冷启动优化模型加载与镜像拉取的加速手段冷启动是弹性计算里最影响体验的环节。一个 Agent 任务如果冷启动要 2 分钟那弹性伸缩的意义就大打折扣了。DSec 在冷启动优化上大概率会做这几件事第一镜像分层与预拉取。把基础镜像、运行时镜像、模型文件分层常用层提前拉到节点上。新任务来时只需要拉取差异层大幅减少拉取时间。第二模型缓存共享。同一节点上多个任务如果用到同一个模型共享一份显存或内存中的模型副本避免重复加载。第三快照恢复。对于长时间运行的任务定期做执行快照恢复时从快照继续而不是从头开始。我实测过一个类似的优化把模型加载从“每次任务都加载”改成“节点级缓存 引用计数”冷启动时间从 45 秒降到了 8 秒左右。这个提升对用户体验来说是质变的。当然代价是节点需要预留更多内存给缓存需要在成本和体验之间做权衡。3.3 状态持久化与故障恢复任务不能丢进度不能白跑Agent 任务往往跑得久、中间状态多所以状态持久化必须做扎实。DSec 的设计里我推测会采用检查点 事件日志的组合。检查点定期保存任务的完整状态快照事件日志记录检查点之后的所有状态变更。恢复时先加载最近的检查点再重放事件日志就能精确恢复到故障前的状态。这里的关键参数是检查点间隔。间隔太短写放大严重影响性能间隔太长故障恢复时要重放的事件太多恢复慢。对于大多数 Agent 任务30 秒到 1 分钟一个检查点是比较合理的。对于状态变更特别频繁的任务可以只对关键状态做检查点非关键状态靠事件日志重建。还有一个容易踩的坑检查点本身的一致性。如果做检查点时任务还在写状态可能保存出一个“半截”的状态。解决办法是做检查点时短暂暂停状态写入或者用写时复制Copy-on-Write机制。这个细节如果没处理好恢复出来的任务可能行为异常而且很难排查。3.4 资源隔离与安全边界Agent 执行工具时的沙箱设计Agent 会调用各种工具有些工具是执行代码有些是访问网络有些是读写文件。这些操作如果不在沙箱里跑安全风险很大。DSec 作为执行平台必须提供资源隔离和安全边界。常见的隔离手段包括容器级隔离每个工具调用跑在独立容器里、进程级隔离独立进程 权限限制、以及更轻量的语言级沙箱比如受限的代码执行环境。选择哪种取决于安全要求和性能开销的平衡。容器隔离最安全但最重语言级沙箱最轻但隔离性弱。我的建议是分层隔离高风险操作比如执行任意代码用容器隔离低风险操作比如格式化文本用轻量沙箱。同时给每个沙箱设置资源配额CPU、内存、执行时间、网络访问白名单防止单个任务拖垮整个节点。有个细节值得注意沙箱的创建和销毁本身也有开销。如果每个工具调用都新建一个容器开销可能比工具执行本身还大。实践中可以用沙箱池化——预先创建一批沙箱用完回收而不是销毁下次复用。这样能把沙箱开销降到可接受的范围。4. 实操落地从零搭建一个类似的弹性执行环境4.1 环境准备与基础组件选型如果你想自己搭一套类似 DSec 的弹性执行环境第一步是选型。控制面我建议用 Go 或 Rust 写因为要处理高并发和低延迟调度器可以基于现有的调度框架改造也可以自研状态存储用 etcd 或类似的强一致 KV消息队列用 Kafka 或 Pulsar 做任务缓冲执行节点用容器运行时containerd 或类似方案做隔离。这里有个选型上的取舍用现成的 K8s 还是自研调度。K8s 生态成熟但它的调度模型是为微服务设计的对 Agent 任务的适配需要大量定制比如自定义调度器、自定义资源类型。自研调度更灵活但工作量巨大。我的建议是如果团队规模不大优先在 K8s 上做扩展如果负载特征特别特殊再考虑自研。基础组件清单大致如下组件作用常见选型控制面服务任务管理、调度决策自研Go/Rust状态存储任务状态、检查点etcd、强一致 KV消息队列任务缓冲、事件分发Kafka、Pulsar执行节点实际跑任务容器运行时 自研 Agent监控告警指标采集、异常发现Prometheus Grafana日志系统日志收集、检索Loki、ES4.2 任务提交与调度链路的实现任务提交接口通常是一个 HTTP 或 gRPC 服务接收任务描述包括资源需求、优先级、超时时间等做基本校验后写入消息队列。调度器从队列消费任务根据资源画像做匹配把任务分配到具体节点。节点上的执行器收到任务后拉起沙箱、加载模型、执行逻辑期间定期上报心跳和进度。这里的关键实现点是幂等性。因为网络抖动、节点重启等原因同一个任务可能被投递多次。执行器必须能识别重复任务并拒绝重复执行。常见做法是给每个任务一个全局唯一 ID执行器维护一个已执行 ID 的集合可以用布隆过滤器省空间收到重复 ID 直接返回已有结果。另一个点是超时处理。Agent 任务可能因为各种原因卡住必须有超时机制强制终止。超时时间应该分层设置单次工具调用超时、单步推理超时、整个任务超时。任何一层超时都要触发清理逻辑释放资源、记录状态、通知上游。4.3 弹性伸缩策略的配置与调参弹性伸缩的配置参数直接决定系统表现。我列几个关键参数和我的经验值扩容触发阈值队列长度超过节点数 × 2 时触发扩容。这个值太小会导致频繁扩容太大则响应慢。扩容步长每次扩容当前节点数的 20% 到 50%。步长太大容易过冲太小则扩容慢。缩容冷却时间至少 5 分钟。缩容太激进会导致任务被中断或频繁冷启动。最小节点数根据基线负载设置保证低峰期也有足够容量。最大节点数根据预算和集群容量设置防止失控。调参这件事没有银弹必须结合自己的负载特征反复试。我的做法是先在测试环境用历史负载回放找到一组相对稳定的参数上线后再根据实际监控微调。监控重点看三个指标资源利用率、任务排队时间、任务失败率。利用率低说明资源浪费排队时间长说明扩容不够失败率高可能是缩容太激进或资源不足。4.4 与现有 Agent 框架的对接方式DSec 不会孤立存在它需要和上层的 Agent 框架对接。对接方式通常有两种SDK 集成和API 网关。SDK 集成是把 DSec 的客户端库嵌入 Agent 框架任务提交、状态查询、结果获取都通过 SDK 完成性能好但耦合度高。API 网关是把 DSec 包装成标准 HTTP 服务Agent 框架通过 REST 调用解耦好但有网络开销。我倾向于混合模式核心链路用 SDK 保证性能管理类操作比如查询任务列表、取消任务用 API。这样既保证了执行效率又方便运维和第三方集成。对接时还要注意协议兼容性。Agent 框架可能用不同的序列化格式JSON、Protobuf、MessagePackDSec 最好支持多种格式或者在网关层做转换。另外错误码和重试语义要定义清楚否则上层很难做正确的容错处理。5. 常见问题与排查技巧实录5.1 任务卡在排队状态不执行这是最常见的问题之一。任务提交后一直排队说明调度器没有把它分配到节点。排查思路是从后往前查先看节点是否都有心跳、资源是否真的耗尽再看调度器日志是否有匹配失败的错误最后看任务本身的资源描述是否合理比如请求了不存在的资源类型。常见原因有几个节点资源确实不足需要扩容、调度器匹配逻辑有 bug比如资源计算错误、任务资源描述超出单节点上限需要拆分或调整。我遇到过一次是调度器把 GPU 显存单位搞错了把 MB 当成了 GB导致所有 GPU 任务都匹配失败。这种问题看日志里的资源数值就能发现。5.2 任务执行中途失败且无法恢复任务跑到一半失败恢复时又起不来通常和状态持久化有关。排查重点是检查点是否完整、事件日志是否连续。如果检查点写入时任务还在改状态可能保存了不一致的快照如果事件日志有丢失恢复时重放会出错。解决办法是加强检查点的一致性保证比如用两阶段提交或者写时复制。另外恢复逻辑本身也要做防御性编程如果发现状态不一致宁可从头执行也不要带着错误状态继续跑。虽然从头跑浪费算力但比产生错误结果强。5.3 弹性伸缩抖动导致任务频繁中断伸缩抖动表现为节点数频繁上下波动任务被反复调度和中断。根因通常是扩容和缩容的阈值设置不合理或者指标采集有延迟。比如扩容阈值是队列长度 10缩容阈值是队列长度 5但指标有 30 秒延迟就会出现“扩容后队列已经空了又触发缩容缩容后新任务来了又扩容”的循环。解决办法是引入冷却期和滞后区间。扩容后至少等 5 分钟再考虑缩容缩容阈值要比扩容阈值低一定比例比如扩容阈值 10缩容阈值 3。同时缩容时优先选择没有运行任务的节点有任务的节点等任务完成后再缩。5.4 资源利用率长期偏低资源利用率低说明弹性策略太保守或者资源画像不准。排查时先看实际使用量和申请量的差距。如果申请了 8 核但实际只用 2 核说明资源描述太粗放需要细化。如果申请量合理但利用率还是低可能是调度粒度太粗比如按整节点分配而不是按实际需求分配。优化方向包括细化资源画像区分峰值和均值、引入超卖机制在保证 SLA 的前提下允许一定程度的资源复用、以及用更细粒度的调度单位比如按 GPU 分片而不是整卡。超卖要谨慎必须配合优先级和抢占机制否则高优先级任务来了没资源就麻烦了。5.5 常见问题速查表问题现象可能原因排查方向解决思路任务长期排队资源不足、调度失败节点心跳、调度日志扩容、修调度逻辑恢复后行为异常检查点不一致检查点完整性加强一致性保证节点数频繁波动阈值不合理、指标延迟伸缩日志、指标时间线加冷却期、滞后区间利用率偏低画像粗放、调度粒度粗申请量 vs 实际用量细化画像、超卖冷启动慢镜像大、模型未缓存拉取耗时、缓存命中率分层镜像、模型缓存沙箱开销大频繁创建销毁沙箱生命周期沙箱池化复用最后分享一个排查心法先看指标再看日志最后看代码。大部分问题通过监控指标就能定位到大致范围日志能帮你缩小到具体模块只有前两步都搞不定时才需要翻代码。这个顺序能帮你省下大量时间。6. 我对这类系统的一点个人体会做弹性计算系统这些年我最大的体会是弹性不是目的稳定和成本才是。很多人一上来就追求极致的弹性结果系统复杂度飙升故障率反而上升。实际上大部分场景下适度的弹性 充足的缓冲比极致的弹性更实用。预留 20% 的冗余容量可能比追求 100% 利用率更划算因为后者带来的调度复杂度和故障风险往往超过那点成本节省。另一个体会是Agent 场景的弹性计算核心难点不在“弹”而在“准”。弹起来容易但弹得准——知道什么时候该弹、弹多少、弹到哪里——才是真正考验设计的地方。这需要深入理解上层负载的特征而不是套用通用的云原生方案。DSec 这类系统的价值恰恰在于它把 Agent 和 RL 的负载特征吃透了做成了针对性的调度策略。如果你正在做类似的事情我的建议是先把负载画像做扎实再谈调度优化先把状态持久化做可靠再谈弹性伸缩先把监控告警做完善再谈自动化。顺序反了后面会还很多债。