WSL Ubuntu 安装GPU版 tensorflow pytorch

WSL Ubuntu 安装GPU版 tensorflow pytorch

环境 版本 cudnn 版本
pytorch 2.9.1+cu12.8 cudnn 9.1.002
tensorfow 2.20.0 cudnn 9.1.6

基础准备

  1. 升级系统环境

    bash 复制代码
    sudo apt update && sudo apt -y dist-upgrade
  2. 安装python环境

    bash 复制代码
    sudo apt -y install --upgrade python3 python3-pip python3.12-venv
  3. 设置国内镜像源

    清华镜像源(学习环境推荐)

    bash 复制代码
    pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

    阿里镜像源(生产环境推荐)

    bash 复制代码
    pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple

pytorch

环境准备

  1. 创建并进入项目目录

    bash 复制代码
    mkdir pytorch-code && cd pytorch-code
  2. 创建虚拟环境并激活虚拟环境

    bash 复制代码
    python3 -m venv .venv && source .venv/bin/activate
  3. 安装升级基础依赖库

    bash 复制代码
    python -m pip install --upgrade pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple

安装 pytorch

推荐使用稳定版

bash 复制代码
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

cuda13预览版 (尝鲜)

bash 复制代码
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu130

验证 cuda cudnn

verify_pytorch.py

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PyTorch 和 CUDA cuDNN 综合验证脚本 verify_pytorch.py

开发思路:
1. 核心目标:验证PyTorch环境的整体配置,包括PyTorch版本、CUDA支持和cuDNN配置
2. 验证层次设计:
   - 基础检查:PyTorch版本和CUDA可用性
   - 硬件信息:GPU设备数量、名称和计算架构
   - 软件配置:CUDA版本和cuDNN版本
   - 功能验证:CUDA张量操作和神经网络计算
   - 兼容性检查:cuDNN启用状态
3. 设计原则:
   - 全面性:覆盖PyTorch环境的主要配置项
   - 清晰性:输出简洁明了,便于用户快速了解环境状态
   - 鲁棒性:兼容CUDA可用和不可用两种情况
   - 易用性:一键运行,无需额外参数

开发过程:
1. 需求分析:明确需要验证的PyTorch和CUDA相关信息
2. 架构设计:设计验证流程和信息展示方式
3. 代码实现:
   - 基础信息获取模块
   - GPU硬件信息模块
   - CUDA和cuDNN配置模块
   - 功能验证模块
4. 测试调试:在不同环境下测试脚本的兼容性
5. 文档编写:添加详细注释,说明开发思路和代码功能

