why and when to use torch.cuda.Stream()
I found torch.cuda.Stream() is manually defined in some open source code.
    self.input_stream = torch.cuda.Stream()
    self.model_stream = torch.cuda.Stream()
    self.output_stream = torch.cuda.Stream()

On torch page, it says
You normally do not need to create one explicitly: by default, each device uses its own “default” stream.
Trying to understand why they had to define this manually. From the quick google search, there are lots of how to use cuda.Stream() but no why/when/best-practice to use it.

Streams are sequences of cuda kernels. Operations in different streams may run in parallel. I don't believe they have to use them. They are are just making the code more parallel and thus hopefully faster.
