yes, Nvidia has a tool to measure performance.  But being fast on GPU not only depends on how many streams you launch at a time. It will also depend on memory transfers, memory fetching and so on.
However, it should be noted that the bottleneck of your algorithm is given by the GPU memory, because if your model is very large, autograd has to store all the computation history, so if your batch is bigger, pytorch will use more memory. In general, unless you call cudaDeviceSynchronize what happens is that cuda queues all the kernels you want to launch, and the main thread continues its execution. Then, CUDA is what manage how kernels are queued and when to launch them, I do not know if you can control that. What you can control is how you fetch the memory, branch divergence,  how many threads you launch by block or by grid and so on…