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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:42:44