最近在搞一个多智能体协作的AI Agent项目,环境是PettingZoo的MAMujoco,策略用的是MAPPO。单机单卡跑小规模(2个agent)还没啥问题,但一上4个agent并用torch.distributed做多进程训练,就疯狂报“NCCL通信超时”,有时候还莫名其妙内存溢出。我试过调大timeout和减小batch size,但跑个几百步就卡死。有没有老哥踩过类似的坑?是环境同步的问题还是PyTorch分布式策略没配好?求指点,孩子快调吐了。
用PyTorch搭多智能体强化学习,分布式训练总是报错,求老哥支招
全部回复
共 186 条多智能体+分布式,坑确实多。MAMujoco里每个env step都要同步,NCCL超时经常是某个进程卡在collective上,不一定是网络问题。可以先把agent数降到3个,看是不是规模一上来就炸。另外MAPPO的critic输入维度是不是随agent数变了?维度对不上时DDP容易静默hang住,最后才超时。
PettingZoo的MAMujoco在分布式下确实容易踩坑,我之前也遇到过类似的NCCL超时。后来发现是环境reset时各进程的随机种子没对齐,导致某些agent卡在等同步上,时间一长就超时了。你可以试试在每个进程初始化时手动设torch.manual_seed和np.random.seed,保证环境步调一致。另外内存溢出大概率是经验回放池在多进程里各存了一份,检查下是不是没做共享或者分片。
PettingZoo多进程配合NCCL本来就容易踩坑,建议先查下各进程环境步数是否对齐,不然同步必卡。
NCCL超时这问题在多智能体里挺常见的,尤其是PettingZoo这种环境同步机制跟torch.distributed混用的时候。我之前跑MAMujoco用MAPPO也遇到过类似情况,后来发现主要是环境step的时间不一致导致的——有些agent动作算得快,有些慢,NCCL的allreduce就会等半天最后超时。你可以试试在每个agent的forward之后加个torch.cuda.synchronize()看看是不是卡在某一步。另外内存溢出大概率不是batch size的问题,而是多进程下每个进程都复制了一份环境实例,4个agent的话显存占用是单卡的几倍,建议检查一下是不是每个worker都独立开了env。还有个坑是PettingZoo的parallel_env和AECEnv在分布式下的行为不一样,如果你用的是AEC模式,step的阻塞逻辑会让NCCL的通信组死锁。我之前换成parallel_env再配合torch.distributed的gloo后端做控制流同步,NCCL只负责梯度allreduce,就稳定多了。你可以先拿2个agent跑一下torch.distributed的debug模式,看看到底是通信卡住还是环境卡住,别一上来就4个agent硬调。
写得挺好,建议补充一些性能数据。
MAMujoco多agent上分布式确实容易踩坑,NCCL超时大概率不是timeout本身的问题。你检查下每个进程的env是不是独立reset的,PettingZoo的并行环境在多进程下如果共享了随机种子或者状态,同步点就会卡住。另外MAPPO的critic输入维度随agent数变化,4个agent时显存涨得比想象快,OOM可能就是这么来的,建议先固定agent数做profile看显存峰值。我之前3个agent跑崩过,最后是给每个worker单独设了CUDA_VISIBLE_DEVICES才稳定下来。