Qwen3.5-Plus 1M 上下文 vllm OOM?让 Codex 走 TaoToken 对照 --max-num-seqs
2026/9/20 7:34:10 网站建设 项目流程

单条 1M 输入也 OOM:从 vllm 报错日志反推 Qwen3.5-Plus 参数错位

Qwen3.5-Plus 在 vllm 上部署 1M 上下文时,最让人头疼的不是"跑得慢",而是明明只发了一条请求,进程却被系统 kill 掉,或者 API 直接超时。这类问题往往不是显存真的不够,而是--max-model-len--max-num-batched-tokens--max-num-seqs--enable-prefix-caching四个参数没有对齐,再加上系统 OOM killer 在背后补刀。本文走排障路线:把start_api.shnvidia-smi显存现象和 vllm 报错日志整理好,交给 Codex 对照参数逐项排查。这一步需要先在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建 Key,再把 Codex 的 Base URL 填成 https://taotoken.net/api。TaoToken 在这里只提供 Key 和 Base URL,不替代 vllm 推理、不部署 Qwen3.5-Plus、不读写模型权重。

一、原问题与场景:单条 1M 输入为什么也会 OOM

先把现象描述清楚,否则 Codex 拿到的信息不足以定位。典型的三类表现:

第一类是"启动就崩"。start_api.sh执行后,vllm 在加载权重阶段就报torch.cuda.OutOfMemoryError,日志里能看到Tried to allocate XX GiB,但此时还没有任何请求进来。这通常意味着--gpu-memory-utilization加上 KV cache 预分配已经超过了 A100 80G 的实际可用显存。

第二类是"单条请求触发 OOM"。服务能起来,但一发 1M 上下文的请求,vllm 日志出现EngineCore崩溃或CUDA out of memorynvidia-smi显示显存瞬间打满。根因多半是--max-num-batched-tokens被设成了 1048576,vllm 会按这个上限去预留激活显存,单条请求就把预算吃光。

第三类是"进程被 kill,但显存没满"。nvidia-smi看显存还有余量,可推理进程突然消失,dmesg里能看到Out of memory: Killed process。这是系统 OOM killer 介入,和显存无关,是主机内存(vm.overcommit_memorymax_map_count)配置没跟上。

把这三类现象对应的日志片段、start_api.sh全文、nvidia-smi截图一起贴给 Codex,它才能判断到底是显存预算问题、参数错位问题,还是内核参数问题。

二、TaoToken 前置:给 Codex 一个能读长日志的入口

排障场景下,Codex 需要读的东西很多:几百行的 vllm 启动日志、start_api.shnvidia-smi输出、dmesg片段。这些内容拼起来很容易超过普通对话窗口,所以先把 Codex 接到 TaoToken 上。

操作顺序:

  1. 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册并创建一个 API Key。
  2. 在控制台确认 Key 状态正常,记下它。
  3. 把 Codex 的 Base URL 指向 https://taotoken.net/api ,模型 ID 按控制台里可用的填。

需要强调边界:TaoToken 只负责把请求转发到模型,它不碰你的 vllm 进程,不读你的模型权重,也不改你的start_api.sh。所有参数修改、脚本重跑、显存观察,都在你自己的服务器上完成。Codex 的角色是"读日志 + 给建议",执行权在你手里。

如果你还没建 Key,直接去 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入细节看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

三、可复制配置:Codex 侧与 vllm 侧各改什么

这一节分两块:Codex 怎么配,start_api.sh怎么改。

Codex 侧(以 config.toml 为例):

model = "你的模型ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"

环境变量里设置TAOTOKEN_API_KEY=YOUR_API_KEY。配好后先发一条短消息确认连通,再开始贴长日志。

vllm 侧,start_api.sh里四个参数必须对齐。原文坑 10 给出的组合是:

--max-model-len 1048576 \ --max-num-batched-tokens 1048576 \ --max-num-seqs 1 \ --enable-prefix-caching \ --gpu-memory-utilization 0.9

