def METHOD_NAME(
    self,
    model: nn.Module,
    optimizer: Optional[Optimizer] = None,
    criterion: Optional[Callable] = None,
    dataloader: Optional[DataLoader] = None,
    lr_scheduler: Optional[LRScheduler] = None,
) -> Tuple[nn.Module, OptimizerWrapper, Callable, DataLoader, LRScheduler]:
    # cast model to cuda
    model = model.cuda()
    # convert model to sync bn
    model = nn.SyncBatchNorm.convert_sync_batchnorm(model, None)
    # wrap the model with PyTorch DDP
    model = TorchDDPModel(model, **self.ddp_kwargs)
    if optimizer is not None and \
            not isinstance(optimizer, OptimizerWrapper):
        optimizer = OptimizerWrapper(optimizer)
    return model, optimizer, criterion, dataloader, lr_scheduler