class_docstr: The DDP module that supports DataContainer.
  
  This MMDDP has some differences with the original MMDDP:
  
  - It implements a ``forward()`` method
  - It update the code in ``train_step()`` ``val_step()`` and ``_run_ddp_forward()``
  when self.device_ids is None, which means training with CPU
  
  related issues:
  - https://github.com/open-mmlab/mmcv/issues/2524
  - https://github.com/open-mmlab/mmcv/issues/2558
  When the issues above is solved by mmcv, this file can be deleted, then directly
  use the MMDDP implemented by mmcv in MMCVRayEpochRunner.
code: def to_kwargs(
      self, inputs: ScatterInputs, kwargs: ScatterInputs, device_id: int
  ) -> Tuple[tuple, tuple]:
      # Use `self.to_kwargs` instead of `self.scatter` in pytorch1.8
      # to move all tensors to device_id
      return scatter_kwargs(inputs, kwargs, [device_id], dim=self.dim)
  
file_path: BigDL/python/orca/src/bigdl/orca/learn/pytorch/experimential/mmcv/distributed.py
imports: from typing import Any, List, Tuple
  import torch
  from torch.nn.parallel.distributed import DistributedDataParallel, _find_tensors
  from mmcv import print_log
  from mmcv.utils import TORCH_VERSION, digit_version
  from mmcv.parallel.scatter_gather import ScatterInputs, scatter_kwargs
label_desc: Use image node_id 2 for calling the MMDistributedDataParallel obj's underlying member method code with example usage: obj.to_kwargs(inputs, kwargs, device_id) and returns: scatter_kwargs