You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
4.0KB

  1. # -*- coding: utf-8 -*-
  2. from traceback import format_exc
  3. from GPUtil import getAvailable, getGPUs
  4. from loguru import logger
  5. from torch.cuda import is_available
  6. from enums.ExceptionEnum import ExceptionType
  7. from exception.CustomerException import ServiceException
  8. # order- 确定返回可用 GPU 设备 ID 的顺序。order应指定为以下字符串之一:
  9. # 'first'- 按升序排列可用的 GPU 设备 ID(默认)
  10. # 'last'- 按 id 降序排列可用的 GPU 设备 id
  11. # 'random'- 随机订购可用的 GPU 设备 ID
  12. # 'load'- 按负载递增排序可用的 GPU 设备 ID
  13. # 'memory'- 通过升序内存使用来排序可用的 GPU 设备 ID
  14. # limit- 将返回的 GPU 设备 ID 数量限制为指定数量。必须是正整数。(默认 = 1)
  15. # maxLoad- 被认为可用的 GPU 的最大当前相对负载。负载大于 的 GPUmaxLoad不会返回。(默认 = 0.5)
  16. # maxMemory- 被视为可用的 GPU 的最大当前相对内存使用量。maxMemory不返回当前内存使用量大于的 GPU 。(默认 = 0.5)
  17. # includeNan- 真/假标志,指示是否包括负载或内存使用为 NaN 的 GPU(指示无法检索使用情况)。(默认 = 假)
  18. # excludeID- ID 列表,应从可用 GPU 列表中排除。见GPU类描述。(默认 = [])
  19. # excludeUUIDexcludeID-除了它使用 UUID 之外,其他相同。(默认 = [])
  20. # 输出
  21. # deviceIDs - 所有可用 GPU 设备 ID 的列表。如果当前负载和内存使用量分别小于maxLoad和maxMemory,则认为 GPU 可用。该列表是根据 排序的order。返回的设备 ID 的最大数量由 限制limit。
  22. def get_gpu_ids():
  23. deviceIDs = getAvailable(maxLoad=0.80, maxMemory=0.80)
  24. return deviceIDs
  25. def get_all_gpu_ids():
  26. return getGPUs()
  27. def get_first_gpu_name():
  28. gps = get_all_gpu_ids()
  29. if len(gps) == 0:
  30. raise ServiceException(ExceptionType.NO_GPU_RESOURCES.value[0],
  31. ExceptionType.NO_GPU_RESOURCES.value[1])
  32. return gps[0].name
  33. def check_gpu_resource(requestId=None):
  34. gpu_ids = get_gpu_ids()
  35. if len(gpu_ids) == 0 or 0 not in gpu_ids:
  36. print_gpu_status(requestId)
  37. raise ServiceException(ExceptionType.NO_RESOURCES.value[0],
  38. ExceptionType.NO_RESOURCES.value[1])
  39. return gpu_ids
  40. def print_gpu_ex_status(requestId=None):
  41. result = False
  42. try:
  43. gpu_ids = get_gpu_ids()
  44. if len(gpu_ids) == 0 or 0 not in gpu_ids:
  45. result = True
  46. print_gpu_status(requestId)
  47. except Exception:
  48. logger.error("打印gpu状态异常: {}", format_exc())
  49. return result
  50. def print_gpu_status(requestId=None):
  51. try:
  52. GPUs = get_all_gpu_ids()
  53. if len(GPUs) == 0:
  54. return
  55. for gpu in GPUs:
  56. if requestId:
  57. logger.info("""############################################################################################
  58. GPU ID:{}, GPU 名称:{}, 负载率:{}, 内存使用率:{}, 总内存:{}, 占用内存:{}, 空闲内存:{}, requestId:{}
  59. ############################################################################################""", gpu.id,
  60. gpu.name, gpu.load * 100, gpu.memoryUtil * 100, gpu.memoryTotal, gpu.memoryUsed, gpu.memoryFree,
  61. requestId)
  62. else:
  63. logger.info("""############################################################################################
  64. GPU ID:{}, GPU 名称:{}, 负载率:{}, 内存使用率:{}, 总内存:{}, 占用内存:{}, 空闲内存:{}
  65. ############################################################################################""", gpu.id,
  66. gpu.name, gpu.load * 100, gpu.memoryUtil * 100, gpu.memoryTotal, gpu.memoryUsed, gpu.memoryFree)
  67. except Exception:
  68. logger.error("打印gpu状态异常: {}", format_exc())
  69. def check_cude_is_available():
  70. if not is_available():
  71. raise Exception("cuda不在活动状态, 请检测显卡驱动是否正常!!!!")