code: def fastnlp_oneflow_all_gather(obj: Any, device=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 isinstance(obj, oneflow.Tensor):
          objs = [
              oneflow.zeros_like(obj)
              for _ in range(dist_env.get_world_size())
          ]
          comm.all_gather(objs, obj)
      else:
          objs = [None for _ in range(dist_env.get_world_size())]
          # 防止 unpickle 的时候弄到发送的 gpu 上了
          obj = apply_to_collection(
              obj,
              oneflow.Tensor,
              _to_device,
              device=oneflow.device("cpu"),
          )
          all_gather_object(objs, obj)
      return objs
  
file_path: fastNLP/fastNLP/core/drivers/oneflow_driver/dist_utils.py
imports: import io
  import pickle
  import os
  from typing import Any, List
  from fastNLP.core.utils import apply_to_collection, get_oneflow_device
  from fastNLP.envs.imports import _NEED_IMPORT_ONEFLOW
  from fastNLP.envs.env import FASTNLP_NO_SYNC
label_desc: Use image node_id 7 for calling a global function with example usage: fastnlp_oneflow_all_gather(obj, device) and returns: objs, list