GPU环境下Python+Numba编程报错:RuntimeError: Numba cannot operate on non-primary CUDA context 55d3358f3aa0

先贴出报错信息:

Traceback (most recent call last):
  File "/home/liuz/mxxx/tools/pooling_gpu.py", line 181, in <module>
    d_arr = cuda.to_device(arr)
  File "/home/liuz/anaconda3/envs/xxx/lib/python3.7/site-packages/numba/cuda/cudadrv/devices.py", line 223, in _require_cuda_context
    with _runtime.ensure_context():
  File "/home/liuz/anaconda3/envs/xxx/lib/python3.7/contextlib.py", line 112, in __enter__
    return next(self.gen)
  File "/home/liuz/anaconda3/envs/xxx/lib/python3.7/site-packages/numba/cuda/cudadrv/devices.py", line 123, in ensure_context
    newctx = self.get_or_create_context(None)
  File "/home/liuz/anaconda3/envs/xxx/lib/python3.7/site-packages/numba/cuda/cudadrv/devices.py", line 138, in get_or_create_context
    return self._get_or_create_context_uncached(devnum)
  File "/home/liuz/anaconda3/envs/xxx/lib/python3.7/site-packages/numba/cuda/cudadrv/devices.py", line 161, in _get_or_create_context_uncached
    raise RuntimeError(msg.format(ac.context_handle.value))
RuntimeError: Numba cannot operate on non-primary CUDA context 55d3358f3aa0

Process finished with exit code 1

原因:未指定GPU

服务器上有多个GPU,而Numba貌似是只能在某个GPU上编译运行。未指定GPU会导致Context初始化失败,出现以上报错信息。

解决方案

1、numba.cuda.select_device(0) 这里0是GPU的id,表示使用第一块GPU。在main函数内添加这句就可以了。
2、使用with环境,例子如下:

import numpy as np
from numba import cuda


if __name__ == "__main__":
	with cuda.gpus[0]:	# id:0,自己指定任意GPU id
		arr = np.arange(1000)
	    d_arr = cuda.to_device(arr)

注意:使用os.environ并不能解决该问题,即
os.environ[“CUDA_VISIBLE_DEVICES”] = ‘0’

Reference

https://numba.readthedocs.io/en/stable/cuda-reference/host.html
https://numba.pydata.org/numba-doc/latest/index.html

### 错误分析 在 Python 中遇到 `AttributeError` 表明尝试访问的对象或模块不存在指定的属性或方法。具体到此问题中的错误消息: ``` AttributeError: module &#39;numba.cuda.models&#39; has no attribute &#39;items&#39; ``` 这表明程序试图调用 `numba.cuda.models.items()` 方法,而该模块并未定义名为 `items` 的属性。 此类问题通常由以下原因引起: - **版本不兼容**:使用的 NumbaCUDA 版本可能与代码需求不符[^1]。 - **拼写错误**:可能存在语法上的笔误,导致调用了错误的方法名称。 - **对象类型错误**:实际操作的对象并非预期的数据结构(如字典),因此无法找到特定方法。 --- ### 解决方案 #### 1. 验证依赖库版本 Numba 是一个高性能编译器,支持 GPU 加速功能。不同版本之间可能会存在 API 变更。如果当前环境中安装的 NumbaCUDA 不匹配,则可能导致上述错误。 建议先检查已安装的 NumbaCUDA 版本号: ```bash pip show numba | grep Version nvcc --version ``` 随后查阅官方文档确认两者之间的兼容性关系[^2]。必要时升级至最新稳定版或者回退到旧版本以满足项目需求。 #### 2. 修改代码逻辑 假设问题是由于误解了某些数据类型的接口所致,则需重新审视涉及的部分代码片段。例如原本期待的是字典形式却传入了一个自定义类实例等情况。 可以临时打印变量类型来辅助调试: ```python import inspect print(type(numba.cuda.models)) for name, value in inspect.getmembers(numba.cuda.models): print(f"{name}: {value}") ``` 通过以上方式了解目标模块的实际成员列表并调整相应部分实现。 #### 3. 替代解决方案 假如经过排查发现确实缺少所需的功能特性,在不影响整体架构的前提下考虑采用其他替代品完成相似任务。比如 PyCUDA 提供更为灵活丰富的API集合用于处理图形处理器相关运算工作负载[^3]。 以下是简单示例展示如何利用PyCuda执行基本矩阵加法计算过程作为参考: ```python import pycuda.autoinit from pycuda import gpuarray import numpy as np a_gpu = gpuarray.to_gpu(np.random.randn(4,4).astype(np.float32)) b_gpu = gpuarray.to_gpu(np.random.randn(4,4).astype(np.float32)) c_gpu = a_gpu + b_gpu result = c_gpu.get() print(result) ``` --- ### 总结 针对 `AttributeError: module &#39;numba.cuda.models&#39; has no attribute &#39;items&#39;` 这一异常情况,应优先核查所依赖软件包间的适配状况;其次深入剖析源码定位确切位置作出修正;最后当常规手段难以奏效之时不妨探索其它可行路径予以绕过障碍达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值