MacOS运行DistilBert聊天机器人API触发信号量泄漏警告如何解决

问题背景
- 运行环境:MacOS操作系统,VS Code开发端
- 实现逻辑:基于Sentence Transformer框架调用DistilBert模型开发聊天机器人API
- 异常表现:程序累计接收3次输入请求后,抛出如下警告:
UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '
- 已验证无效的处理方式:将Python版本从3.9降级至3.7
修复方案
该警告本质是MacOS下Python多进程默认spawn启动模式,和Sentence Transformer、PyTorch内置的并行计算逻辑存在兼容性问题,子进程退出时未正确回收信号量资源,按以下优先级处理即可:
- 模型初始化时显式关闭多进程并行逻辑,从源头避免多余子进程创建:
from sentence_transformers import SentenceTransformer # M系列芯片Mac可指定device='mps'获得GPU加速,Intel芯片指定device='cpu' model = SentenceTransformer('distilbert-base-nli-mean-tokens', device='mps') # 关闭分词阶段的多进程处理 model.tokenizer.parallelism = False
- 如果API使用多worker模式部署(比如uvicorn、gunicorn启动多进程),在项目入口文件最顶部(所有第三方库导入语句之前)添加配置,切换多进程启动模式为兼容性更好的
fork:
import multiprocessing multiprocessing.set_start_method('fork', force=True)
- 本地调试场景下该警告不会影响功能正常运行,可直接添加过滤规则屏蔽:
import warnings warnings.filterwarnings("ignore", message="resource_tracker: There appear to be.*leaked semaphore objects")
内容的提问来源于stack exchange,提问作者Tejas Sutar
相关产品推荐
相关产品推荐

