code: def forward(ctx, nhwc, stride_1x1, scale, bias, x, *conv):
      # TODO: clean up order of tensors
      args = [x, *conv[0:3], *scale[0:3], *bias[0:3]]
      ctx.downsample = len(conv) > 3
      if ctx.downsample:
          args.append(conv[3])
          args.append(scale[3])
          args.append(bias[3])
  
      # weight buffers are always in nhwc while shape can be nhwc or channels_last
      # here we pass in flag and let c++ handle it
      # alternatively, we can put all sizes into a fixed format and pass it in
      outputs = fast_bottleneck.forward(nhwc, stride_1x1, args)
      ctx.save_for_backward(*(args + outputs))
      # save relu outputs for drelu
      ctx.nhwc = nhwc
      ctx.stride_1x1 = stride_1x1
      return outputs[2]
  
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 1 for calling the BottleneckFunction obj's underlying member method code with example usage: obj.forward(ctx, nhwc, stride_1x1, scale, bias, x) and returns: outputs