code: def fastnlp_paddle_all_gather(
      obj: Any, device=None, group=None
  ) -> List:
      """
      实现任何类型的数据都使用该接口可以进行 all_gather 操作。对于非 tensor 类型的数据，通过 pickle 序列化再反序列化的方式进行传输。
  
      example::
  
          >>> # rank 0
          >>> obj = {'a': 1, 'b':[1, 2], 'c':{'d': 1}}
          >>> # rank 1
          >>> obj = {'a': 1, 'b':[1, 2], 'c':{'d': 2}}
          >>> # after all_gather():
          >>> result = [
                  {'a': 1, 'b':[1, 2], 'c':{'d': 1}},
                  {'a': 1, 'b':[1, 2], 'c':{'d': 2}}
              ]
  
      :param obj: 任意结构的数据，如果为 tensor ，需要保证每个显卡上的 tensor 的形状是一样的。如果传入的是非 tensor 对象都将直接进行
          序列化之后进行传输。
      :param device: 当前该参数无意义。
      :param group:
      :return: 返回的结果是 [obj0, obj1, ...]，其中 obj_i 即为第 i 个 rank 上的 obj 。
      """
      if int(os.environ.get(FASTNLP_NO_SYNC, "0")) == 2:
          return [obj]
  
      # if group is None:
      # TODO 2.2 版本存在 bug
      # group = dist.collective._get_global_group()
      if isinstance(obj, paddle.Tensor):
          objs = []
          dist.all_gather(objs, obj, group=group)
      else:
          objs = [None for _ in range(dist.get_world_size())]
          # 防止 unpickle 的时候弄到发送的 gpu 上了
          obj = paddle_move_data_to_device(obj, "cpu")
          objs = all_gather_object(objs, obj, group=group)
  
      return objs
  
file_path: fastNLP/fastNLP/core/drivers/paddle_driver/dist_utils.py
imports: import io
  import pickle
  import os
  from typing import Any, List
  import numpy
  from fastNLP.envs.imports import _NEED_IMPORT_PADDLE
  from fastNLP.envs.env import FASTNLP_NO_SYNC
  from fastNLP.core.utils import paddle_move_data_to_device
label_desc: Use image node_id 8 for calling a global function with example usage: fastnlp_paddle_all_gather(obj, device, group) and returns: objs, list