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编辑  收藏  举报

导航