code: def _convert_data_device(device: Union[str, int]) -> str:
      """
      用于转换 ``driver`` 的 ``data_device`` 的函数。如果用户设置了 ``FASTNLP_BACKEND=paddle``，那么 **fastNLP** 会将
      可见的设备保存在 ``USER_CUDA_VISIBLE_DEVICES`` 中，并且将 ``CUDA_VISIBLE_DEVICES`` 设置为可见的第一张显卡；这是为
      了顺利执行 **paddle** 的分布式训练而设置的。
  
      在这种情况下，单纯使用 ``driver.data_device`` 是无效的。比如在分布式训练中将设备设置为 ``[0,2,3]`` ，且用户设置了
      ``CUDA_VISIBLE_DEVICES=3,4,5,6`` ，那么在 ``rank1``的进程中有::
  
          os.environ["CUDA_VISIBLE_DEVICES"] = "5"
          os.environ["USER_CUDA_VISIBLE_DEVICES"] = "3,4,5,6"
          driver.data_device = "gpu:2" # 为了向用户正确地反映他们设置的设备减少歧义，因此这里没有设置为 "gpu:5"
  
      此时我们便需要通过这个函数将 ``data_device`` 转换为 ``gpu:0``。具体过程便是通过索引 **2** 在 ``USER_CUDA_VISIBLE_DEVICES`` 中
      找到设备 **5**，然后在 ``CUDA_VISIBLE_DEVICES`` 中找到设备 **5** 的索引 **0** 返回。
  
      .. note::
  
          在分布式单进程仅支持单卡的情况下中，这个函数实际等同于直接转换为 ``gpu:0`` 返回。
  
      :param device: 未转化的设备
      :return: 转化后的设备，格式为 ``gpu:x``
      """
      try:
          user_visible_devices = os.getenv(USER_CUDA_VISIBLE_DEVICES)
          if device == "cpu" or user_visible_devices is None:
              # 传入的是 CPU，或者没有设置 USER_CUDA_VISIBLE_DEVICES
              # 此时不需要进行转换
              return get_paddle_gpu_str(device)
  
          idx = get_paddle_device_id(device)
          idx = user_visible_devices.split(",")[idx]
          # 此时 CUDA_VISIBLE_DEVICES 一定不是 None
          cuda_visible_devices_list = os.getenv(
              "CUDA_VISIBLE_DEVICES"
          ).split(",")
          return f"gpu:{cuda_visible_devices_list.index(idx)}"
      except Exception as e:
          raise ValueError(
              f"Can't convert device {device} when USER_CUDA_VISIBLE_DEVICES={user_visible_devices} "
              "and CUDA_VISIBLE_DEVICES={cuda_visible_devices}. If this situation happens, please report this bug to us."
          )
  
file_path: fastNLP/fastNLP/core/utils/paddle_utils.py
imports: import os
  import re
  from typing import Any, Optional, Union
  from fastNLP.envs.imports import _NEED_IMPORT_PADDLE
  from fastNLP.envs import FASTNLP_DISTRIBUTED_CHECK, FASTNLP_BACKEND_LAUNCH, USER_CUDA_VISIBLE_DEVICES
  from .utils import apply_to_collection
label_desc: Use image node_id 1 for calling a global function with example usage: _convert_data_device(device) and returns: str, cuda_visible_devices_list, get_paddle_gpu_str