In case anyone else is wondering about this, I figured it out.
Trainer indeed appears to prefetch data. The problem was that my data loader was too slow to keep up with the GPU.
After optimizing my data loading routine, I’m able to keep the GPU busy constantly.