class_docstr: Wrap a DistributedDataParallel module and forward requests for missing
  attributes to the module wrapped by DDP (the twice-wrapped module).
  Also forward calls to :func:`state_dict` and :func:`load_state_dict`.
  
  Usage::
  
      module.xyz = "hello world"
      wrapped_module = DistributedDataParallel(module, **ddp_args)
      wrapped_module = ModuleProxyWrapper(wrapped_module)
      assert wrapped_module.xyz == "hello world"
      assert wrapped_module.state_dict().keys() == module.state_dict().keys()
  
  Args:
      module (nn.Module): module to wrap
docstr: Forward missing attributes to twice-wrapped module.
docstr_tok: ["Forward","missing","attributes","to","twice-wrapped","module","."]
code: def __getattr__(self, name):
      """Forward missing attributes to twice-wrapped module."""
      try:
          # defer to nn.Module's logic
          return super().__getattr__(name)
      except AttributeError:
          try:
              # forward to the once-wrapped module
              return getattr(self.module, name)
          except AttributeError:
              # forward to the twice-wrapped module
              return getattr(self.module.module, name)
  
imports: from torch import nn
label_desc: Use image node_id 2 for calling the ModuleProxyWrapper obj's underlying member method code with example usage: obj.__getattr__(name) and returns: super, getattr, getattr