🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。
📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服务,有需要可加文末联系方式联系。
💬 博主粉丝群介绍:① 群内高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
解决Python报错:RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously repo
CUDA 错误背景
错误示例代码与详细报错内容
错误示例代码:
import torch
# 假设系统中只有一块 GPU(设备编号为 0),但代码中使用了编号 1 的设备
device = torch.device("cuda:1")
tensor = torch.tensor([1.0, 2.0, 3.0], device=device)
详细报错内容:
RuntimeError: CUDA error: invalid device ordinal
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
常见原因和解决方案
“invalid device ordinal” 错误表明使用的 CUDA 设备编号无效。这通常是由于:
- 设备编号超出范围:设备编号超出了系统中实际存在的 GPU 数量,或在代码中设置了错误的设备编号。
- CUDA 环境变量未正确配置:CUDA 相关的环境变量未正确设置。
- CUDA 设备未正确初始化:CUDA 设备未正确初始化或初始化步骤有误。
- 检查 GPU 的可用性和状态:GPU 可能处于不可用或被占用状态。
下面是一些有效的解决方案和示例代码。
解决方案
1. 检查设备编号范围
确保你使用的设备编号在实际存在的 GPU 数量范围内。
错误示例:
import torch
# 系统只有1块 GPU(设备编号为 0),但代码中使用了编号 1 的设备
device = torch.device("cuda:1")
tensor = torch.tensor([1.0, 2.0, 3.0], device=device)
解决方法:
import torch
# 自动检测并使用可用的 GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
tensor = torch.tensor([1.0, 2.0, 3.0], device=device)
2. 检查并正确设置 CUDA 环境变量
确保 CUDA 环境变量正确设置,尤其是 CUDA_VISIBLE_DEVICES
环境变量。
错误示例:
设置了错误的设备编号:
export CUDA_VISIBLE_DEVICES=1 # 系统只有1块 GPU
解决方法:
export CUDA_VISIBLE_DEVICES=0 # 使用正确的设备编号
3. 正确初始化 CUDA 设备
确保 CUDA 设备正确初始化。
错误示例:
import pycuda.driver as cuda
import pycuda.autoinit
# 使用一个无效的设备编号
cuda.Device(1).make_context() # 当设备编号超出范围时出错
解决方法:
import pycuda.driver as cuda
import pycuda.autoinit
# 获取实际的 GPU 数量
num_devices = cuda.Device.count()
if num_devices > 0:
cuda.Device(0).make_context() # 使用有效的设备编号进行上下文初始化
else:
print('No CUDA devices detected')
4. 检查 GPU 的可用性和状态
确保 GPU 处于可用状态并且没有被占用。
使用 nvidia-smi
检查 GPU 状态:
在终端中运行以下命令:
nvidia-smi
确保所有设备都显示为已启动且健康。如果有设备显示为“不可达”或“故障”,需要进一步排查硬件问题或者 CUDA 驱动程序问题。
示例与应用
示例 1:检查设备编号范围
错误示例:
import torch
# 系统只有1块 GPU(设备编号为 0),但代码中使用了编号 1 的设备
device = torch.device("cuda:1")
tensor = torch.tensor([1.0, 2.0, 3.0], device=device)
正确示例:
import torch
# 自动检测并使用可用的 GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
tensor = torch.tensor([1.0, 2.0, 3.0], device=device)
示例 2:检查并正确设置 CUDA 环境变量
配置环境变量:
export CUDA_VISIBLE_DEVICES=0 # 使用正确的设备编号
示例 3:正确初始化 CUDA 设备
错误示例:
import pycuda.driver as cuda
import pycuda.autoinit
# 使用一个无效的设备编号
cuda.Device(1).make_context() # 当设备编号超出范围时出错
正确示例:
import pycuda.driver as cuda
import pycuda.autoinit
# 获取实际的 GPU 数量
num_devices = cuda.Device.count()
if num_devices > 0:
cuda.Device(0).make_context() # 使用有效的设备编号进行上下文初始化
else:
print('No CUDA devices detected')
示例 4:检查 GPU 的可用性和状态
使用 nvidia-smi
检查 GPU 状态:
在终端中运行以下命令:
nvidia-smi
如果显示有问题的 GPU,可以尝试重新启动 CUDA 驱动程序:
sudo service nvidia-persistenced stop
sudo service nvidia-persistenced start
或者重新启动系统来重置 GPU 状态。
总结
CUDA 错误 “invalid device ordinal” 表示使用的 CUDA 设备编号无效,通常由于设备编号超出范围、环境变量未正确配置、CUDA 设备未正确初始化或 GPU 状态异常等原因。通过检查设备编号范围、正确设置环境变量、初始化 CUDA 设备和检查 GPU 可用性和状态,可以有效解决这个问题。
希望本文对你理解和解决 invalid device ordinal
错误有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论!