Skip to content

Commit

Permalink
BUILD(cfg): Add build toolchain for CUDA variant
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeSWang committed Sep 11, 2024
1 parent b10d380 commit 9a8bd5e
Show file tree
Hide file tree
Showing 9 changed files with 373 additions and 52 deletions.
37 changes: 10 additions & 27 deletions .github/workflows/cd_cuda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ concurrency:

jobs:
build_bdist_cuda:
name: Build bdist wheel
name: Build bdist wheel (CUDA)

strategy:
fail-fast: false
Expand Down Expand Up @@ -76,12 +76,6 @@ jobs:
package-dir: .
output-dir: dist/
config-file: pyproject.toml
env:
CIBW_ENVIRONMENT: >-
PY_CXX=nvcc
PY_OMP=1
PY_CUDA=1
PY_BUILD_PARALLEL='-j'

- name: Verify built distribution
run: python -m twine check --strict dist/*
Expand All @@ -99,7 +93,7 @@ jobs:
path: dist/*.whl

build_conda_cuda:
name: Build Conda package
name: Build Conda package (CUDA)

strategy:
fail-fast: false
Expand All @@ -112,7 +106,7 @@ jobs:

if: >
github.event_name != 'workflow_dispatch' ||
github.event.inputs.run_build_conda == 'true'
github.event.inputs.run_build_conda_cuda == 'true'
defaults:
run:
Expand All @@ -124,20 +118,13 @@ jobs:
with:
fetch-depth: 0

- uses: Jimver/cuda-toolkit@master
id: cuda-toolkit
with:
log-file-suffix: '${{matrix.os}}_cudatoolkit_log.txt'
method: 'network'
sub-packages: '["nvcc"]'
non-cuda-sub-packages: '["libcufft"]'

- name: Set up (Mini)conda
uses: conda-incubator/setup-miniconda@v3
with:
activate-environment: conda_bld
channels: conda-forge
channels: conda-forge,nvidia
channel-priority: strict
architecture: ${{ env.TARGET_ARCH }}

- name: Install packaging requirements
run: |
Expand All @@ -149,17 +136,13 @@ jobs:
- name: Override version
if: github.event_name == 'workflow_dispatch'
uses: knicknic/os-specific-run@v1.0.4
env:
recipe_file: deploy/pkg/conda_recipe_cuda/meta.yaml
with:
linux: |
vers_tag=${{ github.event.inputs.version_tag }}
cuda_vers=${{ steps.cuda-toolkit.outputs.cuda }}
if [[ ! -z ${vers_tag} ]]; then
sed -i "s/# git_rev:.*/git_rev: ${vers_tag}/g" ${recipe_file}
sed -i "s/'CUDA_VERSION', ''/'CUDA_VERSION', '${cuda_vers}'/g" ${recipe_file}
fi
run: |
vers_tag=${{ github.event.inputs.version_tag }}
if [[ ! -z ${vers_tag} ]]; then
sed -i "s/# git_rev:.*/git_rev: ${vers_tag}/g" ${recipe_file}
fi
- name: Build Conda package
env:
Expand Down
226 changes: 226 additions & 0 deletions .github/workflows/cd_cuda_xp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
# Provide continuous delivery (CD) for CUDA-enabled builds.
#
# CD deliverables currently include:
# - (natively) built Python wheel distributions (for PyPI);
# - (natively) built Conda packages (for Anaconda).
#
name: continuous-delivery-cuda-xplatform

on: []
# push:
# tags:
# - 'v[0-9]+.[0-9]+.[0-9]+'
# - 'v[0-9]+.[0-9]+.[0-9]+.post[0-9]+'
# - 'v[0-9]+.[0-9]+.[0-9]+.dev[0-9]+'
# - 'v[0-9]+.[0-9]+.[0-9]+rc[0-9]+'
# paths:
# - deploy/pkg/conda_recipe_cuda_xp/**
# - .github/workflows/cd_cuda_xp.yml
# workflow_dispatch:
# inputs:
# run_build_bdist_cuda_xplat:
# description: 'Run job build_bdist_cuda_xplat'
# type: boolean
# default: false
# required: false
# run_build_conda_cuda_xplat:
# description: 'Run job build_conda_cuda_xplat'
# type: boolean
# default: false
# required: false
# version_tag:
# description: 'Version tag for delivery'
# type: string
# required: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build_bdist_cuda_xplat:
name: Build bdist wheel (CUDA, cross-platform)

strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

runs-on: ${{ matrix.os }}

timeout-minutes: 100

# Allow manual trigger from inputs.
if: >
github.event_name != 'workflow_dispatch' ||
github.event.inputs.run_build_bdist_cuda_xplat == 'true'
steps:
- name: Extract platform architecture
run: |
if [[ $(uname -m) == 'aarch64' ]]; then
echo "TARGET_ARCH=x86_64" >> "${GITHUB_ENV}"
elif [[ $(uname -m) == 'x86_64' ]]; then
echo "TARGET_ARCH=aarch64" >> "${GITHUB_ENV}"
echo "TARGET_ARCH_ALT=arm64" >> "${GITHUB_ENV}"
fi
- name: Checkout (automatic trigger)
if: github.event_name != 'workflow_dispatch'
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Checkout (manual trigger)
if: >
github.event.inputs.run_build_bdist_cuda_xplat == 'true' &&
github.event.inputs.version_tag == ''
uses: actions/checkout@v4
with:
fetch-tags: true

- name: Checkout (manual trigger with tag)
if: >
github.event.inputs.run_build_bdist_cuda_xplat == 'true' &&
github.event.inputs.version_tag != ''
uses: actions/checkout@v4
with:
ref: refs/tags/${{ github.event.inputs.version_tag }}

# Use QEMU for non-native Linux runner.
- name: Set up QEMU (Linux)
if: runner.os == 'Linux'
uses: docker/setup-qemu-action@v3
with:
# Specify target architecture.
platforms: linux/${{ env.TARGET_ARCH_ALT }}

- name: Set up Python 3
uses: actions/setup-python@v5
with:
python-version: '3.x'

- name: Install packaging requirements
run: python -m pip install --upgrade twine

- name: Copy Python project configuration file
run: cp .pyproject_cuda.toml pyproject.toml

