code: def backward(ctx, G_3D):
      X, W = ctx.save_for_backward
  
      G = G_3D.reshape(-1, G_3D.size(-1))
  
      grad_X = grad_W = grad_bias = None
  
      if ctx.needs_input_grad[0]:
          # rowwise quantize for G, columnwise quantize for W and fused transpose
          # we call .t() for weight later because only A @ B^T is supported
          G_int8, state_G = quantize_rowwise(G)
          W_int8, state_W = quantize_columnwise_and_transpose(W)
          grad_X = int8_matmul_rowwise_dequantize(
              G_int8, W_int8.t(), state_G, state_W, None
          ).view(*G_3D.size()[:-1], -1)
      if ctx.needs_input_grad[1]:
          # backward pass uses standard weight grad
          grad_W = torch.matmul(G.t(), X.to(G.dtype))
      if ctx.needs_input_grad[2]:
          grad_bias = G.sum(dim=0)
  
      return grad_X, grad_W, 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 _switchback_vectorrize obj's underlying member method code with example usage: obj.backward(ctx, G_3D) and returns: grad_X,  grad_W,  grad_bias