I think you are correct. I oversaw one small part of your code the dataparalell line should look like this:
   model = torch.nn.DataParallel(model, device_ids=range(torch.cuda.device_count())).cuda()

Thus moving the model to GPU . Also you can move the data and labels to GPU like so:
data = data.cuda(async=True)
label = label.cuda(async=True)

Keep in mind that the .cuda() operation is not in place that is why you need to keep track of the value it returns