🐛 Bug
Hi, torch.cuda.is_available() returns True, however I cannot use cuda tensor. I tried to uninstall and install anaconda, nvidia drivers and cudatoolkit. Still the error is same
To Reproduce
I did nothiing special, just installed pytorch on anaconda and execute following commanda
Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.tensor([1.0, 2.0])
tensor([1., 2.])
>>> torch.tensor([1.0, 2.0]).cuda()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:UsersbalciAnaconda3envspytorchlibsite-packagestorchtensor.py", line 130, in __repr__
return torch._tensor_str._str(self)
File "C:UsersbalciAnaconda3envspytorchlibsite-packagestorch_tensor_str.py", line 311, in _str
tensor_str = _tensor_str(self, indent)
File "C:UsersbalciAnaconda3envspytorchlibsite-packagestorch_tensor_str.py", line 209, in _tensor_str
formatter = _Formatter(get_summarized_data(self) if summarize else self)
File "C:UsersbalciAnaconda3envspytorchlibsite-packagestorch_tensor_str.py", line 87, in __init__
nonzero_finite_vals = torch.masked_select(tensor_view, torch.isfinite(tensor_view) & tensor_view.ne(0))
File "C:UsersbalciAnaconda3envspytorchlibsite-packagestorchfunctional.py", line 227, in isfinite
return (tensor == tensor) & (tensor.abs() != inf)
RuntimeError: CUDA error: no kernel image is available for execution on the device
>>>
Expected behavior
Run pytorch on gpu
Environment
Collecting environment information...
PyTorch version: 1.3.1
Is debug build: No
CUDA used to build PyTorch: 10.1
OS: Microsoft Windows 10 Pro
GCC version: Could not collect
CMake version: Could not collect
Python version: 3.7
Is CUDA available: Yes
CUDA runtime version: Could not collect
GPU models and configuration: GPU 0: GeForce GTX 780
Nvidia driver version: 441.22
cuDNN version: Could not collect
Versions of relevant libraries:
[pip] numpy==1.17.4
[pip] torch==1.3.1
[pip] torchvision==0.4.2
[conda] blas 1.0 mkl
[conda] mkl 2019.4 245
[conda] mkl-service 2.3.0 py37hb782905_0
[conda] mkl_fft 1.0.15 py37h14836fe_0
[conda] mkl_random 1.1.0 py37h675688f_0
[conda] pytorch 1.3.1 py3.7_cuda101_cudnn7_0 pytorch
[conda] torchvision 0.4.2 py37_cu101 pytorch
Process finished with exit code 0
- PyTorch Version (e.g., 1.0): 1.3
- OS (e.g., Linux): Windows 10 x64
- How you installed PyTorch (
conda
,pip
, source): conda - Build command you used (if compiling from source): —
- Python version: 3.7.5 (conda)
- CUDA/cuDNN version: cudatoolkit=10.1 (conda), I also tried with cudatoolkit 10.1 and 10.2 (https://developer.nvidia.com/cuda-toolkit-archive)
- GPU models and configuration: GTX 780
- Any other relevant information: —
Additional context
Драйвер NVIDIA OpenGL обнаружил проблему — ÖZÜM! — РЕШЕНИЕ!
Я пытаюсь использовать nvcc с самым простым примером, но он работает некорректно. Я компилирую и выполняю пример из https://devblogs.nvidia.com/easy-introduction-cuda-c-and-c/, однако мой сервер не может выполнить Глобальный функция. Я переписываю код, чтобы получить сообщение об ошибке, и получаю следующее сообщение: «на устройстве нет образа ядра, доступного для выполнения»
Мой графический процессор — Quadro 6000, а версия cuda — 9.0.
#include #include __global__ void saxpy(int n, float a, float *x, float *y) { int i = blockIdx.x*blockDim.x + threadIdx.x; y[i] = 10.0; //a*x[i] + y[i]; } int main(int argc, char *argv[]) { int N = 120; int nDevices; float *x, *y, *d_x, *d_y; cudaError_t err = cudaGetDeviceCount(&nDevices); if (err != cudaSuccess) printf('%sn', cudaGetErrorString(err)); else printf('Number of devices %dn', nDevices); x = (float*)malloc(N*sizeof(float)); y = (float*)malloc(N*sizeof(float)); cudaMalloc(&d_x, N*sizeof(float)); cudaMalloc(&d_y, N*sizeof(float)); for (int i = 0; i < N; i++) { x[i] = 1.0f; y[i] = 2.0f; } cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice); // Perform SAXPY on 1M elements saxpy<<<1, 1>>>(N, 2.0f, d_x, d_y); cudaDeviceSynchronize(); err = cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost); printf('%sn',cudaGetErrorString(err)); cudaError_t errSync = cudaGetLastError(); cudaError_t errAsync = cudaDeviceSynchronize(); if (errSync != cudaSuccess) printf('Sync kernel error: %sn', cudaGetErrorString(errSync)); if (errAsync != cudaSuccess) printf('Async kernel error: %sn', cudaGetErrorString(errAsync)); cudaFree(d_x); cudaFree(d_y); free(x); free(y); }'
Команда выполнения
bash-4.1$ nvcc -o sapx simples_cuda.cu bash-4.1$ ./sapx Number of devices 1 no error Sync kernel error: no kernel image is available for execution on the device
Графические процессоры с вычислительной мощностью менее 2.0 поддерживаются только инструментами CUDA версии 6.5 и старше.
Графические процессоры с вычислительной мощностью менее 3,0 (но больше или равной 2,0) поддерживаются только инструментами CUDA версии 8.0 и старше.
Ваш Quadro 6000 — это графический процессор 2.0 с вычислительными возможностями. Это можно определить программно с помощью deviceQuery
Пример кода CUDA или через поиск в Google. Не поддерживается CUDA 9.0
Добавление к ответу @ RobertCrovella:
При компиляции с помощью nvcc вы всегда должны устанавливать соответствующие флаги для генерации двоичных образов ядра для микроархитектуры / вычислительных возможностей, на которых вы собираетесь работать. Например: -gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${COMPUTE_CAPABILITY}
, скажем, COMPUTE_CAPABILITY=20
.
Читать nvcc --help
для получения дополнительной информации об этих флагах (хотя, честно говоря, это немного мутная тема).
- предложенный вами набор переключателей не генерирует двоичный образ ядра. Они генерируют PTX.
- @RobertCrovella: Я не хотел, чтобы они были единственными переключателями
Вы должны добавить вычислительные возможности вашей видеокарты в качестве параметра компилятору nvcc. В моем случае (windows / Visual Studio 2017) я установил это в поле Code Generation. Так как @einpoklum ответил, прежде чем добавить генкод такой параметр -gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${SM_CAPABILITY}
где {COMPUTE_CAPABILITY}
а также {SM_CAPABILITY}
принадлежат следующим парам (вы можете добавить их все, как VS2017),
{COMPUTE_CAPABILITY},{SM_CAPABILITY} compute_35,sm_35 compute_37,sm_37 compute_50,sm_50 compute_52,sm_52 compute_60,sm_60 compute_61,sm_61 compute_70,sm_70 compute_75,sm_75 compute_80,sm_80
D:Program FilesnVidiaCUDA SamplesMySamplesIntroToCUDA_1IntroToCUDA_1>'D:Program FilesnVidiaGPU Computing ToolkitCUDAv11.0binnvcc.exe' -gencode=arch=compute_35,code='sm_35,compute_35' -gencode=arch=compute_37,code='sm_37,compute_37' -gencode=arch=compute_50,code='sm_50,compute_50' -gencode=arch=compute_52,code='sm_52,compute_52' -gencode=arch=compute_60,code='sm_60,compute_60' -gencode=arch=compute_61,code='sm_61,compute_61' -gencode=arch=compute_70,code='sm_70,compute_70' -gencode=arch=compute_75,code='sm_75,compute_75' -gencode=arch=compute_80,code='sm_80,compute_80' --use-local-env -ccbin 'D:Program Files (x86)Microsoft Visual Studio2017EnterpriseVCToolsMSVC14.16.27023binHostX86x64' -x cu -I'D:Program FilesnVidiaGPU Computing ToolkitCUDAv11.0include' -I'D:Program FilesnVidiaGPU Computing ToolkitCUDAv11.0include' -G --keep-dir x64Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -D_DEBUG -D_CONSOLE -D_UNICODE -DUNICODE -Xcompiler '/EHsc /W3 /nologo /Od /Fdx64Debugvc141.pdb /FS /Zi /RTC1 /MDd ' -o x64DebugIntroToCUDA_1.cu.obj 'D:Program FilesnVidiaCUDA SamplesMySamplesIntroToCUDA_1IntroToCUDA_1IntroToCUDA_1.cu'
Вы можете проверить CC своей видеокарты с помощью deviceQuery
пример вы можете найти в CUDA Samples SDK
Tweet
Share
Link
Plus
Send
Send
Pin
#pytorch #gpu
Вопрос:
Я пытаюсь запустить фрагмент кода на Pytorch, но получаю ошибку:
RuntimeError: CUDA error: no kernel image is available for execution on the device
Я сузил круг вопросов, чтобы избежать совпадения версий CUDA. На моей машине 2 графических процессора:
GeForce GTX 650 (вычислительные возможности 3.0) и Tesla K40c (вычислительные возможности 3.5). Я проверил вычислительные возможности здесь: https://developer.nvidia.com/cuda-gpus.
Моя nvidia-smi
команда дает следующее:
вывод nvidia-smi (Версия драйвера: 470.57.02 и версия CUDA: 11.4)
В то время как моя nvcc -V
команда дает следующее:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
Версия 10.1 существует, потому что я пытался установить эту версию CUDA, в частности, следуя инструкциям в другом месте (например: https://medium.com/@anarmammadli/how-to-install-cuda-10-2-cudnn-7-6-5-and-samples-on-ubuntu-18-04-2493124478ca)
Кроме того, я установил cudatoolkit
с conda
, и так далее, У conda list
меня есть следующая запись:
...
cudatoolkit 10.1.243 h6bb024c_0
...
В соответствии с https://github.com/moi90/pytorch_compute_capabilities/blob/main/table.md Я также установил версию 1.8.0 PyTorch.
Однако в Python 3.7.11:
Python 3.7.11 (default, Jul 27 2021, 14:32:16)
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.8.1'
>>> torch.version.cuda
'10.1'
>>> torch.cuda.get_arch_list()
['sm_37', 'sm_50', 'sm_60', 'sm_61', 'sm_70', 'sm_75', 'compute_37']
>>> torch.cuda.is_available()
True
У меня нет sm_35
в наличии, что мне нужно для использования Tesla K40. Я считаю, что именно по этой причине я продолжаю получать CUDA error: no kernel image is available for execution on the device
ошибку. Я также попробовал все вышеперечисленное для версии 10.2 CUDA, тот же результат.
Комментарии:
1. Вам нужно будет найти и установить версию PyTorch, созданную с поддержкой cc3.5 . Драйвер, который вы уже установили, в порядке.
2. Так что, похоже, мне требуется Pytorch с версией до 1.5 ?
3. То, какая двоичная поддержка имеется в данной версии Pytorch, не является функцией набора инструментов CUDA или Pytorch (в пределах поддержки), это то, какую двоичную поддержку разработчики Pytorch выбирают для распространения. Они предпочитают жертвовать более старой аппаратной поддержкой для меньшего размера двоичного пакета. Вероятно, вы можете самостоятельно создать более современную версию Pytorch с помощью инструментария CUDA 10.x. Если нет, вам придется брать то, что они дают, и это будет очень старо
Ответ №1:
Я решил свою проблему. Как указано в комментариях, мне требовалась версия PyTorch, поддерживающая sm_35
вычислительные возможности. Это имело мало общего с текущей версией CUDA. В конце концов, я нашел эти двоичные файлы:
https://blog.nelsonliu.me/2020/10/13/newer-pytorch-binaries-for-older-gpus/
Я, наконец, исправил проблему, создав новую среду и запустив:
pip install torch==1.3.1 cu92 -f https://nelsonliu.me/files/pytorch/whl/torch_stable.html
2 / 1 / 1 Регистрация: 18.04.2018 Сообщений: 9 |
|
1 |
|
16.04.2021, 18:38. Показов 5071. Ответов 1
Здравствуйте. До этого все работало нормально.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
16.04.2021, 18:38 |
1 |
Sarcosuchus 2 / 1 / 1 Регистрация: 18.04.2018 Сообщений: 9 |
||||||||||||||||||||||||||||||||
16.06.2021, 17:42 [ТС] |
2 |
|||||||||||||||||||||||||||||||
Добавлено через 11 минут
Добавлено через 19 минут
Добавлено через 7 минут
Добавлено через 2 часа 48 минут
Добавлено через 10 минут
Добавлено через 4 минуты
Добавлено через 1 час 48 минут
0 |