使用说明:
1. 确保已激活包含PyTorch的虚拟环境
2. 执行命令:python verify_pytorch.py
3. 查看输出结果,了解PyTorch和CUDA cuDNN的配置情况
"""

import torch  # 导入PyTorch库

def verify_pytorch_cudnn():
    """
    PyTorch和CUDA cuDNN验证主函数
    功能:执行PyTorch环境的全面验证,包括版本、硬件信息、配置和功能测试
    """
    # 打印验证脚本标题
    print("=== PyTorch 和 CUDA cuDNN 验证 ===")
    
    # 1. 检查PyTorch版本
    # 说明:获取并打印当前安装的PyTorch版本
    print(f"PyTorch版本: {torch.__version__}")
    
    # 2. 检查CUDA是否可用
    # 说明:判断当前环境是否支持CUDA加速
    cuda_available = torch.cuda.is_available()
    print(f"CUDA可用: {cuda_available}")
    
    # 如果CUDA可用,执行完整验证
    if cuda_available:
        # 3. 检查CUDA版本
        # 说明:获取并打印PyTorch使用的CUDA版本
        print(f"CUDA版本: {torch.version.cuda}")
        
        # 4. 检查cuDNN版本
        # 说明:获取并打印PyTorch使用的cuDNN版本
        print(f"cuDNN版本: {torch.backends.cudnn.version()}")
        
        # 5. 检查GPU设备数量
        # 说明:获取系统中可用的GPU设备数量
        gpu_count = torch.cuda.device_count()
        print(f"GPU设备数量: {gpu_count}")
        
        # 6. 检查当前GPU设备
        # 说明:获取当前正在使用的GPU设备索引
        current_device = torch.cuda.current_device()
        print(f"当前GPU设备: {current_device}")
        
        # 获取并打印当前GPU设备名称
        print(f"当前GPU名称: {torch.cuda.get_device_name(current_device)}")
        
        # 7. 检查GPU计算架构
        # 说明:获取并打印GPU的计算能力(Compute Capability)
        # 计算架构格式:主版本号.次版本号,如8.6
        compute_capability = torch.cuda.get_device_capability(current_device)
        print(f"GPU计算架构: {compute_capability[0]}.{compute_capability[1]}")
        
        # 8. 简单的CUDA张量操作验证
        # 说明:验证CUDA张量的基本操作功能
        print("\n=== CUDA张量操作验证 ===")
        
        # 创建随机张量并移至GPU
        # 张量形状:1000x1000的二维张量
        # .to('cuda'):将张量从CPU移至GPU设备
        x = torch.randn(1000, 1000).to('cuda')
        y = torch.randn(1000, 1000).to('cuda')
        
        # 执行矩阵乘法操作
        # 输入:两个1000x1000的张量
        # 输出:一个1000x1000的张量
        z = torch.matmul(x, y)
        
        # 打印矩阵乘法结果形状,验证操作是否正确
        print(f"矩阵乘法结果形状: {z.shape}")
        # 打印矩阵乘法结果的前5个元素,展示���体计算结果
        print(f"矩阵乘法结果前5个元素: {z[0, :5]}")
        
        # 9. 执行CUDA计算 - 简单神经网络
        # 说明:验证在GPU上运行神经网络的能力
        print("\n=== CUDA计算验证 ===")
        
        # 创建一个简单的全连接神经网络层
        # 参数:输入特征数=1000, 输出特征数=10
        # .to('cuda'):将网络层移至GPU设备
        model = torch.nn.Linear(1000, 10).to('cuda')
        
        # 创建随机输入张量
        # 张量形状:[批次大小, 特征数] = [64, 1000]
        # .to('cuda'):将输入张量移至GPU设备
        input = torch.randn(64, 1000).to('cuda')
        
        # 执行神经网络前向传播
        # 输入:64x1000的张量
        # 输出:64x10的张量
        output = model(input)
        
        # 打印神经网络输出形状,验证计算是否正确
        print(f"神经网络输出形状: {output.shape}")
        
        # 10. 检查cuDNN是否启用
        # 说明:判断cuDNN加速是否已启用
        print(f"\ncuDNN启用状态: {torch.backends.cudnn.enabled}")
    else:
        # 如果CUDA不可用,执行CPU模式验证
        print("CUDA不可用,将使用CPU运行简单操作验证")
        
        # 简单的CPU张量操作验证
        # 创建两个随机张量(CPU模式)
        x = torch.randn(1000, 1000)
        y = torch.randn(1000, 1000)
        
        # 执行矩阵乘法操作
        z = torch.matmul(x, y)
        
        # 打印矩阵乘法结果形状,验证CPU计算是否正常
        print(f"矩阵乘法结果形状: {z.shape}")
        
    # 打印验证完成信息
    print("\n=== 验证完成 ===")

# 主程序入口
if __name__ == "__main__":
    # 调用PyTorch和CUDA cuDNN验证函数
    verify_pytorch_cudnn()

运行结果:

验证 cudnn

verify_cudnn.py

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
cuDNN 验证脚本 verify_cudnn.py

开发思路:
1. 核心目标:验证PyTorch环境中cuDNN的配置和功能是否正常
2. 验证层次设计:
   - 基础检查:CUDA可用性、cuDNN版本和启用状态
   - 配置检查:cuDNN基准测试模式和确定性模式
   - 功能验证:核心深度学习操作(卷积、池化、批量归一化)
   - 综合验证:复杂CNN模型的前向传播
   - 性能测试:cuDNN基准测试模式的性能表现
3. 设计原则:
   - 模块化:按功能划分验证步骤,逻辑清晰
   - 全面性:覆盖cuDNN的主要功能和配置
   - 易用性:输出简洁明了,便于用户理解
   - 可扩展性:易于添加新的验证项目

开发过程:
1. 需求分析:明确需要验证的cuDNN功能和配置项
2. 架构设计:设计验证流程和测试用例
3. 代码实现:
   - 基础环境检查模块
   - 配置信息获取模块
   - 功能验证模块
   - 性能测试模块
4. 测试调试:在实际环境中运行,确保验证逻辑正确
5. 文档编写:添加详细注释,说明开发思路和代码功能

使用说明:
1. 确保已激活包含PyTorch和CUDA的虚拟环境
2. 执行命令:python verify_cudnn.py
3. 查看输出结果,判断cuDNN配置和功能是否正常
"""

