name: Release sgl-deep-gemm on: workflow_dispatch: inputs: version: description: "Wheel version (e.g. 0.1.0, 0.1.1rc0)" type: string required: true target: type: choice description: "Build target (default: all)" required: false default: 'all' options: - 'all' - 'cu129' - 'cu130' branch: description: "DeepGEMM branch to build from (default: dev)" type: string required: false default: 'dev' concurrency: group: release-sgl-deepgemm-${{ github.ref }} cancel-in-progress: true env: # Must match TORCH_VER in docker/sgl-deep-gemm.Dockerfile — the wheel's # pre-compiled _C.so links against this torch ABI. TORCH_VER: "2.11.0" jobs: build-cu129-matrix: if: | github.repository == 'sgl-project/sglang' && (github.event.inputs.target == 'all' || github.event.inputs.target == 'cu129') strategy: matrix: python-version: ["3.12"] cuda-version: ["12.9"] arch: [x86_64, aarch64] include: - arch: x86_64 runner: x64-kernel-build-node - arch: aarch64 runner: arm-kernel-build-node runs-on: ${{ matrix.runner }} steps: - name: Clean workspace (remove root-owned files from prior runs) run: | docker run --rm -v "${{ github.workspace }}:/workspace" alpine:3 \ sh -c 'rm -rf /workspace/..?* /workspace/.[!.]* /workspace/*' || true - uses: actions/checkout@v4 - name: Checkout DeepGEMM uses: actions/checkout@v4 with: repository: sgl-project/DeepGEMM ref: ${{ inputs.branch || 'dev' }} path: DeepGEMM submodules: recursive - name: Set wheel version run: | echo -n "${{ inputs.version }}" > DeepGEMM/sgl_deep_gemm/VERSION cat DeepGEMM/sgl_deep_gemm/VERSION - name: Build wheel run: | chmod +x ./scripts/build_sgl_deep_gemm.sh ./scripts/rename_sgl_deep_gemm_whl.sh ./scripts/build_sgl_deep_gemm.sh "${{ matrix.python-version }}" "${{ matrix.cuda-version }}" "${{ github.workspace }}/DeepGEMM" "${{ matrix.arch }}" - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: deepgemm-wheel-cuda${{ matrix.cuda-version }}-${{ matrix.arch }} path: DeepGEMM/dist/*.whl test-cu129: needs: build-cu129-matrix strategy: fail-fast: false matrix: include: - arch_label: sm90 runner: 8-gpu-h200 wheel_arch: x86_64 - arch_label: sm100 runner: 8-gpu-b200 wheel_arch: x86_64 runs-on: ${{ matrix.runner }} timeout-minutes: 120 steps: - uses: actions/checkout@v4 - name: Checkout DeepGEMM uses: actions/checkout@v4 with: repository: sgl-project/DeepGEMM ref: ${{ inputs.branch || 'dev' }} path: DeepGEMM submodules: recursive - name: Download wheel uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true pattern: deepgemm-wheel-cuda12.9-${{ matrix.wheel_arch }} - name: Install wheel and deps env: CU_TAG: cu129 run: | python3 -m pip install --upgrade pip # deep_gemm imports torch before loading _C.so, so torch must preload the # libcudart the cu129 wheel links. Pin the CUDA-matched torch (see sgl-deep-gemm.Dockerfile). python3 -m pip install "torch==${TORCH_VER}" --index-url "https://download.pytorch.org/whl/${CU_TAG}" --force-reinstall python3 -m pip install numpy python3 -m pip install dist/*.whl python3 -c "import deep_gemm; print('deep_gemm:', deep_gemm.__file__)" - name: Run DeepGEMM test suite run: | chmod +x "${{ github.workspace }}/DeepGEMM/sgl_deep_gemm/run_tests.sh" "${{ github.workspace }}/DeepGEMM/sgl_deep_gemm/run_tests.sh" release-cu129: needs: [build-cu129-matrix, test-cu129] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true pattern: deepgemm-wheel-cuda12.9-* - name: Release uses: softprops/action-gh-release@v2 with: tag_name: v${{ inputs.version }} repository: sgl-project/whl token: ${{ secrets.GH_PAT_FOR_WHL_RELEASE }} files: | 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_deepgemm_whl_index.py --cuda 129 - 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 sgl-deep-gemm whl index for v${{ inputs.version }}" git push build-cu130-matrix: if: | github.repository == 'sgl-project/sglang' && (github.event.inputs.target == 'all' || github.event.inputs.target == 'cu130') strategy: matrix: python-version: ["3.12"] cuda-version: ["13.0"] arch: [x86_64, aarch64] include: - arch: x86_64 runner: x64-kernel-build-node - arch: aarch64 runner: arm-kernel-build-node runs-on: ${{ matrix.runner }} steps: - name: Clean workspace (remove root-owned files from prior runs) run: | docker run --rm -v "${{ github.workspace }}:/workspace" alpine:3 \ sh -c 'rm -rf /workspace/..?* /workspace/.[!.]* /workspace/*' || true - uses: actions/checkout@v4 - name: Checkout DeepGEMM uses: actions/checkout@v4 with: repository: sgl-project/DeepGEMM ref: ${{ inputs.branch || 'dev' }} path: DeepGEMM submodules: recursive - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Set wheel version run: | echo -n "${{ inputs.version }}" > DeepGEMM/sgl_deep_gemm/VERSION cat DeepGEMM/sgl_deep_gemm/VERSION - name: Build wheel run: | chmod +x ./scripts/build_sgl_deep_gemm.sh ./scripts/rename_sgl_deep_gemm_whl.sh ./scripts/build_sgl_deep_gemm.sh "${{ matrix.python-version }}" "${{ matrix.cuda-version }}" "${{ github.workspace }}/DeepGEMM" "${{ matrix.arch }}" # PyPI upload moved to release-cu130 so it is gated on test-cu130. - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: deepgemm-wheel-cuda${{ matrix.cuda-version }}-${{ matrix.arch }} path: DeepGEMM/dist/*.whl - name: Upload PyPI artifacts uses: actions/upload-artifact@v4 with: name: deepgemm-pypi-cuda${{ matrix.cuda-version }}-${{ matrix.arch }} path: DeepGEMM/dist-pypi/*.whl test-cu130: needs: build-cu130-matrix strategy: fail-fast: false matrix: include: - arch_label: sm90 runner: 8-gpu-h200 wheel_arch: x86_64 - arch_label: sm100 runner: 8-gpu-b200 wheel_arch: x86_64 - arch_label: sm100-aarch64 runner: 4-gpu-gb300 wheel_arch: aarch64 runs-on: ${{ matrix.runner }} timeout-minutes: 120 steps: - uses: actions/checkout@v4 - name: Checkout DeepGEMM uses: actions/checkout@v4 with: repository: sgl-project/DeepGEMM ref: ${{ inputs.branch || 'dev' }} path: DeepGEMM submodules: recursive - name: Download wheel uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true pattern: deepgemm-wheel-cuda13.0-${{ matrix.wheel_arch }} - name: Install wheel and deps env: CU_TAG: cu130 run: | python3 -m pip install --upgrade pip # deep_gemm imports torch before loading _C.so, so torch must preload the # libcudart the cu130 wheel links. Pin the CUDA-matched torch (see sgl-deep-gemm.Dockerfile). python3 -m pip install "torch==${TORCH_VER}" --index-url "https://download.pytorch.org/whl/${CU_TAG}" --force-reinstall python3 -m pip install numpy python3 -m pip install dist/*.whl python3 -c "import deep_gemm; print('deep_gemm:', deep_gemm.__file__)" - name: Run DeepGEMM test suite run: | chmod +x "${{ github.workspace }}/DeepGEMM/sgl_deep_gemm/run_tests.sh" "${{ github.workspace }}/DeepGEMM/sgl_deep_gemm/run_tests.sh" release-cu130: needs: [build-cu130-matrix, test-cu130] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true pattern: deepgemm-wheel-cuda13.0-* - name: Download PyPI artifacts uses: actions/download-artifact@v4 with: path: dist-pypi/ merge-multiple: true pattern: deepgemm-pypi-cuda13.0-* - name: Upload to PyPI run: | pip install --upgrade twine "packaging>=24.2" python3 -m twine upload --skip-existing dist-pypi/* -u __token__ -p ${{ secrets.SGL_DEEP_GEMM_PYPI_TOKEN }} - name: Release uses: softprops/action-gh-release@v2 with: tag_name: v${{ inputs.version }} repository: sgl-project/whl token: ${{ secrets.GH_PAT_FOR_WHL_RELEASE }} files: | 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_deepgemm_whl_index.py --cuda 130 - 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 sgl-deep-gemm whl index for v${{ inputs.version }}" git push