Pipe combines pipeline parallelism with checkpointing to reduce
   peak memory required to train while minimizing device under-
   utilization.
You should place all the modules on the appropriate devices and
   wrap them into an "nn.Sequential" module defining the desired order
   of execution. If a module does not contain any parameters/buffers,
   it is assumed this module should be executed on CPU and appropriate
   input tensors to the module are moved to CPU before execution. This
   behavior can be overridden by the "WithDevice" wrapper which can be
   used to explicitly specify which device a module should run on.
Parameters:
      * module ("nn.Sequential") -- sequential module to be
        parallelized using pipelining. Each module in the sequence has
        to have all of its parameters on a single device. Each module
        in the sequence has to either be an nn.Module or
        "nn.Sequential" (to combine multiple sequential modules on a
        single device)