0. 前言
之前已经安装成功了,也发了篇博客梳理了整套流程如下。
ubuntu18.04安装pytorch、cuda、cudnn和miniconda_Toblerone_Wind的博客-CSDN博客_ubuntu18.04 安装pytorchhttps://blog.csdn.net/qq_42276781/article/details/124296431但后续发现tensor变量不能转移到cuda上,即执行下面的语句会卡死。
import torch
a = torch.ones(1, 3)
b = a.cuda()
卡死也没报错信息,后来调试了很久发现是原先的cuda10.2版本太低了,不持支我的3060显卡。
装了cuda11.4发现又没有对应的pytorch,导致cuda无法和torch正常通讯。
最后参考了这篇博客,终于找到了正确的安装方法。
总体环境:RTX3060显卡,470nvidia驱动,11.1cuda,支持11.1cuda的cudnn。
所需文件如下,终端默认打开路径为该文件夹
python3.6环境下,pytorch相关: whl1 , whl2, whl3
cudnn相关的3个文件需要注册nvidia账号才能下载,这里我上传到了csdn
1. 安装nvidia驱动
打开blacklist-nouveau.conf文件
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
粘贴下面代码
blacklist nouveau
options nouveau modeset=0
依次输入如下命令
sudo update-initramfs -u
reboot
重启后输入如下指令,如无输出,则禁用成功。
lsmod | grep nouveau
安装nvidia-driver-470
sudo apt-get install nvidia-driver-470
2. 安装cuda
启动cuda安装程序
bash cuda_11.1.0_455.23.05_linux.run
取消勾选455驱动,仅安装cuda。安装完成后修改环境,打开配置文件
gedit ~/.bashrc
在末端加入如下路径
export PATH="/usr/local/cuda-11.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH"
保存后终端输入
source ~/.bashrc
重启后终端输入
nvidia-smi
虽然显示cuda版本是11.4但是没关系,可以看到驱动是470。
终端输入下面指令,可以看到cuda版本是11.1
nvcc -V
3. 安装cudnn
依次输入
sudo dpkg -i libcudnn8_8.0.5.39-1+cuda11.1_amd64.deb
sudo dpkg -i libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb
sudo dpkg -i libcudnn8-samples_8.0.5.39-1+cuda11.1_amd64.deb
4. 安装miniconda
输入指令安装
bash Miniconda3-py37_4.8.3-Linux-x86_64.sh
安装完成后关闭终端,重新打开终端后输入
conda config --set auto_activate_base true
5. 安装pytorch
首先新建一个conda环境,名字叫deep
conda create -n deep python=3.6 -y
进入该环境
conda activate deep
设置pip镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装pytorch相关whl
pip install torch-1.9.0+cu111-cp36-cp36m-linux_x86_64.whl
pip install torchvision-0.10.0+cu111-cp36-cp36m-linux_x86_64.whl
pip install torchaudio-0.9.0-cp36-cp36m-manylinux1_x86_64.whl
6. 测试
运行test.py文件
import torch # 如正常则静默
a = torch.Tensor([1.]) # 如正常则静默
a.cuda() # 如正常则返回"tensor([ 1.], device='cuda:0')"
from torch.backends import cudnn # 如正常则静默
print(cudnn.is_acceptable(a.cuda())) # 如正常则返回 "True"