Streamlit文档GPT应用内存溢出:如何正确释放模型内存?
Streamlit文档GPT应用内存超限问题解决方案
问题背景
近期开发基于LangChain构建的文档GPT Streamlit应用,支持用户上传PDF并提问。由于Streamlit免费版仅提供1GB内存,多用户同时使用或重复上传文件时,应用频繁崩溃需手动重启,经排查为内存超限导致。
核心排查结果
通过Windows任务管理器观察内存变化:
- 应用启动后占用内存约150,000 KB
- 上传PDF并实例化带有HuggingFaceEmbedding的docGPT后,内存飙升至1,000,000 KB
- 重复上传同一份PDF,内存进一步上涨至1,750,000 KB
- 重复上传4次8000KB的文件后,应用因内存超限崩溃,疑似多模型实例未释放导致内存持续占用
疑问解答
1. 如何正确释放初始实例化的模型?
- 手动清除模型引用:将持有模型实例的变量设为
None(如doc_gpt_instance = None),让Python垃圾回收器能识别并回收该实例占用的内存 - 强制触发垃圾回收:调用
import gc; gc.collect(),主动通知垃圾回收器回收无引用的内存块(注:该操作是建议性的,无法保证立即完成回收) - 避免全局变量持有模型:尽量使用局部变量或Streamlit会话状态(
st.session_state)存储模型实例,当用户上传新文件时,先清空旧实例的引用(如del st.session_state.doc_gpt) - 针对HuggingFace Embedding模型:若之前使用GPU加载模型,先调用
model.to('cpu'),再清空模型和tokenizer的引用,减少显存/内存占用
2. 使用st.cache_resource装饰create_doc_gpt(docs)的相关疑问
- 同一用户首次上传PDF生成模型后会缓存占用内存吗?上传新PDF会生成新缓存再占用内存吗?
会缓存。st.cache_resource根据函数的输入参数(此处为docs)生成唯一缓存键,首次上传的PDF对应唯一的docs参数,会生成缓存实例并占用内存;上传新PDF时,docs参数变化,会生成新的缓存实例,额外占用内存。 - 若上述成立,能否用ttl和max_entries参数避免缓存过多?
可以。ttl参数设置缓存的存活时间,超时后自动清除缓存释放内存;max_entries设置最大缓存条目数,当缓存数量超过阈值时,自动删除最久未使用的缓存实例,有效控制内存占用。 - 若max_entries设为2,两位用户同时使用时,他们的缓存模型会分别计数吗?
不会。st.cache_resource的缓存是全局共享的,不区分用户。max_entries=2意味着整个应用最多保留2个缓存模型实例,无论实例来自同一用户还是不同用户,超过后会淘汰最久未使用的实例。若需区分用户缓存,需在create_doc_gpt的参数中加入用户唯一标识(如会话IDst.session_state.session_id),让不同用户的相同PDF生成不同缓存键,再结合max_entries控制单用户缓存数量。
内容的提问来源于stack exchange,提问作者Xiang
相关产品推荐
相关产品推荐

