如何从内存中卸载HuggingFace Sentence Transformers模型?
如何卸载LangChain加载的Sentence Transformers模型并释放内存?
问题场景
我使用以下LangChain脚本加载Sentence Transformers模型:
from langchain_community.embeddings import HuggingFaceEmbeddings embedding_function = HuggingFaceEmbeddings( model_name="sentence-transformers/all-MiniLM-L12-v2", model_kwargs={'device': 'cpu'})
使用完毕后希望删除该模型并从内存中卸载,但常规的Python删除流程无法生效。
当前环境版本
python==3.11.7 langchain==0.1.16 langchain_community==0.0.32 langchain_core==0.1.42 sentence-transformers==2.6.1
已尝试的无效操作
import gc del embedding_function gc.collect()
通过Windows任务管理器观察:移除加载模型的代码行时,终端内存占用低于50MB;添加加载代码并执行上述删除操作后,内存仍高于400MB。
解决方案
LangChain的HuggingFaceEmbeddings内部持有模型(client属性)和分词器(tokenizer属性)的直接引用,单纯删除外层对象无法彻底释放内存,需要先手动清理这些内部引用,再执行垃圾回收:
方法一:显式删除内部引用
# 清除模型实例引用 if hasattr(embedding_function, 'client'): del embedding_function.client # 清除分词器实例引用 if hasattr(embedding_function, 'tokenizer'): del embedding_function.tokenizer # 删除外层对象并触发垃圾回收 del embedding_function import gc gc.collect()
方法二:置空内部引用(更简洁)
# 置空内部模型和分词器引用 embedding_function.client = None embedding_function.tokenizer = None # 删除对象并回收内存 del embedding_function gc.collect()
原理说明
Sentence Transformers的模型和分词器实例被封装在HuggingFaceEmbeddings的内部属性中,可能存在模块缓存或其他隐式引用导致内存无法自动释放。先手动清除/置空这些内部引用,再触发Python的垃圾回收机制,才能彻底释放模型占用的内存。
内容的提问来源于stack exchange,提问作者Znium
相关产品推荐
相关产品推荐

