Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Full CI support for public builds + switch to use cibuildwheel #267

Merged
merged 65 commits into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from 62 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
0141cbf
switch to cibuildwheel + some cleanups
leofang Dec 5, 2024
79fd67a
try setting up Python manually
leofang Dec 5, 2024
92283dc
comment out un-needed code + propagate python-version
leofang Dec 5, 2024
6666e90
fix: need to check out first
leofang Dec 5, 2024
c96fef3
only build natively; add -v; ensure targeting manylinux
leofang Dec 5, 2024
ea77572
single quotes
leofang Dec 5, 2024
508a126
restore env setup to get artifact dir
leofang Dec 5, 2024
beff50d
fix artifact dir
leofang Dec 5, 2024
a935da2
fix artifact name
leofang Dec 5, 2024
df982e5
restore & fix artifact name again
leofang Dec 5, 2024
426cd58
build on all platforms!
leofang Dec 5, 2024
d167a55
fix CIBW_BUILD for windows
leofang Dec 5, 2024
9cd0803
fix typo
leofang Dec 5, 2024
261b1e5
no quotes for wildcard matching
leofang Dec 5, 2024
9134f89
move CIBW_BUILD logic to script
leofang Dec 5, 2024
762ad76
fix win runner name
leofang Dec 5, 2024
0d3c32b
try to find where pwsh is
leofang Dec 5, 2024
37006e8
try to escape
leofang Dec 5, 2024
0ab5067
continue hunting..
leofang Dec 5, 2024
d42f8dd
try to overwrite shell
leofang Dec 5, 2024
55c0370
try to install ps
leofang Dec 5, 2024
f3356f4
be explicit about shell (why?)
leofang Dec 5, 2024
5480f10
only build for win 64 bits
leofang Dec 5, 2024
4b1a431
try to install msvc
leofang Dec 5, 2024
7044c8b
install msvc ourselves
leofang Dec 5, 2024
9fbdff2
fix typo
leofang Dec 5, 2024
8f77f17
skip custom cl ver check
leofang Dec 5, 2024
29e9e2e
install to standard location
leofang Dec 5, 2024
e2cffce
try to locate Python include path
leofang Dec 5, 2024
a7157b5
switch to public windows runner for now
leofang Dec 5, 2024
965b23f
windows image does not have sudo
leofang Dec 5, 2024
8ae7bd2
pwd on Windows Bash does not use Windows path format
leofang Dec 5, 2024
2175ccb
cover all Python versions!
leofang Dec 5, 2024
50eb0e7
add quotes
leofang Dec 5, 2024
b0046ac
align the python version installed via GHA vs used at build time
leofang Dec 5, 2024
4932667
fix constraint syntax
leofang Dec 5, 2024
7cb84c3
check if setup-python is causing interference
leofang Dec 5, 2024
d97fbdd
fix typo
leofang Dec 5, 2024
59e4e0a
apply a WAR on Linux
leofang Dec 5, 2024
2ab0877
fix unbound var
leofang Dec 5, 2024
cac9de8
detect Python path after it's installed (by CIBW)
leofang Dec 5, 2024
a3ef630
try CIBW_BEFORE_ALL_LINUX
leofang Dec 5, 2024
26af84d
try to restore the pre-py-span setup...
leofang Dec 5, 2024
cdbdfb5
reduce build matrix to experiment with cuda.bindings builds
leofang Dec 6, 2024
8a61031
fix parenthesis
leofang Dec 6, 2024
35b8826
use abs path
leofang Dec 6, 2024
8e42dc4
defer CUDA_PATH setting
leofang Dec 6, 2024
1588e57
use CIBW_ENVIRONMENT to pass env var
leofang Dec 6, 2024
e13854d
fetch cuda-profiler-api headers
leofang Dec 6, 2024
4f73509
only rely on redist
leofang Dec 6, 2024
128ab12
allow wheel repair to fix the triplet tags
leofang Dec 6, 2024
6087a54
restore full build matrix!
leofang Dec 6, 2024
b05e95d
fix wget on Windows; pass PARALLEL_LEVEL to CIBW
leofang Dec 6, 2024
0c91ed8
switch from wget to curl
leofang Dec 6, 2024
33f35c3
windows needs unzip not tar
leofang Dec 6, 2024
4b3341a
mv -> rsync
leofang Dec 6, 2024
3503dae
git bash has no wget or rsync...
leofang Dec 6, 2024
dc12840
ensure win-style path on win
leofang Dec 6, 2024
c55bdc5
convert abs path
leofang Dec 6, 2024
bdb3599
debug
leofang Dec 6, 2024
c8fd323
another level down
leofang Dec 6, 2024
0d554f0
check if it is a race condition on win
leofang Dec 6, 2024
19445d5
clean up unused (but still relevant) code
leofang Dec 6, 2024
15626a8
clean up unused (but still relevant) code - cont'd
leofang Dec 6, 2024
07b8d1d
consolidate with PYTHON_VERSION_FORMATTED
leofang Dec 6, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 57 additions & 51 deletions .github/actions/build/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,73 +13,79 @@ inputs:
host-platform:
required: true
type: string
use-container:
required: true
type: boolean
docker-image:
type: string
required: true
upload-enabled:
required: true
type: boolean
python-version:
required: true
type: string

