You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:35:18