我正在编辑【python】代码,遇到了 【root@autodl-container-857740b613-fe9d70ca:~/autodl-tmp/ToothGroupNetwork# python preprocess_data.py 0 1 Traceback (most recent call last): File "preprocess_data.py", line 56, in <module> labeled_vertices = gu.resample_pcd([labeled_vertices], 24000, "fps")[0] File "/root/autodl-tmp/ToothGroupNetwork/gen_utils.py", line 129, in resample_pcd idx = fps(pcd_ls[0][:,:3], n) File "/root/autodl-tmp/ToothGroupNetwork/gen_utils.py", line 139, in fps idx = pointops.furthestsampling(xyz, torch.tensor([xyz.shape[0]]).cuda().type(torch.int), torch.tensor([npoint]).cuda().type(torch.int)) RuntimeError: CUDA error: no kernel image is available for execution on the device】 ,请帮我检查并改正错误点。我的原始代码如下: 【import argparse import os import numpy as np from glob import glob import gen_utils as gu parser = argparse.ArgumentParser() parser.add_argument('--source_obj_data_path', default="./data/data_obj_parent_directory", type=str, help="data path in which original .obj data are saved") parser.add_argument('--source_json_data_path', default="./data/data_json_parent_directory", type=str, help="data path in which original .json data are saved") parser.add_argument('--save_data_path', default="./data_preprocessed", type=str, help="data path in which processed data will be saved") args = parser.parse_args() SAVE_PATH = args.save_data_path SOURCE_OBJ_PATH = args.source_obj_data_path SOURCE_JSON_PATH = args.source_json_data_path Y_AXIS_MAX = 33.15232091532151 Y_AXIS_MIN = -36.9843781139949 os.makedirs(os.path.join(SAVE_PATH), exist_ok=True) stl_path_ls = [] for dir_path in [ x[0] for x in os.walk(SOURCE_OBJ_PATH) ][1:]: stl_path_ls += glob(os.path.join(dir_path,"*.obj")) json_path_map = {} for dir_path in [ x[0] for x in os.walk(SOURCE_JSON_PATH) ][1:]: for json_path in glob(os.path.join(dir_path,"*.json")): json_path_map[os.path.basename(json_path).split(".")[0]] = json_path all_labels = [] for i in range(len(stl_path_ls)): print(i, end=" ") base_name = os.path.basename(stl_path_ls[i]).split(".")[0] loaded_json = gu.load_json(json_path_map[base_name]) labels = np.array(loaded_json['labels']).reshape(-1,1) if loaded_json['jaw'] == 'lower': labels -= 20 labels[labels//10==1] %= 10 labels[labels//10==2] = (labels[labels//10==2]%10) + 8 labels[labels<0] = 0 vertices, org_mesh = gu.read_txt_obj_ls(stl_path_ls[i], ret_mesh=True, use_tri_mesh=False) vertices[:,:3] -= np.mean(vertices[:,:3], axis=0) #vertices[:, :3] = ((vertices[:, :3]-vertices[:, 1].min())/(vertices[:, 1].max() - vertices[:, 1].min()))*2-1 vertices[:, :3] = ((vertices[:, :3]-Y_AXIS_MIN)/(Y_AXIS_MAX - Y_AXIS_MIN))*2-1 labeled_vertices = np.concatenate([vertices,labels], axis=1) name_id = str(base_name) if labeled_vertices.shape[0]>24000: labeled_vertices = gu.resample_pcd([labeled_vertices], 24000, "fps")[0] np.save(os.path.join(SAVE_PATH, f"{name_id}_{loaded_json['jaw']}_sampled_points"), labeled_vertices) 】
时间: 2025-03-22 17:14:42 浏览: 60
<think>好的,我现在需要帮助用户解决他们遇到的CUDA错误。用户运行Python脚本时,在调用`pointops.furthestsampling`时出现了RuntimeError,提示“CUDA error: no kernel image is available for the device”。首先,我得理解这个错误的可能原因。
首先,这个错误通常与CUDA的兼容性有关。可能的情况包括:
1. **CUDA版本不匹配**:用户安装的PyTorch或相关库(如pointops)编译时使用的CUDA版本与当前GPU驱动支持的CUDA版本不一致。例如,如果库是用CUDA 11.x编译的,而用户的驱动只支持CUDA 10.x,就会导致这个问题。
2. **GPU架构不支持**:编译pointops时,可能没有包含用户GPU架构的代码。例如,用户的GPU是较新的架构(如Ampere,即sm_86),但编译时未包含对应的架构,导致无法找到合适的kernel。
接下来,我需要查看用户的代码和环境。用户提供的错误信息显示,问题出在`gen_utils.py`的`fps`函数中调用了`pointops.furthestsampling`,并且使用了`.cuda()`将张量移动到GPU。因此,问题可能出在pointops库的安装或编译上。
接下来,我应该考虑可能的解决方案:
1. **检查CUDA版本和PyTorch版本是否匹配**:用户需要确认他们安装的PyTorch版本是否与系统CUDA工具包兼容。可以通过`nvcc --version`或`nvidia-smi`查看CUDA版本,然后使用`conda list`或`pip list`查看PyTorch的版本。
2. **重新编译pointops库**:如果pointops是用户自己编译的(比如来自某个GitHub仓库),可能需要用正确的CUDA版本和GPU架构重新编译。例如,添加正确的`-gencode`参数来包含用户的GPU架构。
3. **使用CPU模式作为临时解决方案**:如果用户不需要GPU加速,或者无法解决CUDA问题,可以尝试将代码改为在CPU上运行,但这可能会影响性能。
另外,用户提供的代码中,在调用`furthestsampling`时,传入了经过`.cuda()`处理的张量。如果pointops没有正确编译,这会导致找不到对应的CUDA kernel。
可能的解决步骤:
- **步骤1:确认CUDA和PyTorch版本**。用户需要运行`nvidia-smi`查看CUDA版本,然后检查PyTorch是否匹配。例如,如果nvidia-smi显示CUDA 11.6,PyTorch应安装对应的版本。
- **步骤2:重新安装或编译pointops**。如果pointops是第三方库,可能需要从源码重新编译,确保编译时指定正确的CUDA架构。例如,针对RTX 30系列显卡(sm_86),需要在编译时包含该架构。
- **步骤3:修改代码使用CPU**。作为临时解决方案,将张量保留在CPU上,但可能会影响性能。
此外,用户可能需要检查他们的GPU是否被PyTorch正确识别。可以运行一个简单的测试脚本,如:
```python
import torch
print(torch.cuda.is_available())
print(torch.version.cuda)
```
如果输出为False,说明CUDA不可用,可能需要重新安装PyTorch。如果CUDA版本显示与系统不一致,也需要调整PyTorch版本。
总结,用户的问题核心在于CUDA环境的兼容性,需要确保所有组件(驱动、CUDA工具包、PyTorch、pointops)版本一致,并且pointops编译时包含正确的GPU架构。</think>根据错误信息和代码分析,该错误是由于CUDA版本与GPU架构不兼容导致的,下面分步骤说明解决方案:
---
### 一、错误原因诊断
错误代码`RuntimeError: CUDA error: no kernel image is available for execution on the device`表明:
1. 当前GPU设备的架构不被PyTorch/CUDA支持
2. 使用的`pointops`库未正确编译适配当前GPU
---
### 二、关键错误定位
问题出现在`gen_utils.py`第139行的最远点采样操作:
```python
idx = pointops.furthestsampling(xyz, torch.tensor([xyz.shape[0]]).cuda().type(torch.int), torch.tensor([npoint]).cuda().type(torch.int))
```
这里调用了需要CUDA加速的操作,但系统找不到匹配的CUDA内核。
---
### 三、解决方案
#### 方案1:检查CUDA环境兼容性(推荐)
1. **确认GPU架构**:
执行命令查看GPU型号:
```bash
nvidia-smi -L
```
若为RTX 30系列/40系列显卡,需要CUDA 11+和sm_86/sm_89架构支持
2. **检查PyTorch CUDA版本**:
```python
import torch
print(torch.version.cuda) # 应匹配系统安装的CUDA版本
```
3. **重新编译pointops库**:
如果使用自定义CUDA扩展(如来自PointNet++等库):
```bash
cd /root/autodl-tmp/ToothGroupNetwork
rm -rf build/ # 清理旧编译
python setup.py install # 重新编译时需指定GPU架构
```
#### 方案2:强制使用CPU模式(临时方案)
修改`gen_utils.py`第139行:
```python
# 修改前(使用GPU)
idx = pointops.furthestsampling(xyz, torch.tensor([xyz.shape[0]]).cuda().type(torch.int), ...)
# 修改后(使用CPU)
idx = pointops.furthestsampling(xyz, torch.tensor([xyz.shape[0]]).cpu().type(torch.int),
torch.tensor([npoint]).cpu().type(torch.int))
```
#### 方案3:调整数据规模
尝试降低采样点数(修改24000为更小值):
```python
# 修改前
labeled_vertices = gu.resample_pcd([labeled_vertices], 24000, "fps")[0]
# 修改后
labeled_vertices = gu.resample_pcd([labeled_vertices], 12000, "fps")[0]
```
---
### 四、验证步骤
1. 在Python中运行CUDA可用性测试:
```python
import torch
print(torch.cuda.is_available()) # 应输出True
print(torch.zeros(1).cuda()) # 应无报错
```
2. 如果使用自定义CUDA扩展,建议运行库的官方示例验证安装
---
### 五、补充建议
1. **环境一致性检查**:
```bash
# 查看CUDA驱动版本
nvcc --version
# 查看GPU支持的计算能力
https://developer.nvidia.com/cuda-gpus
```
2. **推荐配置**:
- NVIDIA驱动版本 ≥ 515.65.01
- CUDA Toolkit 11.7
- PyTorch 2.0+ with CUDA 11.7支持
建议优先尝试方案1,若紧急处理可先用方案2临时运行。具体选择需根据实际硬件配置决定。
阅读全文
相关推荐



