runs:
using: composite
steps:
- name: Build cuda.core wheel
uses: pypa/cibuildwheel@v2.22.0
env:
CIBW_BUILD: ${{ env.CIBW_BUILD }}
CIBW_ARCHS_LINUX: "native"
CIBW_BUILD_VERBOSITY: 1
# # ensure Python.h & co can be found
# CIBW_BEFORE_BUILD_WINDOWS: >
# python -c "import sysconfig; print(sysconfig.get_path('include'))" >> $env:INCLUDE
with:
package-dir: ./cuda_core/
output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}

- if: ${{ inputs.use-container }}
name: Build (in container)
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |

docker run \
-e AWS_REGION \
-e AWS_SESSION_TOKEN \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e GITHUB_TOKEN \
-e BINDINGS_ARTIFACTS_DIR="$BINDINGS_ARTIFACTS_DIR" \
-e CORE_ARTIFACTS_DIR="$CORE_ARTIFACTS_DIR" \
-e UPLOAD_ENABLED="$UPLOAD_ENABLED" \
-e USE_CUDA="$USE_CUDA" \
-e REPO_DIR="$REPO_DIR" \
-e LEGATE_CORE_BUILD_MODE="$LEGATE_CORE_BUILD_MODE" \
-e PYTHON_VERSION="$PYTHON_VERSION" \
-v "${{ env.REPO_DIR }}:${{ env.REPO_DIR }}" \
-v "${{ env.BINDINGS_ARTIFACTS_DIR }}:${{ env.BINDINGS_ARTIFACTS_DIR }}" \
-v "${{ env.CORE_ARTIFACTS_DIR }}:${{ env.CORE_ARTIFACTS_DIR }}" \
--rm "${{ inputs.docker-image }}" \
/bin/bash -c "${{ env.REPO_DIR }}/continuous_integration/scripts/entrypoint ${{ env.REPO_DIR }}/continuous_integration/scripts/build ${{ inputs.build-type}} ${{ inputs.target-device }}"

- if: ${{ !inputs.use-container }}
name: Build (without container)
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
"${{ env.REPO_DIR }}/continuous_integration/scripts/entrypoint" "${{ env.REPO_DIR }}/continuous_integration/scripts/build" "${{ inputs.build-type}}" "${{ inputs.target-device }}"

- name: Display structure of the bindings artifacts folder (post build)
- name: List the cuda.core artifacts directory
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
sudo chown -R $(whoami) ${{ env.BINDINGS_ARTIFACTS_DIR }}
ls -lahR ${{ env.BINDINGS_ARTIFACTS_DIR }}
if [[ "${{ inputs.host-platform }}" == win* ]]; then
export CHOWN=chown
else
export CHOWN="sudo chown"
fi
$CHOWN -R $(whoami) ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
ls -lahR ${{ env.CUDA_CORE_ARTIFACTS_DIR }}

- name: Upload bindings build artifacts
- name: Upload cuda.core build artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.BINDINGS_ARTIFACT_NAME }}
path: ${{ env.BINDINGS_ARTIFACTS_DIR }}
name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}
path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl
if-no-files-found: error
overwrite: 'true'

- name: Build cuda.bindings wheel
uses: pypa/cibuildwheel@v2.22.0
env:
CIBW_BUILD: ${{ env.CIBW_BUILD }}
CIBW_ARCHS_LINUX: "native"
CIBW_BUILD_VERBOSITY: 1
CIBW_ENVIRONMENT_LINUX: >
CUDA_PATH="$(realpath ./cuda_toolkit)"
PARALLEL_LEVEL=${{ env.PARALLEL_LEVEL }}
CIBW_ENVIRONMENT_WINDOWS: >
CUDA_HOME="$(cygpath -w $(realpath ./cuda_toolkit))"
# PARALLEL_LEVEL=${{ env.PARALLEL_LEVEL }}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: This was commented out because of #271.

