This line of code:
self.frame_array_device.to(device)

won’t push the data to the device, if you don’t reassign the result via:
self.frame_array_device = self.frame_array_device.to(device)

That being said, you could try to profile the data loading using the data_time object from the ImageNet example or alternatively you could create a random CUDATensor and just execute the training without the data loading at all to check the GPU utilization.