在多机多卡训练中,涉及到的参数主要有这些
os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
首先强调,world_size 代表着进程的总数量。无论是用mp.spawn()创建,还是手动跑两个,得保证进程总数等于world_size。
- 比如在同一个机器上,跑两个进程
os.environ['CUDA_VISIBLE_DEVICES']='0'
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
和
os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
- 或者在两台机器上,各跑一个
主机1
os.environ['CUDA_VISIBLE_DEVICES']='0'
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
主机2
os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '主机1的ip'
os.environ['MASTER_PORT'] = '29501'
这两者的效果是等效的,但进程数必须和world_size相等,才能执行,进程数=机器数*每个机器上的进程数
关于rank,的定义比较混乱,有人说是机器的编号,有人说是进程的编号,反正是一团乱。这里声明一下,rank就是进程的编号,机器的编号是node_rank。
比如2个8卡机,world_size=16,(有人说world_size=2,但这是混淆的,实际就是16,等于2的那个是nnodes),此时得在0号机器上创建rank为0-7,local_rank为0-7的进程,在1号机器上创建rank为1-15,local_rank为0-7的进程,才能执行。而且主机ip都要设置成0号机器的ip。数据传输时,用DDP(model, device=local_rank)。
torchrun帮我们解决了这一麻烦。
torchrun --nproc_per_node=8 --nnodes=... --node_rank=... --master_addr=... --master_port=... train.py
这里nproc_per_node=8表示每个机器上使用8张卡,他会自动创建8个进程,为每一个进程分配一个local_rank,已经不需要我们手动设置RANK,WORD_SIZE。
nnodes表示主机的数量,node_rank表示主机的编号。
非要说的话,这里
world_size=nnodes*nproc_per_node,
rank=node_rank*nproc_per_node+local_rank
参考
https://blog.csdn.net/qq_44289607/article/details/123332574
https://blog.csdn.net/qq_40676033/article/details/126695722?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172010202416800182175257%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172010202416800182175257&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-4-126695722-null-null.142v100pc_search_result_base7&utm_term=word_size%E6%98%AF%E4%B8%BB%E6%9C%BA%E6%95%B0%E9%87%8F%E8%BF%98%E6%98%AF%E6%98%BE%E5%8D%A1%E6%95%B0%E9%87%8F&spm=1018.2226.3001.4187
https://zhuanlan.zhihu.com/p/373395654
https://www.cnblogs.com/qizhou/p/16770143.html
https://coderlemon17.github.io/posts/2022/02-14-ddp/