最近折腾 AI Agent 的人越来越多了。
一开始通常只跑一个 Agent。
比如一个负责查资料,一个负责写代码,再加一个负责执行自动化任务。单个跑的时候感觉服务器完全够用,CPU 也没怎么动,内存还有很多剩余。
于是很容易产生一个错觉:
“我这台机器跑一个 Agent 绰绰有余,那跑十个应该也没问题吧?”
真正把 Agent 数量堆起来以后,往往就不是这么回事了。
因为多个 Agent 同时运行,消耗的并不只是模型本身的资源。上下文、工具调用、浏览器、Python 进程、Docker 容器、向量数据库、缓存、网络连接,甚至 Agent 卡住以后堆积起来的任务队列,都会开始抢资源。
所以如果准备长期运行多个 Agent,服务器规划最好别只看“模型多少 B”。
更应该看的是:
到底有多少任务同时执行,以及每个任务会把多少资源占住。
一、先把一个 Agent 拆开看
很多人估算服务器配置的时候,第一反应是:
“这个模型需要多少显存?”
这当然重要,但只解决了一部分问题。
一个比较完整的 Agent 环境,通常至少包含下面几层:
AI Agent
│
┌──────────────┼──────────────┐
▼ ▼ ▼
LLM模型 工具调用 记忆/上下文
│ │ │
▼ ▼ ▼
GPU/显存 CPU/内存 RAM/磁盘
│
┌────────┴────────┐
▼ ▼
浏览器/代码执行 数据库/向量库
│ │
└────────┬────────┘
▼
网络 IO所以一个 Agent 的资源消耗,大概可以理解成:
模型资源 + Agent运行时 + 工具资源 + 数据资源 + 并发带来的额外开销。
而且不同 Agent 的资源模型完全不一样。
一个纯 API 型 Agent,可能大部分时间只是在发 HTTP 请求。
一个代码 Agent,可能突然启动 Python、Node.js、Docker。
一个浏览器 Agent,则可能同时拉起 Chromium,内存一下子就上去了。
还有一些长期运行的 Agent,会不断积累上下文、缓存和任务状态。
这也是为什么:
“我跑一个 Agent 很流畅”并不能直接推导出“我能同时跑十个 Agent”。
二、多个 Agent 最先遇到的,通常不是 GPU,而是内存
如果你的 Agent 主要调用外部模型 API,而不是自己在服务器上部署大模型,那么 GPU 甚至可能不是主要矛盾。
这时候最值得关注的是 RAM。
例如一台机器上同时跑:
模型虽然在云端,但这些东西全部在你的服务器上。
这时候 8GB、16GB 和 32GB 内存的实际体验可能差得非常明显。
尤其是浏览器型 Agent。
Chromium 本身就可能启动多个进程,如果每个 Agent 都拥有独立浏览器环境,那么内存消耗很容易随着并发数往上涨。
所以如果你准备运行的是:
API Agent → 内存压力相对可控
代码 Agent → CPU + 内存明显增加
浏览器 Agent → 内存压力进一步增加
本地模型 Agent → GPU/显存成为核心资源
不要把这几种场景混在一起算。
三、如果是本地模型,真正需要算的是“显存 + 并发”
本地部署模型以后,问题就复杂了一层。
很多人只看模型参数量。
比如:
7B 模型能不能放进 16GB 显存?
这个问题其实只是第一关。
模型放得进去,不代表多个 Agent 同时调用的时候就一定舒服。
因为推理过程中还需要考虑 KV Cache,以及并发请求带来的额外显存占用。
以 Ollama 的并发机制为例,当系统有足够的 CPU 内存或 GPU VRAM 时,可以同时加载多个模型并处理并行请求;同一个模型增加并行请求后,所需的上下文空间也会随之增加。Ollama 还提供了 OLLAMA_NUM_PARALLEL、OLLAMA_MAX_LOADED_MODELS 和 OLLAMA_MAX_QUEUE 等参数控制并发、模型加载数量和等待队列。
这其实说明了一个很现实的问题:
模型大小只是固定成本,并发才是动态成本。
假设:
Agent A ─┐
Agent B ─┤
Agent C ─┼──> 同一个模型
Agent D ─┤
Agent E ─┘五个 Agent 不一定意味着需要五份完整模型。
但它们的上下文、请求、KV Cache 和运行状态会同时存在。
于是服务器真正面对的是:
模型能不能装下?
变成:
模型装下以后,还能同时处理多少任务?
这两个问题完全不同。
四、GPU 不够的时候,不一定马上加 GPU
这里还有一个很容易被忽略的问题。
如果只是偶尔运行几个任务,简单地增加并发并不一定是最好的办法。
例如:
GPU
│
├── Agent 1
├── Agent 2
├── Agent 3
├── Agent 4
└── Agent 5看起来很热闹。
实际上可能所有 Agent 都在抢同一块 GPU。
最后结果就是:
CPU 看起来没满,GPU 也不一定 100%,但响应速度越来越慢。
这种情况下,与其盲目增加 Agent 数量,不如先做任务调度。
例如把任务分成:
实时任务
│
├── 用户交互
└── API 请求
后台任务
│
├── 数据整理
├── 文档总结
└── 批量分析
低优先级任务
│
├── 索引构建
├── embedding
└── 定时任务实时任务优先。
后台任务进入队列。
低优先级任务错峰执行。
很多时候,一个调度得当的 8 核服务器,比一个所有 Agent 同时抢资源的 16 核服务器更好用。
五、真正应该控制的是“并发”,不是“Agent数量”
这是我觉得部署多个 Agent 时最值得注意的一点。
假设你有 20 个 Agent。
并不代表应该让 20 个 Agent 同时执行。
更合理的方式可能是:
20 个 Agent
│
▼
任务队列
│
┌─────────┼─────────┐
▼ ▼ ▼
Worker 1 Worker 2 Worker 3
│ │ │
└─────────┼─────────┘
▼
模型服务比如服务器实际承受能力只有 5 个并发任务,那么就让其他任务排队。
这样做的好处很直接:
- 避免瞬时资源打满
- 防止大量请求同时抢 GPU
- 防止浏览器进程把内存吃光
- 避免数据库连接突然暴涨
- 防止 Agent 失败以后大量重试
- 更容易控制任务优先级
而且队列还有一个隐藏好处:
它把“资源不足”从服务器崩溃,变成任务等待。
这两个结果完全不是一回事。
六、CPU 应该怎么估算?
CPU 最容易被忽略。
因为大家看到 AI,第一反应就是 GPU。
但 Agent 并不是只有模型推理。
下面这些事情都可能吃 CPU:
如果是单纯的 API Agent,CPU 压力可能没那么明显。
但是一旦加入浏览器和代码执行:
Agent
├── LLM API
├── Browser
├── Python
├── Shell
└── DockerCPU 就开始变成比较重要的资源。
因此,与其问:
“10 个 Agent 需要多少核?”
不如先问:
“这 10 个 Agent 同时会启动多少个真正消耗 CPU 的任务?”
这才有意义。
七、内存规划可以用一个很简单的方法
如果你暂时没有完整的压测数据,可以先做一个粗略模型:
服务器内存需求
≈ 操作系统
+ Agent运行时
+ 数据库/Redis
+ 浏览器
+ Docker
+ 模型相关内存
+ 并发任务缓冲
+ 安全余量最后再留一部分余量。
不要把服务器规划成:
16GB 内存,平时刚好用 15.8GB。
这种配置短期可能没事。
一旦某个 Agent 突然启动浏览器、加载大文件,或者模型上下文突然变长,OOM Killer 就可能出来“主持工作”了。
实际部署时,我更倾向于让服务器保留一定余量。
尤其是长期运行的服务。
八、如果使用 vLLM,思路又不一样
当你开始做更正式的模型服务,而不是简单本地跑一个模型时,vLLM 这种推理服务框架就会涉及更加细致的资源管理。
例如 vLLM 提供 GPU memory utilization、KV Cache、最大活动序列数以及请求队列等配置,可以直接影响模型服务能够承载多少并发。当前文档中,--max-num-active-seqs 用于限制处于 RUNNING 状态的请求数量,而请求队列也可以通过相应参数设置上限。
这时候资源规划就从:
“我要一台什么配置的服务器?”
变成了:
“我要让这套模型服务稳定处理多少并发?”
这已经是两个不同层级的问题。
如果单 GPU 能够容纳模型,那么没必要为了“看起来高级”就直接上多机。
vLLM 官方文档也把单 GPU、单机多 GPU、多机多 GPU 的场景进行了区分:模型能够放进单 GPU 时可以直接运行;单卡放不下但单机多卡可以容纳时,可以考虑 Tensor Parallel;模型连单机都放不下,再考虑多节点的 Tensor/Pipeline Parallel。
所以:
不要先买机器,再想怎么用。
应该先确定模型、上下文、并发和延迟目标,再反推硬件。
九、多个 Agent 最容易踩的一个坑:所有东西都塞在一台机器上
刚开始玩的时候,一台 VPS 很舒服:
VPS
│
├── Agent
├── Docker
├── Redis
├── PostgreSQL
├── Ollama
├── Nginx
├── Chromium
└── 监控一个服务器全部搞定。
但随着 Agent 数量增加,这种架构的问题会慢慢暴露出来。
比如:
Agent 跑崩了 → Docker 重启。
Docker 重启 → 数据库受到影响。
数据库负载高 → Agent 请求变慢。
Agent 请求变慢 → 队列堆积。
队列堆积 → 更多 Agent 重试。
然后整个服务器一起开始冒烟。
所以到了多个 Agent 阶段,最好开始考虑简单的资源隔离。
比如:
Gateway
│
┌─────┴─────┐
▼ ▼
Agent Pool Agent Pool
│ │
▼ ▼
Worker Worker
│
┌─────┴─────┐
▼ ▼
Redis Database
│
▼
Storage不一定非要一上来 Kubernetes。
Docker Compose + 队列 + 基础监控,很多个人项目其实已经够用了。
等任务规模真正起来,再考虑 Kubernetes、Ray 等更复杂的调度体系。
十、什么时候应该加 CPU,什么时候应该加内存?
可以简单粗暴地这么判断。
CPU 经常 80%~100%
优先检查:
- Agent 是否大量执行代码
- 是否大量使用浏览器
- 是否存在 OCR / embedding / 数据处理
- 是否有任务同时启动
- 是否存在死循环或者异常重试
这种情况下优先考虑增加 CPU 或降低并发。
内存经常接近上限
重点检查:
- 浏览器数量
- Agent Runtime 数量
- Docker 容器
- 数据库缓存
- 上下文长度
- 本地模型
- 是否存在内存泄漏
这种情况下加内存通常比加 CPU 更直接。
GPU 显存爆掉
先不要急着买更大的 GPU。
先确认:
- 模型到底多大
- quantization 是否合理
- context length 是多少
- 并发是多少
- KV Cache 占了多少
- 是否同时加载多个模型
因为有时候不是模型太大。
而是:
你让它同时干的事情太多了。
十一、一个比较实用的资源规划表
如果只是做个人项目,可以先按照这个思路估:
| 场景 | CPU | 内存 | GPU | 主要瓶颈 |
|---|---|---|---|---|
| 2~3 个 API Agent | 2~4 核 | 4~8GB | 不需要 | 网络/任务调度 |
| 5~10 个轻量 Agent | 4~8 核 | 8~16GB | 不需要 | RAM/并发 |
| 多个浏览器 Agent | 8~16 核 | 16~32GB | 不一定 | RAM/CPU |
| 本地小模型 + 多 Agent | 8 核+ | 16~32GB | 视模型而定 | VRAM |
| 本地模型 + 较高并发 | 8~16 核+ | 32GB+ | 多 GPU 视模型而定 | VRAM/KV Cache |
| 多模型/大规模推理 | 16 核+ | 32GB+ | 多 GPU | GPU/网络/调度 |
这张表只能作为起步估算,不能替代实际压测。
尤其是 AI Agent,差异实在太大。
同样叫“10 个 Agent”,有可能一个只调用 API,另一个却同时开 10 个浏览器、执行代码和处理文档。
两者的服务器需求可能完全不是一个量级。
十二、我更推荐的思路:先把 Agent 当成“任务”,而不是“进程”
这是整个问题里我认为最重要的一点。
如果把 Agent 理解成一个长期运行的进程:
“我要 10 个 Agent,所以我要 10 份资源。”
资源很容易越堆越大。
但如果把 Agent 理解成:
一个可以被调度的任务执行单元。
思路就会完全不一样。
你可以让:
Agent数量:20
Worker数量:5
最大并发:5
任务队列:10020 个 Agent 可以存在。
但任何时候只有 5 个任务真正占用计算资源。
当某个任务结束以后,再把下一个任务交给 Worker。
这样服务器的资源利用率会更加可控。
最后:别先问“需要多大的服务器”
如果只是跑一个 AI Agent,这个问题其实很简单。
但当你开始同时运行 5 个、10 个甚至几十个 Agent 后,真正需要考虑的是:
模型是什么?
并发是多少?
上下文多长?
有没有浏览器?
有没有代码执行?
是不是本地模型?
任务是不是长期运行?
能不能接受排队?
这些因素加起来,才决定最终的服务器配置。
尤其是本地模型服务,GPU 显存并不是唯一指标。并发请求、KV Cache、上下文长度以及服务端调度都会影响实际吞吐。像 vLLM 这样的推理框架已经把这些问题做成了比较明确的调度和资源控制参数。
所以如果你现在正准备搭一套自己的 AI Agent 环境,我反而建议:
先跑起来,再压测,再扩容。
不要一开始就为了“以后可能有几十个 Agent”买一台巨型服务器。
从一个可观测、可限制并发的环境开始,记录 CPU、RAM、GPU、显存、请求延迟和任务队列长度。
等数据出来以后,你自然就知道下一步应该加 CPU、加内存、加 GPU,还是单纯把任务调度做好。
这比看着服务器配置表猜,靠谱得多。
评论 (0)