python中的多线程陷阱与pytorch分布式执行机制
1. 多线程
运行pytorch,设置 work 不为0时的一个怪异现象。
一个类有 __init__ 函数,也有__del__ 函数,以及其他正常函数。
__init__ 被运行后,进行了多线程复制,可能多个线程各自复制了一分这个类的实例。
各个线程在各自空间进行。
最后 __del__ 操作进行一次回收。也就是 __del__ 和 __init__ 是一一对应的,中间的其他线程是独立运行的。
2. 分布式执行
https://lambdalabs.com/blog/multi-node-pytorch-distributed-training-guide
https://www.cnblogs.com/rossiXYZ/p/15553670.html
(1)第一种方式,使用 torchrun 或python3 -m torch.distributed.launch。这种方式要求在每个节点上都要执行命令。每个命令传入了节点数量,节点rank号,主节点地址端口等。该命令根据传入参数创建环境变量,训练程序从环境变量获取rank号等。
参数传入主要是为了方便,也可以直接在训练程序里指定ran号,只要不同节点上运行的程序能区分开rank号并且总的word size符合。
(2)第二种方式,使用mpi,即mpirun。这种方式相当于使用mpi程序启动 python程序。首先需要在mpi程序命令中指定节点列表,也可以通过参数文件传入,设置比较灵活。其次,需要在python程序命令中执行主节点,即rank为0的节点地址,以用来进行 init_process_group 。
一般来说,mpi参数节点列表第一个就是rank为0的节点,因此python参数的节点要填写mpi参数节点列表第一个节点。
也可以子在训练程序中通过rank 0节点广播,让其他节点获取主节点进行 init_process_group 。
mpi运行节点不必须是节点列表的第一个节点,也就是不必须是rank 0
posted on 2024-06-04 15:29 longbigfish 阅读(13) 评论(0) 编辑 收藏 举报