RuntimeError: Expected there to be 1 prompt updates corresponding to 1 video items, but instead found 0 prompt updates! This is likely because you forgot to include input placeholder tokens (e.g

该错误通常出现在 vLLM 服务处理包含大 batch 或多媒体的请求时,多模态缓存(MultiModalReceiverCache)中的条目被同请求内更早出现的新条目挤出缓存,导致后续读取时找不到已标记为“已缓存”的条目;优先排查并调整多模态处理器缓存容量,或将缓存关闭。

快速结论:该错误通常出现在 vLLM 服务处理包含大 batch 或多媒体的请求时,多模态缓存(MultiModalReceiverCache)中的条目被同请求内更早出现的新条目挤出缓存,导致后续读取时找不到已标记为“已缓存”的条目;优先排查并调整多模态处理器缓存容量,或将缓存关闭。

适用环境:Issue 中已确认的信息有限,仅提到 Python 3.10,以及 vLLM 0.11.0、模型 Qwen3-VL-30B-Thinking 和 Qwen2.5-VL(使用 beam search),其余操作系统、CUDA、PyTorch、显卡信息未明确提供。

最快修复方案:暂无可确认的一步修复方案;Issue 维护者建议可优先尝试将 --mm-processor-cache-gb 设为更大的值(如用户反馈设为 50 后暂时不再出现),或直接设为 0 关闭缓存。

注意事项:上述办法均为缓解措施,并不能修复缓存淘汰逻辑本身;关闭缓存会牺牲重复图片场景下的缓存复用效果;调大缓存并不能保证对所有大请求、beam search 或并行多进程场景都彻底避免问题,Issue 中尚未给出根本性修复的验证结论。

问题场景

在 vLLM 中提供多模态推理服务时(例如 Qwen3-VL-30B-Thinking、Qwen2.5-VL),当单个请求携带较多图片或视频、batch size 较大,或使用 beam search 并行生成多个候选时,EngineCore 的预处理线程在调用 MultiModalReceiverCache.get_and_update_features 更新多模态特征时触发断言失败,请求处理中断。

报错原文

Exception in thread Thread-2 (process_input_sockets):
Traceback (most recent call last):
  File "/usr/local/fbcode/platform010/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  ...
  File ".../vllm/v1/engine/core.py", line 442, in preprocess_add_request
    self.mm_receiver_cache.get_and_update_features(
  File ".../vllm/multimodal/cache.py", line 567, in get_and_update_features
    feature.data = self.get_and_update_item(feature.data,
  File ".../vllm/multimodal/cache.py", line 602, in get_and_update_item
    assert mm_item is not None, f"Expected a cached item for {mm_hash=}"
AssertionError: Expected a cached item for mm_hash='0a4f16828ec2b0ab7c808e48ce2451b986be9780460cbf1250ab1dceaa873c3f'

原因分析

按照 Issue 中维护者的假设,vLLM 会在遍历一个请求的多模态条目之前,提前判断哪些条目已在缓存中。当单个请求内的多模态数据总量接近或超过缓存容量时,请求中较早处理的新条目可能把后面本已缓存的条目挤出缓存;等到迭代到后者时,虽然此前预计算的 is_cached 仍为 True,实际却已取不到该条目,从而触发断言失败。维护者认为这一边界情况主要发生在“单个请求的多模态数据大于缓存容量”时。该原因目前属于假设,Issue 中提及仍在尝试构造最小复现来确认。

环境排查

  • 确认 vLLM 版本,Issue 中涉及 0.11.0,并提到之前 0.8.5.post1 未出现该问题。
  • 确认模型及其多模态输入规模,例如单请求图片数量(反馈中约 20 张图片或大量视频帧)。
  • 确认 Python 版本(报错环境为 Python 3.10)。
  • 确认 batch size、是否使用多进程并行调用、是否使用 beam search(反馈中 beam search 场景可 100% 复现)。
  • 确认当前 --mm-processor-cache-gb 的取值与请求中多模态数据总大小是否匹配。
  • CUDA、PyTorch、显卡型号在 Issue 中未提供,需按自身部署环境另行核对。

解决步骤

  1. 记录出现报错时的单请求输入规模(图片数量、视频帧数)与 batch size,判断单请求多模态数据是否可能超过缓存容量。
  2. 可优先尝试调大 --mm-processor-cache-gb。Issue 中有用户反馈在设为 20 后仍报错,改为 50 后暂未再出现。
  3. 若工作负载中重复图片很少,可优先尝试将 --mm-processor-cache-gb 设为 0,直接关闭多模态处理器缓存,以规避缓存淘汰引发的问题。
  4. 在存在大量重复图片的滑动窗口场景中,需权衡:关闭缓存会失去复用收益,调大缓存则需预留足够内存。
  5. 若仍频繁复现,可优先尝试降低 batch size(有用户反馈减小 batch size 有助于缓解),或避免在包含大体积多模态输入时使用 beam search 多头并行。
  6. 临时绕过手段:有用户反馈重启服务后同一数据可正常推理,但属临时规避,非修复手段。

验证方法

使用原先触发报错的数据与请求参数重新发起推理,观察 EngineCore 日志中不再出现 AssertionError: Expected a cached item for mm_hash=...,且请求能正常返回结果;同时在相同负载下重复多次,确认问题不再稳定复现。

参考来源

vllm-project/vllm #26195

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30927

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注