【安装】PyTorch|查看并调整Cuda版本以适应PyTorch安装的指南

2025/04/02更新:我感觉之前写得太垃圾了,特地来重写一下,之前被我的文章坑到的兄弟姐妹们不好意思。

首先,安装Anaconda和Pytorch以及其他的东西的教程可以看这篇博客:【安装】Python3|Windows下安装Anaconda、pytorch,以及修改pip默认安装路径_anaconda pip修改安装的包路径-CSDN博客,当且仅当你遇到版本不对劲的时候再回来看本篇博客。

Cuda版本查看

1 最高的Cuda版本

首先,运行指令,查看自己的显卡支持的最高的CUDA版本号:

nvidia-smi -i 0

2 查看当前活跃的Cuda版本

运行以下指令:

nvcc -V

会显示当前活跃的一个Cuda版本,例如:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed Nov 22 10:08:41 2023
Cuda compilation tools, release 12.4, V12.4.131

在这里插入图片描述

3 查看当前安装的所有Cuda版本

Linux

运行指令,通过包管理器查看:

dpkg -l | grep cuda-toolkit

输出示意(有什么版本就会显示什么版本的):

ii  nvidia-cuda-toolkit                           12.0.140~12.0.1-4build4                  amd64        NVIDIA CUDA development toolkit
ii  nvidia-cuda-toolkit-doc                       12.0.1-4build4                           all          NVIDIA CUDA and OpenCL documentation
Windows

在 Windows 系统下,通过安装目录直接查看:

CUDA Toolkit 默认安装在以下路径:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA

打开此目录,每个子文件夹对应一个已安装的 CUDA 版本(例如 v11.7, v12.2 等)。

示例: 在这里插入图片描述

PyTorch安装指令构造

方式一 官网安装选项组合

直接点开官网,看安装选项中有没有你自己的CUDA版本,例如下图:
在这里插入图片描述

如果有就可以直接用它给出的指令,如果没有就继续往下看。

方式二 查看所有可安装的版本

打开官网的所有版本,检查是不是有符合你的Cuda版本的。如果有的话可以考虑装那个版本的。

例如如果你的CUDA是11.1,那么你搜索cu111,会发现torch 1.9.0+cu111存在。就可以用如下指令下载pytorch:

pip --default-timeout=1000 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html

如果你发现你的CUDA还是没有对应的版本,比如CUDA 11.2 没有任何的torch版本,因为PyTorch没有专门针对CUDA 11.2发行的版本。那就继续往下看。

方式三 安装其他版本CUDA,再用方式一二

1 安装其他版本

参考:CUDA版本升级(20分钟搞定)_更新cuda版本-CSDN博客

首先你需要注意自己安装的版本再高也不能高过Nvidia-smi显示的那个,其他就没什么注意的了,哪个能用就装哪个吧。不需要卸载原本的,让卸载的博客都不太正常……

官网上下载和Pytorch匹配的版本:https://developer.nvidia.com/cuda-toolkit-archive

按照自己的需求选一下,比如我现在要下的版本是Windows Cuda 11.8:
在这里插入图片描述
根据下载的指示去下载就可以了,Windows是按Download按钮就行。
在这里插入图片描述
这里我只演示Windows的操作:

  1. 第一步会让选解压目录,随便解压一下,不用管到底解压到哪个目录了因为安装完会自动删掉的:
    在这里插入图片描述
  2. 弹出选项问是否安装驱动,一直点同意或下一步就好了:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

安装完成之后你就可以看到文件夹下多了一个v11.8了!

在这里插入图片描述

2 安装PyTorch

参考方式一、二去构造相应的安装指令了,记得先把之前不小心装的cpu版本卸载掉。
在这里插入图片描述

3 切换Cuda版本

你装完之后运行nvcc -V大概率还是会显示之前的版本,但是不要紧,你要的是代码里面版本正确,而且我也不想把系统的nvcc改掉。

这里提供一个在代码里测试并切换cuda版本的方案。

以下是完整的python测试代码:

import os
import sys
import subprocess

# 设置目标 CUDA 版本路径(根据你的实际安装路径修改)
cuda_path = r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8"  # Windows 示例
# cuda_path = "/usr/local/cuda-11.8"  # Linux 示例

# -------------------------------------------------------------------
# 1. 添加 CUDA 相关路径到环境变量(临时生效,仅限当前脚本)
# -------------------------------------------------------------------
def add_cuda_to_path():
    # Windows 路径格式
    if sys.platform == "win32":
        cuda_bin = os.path.join(cuda_path, "bin")
        cuda_lib = os.path.join(cuda_path, "lib", "x64")
        os.environ["PATH"] = f"{cuda_bin};{os.environ['PATH']}"
        os.environ["CUDA_PATH"] = cuda_path
        os.environ["LD_LIBRARY_PATH"] = f"{cuda_lib};{os.environ.get('LD_LIBRARY_PATH', '')}"
    
    # Linux 路径格式
    else:
        cuda_bin = os.path.join(cuda_path, "bin")
        cuda_lib = os.path.join(cuda_path, "lib64")
        os.environ["PATH"] = f"{cuda_bin}:{os.environ['PATH']}"
        os.environ["LD_LIBRARY_PATH"] = f"{cuda_lib}:{os.environ.get('LD_LIBRARY_PATH', '')}"

