Compute Capability Mismatch, ou `cudaErrorNoKernelImageForDevice`
Compute Capability Mismatch
tudo começou com esse erro
torch.AcceleratorError: CUDA error: no kernel image is available for execution on the device
Search for cudaErrorNoKernelImageForDevice' in https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__TYPES.html for more information. Compile with TORCH_USE_CUDA_DSA to enable device-side assertions.
o meu ambiente era: Python 3.12, PyTorch 2.9, GPU Driver Version: 580.119.02 e CUDA Version: 13.0
chequei usando nvidia-smi -q | grep "Compute Capability", que retornou nulo. então fui ler a documentação e descobri o comando certo
nvidia-smi --query-gpu=name,compute_cap
name, compute_cap
NVIDIA GeForce MX330, 6.1
o que significa que a compute capability da minha GPU é sm_61.
então fui conferir o que a minha versão do torch suportava:
In [1]: import torch
In [2]: torch?
Type: module
String form: <module 'torch' from '/home/gigibs/.pyenv/versions/venv312/lib/python3.12/site-packages/torch/__init__.py'>
File: ~/.pyenv/versions/venv312/lib/python3.12/site-packages/torch/__init__.py
Docstring:
The torch package contains data structures for multi-dimensional
tensors and defines mathematical operations over these tensors.
Additionally, it provides many utilities for efficient serialization of
Tensors and arbitrary types, and other useful utilities.
It has a CUDA counterpart, that enables you to run your tensor computations
on an NVIDIA GPU with compute capability >= 3.0.
In [3]: torch.__version__
Out[3]: '2.9.1+cu128'
In [4]: torch.cuda.get_arch_list()
Out[4]: ['sm_70', 'sm_75', 'sm_80', 'sm_86', 'sm_90', 'sm_100', 'sm_120']
ou seja: não suporta. depois eu descobri que minha GPU faz parte de uma linda família
que se chama Pascal e que portanto tem compute capability sm_61 e que não
é suportada pelo Torch > 2.0 e CUDA > 11.8. Na verdade eu não sei exatamente
qual o range de versões que suportam essa família de GPU, já que vi que PyTorch
2.4 + CUDA 12.4 talvez funcionassem, mas aí também era detalhe demais pra um
problema que eu não ia resolver, então só decidi ignorar essa info por
enquanto. fica pra próxima.
as minhas opções aqui eram:
- fazer o downgrade do CUDA + Torch
- rodar como apenas CPU o meu código
- arranjar uma GPU foda do nada
escolhi a opção 2 porque o meu ambiente está corretamente configurado no cluster da universidade e, portanto, não preciso rodar nada local, exceto pequenas provas de conceito.
resolvido! fica o aprendizado.
referências