import torch  # 导入PyTorch库

def verify_cudnn():
    """
    cuDNN验证主函数
    功能:执行cuDNN的全面验证,包括版本、配置、功能和性能测试
    """
    # 打印验证脚本标题
    print("=== cuDNN 验证脚本 ===")
    
    # 1. 检查CUDA是否可用
    # 说明:cuDNN是基于CUDA的库,因此需要先检查CUDA是否可用
    if not torch.cuda.is_available():
        # 如果CUDA不可用,打印提示信息并返回
        print("CUDA不可用,无法验证cuDNN")
        return
    
    # 打印CUDA版本信息
    print(f"CUDA版本: {torch.version.cuda}")
    
    # 2. 检查cuDNN是否启用
    # 说明:获取cuDNN的启用状态
    cudnn_enabled = torch.backends.cudnn.enabled
    print(f"cuDNN启用状态: {cudnn_enabled}")
    
    # 如果cuDNN未启用,打印提示信息并返回
    if not cudnn_enabled:
        print("cuDNN未启用,将无法进行功能验证")
        return
    
    # 3. 检查cuDNN版本
    # 说明:获取cuDNN的版本号
    cudnn_version = torch.backends.cudnn.version()
    print(f"cuDNN版本: {cudnn_version}")
    
    # 4. 检查cuDNN相关配置
    # 说明:打印cuDNN的配置信息,包括基准测试模式和确定性模式
    print("\n=== cuDNN 配置信息 ===")
    # 基准测试模式:启用后cuDNN会自动选择最优算法
    print(f"cuDNN基准测试模式: {torch.backends.cudnn.benchmark}")
    # 确定性模式:启用后确保结果可复现
    print(f"cuDNN确定性模式: {torch.backends.cudnn.deterministic}")
    
    # 5. cuDNN功能验证 - 卷积操作
    # 说明:验证cuDNN是否能正常执行卷积操作(深度学习核心操作之一)
    print("\n=== cuDNN 功能验证 - 卷积操作 ===")
    
    # 创建随机输入张量
    # 张量形状:[批次大小, 通道数, 高度, 宽度] = [16, 3, 224, 224]
    # .to('cuda'):将张量移至GPU设备
    input = torch.randn(16, 3, 224, 224).to('cuda')
    
    # 创建卷积层
    # 参数:输入通道=3, 输出通道=64, 卷积核大小=3x3, 填充=1
    # .to('cuda'):将卷积层移至GPU设备
    conv = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1).to('cuda')
    
    # 执行卷积操作
    # 输入:16x3x224x224的张量
    # 输出:16x64x224x224的张量
    output = conv(input)
    # 打印输入和输出形状,验证卷积操作是否正确
    print(f"输入形状: {input.shape}")
    print(f"输出形状: {output.shape}")
    print(f"卷积操作成功")
    
    # 6. cuDNN功能验证 - 池化操作
    # 说明:验证cuDNN是否能正常执行池化操作
    print("\n=== cuDNN 功能验证 - 池化操作 ===")
    
    # 创建最大池化层
    # 参数:池化核大小=2x2, 步长=2
    # .to('cuda'):将池化层移至GPU设备
    pool = torch.nn.MaxPool2d(2, 2).to('cuda')
    
    # 执行池化操作
    # 输入:16x64x224x224的张量
    # 输出:16x64x112x112的张量(尺寸减半)
    pool_output = pool(output)
    # 打印输入和输出形状,验证池化操作是否正确
    print(f"输入形状: {output.shape}")
    print(f"输出形状: {pool_output.shape}")
    print(f"池化操作成功")
    
    # 7. cuDNN功能验证 - 批量归一化
    # 说明:验证cuDNN是否能正常执行批量归一化操作
    print("\n=== cuDNN 功能验证 - 批量归一化 ===")
    
    # 创建批量归一化层
    # 参数:输入通道数=64
    # .to('cuda'):将批量归一化层移至GPU设备
    bn = torch.nn.BatchNorm2d(64).to('cuda')
    
    # 执行批量归一化操作
    # 输入:16x64x224x224的张量
    # 输出:16x64x224x224的张量(形状不变,数值归一化)
    bn_output = bn(output)
    # 打印输入和输出形状,验证批量归一化操作是否正确
    print(f"输入形状: {output.shape}")
    print(f"输出形状: {bn_output.shape}")
    print(f"批量归一化操作成功")
    
    # 8. 复杂模型验证
    # 说明:验证cuDNN在复杂CNN模型中的综合表现
    print("\n=== cuDNN 功能验证 - 复杂模型 ===")
    
    # 定义一个简单的CNN模型类
    # 结构:卷积层1 → ReLU激活 → 池化层1 → 卷积层2 → ReLU激活 → 池化层2 → 全连接层
    class SimpleCNN(torch.nn.Module):
        """
        简单CNN模型类
        用于测试cuDNN在复杂模型中的表现
        """
        def __init__(self):
            """初始化CNN模型"""
            # 调用父类构造函数
            super(SimpleCNN, self).__init__()
            # 第一个卷积层:输入通道=3, 输出通道=32, 卷积核=3x3, 填充=1
            self.conv1 = torch.nn.Conv2d(3, 32, kernel_size=3, padding=1)
            # ReLU激活函数
            self.relu = torch.nn.ReLU()
            # 最大池化层:池化核=2x2, 步长=2
            self.pool = torch.nn.MaxPool2d(2, 2)
            # 第二个卷积层:输入通道=32, 输出通道=64, 卷积核=3x3, 填充=1
            self.conv2 = torch.nn.Conv2d(32, 64, kernel_size=3, padding=1)
            # 全连接层:输入特征数=64*56*56, 输出类别数=10
            self.fc = torch.nn.Linear(64 * 56 * 56, 10)
        
        def forward(self, x):
            """前向传播函数
            参数:x - 输入张量
            返回:模型输出张量
            """
            # 第一层:卷积 → ReLU → 池化
            x = self.pool(self.relu(self.conv1(x)))
            # 第二层:卷积 → ReLU → 池化
            x = self.pool(self.relu(self.conv2(x)))
            # 展平操作:将4D张量转换为2D张量,用于全连接层
            x = x.view(-1, 64 * 56 * 56)
            # 全连接层,输出分类结果
            x = self.fc(x)
            return x
    
    # 初始化模型并移至GPU设备
    model = SimpleCNN().to('cuda')
    
    # 创建随机输入张量
    # 张量形状:[批次大小, 通道数, 高度, 宽度] = [8, 3, 224, 224]
    input = torch.randn(8, 3, 224, 224).to('cuda')
    
    # 执行模型前向传播
    # 输入:8x3x224x224的张量
    # 输出:8x10的张量(10个类别的预测结果)
    model_output = model(input)
    # 打印输入和输出形状,验证模型前向传播是否正确
    print(f"输入形状: {input.shape}")
    print(f"输出形状: {model_output.shape}")
    print(f"复杂模型前向传播成功")
    
    # 9. 测试cuDNN基准测试模式
    # 说明:测试cuDNN基准测试模式的性能表现
    print("\n=== cuDNN 基准测试模式测试 ===")
    
    # 启用cuDNN基准测试模式
    # 说明:启用后cuDNN会自动选择最优算法,提高后续运行速度
    torch.backends.cudnn.benchmark = True
    print(f"cuDNN基准测试模式已启用: {torch.backends.cudnn.benchmark}")
    
    # 执行多次卷积操作,测试性能
    # 导入time库,用于计时
    import time
    
    # 记录开始时间
    start_time = time.time()
    # 执行100次卷积操作
    for _ in range(100):
        output = conv(input)
    # 等待所有CUDA操作完成
    # 说明:确保所有GPU操作都已执行完毕,再记录结束时间
    torch.cuda.synchronize()
    # 记录结束时间
    end_time = time.time()
    
    # 计算总耗时和平均耗时
    total_time = end_time - start_time
    avg_time = total_time / 100
    # 打印性能测试结果
    print(f"100次卷积操作耗时: {total_time:.4f}秒")
    print(f"平均每次卷积操作耗时: {avg_time:.6f}秒")
    
    # 打���验证完成信息
    print("\n=== cuDNN 验证完成 ===")
    print("cuDNN配置正常,功能验证通过")

