ColBERT reranker silently runs on CPU on non-CUDA accelerators (Ascend/ROCm/XPU)

在 Ascend NPU、AMD ROCm、Intel XPU 等非 CUDA 加速卡上部署 Open WebUI 并启用 ColBERT reranker 时,reranker 会静默回退到 CPU 运行,表现为重排序环节明显变慢,但不会报错。应优先排查 backend/open_webui/re

快速结论:在 Ascend NPU、AMD ROCm、Intel XPU 等非 CUDA 加速卡上部署 Open WebUI 并启用 ColBERT reranker 时,reranker 会静默回退到 CPU 运行,表现为重排序环节明显变慢,但不会报错。应优先排查 backend/open_webui/retrieval/models/colbert.py 中的设备选择逻辑是否只判断了 torch.cuda.is_available()

适用环境:Open WebUI;使用 ColBERT reranker 的 RAG 检索流程;运行在非 CUDA 加速器上(Issue 中列出 Ascend NPU、AMD ROCm、Intel XPU)。Issue 未提供具体的操作系统、Python、PyTorch 或驱动版本。

最快修复方案:暂无确认的一步修复方案。Issue 作者提出的方案是:将设备选择逻辑改为使用 torch.accelerator.current_accelerator(),由框架返回当前实际加速器(如 cudanpuxpu),无加速器时回退到 cpu;作者表示会自行提交 PR,但 Issue 讨论中未确认该 PR 已合并。

注意事项:该改动依赖 PyTorch 提供 torch.accelerator API,需确认所用 PyTorch 版本是否支持;Issue 中未给出验证步骤、合并状态或版本号,因此在官方修复落地前,该方案属于可优先尝试的推测性修复,建议在测试环境验证后再上生产。

问题场景

用户在配备非 NVIDIA 加速卡(Ascend NPU、AMD ROCm、Intel XPU)的机器上自托管 Open WebUI,并在 RAG 流程中启用 ColBERT reranker。检索结果的重排序环节运行速度远低于预期,加速卡利用率接近于零,但没有抛出任何异常。作者指出这是性能回退(regression),而不是运行报错。

报错原文

ColBERT reranker silently runs on CPU on non-CUDA accelerators (Ascend/ROCm/XPU)

self.device = 'cuda' if torch.cuda.is_available() else 'cpu'

原因分析

已确认的直接原因:backend/open_webui/retrieval/models/colbert.py 里用一行三目表达式决定计算设备,只检测 CUDA。在 Ascend NPU、AMD ROCm、Intel XPU 等环境下,torch.cuda.is_available() 返回 False,于是设备被设为 cpu,即使系统里存在可用加速器,ColBERT reranker 也会静默在 CPU 上运行。

可能原因(Issue 摘要中关联的其他报告):同仓库的 #8784、#6529、#8365 也分别报告了 rerank 未使用 GPU、rerank 模型跑在 CPU 上导致极慢,以及 ROCm 场景下 reranking 走 CPU 的问题,症状与该设备选择逻辑一致。

环境排查

  • 确认 Open WebUI 版本,并定位到 backend/open_webui/retrieval/models/colbert.py,检查其中的设备选择代码。
  • 确认加速器类型:Ascend NPU、AMD ROCm 还是 Intel XPU,以及对应的驱动与运行时是否已正确安装。
  • 确认 PyTorch 安装版本及其对应的加速后端构建,并检查是否支持 torch.accelerator API。
  • 确认同一套栈中其他组件(如嵌入模型)是否已经跑在加速器上,以判断是个例还是全局设备选择问题。
  • Issue 未给出具体版本号,以上项目需按实际部署环境自行核对。

解决步骤

  1. 打开 backend/open_webui/retrieval/models/colbert.py,找到当前设备选择语句:self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
  2. 按 Issue 作者的建议,可优先尝试改为使用 torch.accelerator.current_accelerator() 来获取框架当前实际使用的加速器(返回 cudanpuxpu 等),当没有可用加速器时回退到 cpu
  3. 确认所用 PyTorch 版本是否提供 torch.accelerator;若不提供,则该方案不可用。
  4. 由于 Issue 作者仅表示会提交实现该改动的 PR,讨论中并未确认合并状态,建议先自行在本地或测试环境打补丁验证,或关注上游 PR 与后续版本更新。
  5. 如果暂时不改代码,可将排查重点放在确认 reranker 是否确实落在 CPU 上(见验证方法),并据此评估是否需要等待官方修复。

验证方法

在修改前后分别观察 ColBERT reranker 实际使用的计算设备:可通过日志或调试输出确认设备是否仍为 cpu,或在重排序阶段监控加速卡的利用率与显存占用。若加速器开始被占用、重排序耗时明显下降,说明设备选择已生效。Issue 讨论中未给出官方验证步骤,以上为通用确认方式。

参考来源

open-webui/open-webui #30115

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24149

发表回复

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