code: def send_forward_recv_backward(output_tensors, tensor_shapes, config):
      if not isinstance(output_tensors, list):
          output_tensors = [output_tensors]
      output_tensor_grads = []
      for output_tensor, tensor_shape in zip(
          output_tensors, tensor_shapes
      ):
          if tensor_shape is None:
              output_tensor_grads.append(None)
              continue
          output_tensor_grad = (
              p2p_communication.send_forward_recv_backward(
                  output_tensor, tensor_shape, config
              )
          )
          output_tensor_grads.append(output_tensor_grad)
      return output_tensor_grads
  
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 13 for calling a global function with example usage: send_forward_recv_backward(output_tensors, tensor_shapes, config) and returns: output_tensor_grads