deepspeed从入门到放弃
本文并不讲解deepspeed的原理以及用法,只是澄清几个deepspeed中的技术细节。
启动deepspeed训练可以通过运行deepspeed --nproc-per-node 4 xxx.py ...
,这样就会启动4个进程来运行xxx.py
- deepspeed启动进程后如何知道是几号进程?
答:deepspeed启动进程会自动传入一个参数--local_rank=<rank>
,同时也会设置环境变量LOCAL_RANK
。
torchrun是通过环境变量
LOCAL_RANK
来传递rank,而torch.distributed.launch
则是通过参数--local-rank=<rank>
,值得注意的是,在pytorch 1.x版本中,torch.distributed.launch
传递的参数是--local_rank=<rank>
(注意下划线和连字符的不同)。
dist.broadcast
超时
答:分布式操作必须在所有的卡上都进行才可以,不能只有部分进程执行了这条代码。假如写了如下代码就会超时:
if local_rank == 0:
torch.distributed.broadcast(tensor, src=0)
必须在所有卡上调用broadcast(tensor, src=0)
,只不过其他卡执行的是“recv”操作,0号卡执行的是“send”操作,不然0卡发送出去后会一直等待其他进程接收,结果其他进程一直不接收,就会超时。
3. zero-3
将模型切分后,在一张卡上的model.parameters()
返回的是什么?
写一段代码测试一下哈。实测返回的是一个空参数,并不是模型的实际参数,打印结果如下:
tensor([], device='cuda:3', requires_grad=True)