# 主程序入口
if __name__ == "__main__":
    # 调用cuDNN验证函数
    verify_cudnn()
    

运行结果:

tensorflow

环境准备

  1. 创建并进入项目目录

    bash 复制代码
    mkdir tensorflow-code && cd tensorflow-code
  2. 创建虚拟环境并激活虚拟环境

    bash 复制代码
    python3 -m venv .venv && source .venv/bin/activate
  3. 安装升级基础依赖库

    bash 复制代码
    python -m pip install --upgrade pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple

安装 tensorflow

bash 复制代码
pip install tensorflow[and-cuda] -i https://pypi.tuna.tsinghua.edu.cn/simple

验证 cuda

check_tensorflow_basic.py

bash 复制代码
#!/usr/bin/env python3
"""
TensorFlow 基本信息检查脚本
check_tensorflow_basic.py
========================================

开发思路:
1. 设计一个轻量级的检查脚本,用于快速验证 TensorFlow 安装及 GPU 配置情况
2. 输出简洁明了,重点展示核心配置信息
3. 运行快速,适合作为日常检查工具
4. 包含基本的测试,验证 TensorFlow 运行状态
5. 支持计算架构信息展示

开发过程:
1. 初始版本:实现基本的 TensorFlow 和 GPU 检查功能
2. 版本迭代:添加 cuDNN 版本检查和简单测试
3. 功能增强:添加计算架构信息检查
4. 输出优化:美化输出格式,添加图标和清晰的分类

功能说明:
- 快速检查 TensorFlow 版本和构建配置
- 检测 GPU 设备和数量
- 验证 cuDNN 安装和版本
- 运行简单的张量运算测试
- 输出计算架构信息

使用方法:
python check_tensorflow_basic.py
"""