# -------------------------------------------------------------------
# 2. 验证 PyTorch CUDA 版本
# -------------------------------------------------------------------
def check_pytorch_cuda():
    try:
        import torch
        print("\n[PyTorch 验证]")
        print(f"Python 版本: {sys.version}")
        print(f"PyTorch 版本: {torch.__version__}")
        print(f"CUDA 可用性: {torch.cuda.is_available()}")
        print(f"GPU 设备数量: {torch.cuda.device_count()}")
        if torch.cuda.is_available():
            print(f"PyTorch 使用的 CUDA 版本: {torch.version.cuda}")
            print(f"当前 GPU 设备: {torch.cuda.get_device_name(0)}")
        else:
            print("警告: CUDA 不可用,请检查驱动和PyTorch安装!")
    except ImportError:
        print("错误: PyTorch 未安装!")
    except Exception as e:
        print(f"PyTorch 验证异常: {str(e)}")

# -------------------------------------------------------------------
# 3. 验证系统 CUDA 环境
# -------------------------------------------------------------------
def check_system_cuda():
    print("\n[系统环境验证]")
    try:
        # 检查 nvcc 版本
        nvcc_output = subprocess.check_output(["nvcc", "--version"], stderr=subprocess.STDOUT)
        print(nvcc_output.decode().strip())
    except FileNotFoundError:
        print("错误: nvcc 未找到,请检查 CUDA 是否安装或路径是否正确!")
    except Exception as e:
        print(f"系统 CUDA 检查异常: {str(e)}")

    # 检查环境变量
    print(f"\n当前 PATH 中的 CUDA 路径: {'CUDA路径存在' if cuda_path in os.environ['PATH'] else '未找到目标CUDA路径'}")

# -------------------------------------------------------------------
# 执行验证
# -------------------------------------------------------------------
if __name__ == "__main__":
    add_cuda_to_path()
    check_pytorch_cuda()
    check_system_cuda()

调用add_cuda_to_path这个函数就可以保证cuda版本完全正确了~

进一步验证GPU是否在代码中被使用

我做了前面的那些验证之后查看nvidia-smi还是感觉GPU没有怎么被占用,所以写了个更加复杂的看看能不能做到显著占用:

import torch
import time
import numpy as np

def gpu_stress_test(device='cuda', matrix_size=10000, num_iter=100, warmup=10):
    # 检查 CUDA 是否可用
    if not torch.cuda.is_available():
        print("错误: CUDA 不可用,请检查 GPU 驱动和 PyTorch 安装!")
        return False

    # 获取 GPU 设备信息
    print("\n=== GPU 信息 ===")
    print(f"当前 GPU: {torch.cuda.get_device_name(0)}")
    print(f"CUDA 版本: {torch.version.cuda}")
    print(f"PyTorch CUDA 支持: {torch.backends.cudnn.version()}\n")

    # 初始化大型矩阵(显存占用约 2*8*matrix_size^2 字节)
    print(f"创建 {matrix_size}x{matrix_size} 浮点矩阵...")
    try:
        a = torch.randn(matrix_size, matrix_size, device=device)
        b = torch.randn(matrix_size, matrix_size, device=device)
    except RuntimeError as e:
        print(f"显存不足!错误信息: {str(e)}")
        return False

    # 预热阶段(让 GPU 达到稳定状态)
    print("开始 GPU 预热...")
    for _ in range(warmup):
        c = torch.matmul(a, b)
    torch.cuda.synchronize()  # 等待所有计算完成

    # 性能测试
    print(f"\n开始 {num_iter} 次矩阵乘法压力测试...")
    times = []
    mem_usage = []
    util_usage = []

    for i in range(num_iter):
        start_time = time.time()
        
        # 执行矩阵乘法
        c = torch.matmul(a, b)
        
        # 等待计算完成
        torch.cuda.synchronize()
        
        # 记录时间
        elapsed = time.time() - start_time
        times.append(elapsed)
        
        # 记录显存使用
        mem_usage.append(torch.cuda.memory_allocated() / 1024**3)  # 转换为 GB
        
        # 记录 GPU 利用率(需要安装 nvidia-ml-py)
        try:
            from pynvml import nvmlInit, nvmlDeviceGetUtilizationRates
            nvmlInit()
            handle = torch.cuda.get_device_properties(0).pciBusId
            util = nvmlDeviceGetUtilizationRates(handle).gpu
            util_usage.append(util)
        except:
            pass
        
        # 打印进度
        if (i+1) % 10 == 0:
            print(f"已完成 {i+1}/{num_iter} 次迭代")

    # 打印统计信息
    print("\n=== 测试结果 ===")
    print(f"平均每次计算耗时: {np.mean(times)*1000:.2f} ms")
    print(f"最大显存占用: {max(mem_usage):.2f} GB")
    if util_usage:
        print(f"平均 GPU 利用率: {np.mean(util_usage):.1f}%")

    # 验证结果正确性
    try:
        a_cpu = a.cpu()
        b_cpu = b.cpu()
        c_cpu = torch.matmul(a_cpu, b_cpu)
        diff = torch.abs(c.cpu() - c_cpu).max().item()
        print(f"\n数值验证误差: {diff:.6f} (应接近 0)")
    except:
        pass

    return True

if __name__ == "__main__":
    # 执行测试(可调整参数)
    test_result = gpu_stress_test(
        device='cuda',
        matrix_size=15000,  # 增大此值会提高显存占用(如果显存不足请减小)
        num_iter=50,
        warmup=5
    )

    # 最终结论
    if test_result:
        print("\n测试完成,如果出现以下情况需要排查:")
        print("1. 显存占用未达到 GPU 总容量(表示未充分利用)")
        print("2. GPU 利用率长期低于 90%")
        print("3. 数值误差显著大于 1e-5")
        print("4. 出现 CUDA 错误或崩溃")
    else:
        print("\n测试未完成,请检查上述错误信息")

随便运行了一下,占用确实多,说明GPU没坏:

在这里插入图片描述
那就说明要是占用不高就只能是代码有问题了。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/124873505。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shandianchengzi

谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值