class_docstr: A multi-GPU version of the Projected Gradient Descent Attack
  (Madry et al. 2017).
  Paper link: https://arxiv.org/pdf/1706.06083.pdf
  
  This attack is designed to run on multiple GPUs for generating adversarial
  examples.
  Comparing to data parallelism, using this parallelization we can get
  very close to optimal n times speed up using n GPUs. The current
  implementation gets close to 6x speed up on 8 GPUs.
docstr: Take in a dictionary of parameters and applies attack-specific checks
  before saving them as attributes.
  
  Attack-specific parameters:
  :param ngpu: (required int) the number of GPUs available.
  :param kwargs: A dictionary of parameters for MadryEtAl attack.
code: def parse_params(self, ngpu=1, **kwargs):
      """
      Take in a dictionary of parameters and applies attack-specific checks
      before saving them as attributes.
  
      Attack-specific parameters:
      :param ngpu: (required int) the number of GPUs available.
      :param kwargs: A dictionary of parameters for MadryEtAl attack.
      """
  
      return_status = super(MadryEtAlMultiGPU, self).parse_params(
          **kwargs
      )
      self.ngpu = ngpu
  
      return return_status
  
file_path: cleverhans/cleverhans_v3.1.0/examples/multigpu_advtrain/attacks_multigpu.py
imports: from collections import OrderedDict
  import tensorflow
  from cleverhans.attacks import MadryEtAl
  from cleverhans.utils_tf import clip_eta
  from model import clone_variable
label_desc: Use image node_id 5 for calling the MadryEtAlMultiGPU obj's underlying member method code with example usage: obj.parse_params(ngpu) and returns: return_status