You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用ONNXRuntime GPU运行XLM-Roberta标点恢复模型时遇cudaErrorNoKernelImageForDevice错误的无CUDA升级解决方法咨询

ONNXRuntime GPU运行XLM-Roberta标点恢复模型时遇cudaErrorNoKernelImageForDevice错误的无CUDA升级解决方法咨询

看起来你遇到的是ONNXRuntime与CUDA版本不匹配导致的设备内核镜像缺失问题,而且因为是公司服务器没法升级CUDA,确实挺棘手的。结合你的环境(Nvidia A100、CUDA 12.2、当前PyTorch是适配CUDA12.6的版本、ONNXRuntime GPU版来自微软源),我给你几个不用升级CUDA的可行解决思路:

1. 更换与CUDA 12.2适配的ONNXRuntime GPU版本

你当前安装的ONNXRuntime GPU版可能是针对更高版本CUDA(比如12.6)编译的,导致在A100上没有对应的可执行内核镜像。需要卸载现有版本,安装适配CUDA12.2的稳定版:

# 卸载当前ONNXRuntime GPU版本
pip uninstall -y onnxruntime-gpu
# 安装适配CUDA 12.2的ONNXRuntime GPU版本(1.16.3是支持CUDA12.2的稳定版)
pip install onnxruntime-gpu==1.16.3

解释:ONNXRuntime的GPU版本对CUDA版本有严格的依赖,使用和系统CUDA版本一致的编译包,能确保内核镜像与A100设备完全兼容。

2. 降级PyTorch到适配CUDA12.2的版本

你当前安装的PyTorch是cu126版本(针对CUDA12.6),虽然之前其他库能正常运行,但与ONNXRuntime配合时,底层CUDA版本的不匹配可能引发隐性冲突。建议更换为与CUDA12.2兼容的PyTorch版本:

# 卸载当前PyTorch相关包
pip uninstall -y torch torchvision torchaudio
# 安装适配CUDA12.2的PyTorch 2.2.0版本(2.2.0开始原生支持CUDA12.2)
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu122

解释:PyTorch和ONNXRuntime共享CUDA runtime环境,版本对齐后能减少底层资源调用的冲突,避免内核镜像加载失败的问题。

3. 暂时禁用TensorRT Execution Provider

你初始化模型时同时启用了CUDAExecutionProviderTensorrtExecutionProvider,但TensorRT对CUDA、cuDNN版本的依赖更严格,若未安装与CUDA12.2匹配的TensorRT,会额外触发内核镜像错误。可以先只保留CUDA Provider测试:

clf2 = PunctCapSegModelONNX.from_pretrained(
    "1-800-BAD-CODE/xlm-roberta_punctuation_fullstop_truecase", 
    ort_provider=["CUDAExecutionProvider"]
)

解释:先排除TensorRT的干扰,验证纯CUDA Provider是否能正常运行。如果可行,后续再单独安装适配CUDA12.2的TensorRT版本,再重新启用TensorRT Provider。

4. 强制指定GPU架构兼容参数

如果上述方法仍未解决,可以通过环境变量强制ONNXRuntime为A100的架构(计算能力sm_80)生成兼容的内核:

# 在Python脚本开头添加以下代码
import os
# 强制TensorRT(若启用)生成适配sm_80的引擎
os.environ["ONNXRUNTIME_FORCE_TENSORRT_ENGINE_CORE_COMPATIBILITY"] = "80"
# 指定CUDA只加载sm_80的内核
os.environ["TORCH_CUDA_ARCH_LIST"] = "8.0"
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 假设你的A100是第0块卡

解释:A100的计算能力是8.0,通过环境变量指定后,ONNXRuntime和PyTorch会优先加载适配该架构的内核镜像,避免因自动检测错误导致的内核缺失。

额外提示

操作前建议先备份当前环境的依赖清单,方便后续回滚:

pip freeze > current_requirements.txt

如果以上方法都暂时无法生效,可以临时切换到CPU模式验证模型本身是否正常(但这只是验证手段,不是GPU问题的最终解决方案):

clf2 = PunctCapSegModelONNX.from_pretrained(
    "1-800-BAD-CODE/xlm-roberta_punctuation_fullstop_truecase", 
    ort_provider=["CPUExecutionProvider"]
)

你遇到的核心错误本质是编译好的CUDA内核与当前GPU设备、系统CUDA版本不兼容,以上思路都是从版本对齐或强制架构匹配的角度来解决这个问题,不用升级系统CUDA就能尝试修复。

Fail: [ONNXRuntimeError] : 1 : FAIL : Non-zero status code returned while running Equal node. Name:'/Equal' Status Message: CUDA error cudaErrorNoKernelImageForDevice:no kernel image is available for execution on the device

火山引擎 最新活动