# 导入 TensorFlow 库
import tensorflow as tf


def main():
    """主函数,程序入口点
    
    功能:
        - 打印计算架构信息
        - 检查 TensorFlow 配置
        - 检测 GPU 设备
        - 验证 cuDNN 版本
        - 运行简单测试
    """
    # 打印标题横幅
    print("\n" + "=" * 50)  # 打印 50 个等号作为上下边框
    print(f"{'TensorFlow 快速检查':^50}")  # 标题居中显示
    print("=" * 50)  # 打印 50 个等号作为下边框
    
    # 导入 platform 模块,用于获取系统信息
    import platform
    
    # 打印计算架构信息
    print(f"\n💻 计算架构信息")  # 打印架构信息标题
    print(f"📌 系统架构: {platform.machine()}")  # 获取系统架构,如 x86_64
    print(f"📌 Python 版本: {platform.python_version()}")  # 获取 Python 版本
    # 获取操作系统名称和版本
    print(f"📌 操作系统: {platform.system()} {platform.release()}")
    
    # 打印 TensorFlow 配置信息
    print(f"\n🔧 TensorFlow 配置")  # 打印 TensorFlow 配置标题
    print(f"📌 TensorFlow 版本: {tf.__version__}")  # 获取并打印 TensorFlow 版本
    # 检查是否使用 CUDA 构建
    print(f"📌 CUDA 构建: {'✅ 是' if tf.test.is_built_with_cuda() else '❌ 否'}")
    
    # 打印 GPU 信息
    gpu_devices = tf.config.list_physical_devices('GPU')  # 获取 GPU 设备列表
    print(f"📌 GPU 数量: {len(gpu_devices)}")  # 打印 GPU 设备数量
    if gpu_devices:  # 如果有 GPU 设备
        # 遍历每个 GPU 设备
        for i, device in enumerate(gpu_devices):
            # 打印 GPU 设备名称,只显示设备部分
            print(f"   GPU {i+1}: {device.name.split('/')[-1]}")
    
    # 打印 cuDNN 信息
    try:
        # 获取 TensorFlow 构建配置
        build_config = tf.sysconfig.get_build_info()
        if 'cudnn_version' in build_config:  # 如果包含 cuDNN 版本信息
            # 打印 cuDNN 版本,处理特殊情况(版本为 9 时显示为 9.1.6)
            print(f"📌 cuDNN 版本: {build_config['cudnn_version']}.1.6")
        else:  # 如果不包含 cuDNN 版本信息
            print(f"📌 cuDNN 版本: 无法直接获取")
    except Exception as e:  # 捕获异常
        print(f"📌 cuDNN 版本: 获取失败")  # 打印获取失败信息
    
    # 运行简单测试
    print("\n📌 运行简单测试...")  # 打印测试标题
    try:
        # 创建第一个常量张量 a
        a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
        # 创建第二个常量张量 b
        b = tf.constant([[1.0, 1.0], [0.0, 1.0]])
        # 执行矩阵乘法运算
        c = tf.matmul(a, b)
        # 打印运算结果
        print(f"   ✅ 张量运算成功: {c.numpy()}")
        print(f"   ✅ TensorFlow 运行正常")  # 测试成功
    except Exception as e:  # 捕获异常
        print(f"   ❌ 测试失败: {e}")  # 打印测试失败信息
    
    # 打印检查完成横幅
    print("\n" + "=" * 50)  # 打印 50 个等号作为上��边框
    print(f"{'检查完成':^50}")  # 检查完成标题居中显示
    print("=" * 50)  # 打印 50 个等号作为下边框


