deepspeed从入门到放弃

本文并不讲解deepspeed的原理以及用法,只是澄清几个deepspeed中的技术细节。

启动deepspeed训练可以通过运行deepspeed --nproc-per-node 4 xxx.py ...,这样就会启动4个进程来运行xxx.py

  1. 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>(注意下划线和连字符的不同)。

  1. 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)
posted @ 2024-09-01 00:37  王冰冰  阅读(2)  评论(0编辑  收藏  举报