code: def backward(ctx, grad_o):
      outputs = ctx.saved_tensors[-3:]
  
      if ctx.downsample:
          grad_conv3, grad_conv4 = drelu_dscale2(
              grad_o,
              outputs[2],
              ctx.saved_tensors[6],
              ctx.saved_tensors[11],
          )
      else:
          grad_conv3, grad_conv4 = drelu_dscale1(
              grad_o, outputs[2], ctx.saved_tensors[6]
          )
  
      # create input vector for backward
      t_list = [*ctx.saved_tensors[0:10]]
      t_list.append(grad_conv3)
      t_list.append(grad_conv4)
  
      # outputs used for wgrad and generating drelu mask
      t_list.append(outputs[0])
      t_list.append(outputs[1])
  
      # in case there is downsample
      if ctx.downsample:
          t_list.append(ctx.saved_tensors[10])
  
      grads = fast_bottleneck.backward(ctx.nhwc, ctx.stride_1x1, t_list)
  
      return (None, None, None, None, *grads)
  
imports: import functools
  import torch
  import torch.distributed
  from torch import nn
  from apex import check_cudnn_version_and_warn
  import fast_bottleneck
  import nccl_p2p_cuda
label_desc: Use image node_id 2 for calling the BottleneckFunction obj's underlying member method code with example usage: obj.backward(ctx, grad_o) and returns: None,  None,  None,  None,  unknown