报错如下:
RuntimeError: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at “/opt/conda/conda-bld/pytorch_1716905971873/work/aten/src/ATen/cuda/CUDAContext.cpp”:50, please report a bug to PyTorch. device=, num_gpus=
原因及解决方案:
1. 检查CUDA是否为显卡驱动所支持的版本
nvidia-smi #查看显卡及其所支持的最高版本的CUDA
nvcc --version #查看cuda版本,也是检验有没有正确安装上cuda的一个方法
ps:如果CUDA版本太低了,也会报错(不过不是这个错误)。CUDA版本要与显卡算算力相匹配,且<=显卡驱动所支持的最高cuda版本
2. 检查Pytorch版本是否正确。
根据CUDA版本安装对应的Pytorch版本,没有自己对应的版本,就去历史版本里找一下自己对应的。
3. Pytorch与CUDA是否兼容并能正常运行
这里提供一个python小脚本。可以直接用vim编写一个python脚本,复制下面内容进去,保存,在你的环境下运行这个脚本,如果一切输入正常,那么基本就没有问题了。
import torch
print("torch.version = " + torch.__version__) # 查看torch版本
print("torch and cuda is availlable? " + str(torch.cuda.is_available())) # 看安装好的torch和cuda能不能用,也就是看GPU能不能用
print("torch 所需要的cuda版本 " + torch.version.cuda) # 输出一个 cuda 版本,注意:上述输出的 cuda 的版本并不一定是 Pytorch 在实际系统上运行时使用的 cuda 版本,而是编译该 Pytorch release 版本时使用的 cuda 版本,详见:https://blog.csdn.net/xiqi4145/article/details/110254093
import torch.utils
import torch.utils.cpp_extension
print("运行的时的cuda.version(CUDA_HOME) = " + torch.utils.cpp_extension.CUDA_HOME) #输出 Pytorch 运行时使用的 cuda
如果以上的方案都没有问题还是不能解决。
1.存在多个GPU
如果存在多个GPU,那么可能模型不支持多个GPU并行计算或者运行,这时候就需要指定使用哪个GPU了。
export CUDA_VISIBLE_DEVICES=0
使用这个命令,临时设置指定使用哪个GPU。可以通过nvidia-smi
进行查看自己的GPU编号,一般都是从0开始。
2.可能存在多个CUDA版本
这种情况下,就要确保自己的CUDA正确安装了并且确保环境变量
与软连接
都配置正确。
这里/usr/local/
存在cuda
、cuda-11.8
、cuda-12.1
,而我想调用的是cuda是cuda-11.8
which nvcc # 可以查看当前系统变量里的cuda是用的在哪个文件夹,如果有多个,建议上一个目录中查看
# 我的正确输出
/usr/local/cuda-11.8/bin/nvcc
比如一般都是 /usr/local/
下。可能输出显示再/usr/loacl/cuda/nvcc
,但是/usr/local/
下可能有多个cuda版本。
- 检查系统环境变量
echo $PATH # 正确输出包含:/usr/local/cuda-11.8/bin
echo $LD_LIBRARY_PATH # 正确输出包含:/usr/local/cuda-11.8/lib64
echo $CUDA_HOME # 正确输出:/usr/local/cuda-11.8
#
# 如果没有就添加变量
# export PATH=/usr/local/cuda-11.8/bin:$PATH
# export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
- 检查软链接
ls -l /usr/local/cuda
# 我的输出是:/usr/local/cuda -> /etc/alternatives/cuda,所以要在检查后面这个链接指向
ls -l /etc/alternatives/cuda
# 正确输出:/etc/alternatives/cuda -> /usr/local/cuda-11.8
#
# 如果不是,修改方式如下例子:
# rm /etc/alternatives/cuda #删除链接
# ln -s /usr/local/cuda-11.8 /etc/alternatives/cuda #创建链接
# ls -l /etc/alternatives/cuda #检查链接
# 正确输出: /etc/alternatives/cuda -> /usr/local/cuda-11.8
上面的设置都是使用
export
直接在命令行输入是一次性的,要想永久生效就需要修改配置文件 `~/.bash_profile。具体方法如下:
vim ~/.bash_profile
以下是我的配置文件
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export CUDA_HOME=/usr/local/cuda-11.8
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64
修改好后:
source ~/.bash_profile
我没有添加指定哪个GPU的那个命令,如果有需要还是临时指定吧。
其他知识:
配置文件加载顺序
登录 Shell
当你登录到一个系统(例如,通过 SSH 或控制台),Bash 会按以下顺序尝试加载配置文件:
/etc/profile
~/.bash_profile
~/.bash_login
(如果 ~/.bash_profile 不存在)~/.profile
(如果 ~/.bash_login 和 ~/.bash_profile 都不存在)
非登录 Shell
当你启动一个新的终端或运行一个 shell 脚本时,Bash 会加载以下配置文件:
1. ~/.bashrc
5. /etc/bash.bashrc
(如果系统有这个文件)
建议:
为了确保所有配置文件相互兼容,通常会在 ~/.bash_profile
中加载 ~/.bashrc
。这样可以确保登录时也会加载 ~/.bashrc
中定义的设置。