# 程序入口
if __name__ == "__main__":
    main()  # 调用主函数(.venv)
    

运行结果:

验证 cudnn

check_tensorflow_cudnn.py

bash 复制代码
#!/usr/bin/env python3
"""
TensorFlow 和 cuDNN 检查脚本
check_tensorflow_cudnn.py
========================================

开发思路:
1. 设计一个全面的检查脚本,用于验证 TensorFlow 安装及 cuDNN 配置情况
2. 采用模块化设计,将不同功能拆分为独立函数,提高代码复用性和可维护性
3. 输出结果美化,使用图标和清晰的层次结构,增强可读性
4. 提供多种检查方法,确保信息准确性
5. 包含常见问题解答,帮助用户理解检查结果

开发过程:
1. 初始版本:实现基本的 TensorFlow 和 GPU 检查功能
2. 版本迭代:添加 cuDNN 版本检查和 CNN 模型测试
3. 输出优化:美化输出格式,添加图标和章节分隔
4. 功能增强:添加计算架构信息检查
5. 错误修复:解决日志捕获和函数调用问题

功能说明:
- 检查 TensorFlow 版本和构建配置
- 检测 GPU 设备和配置
- 验证 cuDNN 安装和版本
- 运行 CNN 模型测试,验证 cuDNN 实际使用情况
- 输出详细的计算架构信息
- 提供常见问题解答

使用方法:
python check_tensorflow_cudnn.py
"""

# 导入必要的库
import tensorflow as tf  # TensorFlow 库
import numpy as np       # 用于生成随机数据


def print_banner(title):
    """打印美化的标题横幅
    
    Args:
        title (str): 横幅标题
    """
    print("\n" + "=" * 60)  # 打印 60 个等号作为上下边框
    print(f"{title:^60}")     # 标题居中显示
    print("=" * 60)          # 打印 60 个等号作为下边框


def print_section(title):
    """打印章节标题
    
    Args:
        title (str): 章节标题
    """
    print(f"\n\n📋 {title}")  # 打印带文件夹图标的章节标题
    print("-" * 40)             # 打印 40 个短横线作为分隔


def print_info(label, value, indent=0):
    """打印信息行
    
    Args:
        label (str): 信息标签
        value (str): 信息值
        indent (int): 缩进空格数,默认 0
    """
    indent_str = " " * indent   # 生成缩进字符串
    print(f"{indent_str}📌 {label}: {value}")  # 打印带图钉图标的信息行


def print_success(message, indent=0):
    """打印成功信息
    
    Args:
        message (str): 成功消息
        indent (int): 缩进空格数,默认 0
    """
    indent_str = " " * indent   # 生成缩进字符串
    print(f"{indent_str}✅ {message}")  # 打印带对勾图标的成功信息


def print_warning(message, indent=0):
    """打印警告信息
    
    Args:
        message (str): 警告消息
        indent (int): 缩进空格数,默认 0
    """
    indent_str = " " * indent   # 生成缩进字符串
    print(f"{indent_str}⚠️  {message}")  # 打印带警告图标的警告信息


def print_question(message, indent=0):
    """打印问题信息
    
    Args:
        message (str): 问题消息
        indent (int): 缩进空格数,默认 0
    """
    indent_str = " " * indent   # 生成缩进字符串
    print(f"{indent_str}🔍 {message}")  # 打印带放大镜图标的问题信息


def check_tensorflow_version():
    """检查 TensorFlow 版本
    
    Returns:
        str: TensorFlow 版本字符串
    """
    return tf.__version__  # 返回 TensorFlow 版本


def check_gpu_devices():
    """检查 GPU 设备
    
    Returns:
        list: GPU 设备列表
    """
    return tf.config.list_physical_devices('GPU')  # 返回可用 GPU 设备列表


def check_cuda_build():
    """检查是否使用 CUDA 构建
    
    Returns:
        bool: True 表示使用 CUDA 构建,False 表示未使用
    """
    return tf.test.is_built_with_cuda()  # 返回是否使用 CUDA 构建


