diff --git a/.github/workflows/release-whl-kernel.yml b/.github/workflows/release-whl-kernel.yml index e07cad866..9e6cb3717 100644 --- a/.github/workflows/release-whl-kernel.yml +++ b/.github/workflows/release-whl-kernel.yml @@ -8,6 +8,17 @@ on: - sgl-kernel/python/sgl_kernel/version.py workflow_dispatch: inputs: + target: + type: choice + description: 'Build target' + required: false + default: 'all' + options: + - 'all' + - 'cu129' + - 'cu130' + - 'rocm700' + - 'musa43' tag_name: type: string required: false @@ -22,7 +33,9 @@ concurrency: jobs: 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: matrix: python-version: ["3.10"] @@ -119,7 +132,9 @@ jobs: # for now we do not release CUDA 13.0 wheels to pypi 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: matrix: python-version: ["3.10"] @@ -209,7 +224,9 @@ jobs: git push 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 strategy: matrix: @@ -289,3 +306,82 @@ jobs: git add -A git commit -m "update whl index" 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 diff --git a/scripts/ci/musa/musa_install_dependency.sh b/scripts/ci/musa/musa_install_dependency.sh new file mode 100755 index 000000000..d3ef53d21 --- /dev/null +++ b/scripts/ci/musa/musa_install_dependency.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail + +PIP_INSTALL="python3 -m pip install --no-cache-dir" +${PIP_INSTALL} --upgrade pip setuptools torchada diff --git a/scripts/ci/musa/rename_wheels_musa.sh b/scripts/ci/musa/rename_wheels_musa.sh new file mode 100755 index 000000000..23ea57f2b --- /dev/null +++ b/scripts/ci/musa/rename_wheels_musa.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Rename MUSA wheels to include a +musa build tag. +# Usage: +# rename_wheels_musa.sh [wheel_dir] +# Example: +# rename_wheels_musa.sh 43 sgl-kernel/dist + +if [[ $# -lt 1 || $# -gt 2 ]]; then + echo "Usage: $0 [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 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." diff --git a/scripts/update_kernel_whl_index.py b/scripts/update_kernel_whl_index.py index fbe7eb940..4b0844f53 100644 --- a/scripts/update_kernel_whl_index.py +++ b/scripts/update_kernel_whl_index.py @@ -46,34 +46,45 @@ def update_wheel_index(cuda_version=DEFAULT_CUDA_VERSION, rocm_version=None): f.write(f'{path.name}
\n') -def update_wheel_index_rocm(rocm_version): - index_dir = pathlib.Path(f"sgl-whl/rocm{rocm_version}/sgl-kernel") +def _update_non_cuda_wheel_index(backend, version): + index_dir = pathlib.Path(f"sgl-whl/{backend}{version}/sgl-kernel") index_dir.mkdir(exist_ok=True, parents=True) base_url = "https://github.com/sgl-project/whl/releases/download" for path in sorted(pathlib.Path("sgl-kernel/dist").glob("*.whl")): - # Skip the wheel if not rocm - if re.search(f"rocm", path.name) is None: + # Skip the wheel if not for this backend + if re.search(f"{backend}", path.name) is None: continue with open(path, "rb") as f: sha256 = hashlib.sha256(f.read()).hexdigest() 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] full_url = f"{base_url}/v{ver}/{path.name}#sha256={sha256}" with (index_dir / "index.html").open("a") as f: f.write(f'{path.name}
\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(): parser = argparse.ArgumentParser() parser.add_argument("--cuda", type=str, default=DEFAULT_CUDA_VERSION) parser.add_argument("--rocm", type=str, default=None) + parser.add_argument("--musa", type=str, default=None) args = parser.parse_args() - if args.rocm is None: - update_wheel_index(args.cuda) - else: + if args.musa is not None: + update_wheel_index_musa(args.musa) + elif args.rocm is not None: update_wheel_index_rocm(args.rocm) + else: + update_wheel_index(args.cuda) if __name__ == "__main__":