DDP-mp.set_sharing_strategy('file_system')导致程序不能正常退出
ddp训练结束后,发现进程不终止,显存和cpu仍在占用,尝试
torch.distributed.destroy_process_group()
torch.cuda.empty_cache()
if dist.get_rank()==0:
exit()
等清理方法均无效,主进程不能退出,程序只能手动停止。
排查发现是由于代码中使用了torch.multiprocessing的文件共享策略,这样新建了一个受保护的进程用于共享内存,即使训练结束也不会停止。去掉这一行程序即可正常结束。
torch.multiprocessing.set_sharing_strategy('file_system')
以下是官方文档:
如果你的系统对打开的文件描述符数量有限制,并且无法提高,你应该使用file_system
策略。File system -file_system
这个策略将提供文件名称给shm_open
去定义共享内存区域。该策略不需要缓存从其获得的文件描述符的优点,但是容易发生共享内存泄漏。该文件创建后不能被删除,因为其他进程需要访问它以打开其视图。如果进程崩溃或死机,并且不能调用存储析构函数,则文件将保留在系统中。这是非常严重的,因为它们在系统重新启动之前不断使用内存,或者手动释放它们。为了记录共享内存文件泄露数量,torch.multiprocessing
将产生一个守护进程叫做torch_shm_manager
将自己与当前进程组隔离,并且将跟踪所有共享内存分配。一旦连接到它的所有进程退出,它将等待一会儿,以确保不会有新的连接,并且将遍历该组分配的所有共享内存文件。如果发现它们中的任何一个仍然存在,它们将被释放。我们已经测试了这种方法,并且它已被证明对于各种故障都是稳健的。如果你的系统有足够高的限制,并且file_descriptor
是被支持的策略,我们不建议切换到这个
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通