OpenCV with CUDA Error: Device Unavailable on Jetson Orin Nano
Issue Overview
Users of the Nvidia Jetson Orin Nano development board are experiencing issues when attempting to use OpenCV with CUDA support for image processing. Specifically, when calling cv::cuda::setDevice(0)
or using the Canny edge detector, an exception is thrown indicating that all CUDA-capable devices are busy or unavailable. This error occurs despite OpenCV being built with CUDA support and the system recognizing the GPU.
The problem appears to be occurring on a system running JetPack 5.1.1 [L4T 35.3.1] with OpenCV 4.9.0-dev installed. The issue persists even after reinstalling different versions of OpenCV (4.4 and 4.9).
Possible Causes
-
Software Conflict: The user mentioned that the problem was related to a combination of their own software with CUDA, suggesting a potential conflict between custom applications and the CUDA runtime.
-
Resource Allocation: The error message indicates that CUDA-capable devices are busy or unavailable, which could be due to other processes holding onto GPU resources.
-
Driver Mismatch: Although not explicitly mentioned, there could be a mismatch between the CUDA version (11.4) and the installed GPU drivers.
-
OpenCV Build Configuration: Despite the build information showing CUDA support, there might be an issue with how OpenCV was compiled or linked against CUDA libraries.
-
System Resource Limitations: The Jetson Orin Nano might have limited resources, causing CUDA initialization to fail under certain conditions.
Troubleshooting Steps, Solutions & Fixes
-
Verify CUDA Installation:
- Run
nvidia-smi
to check if the CUDA driver is properly installed and recognized. - Use
nvcc --version
to confirm the CUDA toolkit version matches the one used to build OpenCV.
- Run
-
Check for Running CUDA Processes:
- Use
ps aux | grep cuda
to see if any other CUDA processes are running and potentially blocking access to the GPU. - Terminate unnecessary CUDA processes to free up GPU resources.
- Use
-
Rebuild OpenCV:
-
If the issue persists, try rebuilding OpenCV with CUDA support using the following script:
#!/bin/bash # Script to build OpenCV with CUDA support on Jetson Orin Nano # Install dependencies sudo apt-get update sudo apt-get install -y build-essential cmake pkg-config sudo apt-get install -y libjpeg-dev libtiff5-dev libpng-dev sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev sudo apt-get install -y libv4l-dev v4l-utils sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev sudo apt-get install -y libgtk2.0-dev sudo apt-get install -y mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev sudo apt-get install -y libatlas-base-dev gfortran libeigen3-dev sudo apt-get install -y python3-dev python3-numpy # Download and unpack OpenCV sources cd ~ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.9.0.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.9.0.zip unzip opencv.zip unzip opencv_contrib.zip # Create build directory and switch to it cd opencv-4.9.0 mkdir build cd build # Configure OpenCV build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_CUDA=ON \ -D CUDA_ARCH_BIN=8.7 \ -D CUDA_ARCH_PTX="" \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.9.0/modules \ -D WITH_GSTREAMER=ON \ -D WITH_LIBV4L=ON \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=ON \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_EXAMPLES=OFF \ -D WITH_QT=OFF \ -D WITH_OPENGL=ON \ .. # Build and install OpenCV make -j$(nproc) sudo make install
-
-
Check System Resources:
- Use
jtop
to monitor system resources and ensure there’s enough memory and GPU capacity available. - Close unnecessary applications to free up resources.
- Use
-
Isolate Custom Software:
- Create a minimal test program that only uses OpenCV with CUDA to determine if the issue is specific to the custom software.
- Gradually add components of the custom software to identify which part might be causing the conflict.
-
Update JetPack:
- Consider updating to the latest JetPack version (e.g., JetPack 6.0 DP) if possible, as it might include fixes for CUDA-related issues.
-
CUDA Samples Test:
- Run CUDA samples to verify if the GPU is accessible for general CUDA operations:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery
- If this fails, it indicates a more fundamental issue with CUDA setup.
- Run CUDA samples to verify if the GPU is accessible for general CUDA operations:
-
Environment Variables:
- Ensure CUDA-related environment variables are correctly set:
echo 'export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc source ~/.bashrc
- Ensure CUDA-related environment variables are correctly set:
-
Driver Reinstallation:
- As a last resort, consider reinstalling the NVIDIA drivers:
sudo apt-get purge nvidia* sudo apt-get update sudo apt-get install nvidia-driver-xxx # Replace xxx with the appropriate version
- As a last resort, consider reinstalling the NVIDIA drivers:
If the issue persists after trying these solutions, it may be necessary to seek support from NVIDIA’s developer forums or submit a bug report to the OpenCV project, providing detailed information about the system configuration and the exact steps to reproduce the problem.