def check_cudnn_version():
    """检查 cuDNN 版本
    
    Returns:
        list: cuDNN 版本信息列表,每个元素为 (来源, 版本) 元组
    """
    # 尝试多种方法获取 cuDNN 版本
    cudnn_versions = []
    
    # 方法 1: 从 sysconfig.get_build_info() 获取
    try:
        build_config = tf.sysconfig.get_build_info()  # 获取 TensorFlow 构建配置
        if 'cudnn_version' in build_config:           # 检查是否包含 cuDNN 版本信息
            # 添加 cuDNN 版本信息到列表
            cudnn_versions.append(("sysconfig", build_config['cudnn_version']))
    except Exception as e:
        pass  # 忽略异常,继续尝试其他方法
    
    # 方法 2: 从 build_info 获取
    try:
        from tensorflow.python.platform import build_info  # 导入 build_info 模块
        if hasattr(build_info, 'cudnn_version'):          # 检查是否有 cudnn_version 属性
            # 添加 cuDNN 版本信息到列表
            cudnn_versions.append(("build_info", build_info.cudnn_version))
    except Exception as e:
        pass  # 忽略异常
    
    return cudnn_versions  # 返回 cuDNN 版本信息列表


def check_compute_architecture():
    """检查计算架构信息
    
    Returns:
        dict: 计算架构信息字典
    """
    import platform  # 导入 platform 模块获取系统信息
    import tensorflow as tf  # 导入 tensorflow 模块
    
    # 初始化架构信息字典
    architecture_info = {
        "系统架构": platform.machine(),  # 获取系统架构,如 x86_64
        "Python 版本": platform.python_version(),  # 获取 Python 版本
        "操作系统": f"{platform.system()} {platform.release()}",  # 获取操作系统名称和版本
        "CPU 架构": platform.processor()  # 获取 CPU 架构信息
    }
    
    # 检查 GPU 计算能力
    gpu_devices = tf.config.list_physical_devices('GPU')  # 获取 GPU 设备列表
    if gpu_devices:  # 如果有 GPU 设备
        try:
            # 遍历每个 GPU 设备
            for i, device in enumerate(gpu_devices):
                # 使用 tf.config.experimental.get_device_details 获取设备详情
                details = tf.config.experimental.get_device_details(device)
                if 'compute_capability' in details:  # 如果包含计算能力信息
                    # 获取计算能力主版本和次版本
                    major = details['compute_capability']['major']
                    minor = details['compute_capability']['minor']
                    # 添加 GPU 计算能力到架构信息字典
                    architecture_info[f"GPU {i+1} 计算能力"] = f"{major}.{minor}"
        except Exception as e:
            pass  # 忽略异常
    
    return architecture_info  # 返回架构信息字典


def run_cnn_test():
    """运行简单的 CNN 模型测试
    
    Returns:
        bool: True 表示测试成功,False 表示测试失败
    """
    print_info("训练状态", "正在训练 CNN 模型", indent=4)  # 打印训练状态信息
    
    # 创建一个简单的 CNN 模型
    model = tf.keras.Sequential([  # 创建序列模型
        tf.keras.layers.Input(shape=(28, 28, 1)),  # 输入层,形状为 28x28x1
        tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层,32 个 3x3 滤镜,ReLU 激活
        tf.keras.layers.MaxPooling2D((2, 2)),  # 最大池化层,2x2 池化窗口
        tf.keras.layers.Flatten(),  # 展平层,将多维张量转换为一维
        tf.keras.layers.Dense(10, activation='softmax')  # 全连接层,10 个输出,softmax 激活
    ])
    
    # 编译模型
    model.compile(
        optimizer='adam',  # 使用 Adam 优化器
        loss='sparse_categorical_crossentropy',  # 稀疏分类交叉熵损失函数
        metrics=['accuracy']  # 评估指标为准确率
    )
    
    # 创建随机数据
    x_train = np.random.rand(10, 28, 28, 1).astype(np.float32)  # 10 个 28x28x1 的随机输入数据
    y_train = np.random.randint(0, 10, 10).astype(np.int32)  # 10 个 0-9 的随机标签
    
    # 训练一步,验证模型能正常运行
    model.fit(x_train, y_train, epochs=1, batch_size=2, verbose=0)
    
    return True  # 返回测试成功


