[MUSA][11/N] ci: add MUSA 4.3 kernel build and release pipeline (#18537)
Co-authored-by: ximin.chen <ximin.chen@mthreads.com>
This commit is contained in:
@@ -8,6 +8,17 @@ on:
|
|||||||
- sgl-kernel/python/sgl_kernel/version.py
|
- sgl-kernel/python/sgl_kernel/version.py
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
|
target:
|
||||||
|
type: choice
|
||||||
|
description: 'Build target'
|
||||||
|
required: false
|
||||||
|
default: 'all'
|
||||||
|
options:
|
||||||
|
- 'all'
|
||||||
|
- 'cu129'
|
||||||
|
- 'cu130'
|
||||||
|
- 'rocm700'
|
||||||
|
- 'musa43'
|
||||||
tag_name:
|
tag_name:
|
||||||
type: string
|
type: string
|
||||||
required: false
|
required: false
|
||||||
@@ -22,7 +33,9 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-cu129-matrix:
|
build-cu129-matrix:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: |
|
||||||
|
github.repository == 'sgl-project/sglang' &&
|
||||||
|
(github.event.inputs.target == 'all' || github.event.inputs.target == 'cu129')
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ["3.10"]
|
python-version: ["3.10"]
|
||||||
@@ -119,7 +132,9 @@ jobs:
|
|||||||
|
|
||||||
# for now we do not release CUDA 13.0 wheels to pypi
|
# for now we do not release CUDA 13.0 wheels to pypi
|
||||||
build-cu130-matrix:
|
build-cu130-matrix:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: |
|
||||||
|
github.repository == 'sgl-project/sglang' &&
|
||||||
|
(github.event.inputs.target == 'all' || github.event.inputs.target == 'cu130')
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ["3.10"]
|
python-version: ["3.10"]
|
||||||
@@ -209,7 +224,9 @@ jobs:
|
|||||||
git push
|
git push
|
||||||
|
|
||||||
build-rocm700:
|
build-rocm700:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: |
|
||||||
|
github.repository == 'sgl-project/sglang' &&
|
||||||
|
(github.event.inputs.target == 'all' || github.event.inputs.target == 'rocm700')
|
||||||
runs-on: amd-docker-scale
|
runs-on: amd-docker-scale
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -289,3 +306,82 @@ jobs:
|
|||||||
git add -A
|
git add -A
|
||||||
git commit -m "update whl index"
|
git commit -m "update whl index"
|
||||||
git push
|
git push
|
||||||
|
|
||||||
|
build-musa43:
|
||||||
|
if: |
|
||||||
|
github.repository == 'sgl-project/sglang' &&
|
||||||
|
(github.event.inputs.target == 'all' || github.event.inputs.target == 'musa43')
|
||||||
|
runs-on: kernel-build-node-musa
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: ["3.10"]
|
||||||
|
musa-version: ["43"]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: "recursive"
|
||||||
|
|
||||||
|
- name: Build wheels
|
||||||
|
run: |
|
||||||
|
cd sgl-kernel
|
||||||
|
mv pyproject_musa.toml pyproject.toml
|
||||||
|
python setup_musa.py sdist bdist_wheel
|
||||||
|
|
||||||
|
- name: Rename MUSA wheels
|
||||||
|
run: |
|
||||||
|
bash scripts/ci/musa/rename_wheels_musa.sh ${{ matrix.musa-version }} sgl-kernel/dist
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: wheel-python${{ matrix.python-version }}-musa${{ matrix.musa-version }}
|
||||||
|
path: sgl-kernel/dist/*
|
||||||
|
|
||||||
|
release-musa43:
|
||||||
|
needs: build-musa43
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: sgl-kernel/dist/
|
||||||
|
merge-multiple: true
|
||||||
|
pattern: wheel-*
|
||||||
|
|
||||||
|
- name: Set tag name
|
||||||
|
id: set_tag_name
|
||||||
|
run: |
|
||||||
|
if [ -z "${{ inputs.tag_name }}" ]; then
|
||||||
|
TAG_NAME="v$(cat sgl-kernel/python/sgl_kernel/version.py | cut -d'"' -f2)"
|
||||||
|
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "tag_name=${{ inputs.tag_name }}" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.set_tag_name.outputs.tag_name }}
|
||||||
|
repository: sgl-project/whl
|
||||||
|
token: ${{ secrets.GH_PAT_FOR_WHL_RELEASE }}
|
||||||
|
files: |
|
||||||
|
sgl-kernel/dist/*
|
||||||
|
|
||||||
|
- name: Clone wheel index
|
||||||
|
run: git clone https://oauth2:${WHL_TOKEN}@github.com/sgl-project/whl.git sgl-whl
|
||||||
|
env:
|
||||||
|
WHL_TOKEN: ${{ secrets.GH_PAT_FOR_WHL_RELEASE }}
|
||||||
|
|
||||||
|
- name: Update wheel index
|
||||||
|
run: python3 scripts/update_kernel_whl_index.py --musa 43
|
||||||
|
|
||||||
|
- name: Push wheel index
|
||||||
|
run: |
|
||||||
|
cd sgl-whl
|
||||||
|
git config --local user.name "sglang-bot"
|
||||||
|
git config --local user.email "sglangbot@gmail.com"
|
||||||
|
git add -A
|
||||||
|
git commit -m "update whl index"
|
||||||
|
git push
|
||||||
|
|||||||
Executable
+5
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
PIP_INSTALL="python3 -m pip install --no-cache-dir"
|
||||||
|
${PIP_INSTALL} --upgrade pip setuptools torchada
|
||||||
Executable
+46
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Rename MUSA wheels to include a +musa<suffix> build tag.
|
||||||
|
# Usage:
|
||||||
|
# rename_wheels_musa.sh <musa_suffix> [wheel_dir]
|
||||||
|
# Example:
|
||||||
|
# rename_wheels_musa.sh 43 sgl-kernel/dist
|
||||||
|
|
||||||
|
if [[ $# -lt 1 || $# -gt 2 ]]; then
|
||||||
|
echo "Usage: $0 <musa_suffix> [wheel_dir]" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
MUSA_SUFFIX="$1"
|
||||||
|
WHEEL_DIR="${2:-dist}"
|
||||||
|
|
||||||
|
wheel_files=("$WHEEL_DIR"/*.whl)
|
||||||
|
|
||||||
|
if [[ ! -e "${wheel_files[0]}" ]]; then
|
||||||
|
echo "No wheel files found in ${WHEEL_DIR}/, nothing to rename."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for wheel in "${wheel_files[@]}"; do
|
||||||
|
# Normalize platform tag to manylinux2014
|
||||||
|
intermediate_wheel="${wheel/linux/manylinux2014}"
|
||||||
|
|
||||||
|
# Extract Python ABI version (e.g. cp310)
|
||||||
|
if [[ $intermediate_wheel =~ -cp([0-9]+)- ]]; then
|
||||||
|
cp_version="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
echo "Could not extract Python version from wheel name: $intermediate_wheel" >&2
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Insert +musa<suffix> before the Python ABI tag
|
||||||
|
new_wheel="${intermediate_wheel/-cp${cp_version}/+musa${MUSA_SUFFIX}-cp${cp_version}}"
|
||||||
|
|
||||||
|
if [[ "$wheel" != "$new_wheel" ]]; then
|
||||||
|
echo "Renaming $wheel -> $new_wheel"
|
||||||
|
mv -- "$wheel" "$new_wheel"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "MUSA wheel renaming completed."
|
||||||
@@ -46,34 +46,45 @@ def update_wheel_index(cuda_version=DEFAULT_CUDA_VERSION, rocm_version=None):
|
|||||||
f.write(f'<a href="{full_url}">{path.name}</a><br>\n')
|
f.write(f'<a href="{full_url}">{path.name}</a><br>\n')
|
||||||
|
|
||||||
|
|
||||||
def update_wheel_index_rocm(rocm_version):
|
def _update_non_cuda_wheel_index(backend, version):
|
||||||
index_dir = pathlib.Path(f"sgl-whl/rocm{rocm_version}/sgl-kernel")
|
index_dir = pathlib.Path(f"sgl-whl/{backend}{version}/sgl-kernel")
|
||||||
index_dir.mkdir(exist_ok=True, parents=True)
|
index_dir.mkdir(exist_ok=True, parents=True)
|
||||||
base_url = "https://github.com/sgl-project/whl/releases/download"
|
base_url = "https://github.com/sgl-project/whl/releases/download"
|
||||||
|
|
||||||
for path in sorted(pathlib.Path("sgl-kernel/dist").glob("*.whl")):
|
for path in sorted(pathlib.Path("sgl-kernel/dist").glob("*.whl")):
|
||||||
# Skip the wheel if not rocm
|
# Skip the wheel if not for this backend
|
||||||
if re.search(f"rocm", path.name) is None:
|
if re.search(f"{backend}", path.name) is None:
|
||||||
continue
|
continue
|
||||||
with open(path, "rb") as f:
|
with open(path, "rb") as f:
|
||||||
sha256 = hashlib.sha256(f.read()).hexdigest()
|
sha256 = hashlib.sha256(f.read()).hexdigest()
|
||||||
ver = re.findall(
|
ver = re.findall(
|
||||||
r"sgl_kernel-([0-9.]+(?:\.post[0-9]+)?)(?:\+rocm[0-9]+)?-", path.name
|
rf"sgl_kernel-([0-9.]+(?:\.post[0-9]+)?)(?:\+{backend}[0-9]+)?-", path.name
|
||||||
)[0]
|
)[0]
|
||||||
full_url = f"{base_url}/v{ver}/{path.name}#sha256={sha256}"
|
full_url = f"{base_url}/v{ver}/{path.name}#sha256={sha256}"
|
||||||
with (index_dir / "index.html").open("a") as f:
|
with (index_dir / "index.html").open("a") as f:
|
||||||
f.write(f'<a href="{full_url}">{path.name}</a><br>\n')
|
f.write(f'<a href="{full_url}">{path.name}</a><br>\n')
|
||||||
|
|
||||||
|
|
||||||
|
def update_wheel_index_rocm(rocm_version):
|
||||||
|
_update_non_cuda_wheel_index("rocm", rocm_version)
|
||||||
|
|
||||||
|
|
||||||
|
def update_wheel_index_musa(musa_version):
|
||||||
|
_update_non_cuda_wheel_index("musa", musa_version)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--cuda", type=str, default=DEFAULT_CUDA_VERSION)
|
parser.add_argument("--cuda", type=str, default=DEFAULT_CUDA_VERSION)
|
||||||
parser.add_argument("--rocm", type=str, default=None)
|
parser.add_argument("--rocm", type=str, default=None)
|
||||||
|
parser.add_argument("--musa", type=str, default=None)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if args.rocm is None:
|
if args.musa is not None:
|
||||||
update_wheel_index(args.cuda)
|
update_wheel_index_musa(args.musa)
|
||||||
else:
|
elif args.rocm is not None:
|
||||||
update_wheel_index_rocm(args.rocm)
|
update_wheel_index_rocm(args.rocm)
|
||||||
|
else:
|
||||||
|
update_wheel_index(args.cuda)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user