利用Python进行全面的GPU环境检测与分析

 更新时间:2025年01月09日 09:20:31   作者:老大白菜  
这篇文章主要为大家详细介绍了如何使用Python编写一个强大的 GPU 诊断工具,它能够全面收集和分析系统中的 GPU 相关信息,感兴趣的可以了解下

简介

本文介绍了一个强大的 GPU 诊断工具,它能够全面收集和分析系统中的 GPU 相关信息,包括硬件规格、驱动状态、显存使用情况以及 USB 控制器信息。这个工具特别适用于深度学习开发环境的配置检查和问题诊断。

功能特点

1.系统环境检测

  • Python 运行环境版本
  • PyTorch 版本信息
  • CUDA 和 cuDNN 版本检查

2.CUDA 环境变量检查

  • CUDA_HOME
  • CUDA_PATH
  • CUDA_VISIBLE_DEVICES

3.GPU 硬件信息

  • 设备数量和型号
  • 计算能力
  • 显存容量
  • 多处理器数量
  • 最大线程数

4.显存使用状态

  • 已分配显存
  • 已预留显存
  • 可用显存

5.USB 和雷电接口支持

  • NVIDIA USB 控制器检测
  • Type-C 接口支持检查
  • 雷电接口支持检查

实现细节

1. 环境信息收集

工具使用 Python 的系统库和 PyTorch 库来收集基本的环境信息。通过访问系统环境变量和 PyTorch 的内置函数,可以获取 CUDA 相关的配置信息。

2. GPU 信息获取

使用 PyTorch 的 CUDA API 获取详细的 GPU 信息,包括:

  • torch.cuda.is_available() 检查 GPU 可用性
  • torch.cuda.device_count() 获取 GPU 数量
  • torch.cuda.get_device_properties() 获取 GPU 属性

3. 显存监控

通过 PyTorch 的内存管理 API 实时监控显存使用情况:

  • torch.cuda.memory_allocated()
  • torch.cuda.memory_reserved()

4. 硬件接口检测

使用 Windows Management Instrumentation Command-line (WMIC) 工具检测系统的 USB 控制器和雷电接口支持情况。

使用方法

确保系统已安装 Python 和 PyTorch

运行脚本即可获取完整的诊断报告:

python gpu_info.py

完整代码

import sys
import os
import subprocess
import torch
from datetime import datetime

def get_gpu_info():
    print("=" * 50)
    print("GPU 诊断报告")
    print("=" * 50)
    print(f"诊断时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")

    # 系统信息
    print("系统信息:")
    print(f"Python 版本: {sys.version}")
    print(f"PyTorch 版本: {torch.__version__}")
    print(f"CUDA 版本 (PyTorch): {torch.version.cuda}")
    print(f"cuDNN 版本: {torch.backends.cudnn.version()}\n")

    # CUDA 环境检查
    print("CUDA 环境变量:")
    cuda_vars = {
        'CUDA_HOME': os.environ.get('CUDA_HOME', '未设置'),
        'CUDA_PATH': os.environ.get('CUDA_PATH', '未设置'),
        'CUDA_VISIBLE_DEVICES': os.environ.get('CUDA_VISIBLE_DEVICES', '未设置')
    }
    for var, value in cuda_vars.items():
        print(f"{var}: {value}")
    print()

    # NVIDIA-SMI 输出
    print("NVIDIA-SMI 信息:")
    try:
        encodings = ['gbk', 'utf-8', 'iso-8859-1']
        nvidia_smi = None
        for encoding in encodings:
            try:
                nvidia_smi = subprocess.check_output(["nvidia-smi"]).decode(encoding)
                break
            except UnicodeDecodeError:
                continue
        
        if nvidia_smi:
            print(nvidia_smi)
        else:
            print("无法解码 nvidia-smi 输出")
    except Exception as e:
        print(f"执行 nvidia-smi 失败: {e}\n")

    # PyTorch GPU 信息
    print("\nPyTorch GPU 详细信息:")
    if torch.cuda.is_available():
        print(f"检测到 {torch.cuda.device_count()} 个 GPU 设备")
        
        for i in range(torch.cuda.device_count()):
            props = torch.cuda.get_device_properties(i)
            print(f"\nGPU {i}: {props.name}")
            print(f"├─ 计算能力: {props.major}.{props.minor}")
            print(f"├─ 总显存: {props.total_memory / (1024**2):.1f} MB")
            print(f"├─ 多处理器数量: {props.multi_processor_count}")
            print(f"├─ 最大线程数/块: {props.max_threads_per_multi_processor}")
            
            # 显存使用情况
            try:
                memory_allocated = torch.cuda.memory_allocated(i) / (1024**2)
                memory_reserved = torch.cuda.memory_reserved(i) / (1024**2)
                memory_free = (props.total_memory / (1024**2)) - memory_allocated
                
                print(f"├─ 已分配显存: {memory_allocated:.1f} MB")
                print(f"├─ 已预留显存: {memory_reserved:.1f} MB")
                print(f"└─ 可用显存: {memory_free:.1f} MB")
            except Exception as e:
                print(f"└─ 无法获取显存使用情况: {e}")
    else:
        print("未检测到可用的 GPU 设备")
        print("\n可能的原因:")
        print("1. CUDA 驱动未正确安装")
        print("2. PyTorch 未编译 CUDA 支持")
        print("3. GPU 被其他进程占用")
        print("4. 系统未正确识别 GPU")

