Skip to content

Commit b136f8d

Browse files
committed
[build] Add CUDA 12/13 build matrix with full GPU compatibility
1 parent 53658c8 commit b136f8d

3 files changed

Lines changed: 95 additions & 28 deletions

File tree

.github/workflows/build_wheels_windows.yml

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,46 @@ on:
3333

3434
jobs:
3535
Build:
36-
runs-on: windows-2025
36+
runs-on: ${{ matrix.runs-on }}
3737
strategy:
3838
fail-fast: false
3939
matrix:
4040
python-version: ['3.13']
4141
platform: [x64]
42+
cuda-version: ['12', '13']
43+
include:
44+
# TODO: Both CUDA versions now use v143 toolset - consider consolidating to single runner
45+
# CUDA 12: Supports Maxwell (5.0) through Blackwell (10.0)
46+
- cuda-version: '12'
47+
runs-on: 'windows-2025'
48+
cuda-installer: 'cuda_12.9.1_windows_network.exe'
49+
cuda-path-version: 'v12.9'
50+
cudnn-archive: 'cudnn-windows-x86_64-9.18.1.3_cuda12-archive.zip'
51+
cudnn-folder: 'cudnn-windows-x86_64-9.18.1.3_cuda12-archive'
52+
cuda-arch-bin: '5.0;5.2;6.0;6.1;7.0;7.5;8.0;8.6;8.9;9.0;10.0'
53+
cuda-arch-ptx: '10.0'
54+
cache-key: 'nvidia-deps-cuda-12.9.1-cudnn-9.18.1.3'
55+
# CUDA 13: Supports Turing (7.5) through Blackwell (12.0)
56+
- cuda-version: '13'
57+
runs-on: 'windows-2022'
58+
cuda-installer: 'cuda_13.1.1_windows_network.exe'
59+
cuda-path-version: 'v13.1'
60+
cudnn-archive: 'cudnn-windows-x86_64-9.18.1.3_cuda13-archive.zip'
61+
cudnn-folder: 'cudnn-windows-x86_64-9.18.1.3_cuda13-archive'
62+
cuda-arch-bin: '7.5;8.0;8.6;8.9;9.0;10.0;12.0'
63+
cuda-arch-ptx: '12.0'
64+
cache-key: 'nvidia-deps-cuda-13.1.1-cudnn-9.18.1.3'
4265
env:
4366
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
4467
SDIST: 0
4568
ENABLE_HEADLESS: 0
4669
ENABLE_CONTRIB: 1
4770
ENABLE_ROLLING: ${{ inputs.rolling_build && 1 || 0 }}
4871
OPENCV_TEST_DATA_PATH: ${{ github.workspace }}\opencv_extra\testdata
72+
CUDA_ARCH_BIN: ${{ matrix.cuda-arch-bin }}
73+
CUDA_ARCH_PTX: ${{ matrix.cuda-arch-ptx }}
74+
# Force VS 2022 toolset - scikit-build incorrectly detects v144 which doesn't exist
75+
CMAKE_GENERATOR_TOOLSET: v143
4976
steps:
5077
- name: Cleanup
5178
shell: bash
@@ -72,7 +99,7 @@ jobs:
7299
uses: actions/cache@v3
73100
with:
74101
path: .deps/Nvidia
75-
key: nvidia-deps-cuda-12.4.0-cudnn-8.9.7.29
102+
key: ${{ matrix.cache-key }}
76103
- name: Clone NVIDIA dependencies
77104
if: steps.cache-nvidia-deps.outputs.cache-hit != 'true'
78105
env:
@@ -85,27 +112,26 @@ jobs:
85112
shell: bash
86113
- name: 🔧 Install NVIDIA CUDA Toolkit
87114
run: |
88-
$installer_path = ".deps/Nvidia/cuda_12.4.0_windows_network.exe"
115+
$installer_path = ".deps/Nvidia/${{ matrix.cuda-installer }}"
89116
if (-not (Test-Path $installer_path)) {
90117
throw "CUDA Toolkit installer not found at $installer_path"
91118
}
92-
echo "Installing CUDA Toolkit silently..."
93-
$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"
94-
Start-Process -FilePath $installer_path -ArgumentList $arguments -Wait -NoNewWindow
119+
echo "Installing CUDA ${{ matrix.cuda-version }} Toolkit silently..."
120+
Start-Process -FilePath $installer_path -ArgumentList "-s" -Wait -NoNewWindow
95121
echo "Adding CUDA to PATH..."
96-
$CUDA_PATH = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4"
122+
$CUDA_PATH = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\${{ matrix.cuda-path-version }}"
97123
echo "CUDA_PATH=$CUDA_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append
98124
Copy-Item -Path "$CUDA_PATH/bin/*" -Destination . -Include "*.dll"
99125
shell: pwsh
100126
- name: 🔧 Install NVIDIA CuDNN
101127
run: |
102-
$cudnn_path = ".deps/Nvidia/cudnn-windows-x86_64-8.9.7.29_cuda12-archive.zip"
128+
$cudnn_path = ".deps/Nvidia/${{ matrix.cudnn-archive }}"
103129
if (-not (Test-Path $cudnn_path)) {
104130
throw "CuDNN archive not found at $cudnn_path"
105131
}
106-
echo "Installing CuDNN..."
132+
echo "Installing CuDNN for CUDA ${{ matrix.cuda-version }}..."
107133
7z x $cudnn_path
108-
$CUDNN_PATH = "D:/a/opencv-python-cuda/opencv-python-cuda/cudnn-windows-x86_64-8.9.7.29_cuda12-archive"
134+
$CUDNN_PATH = "D:/a/opencv-python-cuda/opencv-python-cuda/${{ matrix.cudnn-folder }}"
109135
echo "CUDNN_LIBRARY=$CUDNN_PATH/lib/x64/cudnn.lib" | Out-File -FilePath $env:GITHUB_ENV -Append
110136
echo "CUDNN_INCLUDE_DIR=$CUDNN_PATH/include" | Out-File -FilePath $env:GITHUB_ENV -Append
111137
Copy-Item -Path "$CUDNN_PATH/bin/*" -Destination . -Include "*.dll"
@@ -116,9 +142,9 @@ jobs:
116142
if: ${{ inputs.restore_build_cache && !inputs.rolling_build }}
117143
with:
118144
path: _skbuild
119-
key: ${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/CMakeLists.txt') }}
145+
key: ${{ runner.os }}-${{ matrix.python-version }}-cuda${{ matrix.cuda-version }}-${{ hashFiles('**/CMakeLists.txt') }}
120146
restore-keys: |
121-
${{ runner.os }}-${{ matrix.python-version }}-
147+
${{ runner.os }}-${{ matrix.python-version }}-cuda${{ matrix.cuda-version }}-
122148
123149
- name: Build a package
124150
# CMake 3.25 regression fix. See https://stackoverflow.com/questions/74162633/problem-compiling-from-source-opencv-with-mvsc2019-in-64-bit-version
@@ -140,11 +166,11 @@ jobs:
140166
if: ${{ inputs.save_build_cache && !inputs.rolling_build }}
141167
with:
142168
path: _skbuild
143-
key: ${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/CMakeLists.txt') }}
169+
key: ${{ runner.os }}-${{ matrix.python-version }}-cuda${{ matrix.cuda-version }}-${{ hashFiles('**/CMakeLists.txt') }}
144170
- name: Saving all wheels
145171
uses: actions/upload-artifact@v4
146172
with:
147-
name: wheel-cuda-${{ matrix.platform }}
173+
name: wheel-cuda${{ matrix.cuda-version }}-${{ matrix.platform }}
148174
path: wheelhouse/opencv*
149175

150176
Test:
@@ -158,6 +184,7 @@ jobs:
158184
matrix:
159185
python-version: ['3.12']
160186
platform: [x64]
187+
cuda-version: ['12', '13']
161188
env:
162189
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
163190
OPENCV_TEST_DATA_PATH: ${{ github.workspace }}\opencv_extra\testdata
@@ -182,7 +209,7 @@ jobs:
182209
- name: Download a wheel accordingly to matrix
183210
uses: actions/download-artifact@v4
184211
with:
185-
name: wheel-cuda-${{ matrix.platform }}
212+
name: wheel-cuda${{ matrix.cuda-version }}-${{ matrix.platform }}
186213
path: wheelhouse/
187214
- name: Package installation
188215
run: |
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Simple workflow to cache NVIDIA dependencies
2+
# Run this once to populate the cache, then disable or delete
3+
4+
name: Cache NVIDIA Dependencies
5+
6+
on:
7+
workflow_dispatch:
8+
9+
jobs:
10+
cache-deps:
11+
runs-on: windows-2025
12+
strategy:
13+
matrix:
14+
include:
15+
- cuda-version: '12'
16+
cache-key: 'nvidia-deps-cuda-12.9.1-cudnn-9.18.1.3'
17+
- cuda-version: '13'
18+
cache-key: 'nvidia-deps-cuda-13.1.1-cudnn-9.18.1.3'
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@v4
22+
with:
23+
submodules: false
24+
fetch-depth: 1
25+
- name: Cache NVIDIA dependencies (CUDA ${{ matrix.cuda-version }})
26+
id: cache-nvidia-deps
27+
uses: actions/cache@v3
28+
with:
29+
path: .deps/Nvidia
30+
key: ${{ matrix.cache-key }}
31+
- name: Clone NVIDIA dependencies
32+
if: steps.cache-nvidia-deps.outputs.cache-hit != 'true'
33+
env:
34+
SSH_PRIVATE_KEY: ${{ secrets.DEPS_REPO_SSH_KEY }}
35+
run: |
36+
eval "$(ssh-agent -s)"
37+
ssh-add - <<< "${SSH_PRIVATE_KEY}"
38+
ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
39+
git clone git@github.com:Breakthrough/opencv-python-cuda-deps.git .deps
40+
shell: bash
41+
- name: Cache populated
42+
run: |
43+
echo "NVIDIA dependencies for CUDA ${{ matrix.cuda-version }} cached successfully!"
44+
ls -la .deps/Nvidia/ || echo "Cache was already populated"
45+
shell: bash

setup.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,14 @@ def main():
2222
build_java = "ON" if get_build_env_var_by_name("java") else "OFF"
2323
build_rolling = get_build_env_var_by_name("rolling")
2424

25-
# TODO(@Breakthrough): What architectures should we ship?
26-
# fermi = "2.0"
27-
# kepler = "3.0;3.5;3.7"
28-
# maxwell = "5.0;5.2"
29-
# pascal = "6.0;6.1"
30-
# volta = "7.0"
31-
# turing = "7.5"
32-
# ampere = "8.0;8.6"
33-
# lovelace = "8.9"
34-
# hopper = "9.0"
35-
# blackwell = "10.0;12.0"
36-
cuda_arch_bin = "5.0;5.2;6.0;6.1;7.0;7.5,8.0"
37-
cuda_arch_ptx = "8.0"
25+
# CUDA architecture configuration - can be overridden via environment variables
26+
# CUDA 12.x supports: 5.0+ (Maxwell through Hopper)
27+
# CUDA 13.x supports: 7.5+ (Turing through Hopper)
28+
# Reference architectures:
29+
# maxwell=5.0;5.2, pascal=6.0;6.1, volta=7.0, turing=7.5,
30+
# ampere=8.0;8.6, lovelace=8.9, hopper=9.0
31+
cuda_arch_bin = os.environ.get("CUDA_ARCH_BIN", "7.5;8.0;8.6;8.9;9.0")
32+
cuda_arch_ptx = os.environ.get("CUDA_ARCH_PTX", "9.0")
3833

3934
# NOTE: since 2.3.0 numpy upgraded from manylinux2014 to manylinux_2_28
4035
# see https://numpy.org/doc/stable/release/2.3.0-notes.html#numpy-2-3-0-release-notes

0 commit comments

Comments
 (0)