python 安装gpu版pytorch【亲测有效】 首先查看本机cuda版本:nvidia-smi查看本机是否安装了pytorch,pip list。
笔者在使用pytorch时遇到无法使用gpu训练,只能使用cpu训练,这是由于之前安装pytorch时只安装了cpu版导致的,经过在网上各种查阅资料结合自己的探索,最终高效的解决了这一问题,不用像大多数网页说的那样从清华源下载安装包离线手动安装,这种安装方法效率太低,需要确定pytorch需要的每个安装包的版本号然后找到安装包下载安装,十分耗时耗力,而且容易出错。
笔者从另一种方法来安装,安装方法十分简单而且高效,只需要简单的两步搞定。
首先需要说明的是pytorch gpu的安装需要匹配python版本、cuda版本和pytorch版本等正确的情况下才能正常使用,否则就会出错,本文详细记录解决过程。
1 查看本机cuda版本
首先查看本机cuda版本:nvidia-smi,从中可以看到cuda版本为12.2
查看本机是否安装了pytorch,pip list
2 安装cuda12.2版本对应的pytorch
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu122
测试是否安装成功
import torch
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
print(torch.version.cuda)
# 选择设备
# device = torch.device("cpu")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 假设这些张量已经定义
input = torch.randn(10, 20).to(device)
weight = torch.randn(30, 20).to(device)
bias = torch.randn(10, 30).to(device)
# 打印张量的形状和数据类型
print("Input shape:", input.shape)
print("Weight shape:", weight.shape)
print("Bias shape:", bias.shape)
print("Input dtype:", input.dtype)
print("Weight dtype:", weight.dtype)
print("Bias dtype:", bias.dtype)
# 执行矩阵乘法
try:
ret = torch.addmm(bias, input, weight.t())
print("Result shape:", ret.shape)
except RuntimeError as e:
print("Error:", e)
但运行时报错:
在python脚本中加入:
print(torch.version.cuda)
打印结果为10.1,与nvidia-smi输出结果不同,版本不一致导致的。
卸载pytorch
pip uninstall pytorch
重新安装pytorch
前往pytorch官网,目前要python3.8版本以上
https://pytorch.org/get-started/locally/
3 解决方法
由于笔者电脑用的是python3.7,升级python到3.8较麻烦,需要卸载anaconda,并且很多之前安装的第三方库可能无法使用,因此降低nvidia驱动版本。
安装nvidia驱动后查看cuda版本为11.4
4 安装低版本cuda11.4对应的pytorch
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu114
5 cpu和gpu耗时对比
# cpu和gpu耗时对比
import time
def train(size_list, epochs):
for s in size_list:
# CPU
start_time1 = time.time()
a = torch.ones(s, s)
for _ in range(epochs):
a += a
cpu_time = time.time() - start_time1
# GPU
start_time2 = time.time()
b = torch.ones(s, s).cuda()
for _ in range(epochs):
b += b
gpu_time = time.time() - start_time2
print("s = %d, CPU_time = %.4fs, GPU_time = %.4fs" % (s, cpu_time, gpu_time))
size_list = [8, 32, 128, 512, 1024, 2048]
epochs = 100000
train(size_list, 100000)
在维数较小时,cpu耗时更低,但随着维数的增加,gpu的优势越来越大。
cpu和gpu耗时原因分析:
1)维数问题
GPU加速通过大量的计算并行化来工作。 GPU有大量的内核,每个内核都不是很强大,但是核心数量巨大。PyTorch可以使它们尽可能地并行计算, 在tensor维度比较高的情况下,GPU能够并行化更多的整体计算,显著减少计算耗时。
因此,如果遇到pytorch 用CPU比GPU还快的情况时,可以看看dataloader里单次输入的 x 维度是否太低,如果太低可以把 batch_size 调大一点,可以的话增加一下数据维度,单次输入的tensor的shape越大,GPU越能并行化计算。
当然,也不要设的太大了,比如batch_size设个大几万啥的,再强的显卡也遭不住这么折腾。
2)模型太过简单
GPU的强大体现在它的并行计算,数据越大,模型越复杂越能体现出来。太过简单的模型CPU一下子就算完了,此时的GPU可能才刚接收完数据,没法体现GPU的强大。
因此,解决方案也很简单,换个复杂点的模型或者加深加宽现有的神经网络模型。
3)CPU 相对 GPU 强太多
在相同的、没调好的参数情况下,有时候64核的CPU用60%的核心(也就是38个)也能达到一张2080ti显卡(GPU)的效果。如果CPU是个64核的芯片,而显卡是老黄家的古董960,那CPU比GPU快也是完全有可能的,这时候瓶颈就在显卡了。