FFMPEG doesn’t detect CUDA-capable device [CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected]

Environment
GPU : Quadro T400
Driver : 510.47.03
CUDA : 11.6
OS : Debian 11 (Headless)

Hello,

I am trying to implement NVENC hardware acceleration through ffmpeg. However, when I try to use the CUDA hardware accelerator, the following error is shown :

ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i input.mkv -c:a copy -c:v h264_nvenc output.mkv 
[h264 @ 0x55b885e76c00] decoder->cvdl->cuvidGetDecoderCaps(&caps) failed -> CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected [h264 @ 0x55b885e76c00] Failed setup for format cuda: hwaccel initialisation returned error. 

This error keeps showing up even though the GPU seems to be detected as CUDA-capable.

I installed the cuda toolkit and packages following the official installation guide (https://docs.nvidia.com/cuda/cuda-installation-guide-linux/), and compiled ffmpeg following the following guide (Using FFmpeg with NVIDIA GPU Hardware Acceleration :: NVIDIA Video Codec SDK Documentation)

./deviceQuery Output :

 CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "NVIDIA T400" CUDA Driver Version / Runtime Version 11.6 / 11.6 CUDA Capability Major/Minor version number: 7.5 Total amount of global memory: 1874 MBytes (1964769280 bytes) (006) Multiprocessors, (064) CUDA Cores/MP: 384 CUDA Cores GPU Max Clock rate: 1425 MHz (1.42 GHz) Memory Clock rate: 5001 Mhz Memory Bus Width: 64-bit L2 Cache Size: 524288 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384) Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total shared memory per multiprocessor: 65536 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 1024 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 3 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device supports Managed Memory: Yes Device supports Compute Preemption: Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 6 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.6, CUDA Runtime Version = 11.6, NumDevs = 1 Result = PASS 

nvidia-smi output :
image|690x330

Thanks to anyone who could have a clue about the origin of this issue.

After a full re-installation of the CUDA Toolkit and recompiling nv-codec-headers + ffmpeg, hardware-accelerated transcoding still doesn’t seem to work.

However, after checking dmesg, the following entries were created for each transcode attempt :

[ 471.749093] NVRM: API mismatch: the client has the version 418.113, but NVRM: this kernel module has the version 510.47.03. Please NVRM: make sure that this kernel module and all NVIDIA driver NVRM: components have the same version. 

This seems really strange, as the only currently installed and loaded driver reported by dkms is 510.47.03 :

sudo dkms status nvidia-current, 510.47.03, 5.10.0-11-amd64, x86_64: installed 

ffmpeg configure command

./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared --nvccflags="-gencode arch=compute_52,code=sm_52 -O2" 

Any guess ?
Thank you in advance

1 Like

I am not used to .deb and apt, but have experienced similar ‘API mismatch’ on openSUSE rpm repositories. Looks like previous installations are not cleaned up properly and/or a repository mismatch is in place.

Recommendation:

  • check /usr/local/ for /usr/local/cuda* - is there only one version listed or more, is the symbolic link set to the desired version ?

  • check ‘echo $PATH ; echo $LD_LIBRARY_PATH’ , they should include ‘/usr/local/cuda’ or the respective PATH to the desired cuda version

  • check the configured repositories in ‘/etc/apt/sources.list’, do they point to the desired repos/URLs ? https://developer.download.nvidia.com/compute/cuda/repos/debian11/x86_64/ does not contain any ‘418’ drivers /packages

  • check for packages using ‘apt list --installed | grep cuda ; apt list --installed | grep nvidia’ , which are not listed by ‘apt list --installed cuda* nvidia*’

After ‘cleaning up’ the dependencies / repos / packages / install / reboot (for proper driver loading), check ‘dmesg’ for the dmesg NVRM hint, nvidia-smi reports its driver version and (my assumption) the best ‘matching’ cuda version it was complied for, not necessarly the install one.

Thanks a lot for your suggestions !
I do believe the solution to this problem lies within package(s) mismatch in my Debian installation.

This system was running an installation of Debian 10 that was manually upgraded to 11, and it’s more than plausible that some of the involved repositories and / or packages weren’t up-to-date after the process.

I ended up performing a fresh install of Debian 11 on this machine, which solved the problem. Sadly, I don’t have the old installation anymore, and can’t confirm which of these leads were the possible answer to the issue, although I have no doubt you got it right.

Thank you again for the help provided ! It will ll certainly be of great help for others in this situation.

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.