Files
wehub-resource-sync 59a0a3844c
PR Test AMD / cancel-on-close (push) Has been skipped
PR Test NVIDIA ARM / scan (push) Has been skipped
PR Test NVIDIA / cancel-on-close (push) Has been skipped
PR Test AMD / scan (push) Has been skipped
PR Test NVIDIA ARM / cancel-on-close (push) Has been skipped
PR Test NVIDIA / scan (push) Has been skipped
Release Docker Images / build (cu129-torch-2.11.0) (push) Has been skipped
Release Docker Images / build (cu130-torch-2.11.0) (push) Has been skipped
Release PyPI / publish (push) Has been skipped
Scheduler Python Test / test (push) Successful in 27m19s
Docs / build (push) Successful in 28m8s
Scheduler C++ Test / test (push) Successful in 28m19s
Scheduler C++ Test / test-flat (push) Successful in 28m18s
Docs / deploy (push) Has been cancelled
PR Test AMD / finish (push) Has been cancelled
PR Test NVIDIA / finish (push) Has been cancelled
PR Test NVIDIA ARM / finish (push) Has been cancelled
PR Test NVIDIA ARM / ${{ matrix.name }} (${{ matrix.runner }}) (push) Has been cancelled
PR Test AMD / ${{ matrix.name }} (${{ matrix.runner }}) (push) Has been cancelled
PR Test NVIDIA / ${{ matrix.name }} (${{ matrix.runner }}) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:32:31 +08:00

377 lines
13 KiB
YAML

