code: def backward(ctx, grad_output_3D):
      input, weight, bias = ctx.saved_tensors
  
      grad_output = grad_output_3D.reshape(-1, grad_output_3D.size(-1))
  
      grad_input = grad_weight = grad_bias = None
  
      if ctx.needs_input_grad[0]:
          grad_input = grad_output.matmul(
              weight.to(grad_output.dtype)
          ).view(*grad_output_3D.size()[:-1], -1)
      if ctx.needs_input_grad[1]:
          grad_weight = grad_output.t().matmul(
              input.to(grad_output.dtype)
          )
      if bias is not None and ctx.needs_input_grad[2]:
          grad_bias = grad_output.sum(0)
  
      return grad_input, grad_weight, grad_bias
  
imports: import torch
  import torch.nn
  import time
  from functools import partial
  from bitsandbytes.triton.triton_utils import is_triton_available
  from bitsandbytes.triton.dequantize_rowwise import dequantize_rowwise
  from bitsandbytes.triton.quantize_rowwise import quantize_rowwise
  from bitsandbytes.triton.quantize_columnwise_and_transpose import quantize_columnwise_and_transpose
  from bitsandbytes.triton.int8_matmul_rowwise_dequantize import int8_matmul_rowwise_dequantize
  from bitsandbytes.triton.quantize_global import quantize_global, quantize_global_transpose
  from bitsandbytes.triton.int8_matmul_mixed_dequantize import int8_matmul_mixed_dequantize
label_desc: Use image node_id 2 for calling the StandardLinearFunction obj's underlying member method code with example usage: obj.backward(ctx, grad_output_3D) and returns: grad_input,  grad_weight,  grad_bias