code: def send_backward_recv_forward(
      input_tensor_grads, tensor_shapes, config
  ):
      if not isinstance(input_tensor_grads, list):
          input_tensor_grads = [input_tensor_grads]
      input_tensors = []
      for input_tensor_grad, tensor_shape in zip(
          input_tensor_grads, tensor_shapes
      ):
          if tensor_shape is None:
              input_tensors.append(None)
              continue
          input_tensor = p2p_communication.send_backward_recv_forward(
              input_tensor_grad, tensor_shape, config
          )
          input_tensors.append(input_tensor)
      return input_tensors
  
imports: import contextlib
  from typing import Callable, Iterator, List, Optional, Union
  import torch
  from torch.autograd.variable import Variable
  from megatron.core import parallel_state
  from megatron.core.enums import ModelType
  from megatron.core.pipeline_parallel import p2p_communication
  from megatron.core.utils import get_attr_wrapped_model, get_model_config, get_model_type
label_desc: Use image node_id 14 for calling a global function with example usage: send_backward_recv_forward(input_tensor_grads, tensor_shapes, config) and returns: input_tensors