快速结论:这是在 Open WebUI 全远程推理部署(不装 Ollama、不用本地 embedding/rerank/STT/TTS)中,后端仅在 import open_webui.main 阶段就加载 torch、transformers、sentence-transformers、spaCy 等本地 ML 栈,导致启动 RSS 与 swap 显存被持续占用的问题。优先排查 langchain-text-splitters 版本与所用镜像变体。
适用环境:Open WebUI v0.11.0(ghcr.io/open-webui/open-webui:main,镜像构建于 2026-07-27,revision 01f4282);Docker 安装;Ubuntu 25.10 x86_64,内核 7.0.0-27-generic;2GB RAM + 2GB swap 的 DigitalOcean droplet。后续复现使用 dev 分支 eb9b7b65 与 4ef7e35 构建,并在 ROCm 版 torch 环境与 OFFLINE_MODE=true 下验证。不涉及 Ollama、浏览器控制台。
最快修复方案:换用 slim 镜像(如 ghcr.io/open-webui/open-webui:dev-slim)。据 Issue 中 4ef7e35 同版本对照,标准镜像加载 torch 等本地 ML 栈、import open_webui.main 峰值 RSS 约 826MB,slim 镜像不加载、峰值 RSS 约 292MB。Issue 关闭时给出了“Fixed for your setup in v0.11.4”:slim 镜像不再安装 torch、transformers、sentence-transformers 或 spaCy。
注意事项:v0.11.0 时期的 slim 镜像仍携带完整 ML 栈,仅省略模型文件,因此那时换 slim 不一定有效;需使用 v0.11.4 及之后不再安装这些依赖的 slim 镜像。仅设置 OFFLINE_MODE=true 不能阻止标准镜像在导入期加载这些模块,因为加载发生在读取配置之前。2GB 主机上这是稳定性问题而非观感问题;是否在所有部署形态下都被 v0.11.4 覆盖,Issue 中未逐项验证。
问题场景
在 Open WebUI 后端启动、尚未处理任何 HTTP 请求的阶段即可观测到高内存占用。用户把所有 AI 相关功能都配置为远程引擎:rag.embedding_engine = "openai"、rag.reranking_engine = ""、audio.stt.engine = "web"、audio.tts.engine = ""、rag.bypass_embedding_and_retrieval = true,部署中也没有安装或使用 Ollama。按照配置,代码路径不应触碰本地机器学习运行时,但 import open_webui.main 仍加载了 torch、transformers、sentence-transformers、spacy、thinc/blis、nltk、sklearn、pandas、pyarrow、scipy 与 av。
报错原文
issue: torch and full local ML stack loaded at import time with all-remote engines (~340MB RSS, langchain-text-splitters 1.1.2 regression)
torch loaded: True | sentence_transformers: True | spacy: True | transformers: True | peak RSS MB: 826
torch loaded: False | sentence_transformers: False | spacy: False | transformers: False | peak RSS MB: 292
原因分析
Issue 将根因指向 langchain-text-splitters 1.1.2 的回归。该版本被 backend/requirements.txt 精确锁定为 ==1.1.2(报告时位于第 57 行,dev 构建中位于第 52 行),且在当时也是 PyPI 上的最新版本,没有可升的上游版本。触发路径是:backend/open_webui/routers/retrieval.py 在模块级执行 from langchain_text_splitters import (MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter, TokenTextSplitter),而该 router 又被 main.py 无条件导入。在 1.1.2 中,这一步会触发两条独立的 eager-import 链,其中 langchain_text_splitters/__init__.py 会导入所有 splitter 后端。
后续评论进一步验证:仅 import langchain_text_splitters 就会把常驻内存从 10MB 推到 843MB,并加载 torch、sentence_transformers、spacy。dev 分支在该路径上未发生变化,仍锁定 1.1.2 并保持模块级导入。
环境排查
- 确认 Open WebUI 版本:v0.11.0 是否仍在使用标准镜像,是否为 v0.11.4 及之后的 slim 镜像。
- 确认所用镜像标签:
main、dev,还是dev-slim;相比报告中的01f4282、eb9b7b65、4ef7e35是否一致。 - 确认
backend/requirements.txt中langchain-text-splitters的锁定版本是否为==1.1.2。 - 确认
backend/open_webui/routers/retrieval.py是否仍在模块级导入langchain_text_splitters。 - 确认
OFFLINE_MODE是否仅被当作缓解措施使用;Issue 显示它不会阻止标准镜像的导入期加载。 - 如使用 ROCm 版 torch,RSS 绝对值会与报告中的 693MB 不可直接比较,应关注加载的模块集合。
解决步骤
- 先量化确认问题:在目标镜像上,用与 Issue 相同思路的检查命令运行
import open_webui.main,打印torch in sys.modules、sentence_transformers in sys.modules、spacy in sys.modules、transformers in sys.modules与ru_maxrss,对比是否出现标准镜像的加载结果。 - 在同版本构建上做镜像变体对照:分别用标准镜像与 slim 镜像,在相同设置(Issue 中为
OFFLINE_MODE=true,并使用镜像默认设置而非全远程配置,因为加载发生在读取设置之前)执行同一条检查命令,比较模块加载与峰值 RSS。 - 如果目标是小内存主机,将部署切换到支持该修复的 slim 镜像:Issue 显示
dev-slim在 4ef7e35 上不加载 torch、transformers、sentence-transformers、spaCy,峰值 RSS 约 292MB,标准dev约 826MB。 - 升级或选用 v0.11.4 及之后版本的 slim 镜像。Issue 关闭时明确表示该版本 slim 不再安装 torch、transformers、sentence-transformers 或 spaCy。
- 不建议把
OFFLINE_MODE=true当作标准镜像的替代修复或唯一修复;Issue 中该开关单独使用不能改变导入链。
验证方法
重新运行量化检查,确认 torch、sentence_transformers、spacy、transformers 均未出现在 sys.modules 中,且 import open_webui.main 的峰值 RSS 明显下降(Issue 中 slim 为 292MB,标准为 826MB)。同时在宿主机上观察容器 /proc/1/smaps_rollup 的 Rss/Swap 与 atop 历史,确认 swap 不再长期钉在 1.0–1.1GB。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


