No, what I meant is just simply moving the line
model.load_state_dict(checkpoint['state_dict'])

after you casting DDP encapsulation not before it.
model = torch.nn.parallel.DistributedDataParallel(
    model, device_ids=[args.gpu]
    #,output_device=[args.gpu]
    ,find_unused_parameters=True)

In short, you can try:
model = torch.nn.parallel.DistributedDataParallel(
    model, device_ids=[args.gpu]
    #,output_device=[args.gpu]
    ,find_unused_parameters=True)

model.load_state_dict(checkpoint['state_dict'])

When you cast your model as DataParallel or DistributedDataParallel, they move your layers under .module. For example, self.model.backbone will move to self.model.module.backbone.
When you call your parameters as self.model.state_dict() at saving, the changed hierarchy will also be applied to the state_dict.
Due to the difference, you will be able to load your state_dict when your model is the same DistributedDataParallel class, not the basic nn.Module class.