这里最容易出问题的是--max-num-batched-tokens。它和--max-model-len都设成 1048576,意味着 vllm 允许单批次塞进 1M token,激活显存按这个量级预留。A100 80G 在 BF16 下,光 KV cache 加激活就很难扛住。排障时可以先把它降下来,比如设成--max-num-batched-tokens 8192,让 vllm 分块处理,再观察是否还 OOM。

--max-num-seqs 1是长上下文场景的合理值,避免并发把显存摊薄。--enable-prefix-caching对多轮对话有用,但单条 1M 请求首次推理时它不省显存,别指望它救 OOM。

把改前改后的start_api.sh都贴给 Codex,让它对比参数差异,比只贴报错更有效。

四、验证请求与成功结果:重跑单条 1M 推理看什么

改完参数后,重跑一次单条 1M 上下文推理,观察三个指标:

第一,vllm 启动日志里GPU blocksKV cache的预分配数字。如果--max-num-batched-tokens降下来后,这个数字明显变小,说明激活显存预算松了。

第二,nvidia-smi在推理过程中的峰值显存。A100 80G 上,1M 上下文单条推理的稳定占用应该在 75G 以内(原文坑 10 的验证标准)。如果还是瞬间打满,说明参数没对齐或模型精度选错了。

第三,dmesg里是否还有Killed process。如果显存没满但进程还是被杀,就要回到系统层,检查vm.overcommit_memory是否设为 1、vm.max_map_count是否够大、swap 是否关闭。原文坑 12 给了一组内核参数:

swapoff -a sed -i '/swap/s/^/#/' /etc/fstab echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf echo 'vm.max_map_count=2621440' >> /etc/sysctl.conf sysctl -p

另外可以给推理进程设oom_score_adj,降低被 OOM killer 选中的概率:

echo -1000 > /proc/[PID]/oom_score_adj

验证成功的标志:单条 1M 输入跑完,进程存活,API 返回正常,nvidia-smi峰值不超 75G,dmesg无 kill 记录。把这次成功的日志和之前的失败日志一起贴给 Codex,让它确认参数组合是否稳定。

五、本篇常见错排查

错误一:只改--max-model-len,不动--max-num-batched-tokens前者是模型能接受的最大长度,后者是单批次 token 预算。两个都设 1048576,等于告诉 vllm"我一次要处理 1M token",激活显存直接爆。排障时优先降--max-num-batched-tokens

错误二:--gpu-memory-utilization设太高。0.9 在 A100 80G 上意味着 vllm 可以占用 72G,留给系统和 CUDA context 的空间很少。如果同时跑其他进程,容易触发系统 OOM。可以试 0.85 或 0.8。

错误三:忽略--enforce-eager原文start_api.sh里带了--enforce-eager,它会关闭 CUDA graph,降低显存峰值但牺牲一点吞吐。长上下文排障阶段建议保留,稳定后再考虑去掉。

错误四:把系统 OOM 当成显存 OOM。两者日志不同:显存 OOM 是torch.cuda.OutOfMemoryError,系统 OOM 是dmesg里的Killed process。搞混了会往错误方向调参。

错误五:Codex 贴日志时截断。vllm 的报错往往在日志中段,只贴最后几行会丢掉关键信息。把完整启动日志和报错前后的上下文一起给 Codex。

如果排查中需要确认模型侧行为,可以用模型对话页面直接发一条短请求对比:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入相关问题看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

六、语义一致 CTA

这条排障路线的核心是:把start_api.shnvidia-smi现象、vllm 报错日志整理清楚,交给 Codex 对照参数排查,改完重跑单条 1M 推理验证。TaoToken 在其中只做两件事——提供 Key 和 Base URL,让 Codex 能读下这些长日志。

如果你还在建 Key 阶段,去 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入配置和 Base URL 填法看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果你后续要把这类长上下文排障做成常态化流程,可以考虑 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

再提醒一次边界:TaoToken 不替代 vllm 推理、不部署 Qwen3.5-Plus、不读写模型权重。参数怎么改、脚本怎么跑、显存怎么观察,都在你的服务器上完成。Codex 给建议,你来做决定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询