Windows CUDA x64 #51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # GitHub Actions Workflow: Build opencv-python with CUDA support on Windows | |
| # | |
| # This workflow compiles opencv-python from source with CUDA enabled on a | |
| # GitHub-hosted Windows runner. The resulting Python wheel is then uploaded | |
| # as a build artifact. | |
| # | |
| # This is a complex and long-running process. It is configured to run only | |
| # on manual trigger (workflow_dispatch). | |
| name: Windows CUDA x64 | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| # TODO: Right now we don't correctly determine when things have changed and we require a | |
| # rebuild, so for now we just manually trigger rebuilds between runs. | |
| restore_build_cache: | |
| description: "Restore build cache. Uncheck to force re-build." | |
| required: false | |
| type: boolean | |
| default: true | |
| save_build_cache: | |
| description: "Save build cache." | |
| required: false | |
| type: boolean | |
| default: true | |
| rolling_build: | |
| description: "Use latest commit from upstream OpenCV repo. Cache settings will be ignored." | |
| required: false | |
| type: boolean | |
| default: false | |
| jobs: | |
| Build: | |
| runs-on: windows-2025 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ['3.13'] | |
| platform: [x64] | |
| env: | |
| ACTIONS_ALLOW_UNSECURE_COMMANDS: true | |
| SDIST: 0 | |
| ENABLE_HEADLESS: 0 | |
| ENABLE_CONTRIB: 1 | |
| ENABLE_ROLLING: ${{ inputs.rolling_build && 1 || 0 }} | |
| OPENCV_TEST_DATA_PATH: ${{ github.workspace }}\opencv_extra\testdata | |
| steps: | |
| - name: Cleanup | |
| shell: bash | |
| run: | | |
| rm -rf ./* || true | |
| rm -rf ./.??* || true | |
| working-directory: ${{ github.workspace }} | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: false | |
| fetch-depth: 0 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| architecture: ${{ matrix.platform }} | |
| - name: Setup MSBuild.exe | |
| uses: microsoft/[email protected] | |
| - name: Setup NASM | |
| uses: ilammy/setup-nasm@v1 | |
| - name: Cache NVIDIA dependencies | |
| id: cache-nvidia-deps | |
| uses: actions/cache@v3 | |
| with: | |
| path: .deps/Nvidia | |
| key: nvidia-deps-cuda-13.1.1-cudnn-9.18.1.3 | |
| - name: Clone NVIDIA dependencies | |
| if: steps.cache-nvidia-deps.outputs.cache-hit != 'true' | |
| env: | |
| SSH_PRIVATE_KEY: ${{ secrets.DEPS_REPO_SSH_KEY }} | |
| run: | | |
| eval "$(ssh-agent -s)" | |
| ssh-add - <<< "${SSH_PRIVATE_KEY}" | |
| ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null | |
| git clone [email protected]:Breakthrough/opencv-python-cuda-deps.git .deps | |
| shell: bash | |
| - name: 🔧 Install NVIDIA CUDA Toolkit | |
| run: | | |
| $installer_path = ".deps/Nvidia/cuda_13.1.1_windows_network.exe" | |
| if (-not (Test-Path $installer_path)) { | |
| throw "CUDA Toolkit installer not found at $installer_path" | |
| } | |
| echo "Installing CUDA Toolkit silently..." | |
| $arguments = "-s nvcc_13.1 cudart_13.1 cublas_13.1 cublas_dev_13.1 cufft_13.1 cufft_dev_13.1 npp_13.1 npp_dev_13.1 visual_studio_integration_13.1" | |
| Start-Process -FilePath $installer_path -ArgumentList $arguments -Wait -NoNewWindow | |
| echo "Adding CUDA to PATH..." | |
| $CUDA_PATH = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.1" | |
| echo "CUDA_PATH=$CUDA_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| Copy-Item -Path "$CUDA_PATH/bin/*" -Destination . -Include "*.dll" | |
| shell: pwsh | |
| - name: 🔧 Install NVIDIA CuDNN | |
| run: | | |
| $cudnn_path = ".deps/Nvidia/cudnn-windows-x86_64-9.18.1.3_cuda13-archive.zip" | |
| if (-not (Test-Path $cudnn_path)) { | |
| throw "CuDNN archive not found at $cudnn_path" | |
| } | |
| echo "Installing CuDNN..." | |
| 7z x $cudnn_path | |
| $CUDNN_PATH = "D:/a/opencv-python-cuda/opencv-python-cuda/cudnn-windows-x86_64-9.18.1.3_cuda13-archive" | |
| echo "CUDNN_LIBRARY=$CUDNN_PATH/lib/x64/cudnn.lib" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| echo "CUDNN_INCLUDE_DIR=$CUDNN_PATH/include" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| Copy-Item -Path "$CUDNN_PATH/bin/*" -Destination . -Include "*.dll" | |
| shell: pwsh | |
| - name: Restore build artifacts | |
| uses: actions/cache/restore@v3 | |
| if: ${{ inputs.restore_build_cache && !inputs.rolling_build }} | |
| with: | |
| path: _skbuild | |
| key: ${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/CMakeLists.txt') }} | |
| restore-keys: | | |
| ${{ runner.os }}-${{ matrix.python-version }}- | |
| - name: Build a package | |
| # CMake 3.25 regression fix. See https://stackoverflow.com/questions/74162633/problem-compiling-from-source-opencv-with-mvsc2019-in-64-bit-version | |
| run: | | |
| python --version | |
| python -m pip install --upgrade pip | |
| python -m pip install --upgrade setuptools | |
| python -m pip install cmake==3.24.2 | |
| python -m pip install toml && python -c "import toml; c = toml.load('pyproject.toml'); print('\n'.join(c['build-system']['requires']))" >> requirements.txt | python -m pip install -r requirements.txt | |
| $CI_BUILD = 1 | |
| if (Test-Path _skbuild) { | |
| $SKIP_CMAKE = "--skip-cmake" | |
| } | |
| python setup.py $SKIP_CMAKE bdist_wheel --py-limited-api=cp37 --dist-dir="$PWD\wheelhouse" -v | |
| shell: pwsh | |
| - name: Save build artifacts to cache | |
| uses: actions/cache/save@v3 | |
| if: ${{ inputs.save_build_cache && !inputs.rolling_build }} | |
| with: | |
| path: _skbuild | |
| key: ${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/CMakeLists.txt') }} | |
| - name: Saving all wheels | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wheel-cuda-${{ matrix.platform }} | |
| path: wheelhouse/opencv* | |
| Test: | |
| needs: [Build] | |
| runs-on: windows-2025 | |
| defaults: | |
| run: | |
| shell: cmd | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ['3.12'] | |
| platform: [x64] | |
| env: | |
| ACTIONS_ALLOW_UNSECURE_COMMANDS: true | |
| OPENCV_TEST_DATA_PATH: ${{ github.workspace }}\opencv_extra\testdata | |
| PlatformToolset: v143 | |
| steps: | |
| - name: Cleanup | |
| shell: bash | |
| run: | | |
| rm -rf ./* || true | |
| rm -rf ./.??* || true | |
| working-directory: ${{ github.workspace }} | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| fetch-depth: 0 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| architecture: ${{ matrix.platform }} | |
| - name: Download a wheel accordingly to matrix | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: wheel-cuda-${{ matrix.platform }} | |
| path: wheelhouse/ | |
| - name: Package installation | |
| run: | | |
| cd ${{ github.workspace }}/tests | |
| &python -m pip install --user --no-warn-script-location (ls "../wheelhouse/opencv*.whl") | |
| if ($LastExitCode -ne 0) {throw $LastExitCode} | |
| python get_build_info.py | |
| shell: powershell | |
| - name: Run tests | |
| run: | | |
| cd ${{ github.workspace }}/tests | |
| python test.py |