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()  # 调用主函数

运行结果:

相关推荐
Smile_Gently1 小时前
Ubuntu 20.04 安装 Nginx 详细操作文档
chrome·nginx·ubuntu
Cincoze-Johnny1 小时前
Linux系统-应用问题全面剖析Ⅳ:德承工控机MD-3000在Ubuntu操作系统下[TPM功能]设置教程
linux·运维·ubuntu
红袜子i1 小时前
解决 Ubuntu 中 apt-get update 因架构配置混乱导致的更新失败问题
linux·ubuntu·架构
HIT_Weston1 小时前
50、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(二)
前端·ubuntu·gitlab
zengshitang5202 小时前
ACRN 实战应用:在一台电脑上同时安装Windows10、Ubuntu22.04、Ubuntu PREEMPT_RT实时系统并流畅运行
linux·运维·ubuntu
啦啦右一2 小时前
杂货铺 | TensorFlow GPU 无法识别问题
人工智能·python·tensorflow
serve the people2 小时前
tensorflow Keras 模型的保存与加载
人工智能·tensorflow·keras
vortex52 小时前
Ubuntu 虚拟机配置静态 IP
linux·tcp/ip·ubuntu
All The Way North-2 小时前
PyTorch 二分类损失函数详解:BCELoss vs BCEWithLogitsLoss 最佳实践指南
人工智能·pytorch·深度学习·机器学习·二分类损失函数