anosorae / IRRA

Cross-Modal Implicit Relation Reasoning and Aligning for Text-to-Image Person Retrieval (CVPR 2023)
MIT License
194 stars 27 forks source link

如何使用多GPU训练? #40

Open lizimo-n opened 6 months ago

lizimo-n commented 6 months ago

如何使用多GPU训练?服务器有四张卡(0,1,2,3).然后我想使用卡1和卡2.怎么办?求大神告知,我看源码里面好像对多GPU训练的部分写的有些问题,有人遇到过这个问题吗

lizimo-n commented 6 months ago

已经解决了,以前用的都是DataParallel,而本代码里面用的是DistributedDataParallel来做并行训练。 准备过几天好好把并行训练的知识点学一学!我服务器上有4张卡(每张49G),然后我用了两张卡跑,batch设置为188 下面是我使用的两个命令,第一个是放在后台离线跑,指定输出文件。第二个是在线跑,在终端打印结果 nohup sh -c "CUDA_VISIBLE_DEVICES=1,2 python -m torch.distributed.launch --nproc_per_node=2 multi_gpu_train.py --name='irra' --img_aug --MLM --dataset_name='CUHK-PEDES' --loss_names='sdm+mlm+id' --root_dir='./data' --num_epoch=100 --batch_size=188" > run-IRRA-epoch100.log 2>&1 &

CUDA_VISIBLE_DEVICES=1,2 python -m torch.distributed.launch --nproc_per_node=2 multi_gpu_train.py --name='irra' --img_aug --MLM --dataset_name='CUHK-PEDES' --loss_names='sdm+mlm+id' --root_dir='./data' --num_epoch=100 --batch_size=188

koalayyy commented 4 months ago

请问使用多gpu时代码里做了哪些修改呢,现在跑多gpu也遇到了一些问题,感谢!

lizimo-n commented 4 months ago

你好,代码没做任何修改,我是加了一个sh脚本,sh脚本命名为run.sh,其内容如下:

!/home/202312150002/anaconda3/envs/lzm/bin/python3.8

export CUDA_VISIBLE_DEVICES=0,1,2

python -m torch.distributed.run --nproc_per_node=3 \ train.py \ --name style4_global_itc2 \ --img_aug \ --batch_size 128 \ --MLM \ --pretrain_choice 'ViT-B/16' \ --loss_names 'sdm+mlm+id' \ --num_epoch 100

lizimo-n commented 4 months ago

上面的脚本内容,从python-m那一行开始后面都有一个反斜杠哈。最后一行不用,刚才我发现github里面没有显示出来这个反斜杠,不要误导您

koalayyy commented 4 months ago

上面的脚本内容,从python-m那一行开始后面都有一个反斜杠哈。最后一行不用,刚才我发现github里面没有显示出来这个反斜杠,不要误导您

好的,非常感谢!

sunzhens commented 4 months ago

已经解决了,以前用的都是DataParallel,而本代码里面用的是DistributedDataParallel来做并行训练。 准备过几天好好把并行训练的知识点学一学!我服务器上有4张卡(每张49G),然后我用了两张卡跑,batch设置为188 下面是我使用的两个命令,第一个是放在后台离线跑,指定输出文件。第二个是在线跑,在终端打印结果 nohup sh -c "CUDA_VISIBLE_DEVICES=1,2 python -m torch.distributed.launch --nproc_per_node=2 multi_gpu_train.py --name='irra' --img_aug --MLM --dataset_name='CUHK-PEDES' --loss_names='sdm+mlm+id' --root_dir='./data' --num_epoch=100 --batch_size=188" > run-IRRA-epoch100.log 2>&1 &

CUDA_VISIBLE_DEVICES=1,2 python -m torch.distributed.launch --nproc_per_node=2 multi_gpu_train.py --name='irra' --img_aug --MLM --dataset_name='CUHK-PEDES' --loss_names='sdm+mlm+id' --root_dir='./data' --num_epoch=100 --batch_size=188

你好,我尝试用下面这个命令用多GPU复现 CUDA_VISIBLE_DEVICES=0,1,2 python -m torch.distributed.run --nproc_per_node=3 train.py --name style4_global_itc2 --img_aug --batch_size 128 --MLM --pretrain_choice 'ViT-B/16' --loss_names 'sdm+mlm+id' --root_dir '/home/xmu/datasets_lwh/' --num_epoch 100 --dataset_name 'CUHK-PEDES' 但是出现了下面的问题,请问这怎么解决啊?谢谢 image

ForeUP commented 2 months ago

你好,代码没做任何修改,我是加了一个sh脚本,sh脚本命名为run.sh,其内容如下: #!/home/202312150002/anaconda3/envs/lzm/bin/python3.8 export CUDA_VISIBLE_DEVICES=0,1,2

python -m torch.distributed.run --nproc_per_node=3 train.py --name style4_global_itc2 --img_aug --batch_size 128 --MLM --pretrain_choice 'ViT-B/16' --loss_names 'sdm+mlm+id' --num_epoch 100

作者的代码里并没有实现ddp训练的sampler,应该需要自己补充一下,如下面代码所示: https://github.com/anosorae/IRRA/blob/c698f851e5c866cd79031320825844e547249690/datasets/build.py#L116-L118

我尝试改了下,但是具体是不是存在错误需要等我训练完验证一下:

            if args.distributed:
                # TODO valid distributed condition
                logger.info('using ddp random sampler')
                logger.info('DISTRIBUTED TRAIN START')
                mini_batch_size = args.batch_size // get_world_size()
                # 初始化DistributedSampler
                train_sampler = DistributedSampler(train_set, shuffle=True)
                train_loader = DataLoader(train_set,
                                          batch_size=mini_batch_size,  # 改为mini_batch
                                          sampler=train_sampler,  # 使用DistributedSampler
                                          num_workers=num_workers,
                                          collate_fn=collate)