多进程包 - torch.multiprocessing
torch.multiprocessing 是基于原生 multiprocessing
模块的一个包装器。
它注册了自定义的reducers,这些reducers使用共享内存来提供不同进程中同一数据的共享视图。一旦张量/存储被移动到共享内存(参见share_memory_()
),就可以在不进行复制的情况下将其发送给其他进程。
该 API 完全兼容原始模块——只需将 import multiprocessing
更改为 import torch.multiprocessing
,所有张量就会被移动到共享内存中,无论是通过队列发送还是通过其他机制进行共享。
由于 API 相似,我们没有记录此包的大部分内容,并建议参考原模块的详细文档。
警告
如果主进程因意外原因(如接收信号)突然退出,Python的multiprocessing
有时无法正确清理其子进程。这是一个已知的问题,所以如果你在中断解释器后发现有资源泄漏的情况,很可能就是这个问题导致的。
策略管理
- torch.multiprocessing.get_all_sharing_strategies()[源代码]
-
返回当前系统中支持的共享策略集。
- torch.multiprocessing.get_sharing_strategy()[源代码]
-
返回当前用于共享 CPU 张量的策略。
- torch.multiprocessing.set_sharing_strategy(new_strategy)[源代码]
-
设定共享CPU张量的策略。
- 参数
-
new_strategy (str) – 选定的策略名称。应为
get_all_sharing_strategies()
返回值之一。
生成子进程
注意
支持 Python 3.4 及以上版本。
这取决于Python的
可以通过创建Process
实例并调用join
来等待它们完成,从而启动多个子进程以执行某些功能。这种方法在处理单个子进程时效果很好,但在处理多个进程时可能会遇到一些问题。
也就是说,顺序连接进程意味着它们会依次终止。如果进程未能如预期那样终止,特别是第一个进程没有终止的情况下,这种情况可能不会被发现。另外,系统中也没有内置机制来处理和传播错误。
下面的 spawn
函数解决了这些问题,处理了错误传播和乱序终止的问题,并且一旦检测到一个进程出错,就会主动终止所有进程。
- torch.multiprocessing.spawn.spawn(fn, args=(), nprocs=1, join=True, daemon=False, start_method='spawn')[源代码]
-
创建
nprocs
个进程,每个进程用args
参数来运行fn
函数。如果其中一个进程以非零退出状态退出,其余进程将被杀死,并抛出一个包含终止原因的异常。如果子进程中捕获到异常,该异常将被转发,并将其回溯信息包含在父进程中抛出的异常中。
- 参数
-
-
fn (函数) –
该函数被调用作为派生进程的入口点。它必须在模块的顶层定义,以便可以被序列化和启动。这是multiprocessing模块的要求。
该函数的调用方式为
fn(i, *args)
,其中i
表示进程索引,args
是一个包含所有参数的元组。 -
args (元组) – 传递给函数
fn
的参数。 -
nprocs (int) – 指定要创建的进程数。
-
join (bool) – 对所有进程进行阻塞式的等待连接。
-
daemon (bool) – 孵化进程的守护进程标志。若设置为 True,将创建守护进程。
-
start_method (str) – (已弃用)此参数始终使用
spawn
作为启动方法。若要使用其他启动方法,请调用start_processes()
。
-
- 返回值
-
如果
join
为True
,则返回None
;如果join
为False
,则返回ProcessContext