Skip to content

Windows CUDA x64

Windows CUDA x64 #43

# 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