Windows CUDA x64 #20
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: | |
| 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 | |
| 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: Setup environment | |
| shell: bash | |
| run: | | |
| if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then | |
| echo "ENABLE_ROLLING=1" >> $GITHUB_ENV | |
| fi | |
| - 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 | |
| - name: Cache CuDNN Installer | |
| id: cache-cudnn-installer | |
| uses: actions/cache@v3 | |
| with: | |
| path: ./.cache/cudnn.zip | |
| key: cudnn-8.9.7.29-cuda-12-windows | |
| - name: 🔧 Install NVIDIA CuDNN | |
| run: | | |
| $cudnn_path = "./.cache/cudnn.zip" | |
| if (-not (Test-Path $cudnn_path)) { | |
| echo "Downloading CuDNN..." | |
| $cudnn_installer_url = "https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/windows-x86_64/cudnn-windows-x86_64-8.9.7.29_cuda12-archive.zip" | |
| New-Item -Path (Split-Path $cudnn_path) -ItemType Directory -Force | |
| curl -L -o $cudnn_path $cudnn_installer_url | |
| } else { | |
| echo "CuDNN installer found in cache." | |
| } | |
| echo "Installing CuDNN..." | |
| 7z x $cudnn_path | |
| $CUDNN_PATH = "D:/a/opencv-python-cuda/opencv-python-cuda/cudnn-windows-x86_64-8.9.7.29_cuda12-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: Cache build artifacts | |
| uses: actions/cache@v3 | |
| 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 | |
| # TODO: Check if adding --skip-cmake is necessary. | |
| 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 bdist_wheel --py-limited-api=cp37 --dist-dir="$PWD\wheelhouse" $SKIP_CMAKE -v | |
| shell: pwsh | |
| - 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 | |
| PYLINT_TEST_FILE: ${{ github.workspace }}\opencv\samples\python\squares.py | |
| 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 }}/opencv | |
| python modules\python\test\test.py -v --repo . | |
| - name: Pylint test | |
| run: | | |
| python -m pip install pylint==2.15.9 | |
| cd ${{ github.workspace }}\tests | |
| python -m pylint $PYLINT_TEST_FILE |