# # ensure Python.h & co can be found
# CIBW_BEFORE_BUILD_WINDOWS: >
# python -c "import sysconfig; print(sysconfig.get_path('include'))" >> $env:INCLUDE
with:
package-dir: ./cuda_bindings/
output-dir: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}

- name: Display structure of the core artifacts folder (post build)
- name: List the cuda.bindings artifacts directory
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
sudo chown -R $(whoami) ${{ env.CORE_ARTIFACTS_DIR }}
ls -lahR ${{ env.CORE_ARTIFACTS_DIR }}
if [[ "${{ inputs.host-platform }}" == win* ]]; then
export CHOWN=chown
else
export CHOWN="sudo chown"
fi
$CHOWN -R $(whoami) ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
ls -lahR ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}

- name: Upload core build artifacts
- name: Upload cuda.bindings build artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.CORE_ARTIFACT_NAME }}
path: ${{ env.CORE_ARTIFACTS_DIR }}
name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}
path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl
if-no-files-found: error
overwrite: 'true'
170 changes: 149 additions & 21 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,51 +22,179 @@ inputs:
python-version:
required: true
type: string
cuda-version:
required: true
type: string

runs:
using: composite
steps:
- name: Set REPO_DIR and Dump environment
# WAR: setup-python is not relocatable...
# see https://github.com/actions/setup-python/issues/871
- name: Set up Python ${{ inputs.python-version }}
if: ${{ startsWith(inputs.host-platform, 'linux') }}
id: setup-python
uses: actions/setup-python@v5
with:
python-version: "3.12"
Comment on lines +32 to +39
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically we don't need this step. However, because actions/setup-python is not relocatable (its RPATH is hard-wired, see actions/setup-python#871), on a self-hosted runner cibuildwheels cannot properly load libpython3.12. This is a WAR by forcing the same Python version installed on the host (and mounted into the container).


# - name: Set up new PowerShell (pwsh)
leofang marked this conversation as resolved.
Show resolved Hide resolved
# if: ${{ startsWith(inputs.host-platform, 'win') }}
# shell: powershell
# env:
# # doesn't seem there's an easy way to avoid hard-coding it?
# PS_MSI_URL: https://github.com/PowerShell/PowerShell/releases/download/v7.4.6/PowerShell-7.4.6-win-x64.msi
# run: |
# Invoke-WebRequest -Uri "$env:PS_MSI_URL" -OutFile "ps_installer.msi"
# Start-Process msiexec.exe -Wait -Verbose -ArgumentList '/i "ps_installer.msi" /qn REGISTER_MANIFEST=1'
# echo "$env:ProgramFiles\\PowerShell\\7" >> $env:GITHUB_PATH
leofang marked this conversation as resolved.
Show resolved Hide resolved

# - name: Install MSVC
# if: ${{ startsWith(inputs.host-platform, 'win') }}
# shell: pwsh
# run: |
# # Download & install
# .\\continuous_integration\\scripts\\install-vs.ps1 -msvcVersion 15 -clVersion 14.16

# # Verify
# # Note: this assumes vs2017, e.g. see _find_vc2017():
# # https://github.com/pypa/setuptools/blob/9692cde009af4651819d18a1e839d3b6e3fcd77d/setuptools/_distutils/_msvccompiler.py#L67
# $vsPath = & "${env:ProgramFiles(x86)}\\Microsoft Visual Studio\\Installer\\vswhere.exe" `
# -latest `
# -products * `
# -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
# -property installationPath
# $clPath = Join-Path $vsPath "VC\\Tools\\MSVC\\*\\bin\\Hostx64\\x64\\cl.exe"
# $clPath = (Get-ChildItem $clPath).FullName
# echo "found cl.exe: $clPath"
# # # For some reason below just doesn't work in the CI...
# # Start-Process -NoNewWindow -RedirectStandardError cl.out -FilePath "$clPath"
# # $CL_VERSION_STRING = & type cl.out
# # if (($CL_VERSION_STRING -join " ") -match "Version (\\d+\\.\\d+)\\.\\d+") {
# # $CL_VERSION = $matches[1]
# # echo "Detected cl.exe version: $CL_VERSION"
# # }

# # Delete temporary items created by installers and such
# Remove-Item -Recurse "${env:TEMP}\\*"
leofang marked this conversation as resolved.
Show resolved Hide resolved

- name: Set up MSVC
if: ${{ startsWith(inputs.host-platform, 'win') }}
uses: ilammy/msvc-dev-cmd@v1
# with:
# toolset: 14.16
# vsversion: 2017

- name: Dump environment
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
echo "REPO_DIR=$(pwd)" >> $GITHUB_ENV
env

