The process I think is as follows.
GPU1 GPU2 GPU3
model model model
dataloader1 dataloader2 dataloader3

This is possible and is actually the recommended use case for DDP. For dataloader, you can use the DistributedSampler 1 and set num_replicas properly to match DDP world size.

I want to backpropagation by averaging the loss values of each dataloader.

This is a bit tricky. With DDP, outputs and losses are local to each process. DDP synchronizes models by synchronizing gradients. More details are available in this PyTorch Distributed paper.

Each data loader has different image size and batch size, so concatDataset cannot be used.

I see. Independent dataloaders could still work with DDP, but you will need to be aware of the implications on model accuracy. Is this the reason why you have to average loss instead of gradients?