Oh, I was mistaken. You are already loading the parameters before setting up DDP.
Then it is not necessary to load to use self.model.module.load_state_dict.
Would you mind checking if this is the opposite case?
How did you save your ‘state_dict’?
Did you save parameters of the DDP model as
self.model.state_dict() where
isinstance(self.model, torch.nn.parallel.DistributedDataParallel) == True?
If so, you may need to encapsulate the model as DDP and then load parameters.
model = ...
model = torch.nn.parallel.DistributedDataParallel(
    model, device_ids=[args.gpu]
    ,find_unused_parameters=True)

checkpoint = torch.load(...)

model.load_state_dict(checkpoint[state_dict])