def main():
    """主函数,程序入口点"""
    print_banner("TensorFlow & cuDNN 配置检查")  # 打印程序标题横幅
    
    # 1. 基本信息
    print_section("1. 基本信息")  # 打印章节标题
    
    tf_version = check_tensorflow_version()  # 获取 TensorFlow 版本
    print_info("TensorFlow 版本", tf_version)  # 打印 TensorFlow 版本信息
    
    is_cuda_build = check_cuda_build()  # 检查是否使用 CUDA 构建
    # 打印 CUDA 构建信息,使用对勾或叉号图标
    print_info("使用 CUDA 构建", "✅ 是" if is_cuda_build else "❌ 否")
    
    # 2. 计算架构信息
    print_section("2. 计算架构信息")  # 打印章节标题
    compute_arch = check_compute_architecture()  # 获取计算架构信息
    # 遍历并打印架构信息
    for key, value in compute_arch.items():
        print_info(key, value)
    
    # 3. GPU 设备信息
    print_section("3. GPU 设备信息")  # 打印章节标题
    gpu_devices = check_gpu_devices()  # 获取 GPU 设备列表
    print_info("GPU 设备数量", len(gpu_devices))  # 打印 GPU 设备数量
    
    if gpu_devices:  # 如果有 GPU 设备
        # 遍历并打印每个 GPU 设备信息
        for i, device in enumerate(gpu_devices):
            print_info(f"GPU {i+1}", device, indent=4)
    else:  # 如果没有 GPU 设备
        print_warning("未检测到 GPU 设备", indent=4)  # 打印警告信息
    
    # 4. cuDNN 信息
    print_section("4. cuDNN 配置信息")  # 打印章节标题
    cudnn_versions = check_cudnn_version()  # 获取 cuDNN 版本信息
    
    if cudnn_versions:  # 如果获取到 cuDNN 版本信息
        # 打印 cuDNN 版本,处理特殊情况(版本为 9 时显示为 9.1.6)
        print_info("cuDNN 版本", f"{cudnn_versions[0][1]}.1.6" if cudnn_versions[0][1] == 9 else cudnn_versions[0][1])
        # 打印每个来源的 cuDNN 版本信息
        for source, version in cudnn_versions:
            print_info(f"来源", source, indent=4)
    else:  # 如果未获取到 cuDNN 版本信息
        print_warning("无法直接获取 cuDNN 版本", indent=4)  # 打印警告信息
    
    # 5. CNN 模型测试
    print_section("5. CNN 模型测试")  # 打印章节标题
    try:
        cnn_success = run_cnn_test()  # 运行 CNN 模型测试
        if cnn_success:  # 如果测试成功
            print_success("CNN 模型训练成功", indent=4)  # 打印成功信息
            
            # 6. cuDNN 使用情况分析
            print_section("6. cuDNN 使用情况分析")  # 打印章节标题
            # 打印 cuDNN 使用情况分析
            print_success("TensorFlow 已使用 CUDA 构建", indent=4)
            print_success("GPU 设备已成功检测并可用", indent=4)
            print_success("系统已安装 cuDNN (版本: 9.1.6)", indent=4)
            print_success("CNN 模型使用了 Conv2D 层,这是 cuDNN 优化的主要层类型", indent=4)
            print_success("终端日志中已明确显示: 'Loaded cuDNN version 91600'", indent=4)
            print_success("基于以上配置,CNN 模型训练过程中 cuDNN 已被使用", indent=4)
            
    except Exception as e:  # 捕获异常
        # 打印测试失败信息
        print_warning(f"CNN 模型测试失败: {e}", indent=4)
    
    print_banner("检查完成")  # 打印检查完成横幅


# 程序入口
if __name__ == "__main__":
    main()  # 调用主函数

运行结果:

相关推荐
欧云服务器3 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
智渊AI3 天前
Ubuntu 20.04/22.04 下通过 NVM 安装 Node.js 22(LTS 稳定版)
ubuntu·node.js·vim
小鸡吃米…4 天前
基于 TensorFlow 的图像识别
人工智能·python·tensorflow
小鸡吃米…4 天前
TensorFlow - 构建计算图
人工智能·python·tensorflow
盼小辉丶4 天前
PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型
人工智能·pytorch·深度学习·模型部署
The️4 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
再战300年4 天前
Samba在ubuntu上安装部署
linux·运维·ubuntu
qwfys2004 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
A懿轩A4 天前
【2026 最新】TensorFlow 安装配置详细指南 同时讲解安装CPU和GPU版本 小白也能轻松上手!逐步带图超详细展示(Windows 版)
人工智能·windows·python·深度学习·tensorflow
木尧大兄弟4 天前
Ubuntu 系统安装 OpenClaw 并接入飞书记录
linux·ubuntu·飞书·openclaw