def get_usb_controller_info():
    print("\nUSB 控制器信息:")
    try:
        result = subprocess.check_output(["wmic", "path", "Win32_USBController", "get", "name,manufacturer"], 
                                      encoding='gbk')
        controllers = result.strip().split('\n')[1:]  # Skip header
        nvidia_controllers = []
        
        for controller in controllers:
            if controller.strip():
                if "NVIDIA" in controller:
                    nvidia_controllers.append(controller.strip())
                    
        if nvidia_controllers:
            print("\nNVIDIA USB 控制器:")
            for controller in nvidia_controllers:
                print(f"- {controller}")
                if "Type-C" in controller:
                    print("  * 支持 USB Type-C")
                    # Check for Thunderbolt support
                    try:
                        tb_check = subprocess.check_output(
                            ["wmic", "path", "Win32_PnPEntity", "where", 
                             "caption like '%Thunderbolt%'", "get", "caption"], 
                            encoding='gbk'
                        )
                        if len(tb_check.strip().split('\n')) > 1:  # Has content beyond header
                            print("  * 支持雷电接口")
                    except:
                        pass
        else:
            print("未找到 NVIDIA USB 控制器")
    except Exception as e:
        print(f"获取 USB 控制器信息失败: {e}")

if __name__ == "__main__":
    get_gpu_info()
    get_usb_controller_info()

注意事项

确保系统已正确安装 NVIDIA 驱动

PyTorch 需要安装 CUDA 版本

在 Windows 系统中,需要管理员权限来获取某些硬件信息

故障排除

如果工具报告未检测到 GPU,请检查:

NVIDIA 驱动是否正确安装

CUDA 工具包是否与 PyTorch 版本匹配

环境变量是否正确配置

GPU 是否被其他进程独占

以上就是利用Python进行全面的GPU环境检测与分析的详细内容,更多关于Python GPU环境检测的资料请关注脚本之家其它相关文章!

相关文章

  • Python调用scp向服务器上传文件示例

    Python调用scp向服务器上传文件示例

    今天小编就为大家分享一篇Python调用scp向服务器上传文件示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python将pandas datarame保存为txt文件的实例

    python将pandas datarame保存为txt文件的实例

    今天小编就为大家分享一篇python将pandas datarame保存为txt文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python JSON模块的使用详情

    Python JSON模块的使用详情

    这篇文章主要介绍了Python JSON模块的使用详情,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写下面文章围绕Python JSON模块的相关资料展开内容,需要的小伙伴可以参考一下,希望 对你有所帮助
    2021-12-12
  • 详解Python中的各种转义符\n\r\t

    详解Python中的各种转义符\n\r\t

    这篇文章主要介绍了详解Python中的各种转义符\n\r\t,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python文件基本操作open函数应用与示例详解

    Python文件基本操作open函数应用与示例详解

    这篇文章主要为大家介绍了Python文件基本操作open函数应用与示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python字典循环添加一键多值的用法实例

    Python字典循环添加一键多值的用法实例

    今天小编就为大家分享一篇Python字典循环添加一键多值的用法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Opencv中cv2.cvtColor彩色图转灰度图的其他6种方法

    Opencv中cv2.cvtColor彩色图转灰度图的其他6种方法

    本文主要介绍了Opencv中cv2.cvtColor彩色图转灰度图的其他6种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用python-cv2实现Harr+Adaboost人脸识别的示例

    使用python-cv2实现Harr+Adaboost人脸识别的示例

    这篇文章主要介绍了使用python-cv2实现Harr+Adaboost人脸识别的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 思考分析Python运算中 a+=b 和 a=a+b是否相等

    思考分析Python运算中 a+=b 和 a=a+b是否相等

    这篇文章主要为大家介绍了Python运算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python实现变量数值交换及判断数组是否含有某个元素的方法

    Python实现变量数值交换及判断数组是否含有某个元素的方法

    这篇文章主要介绍了Python实现变量数值交换及判断数组是否含有某个元素的方法,涉及Python字符串与数组的相关赋值、判断操作技巧,需要的朋友可以参考下
    2017-09-09

最新评论