当前将torch.npu.set_device放在__main__函数外,如果此时又使用spawn起进程,则会报以下错误:

原因分析
本质问题是multiprocessing中使用spawn起进程的限制,如以下脚本也会报同样的错误:

在 Python 中, multiprocessing如果使用了 spawn 启动方法来创建多进程, 16行的subprocess启动时会在新的 Python 解释器进程中重新执行代码,此时执行到了第九行的代码,就会校验失败,从而报错。
而torch_npu的初始化,cann中会有组件使用spawn起进程,因此会报错。
规避方式
330的pta包会将cann中起进程的代码lazy_init(甚至disable),即在torch.npu.set_device接口不会初始化底层的aoe初始化,仅当客户需要使用aclop时才会初始化。
export ACL_OP_INIT_MODE=1(lazy_init)
export ACL_OP_INIT_MODE=2(disable)

无法处理的情况就是在__main__外面存在有aclop的代码,cann就仍然会起进程,报错。

当前将torch.npu.set_device放在__main__函数外,如果此时又使用spawn起进程,则会报以下错误:
原因分析
本质问题是multiprocessing中使用spawn起进程的限制,如以下脚本也会报同样的错误:
在 Python 中, multiprocessing如果使用了 spawn 启动方法来创建多进程, 16行的subprocess启动时会在新的 Python 解释器进程中重新执行代码,此时执行到了第九行的代码,就会校验失败,从而报错。
而torch_npu的初始化,cann中会有组件使用spawn起进程,因此会报错。
规避方式
330的pta包会将cann中起进程的代码lazy_init(甚至disable),即在torch.npu.set_device接口不会初始化底层的aoe初始化,仅当客户需要使用aclop时才会初始化。
export ACL_OP_INIT_MODE=1(lazy_init)
export ACL_OP_INIT_MODE=2(disable)
无法处理的情况就是在__main__外面存在有aclop的代码,cann就仍然会起进程,报错。