Sharing strategies
本节简要概述了不同的共享策略如何工作。
请注意,它仅适用于CPU张量 - CUDA张量将始终使用CUDA API,因为它们是唯一的共享方式。
File descriptor-file_descripor
NOTE: 这是默认策略(除了不支持的MacOS和OS X)。
此策略将使用文件描述符作为共享内存句柄。当存储被移动到共享内存中,一个由shm_open获得的文件描述符被缓存,
并且当它将被发送到其他进程时,文件描述符将被传送(例如通过UNIX套接字)。
接收者也将缓存文件描述符,并且mmap它,以获得对存储数据的共享视图。
请注意,如果要共享很多张量,则此策略将保留大量文件描述符。
如果你的系统对打开的文件描述符数量有限制,并且无法提高,你应该使用file_system策略。
File system -file_system
这个策略将提供文件名称给shm_open去定义共享内存区域。
该策略不需要缓存从其获得的文件描述符的优点,但是容易发生共享内存泄漏。
该文件创建后不能被删除,因为其他进程需要访问它以打开其视图。
如果进程崩溃或死机,并且不能调用存储析构函数,则文件将保留在系统中。
这是非常严重的,因为它们在系统重新启动之前不断使用内存,或者手动释放它们。
为了记录共享内存文件泄露数量,torch.multiprocessing将产生一个守护进程叫做torch_shm_manager
将自己与当前进程组隔离,并且将跟踪所有共享内存分配。一旦连接到它的所有进程退出,
它将等待一会儿,以确保不会有新的连接,并且将遍历该组分配的所有共享内存文件。
如果发现它们中的任何一个仍然存在,它们将被释放。我们已经测试了这种方法,并且它已被证明对于各种故障都是稳健的。
如果你的系统有足够高的限制,并且file_descriptor是被支持的策略,我们不建议切换到这个。