Mac M1 Monterey系统下Python 3.9运行SentenceTransformer语义搜索代码出现信号量泄漏警告的原因及修复方案
解决M1 Mac上SentenceTransformer/Faiss运行时的资源跟踪器警告
警告产生的原因
这个警告其实是Python的multiprocessing.resource_tracker模块在程序退出时,发现有1个信号量(semaphore)对象没被正确清理掉。结合你的M1 Mac环境,大概率是这两个原因:
- M1的ARM架构搭配Homebrew/miniforge的Python环境,在多进程资源管理上和x86架构存在细微差异,要么是资源跟踪器的检测逻辑误报,要么是真的存在小范围的资源泄漏。
- SentenceTransformer的
model.encode()方法默认会启用多进程加速编码,进程结束后,部分和进程绑定的信号量资源没被及时回收,再加上和Faiss的索引操作结合,资源清理的顺序出了小问题,就触发了这个警告。
修复方法(按推荐程度排序)
禁用多进程编码(推荐)
SentenceTransformer的多进程加速在M1上其实没必要,我们可以直接用M1的GPU(MPS)来加速编码,单进程反而更稳定。修改你search函数里的编码代码:query_vector = model.encode([query], show_progress_bar=False, device='mps', use_multiprocessing=False)加上
use_multiprocessing=False彻底禁用多进程,同时device='mps'让模型跑在M1的GPU上,速度不会比多进程慢,还能从根源避免资源泄漏问题。临时抑制警告
如果暂时不想改核心逻辑,只是不想看到这个警告,可以在代码最开头添加过滤规则:import warnings warnings.filterwarnings("ignore", category=UserWarning, message="resource_tracker: There appear to be.*")这个方法只是“遮眼睛”,没解决实际的资源问题,但胜在简单快速。
升级依赖库
有可能是旧版本的SentenceTransformer、Faiss或者Python的多进程模块在ARM架构上有bug。试试升级这些库:pip install --upgrade sentence-transformers faiss-cpu注意M1上安装Faiss优先选
faiss-cpu,如果需要GPU加速可以尝试faiss-gpu,但要确认版本适配ARM架构。手动清理资源跟踪器
在程序退出前手动清理资源跟踪器里的残留信号量,比如在main()函数的最后加上:from multiprocessing import resource_tracker try: resource_tracker.unregister('/semaphore', 'semaphore') except Exception: pass这个方法需要处理异常,因为有时候资源可能已经被清理了,避免触发新的报错。
内容的提问来源于stack exchange,提问作者e.iluf
相关产品推荐
相关产品推荐