- name: Build built distribution
uses: pypa/cibuildwheel@v2.20.0
with:
package-dir: .
output-dir: dist/
config-file: pyproject.toml
env:
# Specify target architecture, which is actually fixed to aarch64.
CIBW_ARCHS_LINUX: ${{ env.TARGET_ARCH }}
CIBW_BEFORE_ALL_LINUX: >
yum install -y gsl-devel &&
yum install -y yum-utils &&
yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/aarch64/cuda-rhel9.repo &&
yum install -y nvidia-container-toolkit
- name: Verify built distribution
run: python -m twine check --strict dist/*

- name: Save wheel to bdist
uses: actions/upload-artifact@v4
with:
name: bdist_whl_${{ matrix.os }}_${{ env.TARGET_ARCH }}_${{ github.ref_name }}_cuda
path: dist/*.whl

- name: Save wheel to pypi_dist
uses: actions/upload-artifact@v4
with:
name: pypi_dist_${{ runner.os }}_${{ env.TARGET_ARCH }}_${{ github.ref_name }}_cuda
path: dist/*.whl

build_conda_cuda:
name: Build Conda package (CUDA, cross-platform)

strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

runs-on: ${{ matrix.os }}

timeout-minutes: 120

if: >
github.event_name != 'workflow_dispatch' ||
github.event.inputs.run_build_conda_cuda_xplat == 'true'
defaults:
run:
shell: bash -el {0}

steps:
- name: Extract platform architecture
run: |
if [[ $(uname -m) == 'aarch64' ]]; then
echo "TARGET_ARCH=x86_64" >> "${GITHUB_ENV}"
elif [[ $(uname -m) == 'x86_64' ]]; then
echo "TARGET_ARCH=aarch64" >> "${GITHUB_ENV}"
fi
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up (Mini)conda
uses: conda-incubator/setup-miniconda@v3
with:
activate-environment: conda_bld
channels: conda-forge,nvidia
channel-priority: strict
architecture: ${{ env.TARGET_ARCH }}

- name: Install packaging requirements
run: |
conda install -y conda-build conda-verify conda-package-handling
# `cph` not found otherwise.
conda_root=$(conda config --show root_prefix | sed 's/root_prefix: //')
conda_env=${conda_root}/envs/conda_bld
export PATH="$PATH:${conda_root}/bin:${conda_env}/bin"
- name: Override version
if: github.event_name == 'workflow_dispatch'
env:
recipe_file: deploy/pkg/conda_recipe_cuda_xp/meta.yaml
run: |
vers_tag=${{ github.event.inputs.version_tag }}
if [[ ! -z ${vers_tag} ]]; then
sed -i "s/# git_rev:.*/git_rev: ${vers_tag}/g" ${recipe_file}
fi
- name: Build Conda package
env:
recipe_dir: deploy/pkg/conda_recipe_cuda_xp
output_dir: dist/
variants: "{'python': ['3.10', '3.11', '3.12']}"
run: |
# Create output directory if non-existent.
if [[ ! -d ${output_dir} ]]; then mkdir -p ${output_dir}; fi
# Build.
conda build --strict-verify --no-anaconda-upload ${recipe_dir} \
--variants "${variants}" --output-folder ${output_dir}
# Transmute.
find ${output_dir} -name '*.tar.bz2' \
-exec cph transmute {} .conda --out-folder ${output_dir} \;
- name: Save build to conda_bld
uses: actions/upload-artifact@v4
with:
name: conda_bld_${{ matrix.os }}_${{ github.ref_name }}_cuda
path: dist/*

- name: Save build to conda_dist
uses: actions/upload-artifact@v4
with:
name: conda_dist_${{ runner.os }}_${{ runner.arch }}_${{ github.ref_name }}_cuda
path: |
dist/**/*.tar.bz2
dist/*.conda
10 changes: 9 additions & 1 deletion .pyproject_cuda.toml
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,16 @@ manylinux-aarch64-image = 'manylinux_2_28'

[tool.cibuildwheel.linux]
before-all = [
"yum install -y gsl-devel cuda-toolkit",
"yum install -y gsl-devel",
# Install CUDA Toolkit inside Docker container using package manager,
# matching repository with image OS, and optionally matching CUDA version
# for Pip/Conda consistency.
"yum install -y yum-utils",
"yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo",
"yum install -y cuda-toolkit",
# "yum install -y cuda-toolkit-12-6",
]
environment = { PY_CXX="/usr/local/cuda/bin/nvcc", PY_CXXFLAGS="-I/usr/local/cuda/include", PY_LDFLAGS="-L/usr/local/cuda/lib64", PY_OMP='1', PY_CUDA='1', PY_BUILD_PARALLEL='-j' }

[tool.autopep8]
in-place = true
Expand Down
12 changes: 6 additions & 6 deletions deploy/pkg/conda_recipe/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ build:
# Use Conda-provided compiler.
- export PY_CXX=$CXX
- export PY_CXXFLAGS="${PY_CXXFLAGS} -D_LIBCPP_DISABLE_AVAILABILITY"
# Optional: Enforce OpenMP support.
- export PY_OMP=1
# Default to LLVM OpenMP on macOS.
- export PY_CXXFLAGS_OMP="-Xpreprocessor -fopenmp" # [osx]
- export PY_LDFLAGS_OMP="-lomp" # [osx]
- cp .pyproject.toml pyproject.toml
- {{ PYTHON }} -m pip install . -vvv
script_env:
- PY_BUILD_PARALLEL="-j"
# Optional: Enforce OpenMP support.
- PY_OMP=1
# Default to LLVM OpenMP on macOS.
- PY_CXXFLAGS_OMP="-Xpreprocessor -fopenmp" # [osx]
- PY_LDFLAGS_OMP="-lomp" # [osx]
- PY_BUILD_PARALLEL='-j'

requirements:
build:
Expand Down
5 changes: 4 additions & 1 deletion deploy/pkg/conda_recipe_cuda/conda_build_config.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
target_platform:
- linux-64 # [linux]
- linux-aarch64 # [linux]
# - linux-aarch64 # [linux]

cuda_version:
- 12.0
Loading

0 comments on commit 9a8bd5e

Please sign in to comment.