I am already using the err.data[0], but that is good to know.  del of variables does not seem to free up the CUDA memory at all. Is there something I need to do for CUDA vars after I call del?
For my use case, the difference between train and validate is the calls to:
opt.zero_grad()
...
loss.backward() 
opt.step()

Could those be freeing up the memory in some way?  My train loop has far more batches and has no issues with GPU memory.