Multiprocessing包 - torch.multiprocessing
这个API与原始模块100%兼容,将import multiprocessing
改为就可以将所有张量通过队列发送或通过其他机制共享转移到共享内存中
由于API的相似性,我们没有记录这个软件包的大部分内容,我们建议您参考Python multiprocessing
原始模块的文档。
返回一组当前系统支持的共享策略。
设置共享CPU张量的策略
参数: new_strategy(str)- 所选策略的名称。应当是上面get_all_sharing_strategies()
中系统支持的共享策略之一。
只支持在Python 3中使用spawn
或forkserver
启动方法才支持在进程之间共享CUDA张量。
Python2中的multiprocessing
只能使用创建子进程,并且不支持CUDA运行时。
本节简要概述了不同的共享策略如何工作。请注意,它只适用于CPU张量 - CUDA张量将始终使用CUDA API,因为它们是唯一的共享方式。
此策略将使用文件描述符作为共享内存句柄。当存储器被移动到共享存储器时,每当存储器被移动到共享内存中时,从shm_open
对象获取的文件描述符被缓存,并且当它被发送到其他进程时,文件描述符也将被传送(例如通过UNIX套接字)。接收器还将缓存文件描述符并且mmap
它,以获得对存储数据的共享视图。
请注意,如果要共享很多张量,则此策略将保留大量文件描述符需要很多时间才能打开。如果您的系统对打开的文件描述符数量有限制,并且无法提高,你应该使用file_system
策略。
为了解决共享内存文件泄漏的问题,torch.multiprocessing
将产生一个守护程序,它将自己与当前进程组隔离,并且将跟踪所有共享内存分配。一旦连接到它的所有进程退出,它将等待一会儿,以确保不会有新的连接,并且将遍历该组分配的所有共享内存文件。如果发现它们中的任何一个仍然存在,就释放掉它。我们已经测试了这种方法,并且证明对于各种故障是稳健的。不过,如果您的系统具有足够的限制,并且支持file_descriptor
策略,我们不建议切换到该策略。