name: Build and Release tokenspeed-kernel
on:
workflow_dispatch:
inputs:
tag_name:
description: "Git tag prefix to create or update. Defaults to tokenspeed-kernel-v<version>."
required: false
type: string
version_date:
description: "Version date override for development builds, formatted as YYYYMMDD."
required: false
type: string
cuda_variant:
description: "CUDA variant to build."
required: false
default: all
type: choice
options:
- all
- cu130
- cu129
pypi_cuda_variant:
description: "CUDA variant to publish to PyPI."
required: false
default: cu130
type: choice
options:
- cu130
- cu129
prerelease:
description: "Mark the GitHub release as a prerelease."
required: false
default: false
type: boolean
publish_github:
description: "Publish distributions to lightseekorg/whl."
required: false
default: false
type: boolean
publish_pypi:
description: "Publish the selected PyPI CUDA variant."
required: false
default: false
type: boolean
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
jobs:
metadata:
name: Resolve release metadata
runs-on: ubuntu-24.04-32core-x64
outputs:
version: ${{ steps.metadata.outputs.version }}
version_date: ${{ steps.metadata.outputs.version_date }}
tag_name: ${{ steps.metadata.outputs.tag_name }}
steps:
- name: Validate publish inputs
if: inputs.publish_pypi && inputs.cuda_variant != 'all' && inputs.cuda_variant != inputs.pypi_cuda_variant
run: |
echo "pypi_cuda_variant must be included by cuda_variant." >&2
exit 1
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install build metadata dependencies
run: python -m pip install --upgrade "setuptools<82" wheel packaging
- name: Resolve release metadata
id: metadata
env:
PUBLISH_PYPI: ${{ inputs.publish_pypi }}
run: |
version_date="${{ inputs.version_date }}"
if [ -z "$version_date" ]; then
version_date="$(date -u +%Y%m%d)"
fi
version=$(
cd tokenspeed-kernel/python
TOKENSPEED_KERNEL_BACKEND=cuda \
TOKENSPEED_KERNEL_VERSION_DATE="$version_date" \
TOKENSPEED_KERNEL_GIT_SHA="$GITHUB_SHA" \
TOKENSPEED_KERNEL_GIT_BRANCH="$GITHUB_REF_NAME" \
python setup.py --version
)
if [ "$PUBLISH_PYPI" = "true" ] && [[ "$version" == *+* ]]; then
echo "Version ${version} contains a local segment and cannot be published to PyPI; dispatch from a release/* branch." >&2
exit 1
fi
tag_name="${{ inputs.tag_name }}"
if [ -z "$tag_name" ]; then
tag_name="tokenspeed-kernel-v${version}"
fi
echo "version=${version}" >> "$GITHUB_OUTPUT"
echo "version_date=${version_date}" >> "$GITHUB_OUTPUT"
echo "tag_name=${tag_name}" >> "$GITHUB_OUTPUT"
echo "Release version: ${version}"
echo "Release tag: ${tag_name}"
build-wheel:
name: Build ${{ matrix.cuda.variant }} ${{ matrix.arch.name }} wheel for Python ${{ matrix.python.version }}
needs: metadata
runs-on: ${{ matrix.arch.runner }}
strategy:
fail-fast: false
matrix:
arch:
- name: x64
runner: ubuntu-24.04-32core-x64
manylinux_arch: x86_64
cuda_repo_arch: x86_64
- name: arm64
runner: ubuntu-24.04-32core-arm64
manylinux_arch: aarch64
cuda_repo_arch: sbsa
python:
- version: "3.10"
tag: cp310-cp310
- version: "3.11"
tag: cp311-cp311
- version: "3.12"
tag: cp312-cp312
- version: "3.13"
tag: cp313-cp313
cuda:
- variant: cu130
package_version: "13-0"
torch_index_url: https://download.pytorch.org/whl/cu130
- variant: cu129
package_version: "12-9"
torch_index_url: https://download.pytorch.org/whl/cu129
steps:
- name: Checkout repository
if: inputs.cuda_variant == 'all' || inputs.cuda_variant == matrix.cuda.variant
uses: actions/checkout@v4
- name: Build manylinux CUDA image
if: inputs.cuda_variant == 'all' || inputs.cuda_variant == matrix.cuda.variant
run: |
cat > Dockerfile.tokenspeed-kernel-release <<'DOCKERFILE'
ARG MANYLINUX_ARCH=x86_64
FROM quay.io/pypa/manylinux_2_28_${MANYLINUX_ARCH}
ARG CUDA_PKG_VERSION=13-0
ARG CUDA_REPO_ARCH=x86_64
RUN curl -o /etc/yum.repos.d/cuda-rhel8.repo \
https://developer.download.nvidia.com/compute/cuda/repos/rhel8/${CUDA_REPO_ARCH}/cuda-rhel8.repo \
&& yum install -y \
cuda-nvcc-${CUDA_PKG_VERSION} \
cuda-cccl-${CUDA_PKG_VERSION} \
cuda-cudart-devel-${CUDA_PKG_VERSION} \
cuda-driver-devel-${CUDA_PKG_VERSION} \
libcublas-devel-${CUDA_PKG_VERSION} \
libcurand-devel-${CUDA_PKG_VERSION} \
libcusolver-devel-${CUDA_PKG_VERSION} \
libcusparse-devel-${CUDA_PKG_VERSION} \
gcc-toolset-13-gcc \
gcc-toolset-13-gcc-c++ \
ninja-build \
&& yum clean all \
&& rm -rf /var/cache/yum \
&& ln -s /usr/bin/ninja-build /usr/local/bin/ninja
ENV CC=/opt/rh/gcc-toolset-13/root/usr/bin/gcc
ENV CXX=/opt/rh/gcc-toolset-13/root/usr/bin/g++
ENV CUDA_HOME=/usr/local/cuda
ENV PATH=${CUDA_HOME}/bin:${PATH}
ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${CUDA_HOME}/lib64/stubs:${LD_LIBRARY_PATH}
ENV LIBRARY_PATH=${CUDA_HOME}/lib64/stubs:${LIBRARY_PATH}
WORKDIR /workspace
DOCKERFILE
docker build \
--build-arg MANYLINUX_ARCH=${{ matrix.arch.manylinux_arch }} \
--build-arg CUDA_PKG_VERSION=${{ matrix.cuda.package_version }} \
--build-arg CUDA_REPO_ARCH=${{ matrix.arch.cuda_repo_arch }} \
-f Dockerfile.tokenspeed-kernel-release \
-t tokenspeed-kernel-release:${{ matrix.cuda.variant }}-${{ matrix.arch.name }} .
- name: Build wheel
if: inputs.cuda_variant == 'all' || inputs.cuda_variant == matrix.cuda.variant
run: |
mkdir -p dist
docker run --rm \
-e PYTHON_TAG=${{ matrix.python.tag }} \
-e TORCH_INDEX_URL=${{ matrix.cuda.torch_index_url }} \
-e TOKENSPEED_KERNEL_BACKEND=cuda \
-e TOKENSPEED_KERNEL_VERSION_DATE=${{ needs.metadata.outputs.version_date }} \
-e TOKENSPEED_KERNEL_GIT_SHA=$GITHUB_SHA \
-e TOKENSPEED_KERNEL_GIT_BRANCH=$GITHUB_REF_NAME \
-e MAX_JOBS=8 \
-v "$PWD:/workspace" \
-v "$PWD/dist:/output" \
tokenspeed-kernel-release:${{ matrix.cuda.variant }}-${{ matrix.arch.name }} \
bash -lc '
set -euo pipefail
PYBIN="/opt/python/${PYTHON_TAG}/bin"
cd /workspace/tokenspeed-kernel/python
"${PYBIN}/python" -m pip install --upgrade \
pip "setuptools<82" wheel build twine packaging "apache-tvm-ffi>=0.1.5,<=0.1.11"
"${PYBIN}/python" -m pip install --no-cache-dir "torch==2.11.0" --index-url "${TORCH_INDEX_URL}"
rm -rf build *.egg-info
PIP_EXTRA_INDEX_URL="${TORCH_INDEX_URL}" \
"${PYBIN}/python" -m build --wheel --no-isolation --outdir /output
python_tag="${PYTHON_TAG%%-*}"
abi_tag="${PYTHON_TAG#*-}"
platform_tag="manylinux_2_28_$(uname -m)"
"${PYBIN}/python" -m wheel tags \
--python-tag "${python_tag}" \
--abi-tag "${abi_tag}" \
--platform-tag "${platform_tag}" \
--remove /output/*.whl
"${PYBIN}/python" -m twine check /output/*.whl
'
- name: Upload wheel
if: inputs.cuda_variant == 'all' || inputs.cuda_variant == matrix.cuda.variant
uses: actions/upload-artifact@v4
with:
name: tokenspeed-kernel-wheel-${{ matrix.cuda.variant }}-${{ matrix.arch.name }}-py${{ matrix.python.version }}
path: dist/*.whl
build-sdist:
name: Build source distribution
needs: metadata
runs-on: ubuntu-24.04-32core-x64
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Build source distribution
run: |
python -m pip install --upgrade \
build twine "setuptools<82" wheel packaging "apache-tvm-ffi>=0.1.5,<=0.1.11"
cd tokenspeed-kernel/python
TOKENSPEED_KERNEL_BACKEND=cuda \
TOKENSPEED_KERNEL_VERSION_DATE=${{ needs.metadata.outputs.version_date }} \
TOKENSPEED_KERNEL_GIT_SHA=$GITHUB_SHA \
TOKENSPEED_KERNEL_GIT_BRANCH=$GITHUB_REF_NAME \
python -m build --sdist --no-isolation --outdir ../../dist
python -m twine check ../../dist/*.tar.gz
- name: Upload source distribution
uses: actions/upload-artifact@v4
with:
name: tokenspeed-kernel-sdist
path: dist/*.tar.gz
release:
name: Create wheelhouse release
if: inputs.publish_github
needs: [metadata, build-wheel, build-sdist]
runs-on: ubuntu-24.04-32core-x64
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download distributions
uses: actions/download-artifact@v4
with:
path: dist
pattern: tokenspeed-kernel-*
merge-multiple: false
- name: Create or update GitHub release
env:
GH_TOKEN: ${{ secrets.LIGHTSEEK_BOT_TOKEN }}
RELEASE_REPOSITORY: lightseekorg/whl
TAG_NAME: ${{ needs.metadata.outputs.tag_name }}
VERSION: ${{ needs.metadata.outputs.version }}
CUDA_VARIANT: ${{ inputs.cuda_variant }}
PRERELEASE: ${{ inputs.prerelease }}
SOURCE_SHA: ${{ github.sha }}
run: |
prerelease_args=()
if [ "$PRERELEASE" = "true" ]; then
prerelease_args+=(--prerelease)
fi
upload_release() {
local cuda_variant="$1"
local release_tag="${TAG_NAME}-${cuda_variant}"
local release_title="tokenspeed-kernel ${VERSION} ${cuda_variant}"
shopt -s nullglob
local assets=(
dist/tokenspeed-kernel-wheel-"${cuda_variant}"-*/*.whl
dist/tokenspeed-kernel-sdist/*.tar.gz
)
shopt -u nullglob
if [ "${#assets[@]}" -eq 0 ]; then
echo "No distributions found for ${cuda_variant}" >&2
exit 1
fi
if gh release view "$release_tag" --repo "$RELEASE_REPOSITORY" >/dev/null 2>&1; then
gh release upload "$release_tag" "${assets[@]}" \
--repo "$RELEASE_REPOSITORY" \
--clobber
else
gh release create "$release_tag" "${assets[@]}" \
--repo "$RELEASE_REPOSITORY" \
--title "$release_title" \
--notes "$release_title built from lightseekorg/tokenspeed@$SOURCE_SHA" \
"${prerelease_args[@]}"
fi
}
case "$CUDA_VARIANT" in
all)
upload_release cu130
upload_release cu129
;;
cu130|cu129)
upload_release "$CUDA_VARIANT"
;;
*)
echo "Unsupported CUDA variant: ${CUDA_VARIANT}" >&2
exit 1
;;
esac
publish-pypi:
name: Publish ${{ inputs.pypi_cuda_variant }} to PyPI
if: inputs.publish_pypi
needs: [metadata, build-wheel, build-sdist]
runs-on: ubuntu-24.04-32core-x64
environment: pypi
permissions:
id-token: write
steps:
- name: Download wheels
uses: actions/download-artifact@v4
with:
path: dist
pattern: tokenspeed-kernel-wheel-${{ inputs.pypi_cuda_variant }}-*
merge-multiple: true
- name: Download source distribution
uses: actions/download-artifact@v4
with:
name: tokenspeed-kernel-sdist
path: dist
- name: Publish distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist