{"version":3,"sources":["../src/nvidia-smi.ts"],"sourcesContent":["import { promisify } from \"util\";\r\nimport { exec } from \"child_process\";\r\nimport { XMLParser } from \"fast-xml-parser\";\r\nimport { TNvidiaSMI } from \"./types\";\r\nimport which from \"which\";\r\nimport filesizeParser from \"filesize-parser\";\r\n\r\nconst parser = new XMLParser();\r\nconst execAsync = promisify(exec);\r\n\r\nexport namespace NvidiaSMI {\r\n  let nvidia_smi_exist = null as null | boolean;\r\n  export async function exist() {\r\n    if (typeof nvidia_smi_exist === \"boolean\") {\r\n      return nvidia_smi_exist;\r\n    }\r\n    try {\r\n      await which(\"nvidia-smi\");\r\n      nvidia_smi_exist = true;\r\n      return true;\r\n    } catch (error) {\r\n      nvidia_smi_exist = false;\r\n      return false;\r\n    }\r\n  }\r\n  export async function assert_exist() {\r\n    if (!(await exist())) {\r\n      throw new Error(\"nvidia-smi not found\");\r\n    }\r\n  }\r\n  export async function get_details() {\r\n    assert_exist();\r\n    try {\r\n      const outXML = await execAsync(\"nvidia-smi -q -x\");\r\n      const json = parser.parse(outXML.stdout);\r\n      return json as TNvidiaSMI.XMLRoot;\r\n    } catch (error) {\r\n      console.error(error);\r\n      return null;\r\n    }\r\n  }\r\n\r\n  export namespace Utils {\r\n    // 获取驱动版本信息\r\n    export async function getDriverVersion() {\r\n      const details = await NvidiaSMI.get_details();\r\n      if (details) {\r\n        return details.nvidia_smi_log.driver_version;\r\n      }\r\n      return null;\r\n    }\r\n\r\n    // 获取 CUDA 版本信息\r\n    export async function getCudaVersion() {\r\n      const details = await NvidiaSMI.get_details();\r\n      if (details) {\r\n        return details.nvidia_smi_log.cuda_version;\r\n      }\r\n      return null;\r\n    }\r\n\r\n    // 获取 GPU 数量\r\n    export async function getAttachedGPUs() {\r\n      const details = await NvidiaSMI.get_details();\r\n      if (details) {\r\n        return details.nvidia_smi_log.attached_gpus;\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    export async function get_gpus() {\r\n      const details = await NvidiaSMI.get_details();\r\n      const gpus = details?.nvidia_smi_log.gpu || [];\r\n      if (Array.isArray(gpus)) {\r\n        return gpus;\r\n      }\r\n      return [gpus];\r\n    }\r\n\r\n    // 获取 GPU 型号和品牌\r\n    export async function getGPUInfo(uuid?: string) {\r\n      const gpus = await get_gpus();\r\n      const gpu = uuid ? gpus.find((gpu) => gpu.uuid === uuid) : gpus[0];\r\n      return gpu ?? null;\r\n    }\r\n\r\n    // 获取 GPU 使用的显存信息\r\n    export async function getMemoryUsage(uuid?: string) {\r\n      const gpu = await getGPUInfo(uuid);\r\n      if (gpu) {\r\n        const { total, reserved, used, free } = gpu.fb_memory_usage;\r\n        return {\r\n          total: filesizeParser(total),\r\n          reserved: filesizeParser(reserved ?? \"0\"),\r\n          used: filesizeParser(used),\r\n          free: filesizeParser(free),\r\n        };\r\n      }\r\n      return null;\r\n    }\r\n\r\n    // 获取 GPU 温度信息\r\n    export async function getTemperature(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.temperature ?? null;\r\n    }\r\n\r\n    // 获取 GPU 负载信息\r\n    export async function getUtilization(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.utilization ?? null;\r\n    }\r\n\r\n    // 获取 ECC 错误信息\r\n    export async function getECCErrors(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.ecc_errors ?? null;\r\n    }\r\n\r\n    // 获取 GPU 的进程信息\r\n    export async function getProcesses(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.encoder_stats ?? null;\r\n    }\r\n\r\n    // 获取 GPU 风扇转速\r\n    export async function getFanSpeed(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.fan_speed ?? null;\r\n    }\r\n\r\n    // 获取 GPU 电源信息\r\n    export async function getPowerReadings(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.gpu_power_readings ?? null;\r\n    }\r\n\r\n    // 获取 GPU 时钟信息\r\n    export async function getClocks(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.clocks ?? null;\r\n    }\r\n\r\n    // 获取 GPU 计算模式信息\r\n    export async function getComputeMode(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.compute_mode ?? null;\r\n    }\r\n\r\n    // 获取 GPU 的性能状态\r\n    export async function getPerformanceState(uuid?: string) {\r\n      return (await getGPUInfo(uuid))?.performance_state ?? null;\r\n    }\r\n  }\r\n}\r\n"],"mappings":"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","names":["NvidiaSMI","Utils","gpu"]}