Windows CUDA x64 #43
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." | |
| required: false | |
| type: boolean | |
| default: false | |
| jobs: | |
| Build: | |
| runs-on: windows-2025 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ['3.9'] | |
| 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/setup-msbuild@v1.1 | |
| - name: Setup NASM | |
| uses: ilammy/setup-nasm@v1 | |
| - name: Cache CUDA Toolkit Installer | |
| id: cache-cuda-installer | |
| uses: actions/cache@v3 | |
| with: | |
| path: ./.cache/cuda_installer.exe | |
| key: cuda-installer-12.4.0 | |
| - name: 🔧 Install NVIDIA CUDA Toolkit | |
| run: | | |
| $installer_path = "./.cache/cuda_installer.exe" | |
| if (-not (Test-Path $installer_path)) { | |
| echo "Downloading CUDA Toolkit..." | |
| $cuda_installer_url = "https://developer.download.nvidia.com/compute/cuda/12.4.0/network_installers/cuda_12.4.0_windows_network.exe" | |
| New-Item -Path (Split-Path $installer_path) -ItemType Directory -Force | |
| curl -L -o $installer_path $cuda_installer_url | |
| } else { | |
| echo "CUDA Toolkit installer found in cache." | |
| } | |
| echo "Installing CUDA Toolkit silently..." | |
| $arguments = "-s nvcc_12.4 cudart_12.4 cublas_12.4 cublas_dev_12.4 cufft_12.4 cufft_dev_12.4 npp_12.4 npp_dev_12.4" | |
| Start-Process -FilePath $installer_path -ArgumentList $arguments -Wait -NoNewWindow | |
| echo "Adding CUDA to PATH..." | |
| $CUDA_PATH = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4" | |
| echo "CUDA_PATH=$CUDA_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| Copy-Item -Path "$CUDA_PATH/bin/*" -Destination . -Include "*.dll" | |
| shell: pwsh | |
| # TODO: This isn't the correct cache key since it relies on the CMake options we build with. | |
| # This is good enough for now though to cache build artifacts; we can manually skip restoring | |
| # the cache to rebuild it. | |
| - name: Restore build artifacts | |
| uses: actions/cache/restore@v3 | |
| if: ${{ inputs.restore_build_cache }} | |
| with: | |
| path: _skbuild | |
| key: ${{ runner.os }}-${{ matrix.python-version }}-minimal-${{ hashFiles('**/CMakeLists.txt') }} | |
| restore-keys: | | |
| ${{ runner.os }}-${{ matrix.python-version }}-minimal- | |
| - 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 }} | |
| with: | |
| path: _skbuild | |
| key: ${{ runner.os }}-${{ matrix.python-version }}-minimal-${{ 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 |