Nemo ASR与Sanic启动方法冲突RuntimeError问题求助
解决Nemo ASR与Sanic启动方法冲突的问题
问题根源在于Nemo ASR在模块导入阶段就已经将多进程启动方法设置为fork,而Sanic默认需要spawn方法。启动方法一旦被设置就无法修改(即使使用force=True也无效),你之前的设置代码都晚于Nemo的初始化操作,因此完全不起作用。
正确解决方案:提前设置启动方法
必须在导入Nemo任何模块之前,完成多进程启动方法的设置。这样Nemo初始化时会继承已设置的spawn方法,不会再强制改为fork。
示例代码:
import multiprocessing as mp # 先设置启动方法,再导入Nemo和Sanic try: mp.set_start_method('spawn', force=True) except RuntimeError: pass # 现在导入依赖模块 import nemo.collections.asr as nemo_asr from sanic import Sanic app = Sanic(__name__) # 可在此添加ASR接口路由 @app.route("/asr", methods=["POST"]) async def asr_handler(request): # 编写你的ASR处理逻辑 return json({"result": "处理完成"}) if __name__ == '__main__': app.run(debug=True)
如果你的代码依赖torch.multiprocessing,也可以用它来设置启动方法,效果一致:
import torch.multiprocessing as mp try: mp.set_start_method('spawn', force=True) except RuntimeError: pass # 后续导入和初始化逻辑同上
注意事项
使用spawn启动方法时,主进程中的全局代码会在子进程中重新执行,因此所有需要初始化的资源(比如加载ASR模型)都应该放在if __name__ == '__main__':块内部,或者路由处理函数中按需加载,避免重复初始化导致资源浪费或错误。
内容的提问来源于stack exchange,提问作者Tanmay Jain
相关产品推荐
相关产品推荐

