目录
前置条件
硬件条件
R5-5600G + RTX4060
当前日期
当前时间是 2023 年 12 月 27 日,请注意本文的时效性,保不齐后续出现某个组件的更新能够直接解决这个问题。
检查方法
检测 Tensorflow 是否检测得到 GPU,运行以下 Python 代码
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
如果运行结果为
[] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
那么恭喜,说明你的 tf 仅仅是检测不到 GPU 设备,CPU 设备还是能够检查到的。
但是,好像从某个版本开始,tf 就不区分 CPU 版和 GPU 版了,所以这个问题通过 install tensorflow-gpu 解决的方法已经过时了。
检测 Pytorch 是否检测得到 GPU,运行以下 Python 代码
import torch
print(torch.cuda.is_available()) # 判断是否可以使用gpu计算
print(torch.cuda.device_count()) # 显示gpu数量
如果运行结果为
False
0
则说明 Pytorch 没有检测到 GPU。
解决方法
大部分的解决思路,我也是看了别的大佬的文章整理的1 2,这里我直接给出结论:首先要将 CUDA 和 cudnn 的版本对齐(高了的话记得先卸载干净);tensorflow 大概率是版本安装得太高了;torch 大概率也是安装了过高的版本,或干脆装成了 CPU 版本的了。
以下我只给出对应版本和查看方法,具体安装教程直接找有很多,我就不赘述了。
GPU 系统驱动
CUDA==11.2
用命令行指令查看版本
nvcc -V
cudnn==8.1.1
到 CUDA 安装路径下的 include 文件夹中(以我的举例,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\include),找到 cudnn_version.h 文件,右键 -> 编辑 找到以下三行查看版本
GPU 在 Python 中的驱动
这一块也是我后续多次给不同设备调试 CUDA 环境确认的,在我看来与 TF 相关的是上一部分的系统驱动,而这一部分的 Python 包驱动是和 Pytorch 相关的,也就是 torch 似乎只能检测到以本章节安装的 CUDA 驱动。
我是先用这条指令查看了一下我所配置的清华源中是否有和上一部分系统驱动相同版本的包驱动:
conda search cudatoolkit
conda search cudnn
但是似乎都没有,所以我就都往后找了一个版本,事实证明是可行的。
cudatoolkit==11.3.1
conda install cudatoolkit=11.3.1
cudnn==8.2.1
conda install cudnn=8.2.1
Tensorflow
tensorflow==2.10.0
这里要先注意,用 pip 安装 tensorflow==2.10.0 之前,要确保 Python 版本在 3.5~3.8 之间3,否则会出现报错。
pip install tensorflow==2.10.0
用命令行指令查看版本
pip show tensorflow
Pytorch
pytorch==1.10.0
Pytorch 官网其实有提供官方的版本对齐文档4,由于上面我们的 CUDA 版本为 11.2,但是官方网站中并没有对应的 Pytorch,所以我选择了高一个版本的(即 CUDA==11.3 所对应的 Pytorch)进行安装,结果证明可行。
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 -c pytorch -c conda-forge
结果
再次检查,Tensorflow 对应的输出变为
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
Pytorch 对应的输出变为
True
1
则代表都检测成功了。
在 Keras 项目开头加上
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
训练速度直接翻了三倍。