- name: Set environment variables
- name: Get CUDA components
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
CUDA_PATH="./cuda_toolkit"
mkdir $CUDA_PATH

WITH_TESTS_STR=''
if [[ ("${{ inputs.upload-enabled }}" == "false") && ("${{ inputs.build-type }}" != "ci") ]]; then
WITH_TESTS_STR='-with_tests'
# The binary archives (redist) are guaranteed to be updated as part of the release posting.
CTK_BASE_URL="https://developer.download.nvidia.com/compute/cuda/redist/"
CTK_JSON_URL="$CTK_BASE_URL/redistrib_${{ inputs.cuda-version }}.json"
if [[ "${{ inputs.host-platform }}" == linux* ]]; then
if [[ "${{ inputs.host-platform }}" == "linux-x64" ]]; then
CTK_SUBDIR="linux-x86_64"
elif [[ "${{ inputs.host-platform }}" == "linux-aarch64" ]]; then
CTK_SUBDIR="linux-sbsa"
fi
function extract() {
tar -xvf $1 -C $CUDA_PATH --strip-components=1
}
elif [[ "${{ inputs.host-platform }}" == "win-x64" ]]; then
CTK_SUBDIR="windows-x86_64"
function extract() {
_TEMP_DIR_=$(mktemp -d)
unzip $1 -d $_TEMP_DIR_
cp -r $_TEMP_DIR_/*/* $CUDA_PATH
rm -rf $_TEMP_DIR_
}
fi
function populate_cuda_path() {
# take the component name as a argument
function download() {
curl -kLSs $1 -o $2
}
CTK_COMPONENT=$1
CTK_COMPONENT_REL_PATH="$(curl -s $CTK_JSON_URL |
python -c "import sys, json; print(json.load(sys.stdin)['${CTK_COMPONENT}']['${CTK_SUBDIR}']['relative_path'])")"
CTK_COMPONENT_URL="${CTK_BASE_URL}/${CTK_COMPONENT_REL_PATH}"
CTK_COMPONENT_COMPONENT_FILENAME="$(basename $CTK_COMPONENT_REL_PATH)"
download $CTK_COMPONENT_URL $CTK_COMPONENT_COMPONENT_FILENAME
extract $CTK_COMPONENT_COMPONENT_FILENAME
rm $CTK_COMPONENT_COMPONENT_FILENAME
}

# Get headers and shared libraries in place
populate_cuda_path cuda_nvcc
populate_cuda_path cuda_cudart
populate_cuda_path cuda_nvrtc
populate_cuda_path cuda_profiler_api
ls -l $CUDA_PATH

TARGET_PLATFORM='linux-64'
if [[ "${{ inputs.host-platform }}" == "linux-aarch64" ]]; then
# Note: the headers will be copied into the cibuildwheel manylinux container,
# so setting the CUDA_PATH env var here is meaningless.

- name: Set environment variables
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
# TODO: just align host-platform names with TARGET_PLATFORM...
if [[ "${{ inputs.host-platform }}" == "linux-x64" ]]; then
TARGET_PLATFORM='linux-64'
elif [[ "${{ inputs.host-platform }}" == "linux-aarch64" ]]; then
TARGET_PLATFORM='linux-aarch64'
elif [[ "${{ inputs.host-platform }}" == "win-x64" ]]; then
TARGET_PLATFORM='win-64'
fi

BUILD_MODE="${{ inputs.build-mode }}"
BUILD_MODE_STR=""
[ -n "${BUILD_MODE}" ] && BUILD_MODE_STR="-${BUILD_MODE}"
if [[ "${{ inputs.host-platform }}" == linux* ]]; then
leofang marked this conversation as resolved.
Show resolved Hide resolved
if [[ "${{ inputs.python-version }}" == "3.12" ]]; then
CIBW_BUILD='cp312-manylinux*'
elif [[ "${{ inputs.python-version }}" == "3.11" ]]; then
CIBW_BUILD='cp311-manylinux*'
elif [[ "${{ inputs.python-version }}" == "3.10" ]]; then
CIBW_BUILD='cp310-manylinux*'
elif [[ "${{ inputs.python-version }}" == "3.9" ]]; then
CIBW_BUILD='cp39-manylinux*'
fi
REPO_DIR=$(pwd)
elif [[ "${{ inputs.host-platform }}" == win* ]]; then
if [[ "${{ inputs.python-version }}" == "3.12" ]]; then
CIBW_BUILD='cp312-win_amd64'
elif [[ "${{ inputs.python-version }}" == "3.11" ]]; then
CIBW_BUILD='cp311-win_amd64'
elif [[ "${{ inputs.python-version }}" == "3.10" ]]; then
CIBW_BUILD='cp310-win_amd64'
elif [[ "${{ inputs.python-version }}" == "3.9" ]]; then
CIBW_BUILD='cp39-win_amd64'
fi
PWD=$(pwd)
REPO_DIR=$(cygpath -w $PWD)
fi

BUILD_MODE="${{ inputs.build-mode }}"
if [[ ("${BUILD_MODE}" == "") || ("${BUILD_MODE}" == "release") ]]; then
# We upload release versions in the default folder.
PKG_DIR="${TARGET_PLATFORM}"
else
PKG_DIR="${BUILD_MODE}/${TARGET_PLATFORM}"
fi

PYTHON_VERSION_FORMATTED=$(echo '${{ inputs.python-version }}' | tr -d '.')

echo "BINDINGS_ARTIFACT_NAME=${{ inputs.host-platform }}-${{ inputs.build-type }}-cuda_bindings-python${PYTHON_VERSION_FORMATTED}-${{ inputs.target-device }}${BUILD_MODE_STR}${WITH_TESTS_STR}-${{ github.sha }}" >> $GITHUB_ENV
leofang marked this conversation as resolved.
Show resolved Hide resolved
echo "BINDINGS_ARTIFACTS_DIR=$(realpath "$(pwd)/cuda_bindings/dist")" >> $GITHUB_ENV
echo "CORE_ARTIFACT_NAME=${{ inputs.host-platform }}-${{ inputs.build-type }}-cuda_core-python${PYTHON_VERSION_FORMATTED}-${{ inputs.target-device }}${BUILD_MODE_STR}${WITH_TESTS_STR}-${{ github.sha }}" >> $GITHUB_ENV
echo "CORE_ARTIFACTS_DIR=$(realpath "$(pwd)/cuda_core/dist")" >> $GITHUB_ENV
echo "USE_CUDA=${{ (inputs.target-device == 'cpu' && 'OFF') || 'ON' }}" >> $GITHUB_ENV
echo "PARALLEL_LEVEL=$(nproc)" >> $GITHUB_ENV
echo "REPO_DIR=$REPO_DIR" >> $GITHUB_ENV
echo "PKG_DIR=${PKG_DIR}" >> $GITHUB_ENV
echo "CUDA_CORE_ARTIFACT_NAME=cuda-core-python${{ inputs.python-version }}-${{ inputs.host-platform }}-${{ inputs.build-type }}-${{ github.sha }}" >> $GITHUB_ENV
echo "CUDA_CORE_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_core/dist")" >> $GITHUB_ENV
echo "CUDA_BINDINGS_ARTIFACT_NAME=cuda-bindings-python${{ inputs.python-version }}-cuda${{ inputs.cuda-version }}-${{ inputs.host-platform }}-${{ inputs.build-type }}-${{ github.sha }}" >> $GITHUB_ENV
echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV
echo "UPLOAD_ENABLED=${{ (inputs.upload-enabled == 'true' && 'ON') || 'OFF' }}" >> $GITHUB_ENV
echo "LEGATE_CORE_BUILD_MODE=${BUILD_MODE}" >> $GITHUB_ENV
echo "BUILD_DATE=$(date +%Y%m%d)" >> $GITHUB_ENV
echo "TARGET_PLATFORM=${TARGET_PLATFORM}" >> $GITHUB_ENV
echo "PKG_DIR=${PKG_DIR}" >> $GITHUB_ENV
echo "PYTHON_VERSION=${{ inputs.python-version }}" >> $GITHUB_ENV
echo "CIBW_BUILD=${CIBW_BUILD}" >> $GITHUB_ENV
13 changes: 11 additions & 2 deletions .github/workflows/ci-gh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,23 @@ jobs:
matrix:
host-platform:
- linux-x64
- linux-aarch64
- win-x64
target-device:
- gpu
build-mode:
- release
upload-enabled:
- false
python-version:
#TODO cover the whole python and cuda matrix
- 3.12
- "3.12"
- "3.11"
- "3.10"
- "3.9"
cuda-version:
# Note: this is for build-time only; the test-time matrix needs to be
# defined separately.
- "12.6.2"
uses:
./.github/workflows/gh-build-and-test.yml
with:
Expand All @@ -36,4 +44,5 @@ jobs:
build-type: ci
upload-enabled: ${{ matrix.upload-enabled }}
python-version: ${{ matrix.python-version }}
cuda-version: ${{ matrix.cuda-version }}
secrets: inherit
Loading