Pytorch | 找不到显卡设备 | RuntimeError: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at “/opt/c

报错如下:

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版本是否正确。

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/存在cudacuda-11.8cuda-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 会按以下顺序尝试加载配置文件:

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login(如果 ~/.bash_profile 不存在)
  4. ~/.profile(如果 ~/.bash_login 和 ~/.bash_profile 都不存在)

非登录 Shell
当你启动一个新的终端或运行一个 shell 脚本时,Bash 会加载以下配置文件:
1. ~/.bashrc
5. /etc/bash.bashrc(如果系统有这个文件)

建议:
为了确保所有配置文件相互兼容,通常会在 ~/.bash_profile 中加载 ~/.bashrc。这样可以确保登录时也会加载 ~/.bashrc 中定义的设置。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值