From 52c191da52390fa5508de98eddd1e3eca2dbcfb2 Mon Sep 17 00:00:00 2001 From: Mohammad Miadh Angkad <176301910+mmangkad@users.noreply.github.com> Date: Fri, 11 Sep 2026 07:58:09 +0800 Subject: [PATCH] [Deps] Retire the CUDA 12 lane (#38404) Co-authored-by: Mohammad Angkad --- .../workflows/_docker-build-and-publish.yml | 113 ++++-------------- .github/workflows/patch-docker-dev.yml | 2 +- .github/workflows/release-docker-dev.yml | 14 +-- .github/workflows/release-docker-runtime.yml | 5 +- .github/workflows/release-docker.yml | 5 +- .github/workflows/release-pypi-nightly.yml | 10 +- .github/workflows/release-whl-deepep.yml | 110 ++--------------- .github/workflows/release-whl-deepgemm.yml | 87 -------------- .github/workflows/release-whl-kernel.yml | 105 ---------------- .github/workflows/retag-docker.yml | 2 +- .github/workflows/trivy-scan-dev.yml | 2 +- docker/Dockerfile | 92 +++----------- docker/Dockerfile.cu134 | 81 ++----------- docker/sgl-deep-ep.Dockerfile | 20 +--- docker/sgl-deep-gemm.Dockerfile | 3 +- .../autoregressive/MiniMax/MiniMax-M3.mdx | 2 +- .../autoregressive/OpenBMB/MiniCPM-V-4_6.mdx | 3 +- .../ThinkingMachines/Inkling-Small.mdx | 4 +- .../ThinkingMachines/Inkling.mdx | 4 +- .../developer_guide/contribution_guide.mdx | 12 +- docs/docs/get-started/install.mdx | 23 +--- .../snippets/configs/MiniMaxAI/minimax-m3.jsx | 7 +- .../thinkingmachines/inkling-small.jsx | 3 +- .../configs/thinkingmachines/inkling.jsx | 3 +- python/sglang/kernels/aot/Dockerfile | 3 +- .../aot/python/sgl_kernel/load_utils.py | 7 +- python/sglang/kernels/aot/rename_wheels.sh | 8 +- python/sglang/kernels/jit/utils/arch.py | 2 +- scripts/build_sgl_deep_gemm.sh | 5 +- scripts/build_sgl_deepep.sh | 9 +- scripts/ci/cuda/ci_install_dependency.sh | 110 +++++------------ .../ci/utils/docker_build_metadata_args.py | 2 +- scripts/rename_sgl_deep_gemm_whl.sh | 2 +- scripts/update_deepep_whl_index.py | 2 +- scripts/update_deepgemm_whl_index.py | 4 +- scripts/update_kernel_whl_index.py | 23 ++-- scripts/update_nightly_whl_index.py | 4 +- .../tools/test_docker_build_metadata_args.py | 14 +-- 38 files changed, 170 insertions(+), 737 deletions(-) diff --git a/.github/workflows/_docker-build-and-publish.yml b/.github/workflows/_docker-build-and-publish.yml index 6a84a7b19..22f21ef70 100644 --- a/.github/workflows/_docker-build-and-publish.yml +++ b/.github/workflows/_docker-build-and-publish.yml @@ -1,7 +1,7 @@ name: Build and Publish Multi-Arch Docker Images -# Reusable workflow: builds CUDA 12 + CUDA 13 images for amd64 and arm64, -# then creates multi-arch manifests with caller-specified tags. +# Reusable workflow: builds CUDA 13 images for amd64 and arm64, then creates +# multi-arch manifests with caller-specified tags. on: workflow_call: @@ -26,7 +26,7 @@ on: type: string default: "" tag_config: - description: 'JSON array of {"cuda":"cu129|cu130","tags":["tag1","tag2"]}. Tags support {version} substitution.' + description: 'JSON array of {"cuda":"cu130","tags":["tag1","tag2"]}. Tags support {version} substitution.' required: true type: string use_environment: @@ -50,7 +50,6 @@ jobs: SGL_VERSION: ${{ inputs.sgl_version }} IMAGE_REPO: ${{ inputs.image_repo }} outputs: - digest-cu129: ${{ steps.build-cu129.outputs.digest }} digest-cu130: ${{ steps.build-cu130.outputs.digest }} steps: - name: Delete huge unnecessary tools folder @@ -69,16 +68,14 @@ jobs: set -euo pipefail BUILD_COMMIT="$(git rev-parse HEAD)" BUILD_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" - for CUDA_VARIANT in cu129 cu130; do - python3 scripts/ci/utils/docker_build_metadata_args.py \ - --cuda "${CUDA_VARIANT}" \ - --tag-config "${TAG_CONFIG}" \ - --image-repo "${IMAGE_REPO}" \ - --sgl-version "${SGL_VERSION}" \ - --build-commit "${BUILD_COMMIT}" \ - --build-url "${BUILD_URL}" \ - > "/tmp/docker-metadata-${CUDA_VARIANT}.args" - done + python3 scripts/ci/utils/docker_build_metadata_args.py \ + --cuda cu130 \ + --tag-config "${TAG_CONFIG}" \ + --image-repo "${IMAGE_REPO}" \ + --sgl-version "${SGL_VERSION}" \ + --build-commit "${BUILD_COMMIT}" \ + --build-url "${BUILD_URL}" \ + > /tmp/docker-metadata-cu130.args - name: Free disk space uses: jlumbroso/free-disk-space@main @@ -106,34 +103,6 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push AMD64 image (CUDA 12) - id: build-cu129 - run: | - VERSION_ARG="" - if [ -n "${SGL_VERSION}" ]; then - VERSION_ARG="--build-arg SGL_VERSION=${SGL_VERSION}" - fi - mapfile -t METADATA_ARGS < /tmp/docker-metadata-cu129.args - - docker buildx build \ - --target ${{ inputs.docker_target }} \ - --platform linux/amd64 \ - --output type=image,name=${{ inputs.image_repo }},push-by-digest=true,name-canonical=true,push=true \ - -f docker/Dockerfile \ - --build-arg CUDA_VERSION=12.9.2 \ - --build-arg BUILD_TYPE=all \ - --build-arg INSTALL_FLASHINFER_JIT_CACHE=1 \ - "${METADATA_ARGS[@]}" \ - ${VERSION_ARG} \ - ${{ inputs.extra_build_args }} \ - --metadata-file /tmp/metadata-cu129.json \ - --no-cache \ - . - - DIGEST=$(python3 -c "import json; print(json.load(open('/tmp/metadata-cu129.json'))['containerimage.digest'])") - echo "Pushed digest: ${DIGEST}" - echo "digest=${DIGEST}" >> $GITHUB_OUTPUT - - name: Build and push AMD64 image (CUDA 13) id: build-cu130 run: | @@ -171,7 +140,6 @@ jobs: SGL_VERSION: ${{ inputs.sgl_version }} IMAGE_REPO: ${{ inputs.image_repo }} outputs: - digest-cu129: ${{ steps.build-cu129.outputs.digest }} digest-cu130: ${{ steps.build-cu130.outputs.digest }} steps: - name: Delete huge unnecessary tools folder @@ -190,16 +158,14 @@ jobs: set -euo pipefail BUILD_COMMIT="$(git rev-parse HEAD)" BUILD_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" - for CUDA_VARIANT in cu129 cu130; do - python3 scripts/ci/utils/docker_build_metadata_args.py \ - --cuda "${CUDA_VARIANT}" \ - --tag-config "${TAG_CONFIG}" \ - --image-repo "${IMAGE_REPO}" \ - --sgl-version "${SGL_VERSION}" \ - --build-commit "${BUILD_COMMIT}" \ - --build-url "${BUILD_URL}" \ - > "/tmp/docker-metadata-${CUDA_VARIANT}.args" - done + python3 scripts/ci/utils/docker_build_metadata_args.py \ + --cuda cu130 \ + --tag-config "${TAG_CONFIG}" \ + --image-repo "${IMAGE_REPO}" \ + --sgl-version "${SGL_VERSION}" \ + --build-commit "${BUILD_COMMIT}" \ + --build-url "${BUILD_URL}" \ + > /tmp/docker-metadata-cu130.args - name: Prune Docker to reclaim disk space run: | @@ -216,34 +182,6 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push ARM64 image (CUDA 12) - id: build-cu129 - run: | - VERSION_ARG="" - if [ -n "${SGL_VERSION}" ]; then - VERSION_ARG="--build-arg SGL_VERSION=${SGL_VERSION}" - fi - mapfile -t METADATA_ARGS < /tmp/docker-metadata-cu129.args - - docker buildx build \ - --target ${{ inputs.docker_target }} \ - --platform linux/arm64 \ - --output type=image,name=${{ inputs.image_repo }},push-by-digest=true,name-canonical=true,push=true \ - -f docker/Dockerfile \ - --build-arg CUDA_VERSION=12.9.2 \ - --build-arg BUILD_TYPE=all \ - --build-arg INSTALL_FLASHINFER_JIT_CACHE=1 \ - "${METADATA_ARGS[@]}" \ - ${VERSION_ARG} \ - ${{ inputs.extra_build_args }} \ - --metadata-file /tmp/metadata-cu129.json \ - --no-cache \ - . - - DIGEST=$(python3 -c "import json; print(json.load(open('/tmp/metadata-cu129.json'))['containerimage.digest'])") - echo "Pushed digest: ${DIGEST}" - echo "digest=${DIGEST}" >> $GITHUB_OUTPUT - - name: Build and push ARM64 image (CUDA 13) id: build-cu130 run: | @@ -292,22 +230,13 @@ jobs: TAG_CONFIG: ${{ inputs.tag_config }} SGL_VERSION: ${{ inputs.sgl_version }} IMAGE_REPO: ${{ inputs.image_repo }} - X86_CU129: ${{ needs.build-x86.outputs.digest-cu129 }} X86_CU130: ${{ needs.build-x86.outputs.digest-cu130 }} - ARM64_CU129: ${{ needs.build-arm64.outputs.digest-cu129 }} ARM64_CU130: ${{ needs.build-arm64.outputs.digest-cu130 }} SHORT_SHA: ${{ github.sha }} run: | echo "${TAG_CONFIG}" | jq -c '.[]' | while read -r entry; do - CUDA=$(echo "${entry}" | jq -r '.cuda') - - if [ "${CUDA}" = "cu129" ]; then - X86_DIGEST="${X86_CU129}" - ARM64_DIGEST="${ARM64_CU129}" - else - X86_DIGEST="${X86_CU130}" - ARM64_DIGEST="${ARM64_CU130}" - fi + X86_DIGEST="${X86_CU130}" + ARM64_DIGEST="${ARM64_CU130}" TAG_ARGS="" for tag in $(echo "${entry}" | jq -r '.tags[]'); do diff --git a/.github/workflows/patch-docker-dev.yml b/.github/workflows/patch-docker-dev.yml index d46d21e17..7ecd5b674 100644 --- a/.github/workflows/patch-docker-dev.yml +++ b/.github/workflows/patch-docker-dev.yml @@ -8,7 +8,7 @@ on: required: false default: "" image_tag: - description: "Base image tag to patch (e.g. dev, dev-cu13, dev-cu12)" + description: "Base image tag to patch (e.g. dev, dev-cu13)" required: true output_tag: description: "Tag to publish as. Overwrites it if it already exists." diff --git a/.github/workflows/release-docker-dev.yml b/.github/workflows/release-docker-dev.yml index d212f0cef..bff64e962 100644 --- a/.github/workflows/release-docker-dev.yml +++ b/.github/workflows/release-docker-dev.yml @@ -25,7 +25,7 @@ on: required: false default: "" overlay_cudas: - description: "Comma-separated cuda variants to overlay onto (cu12, cu13). Default 'cu13'." + description: "Comma-separated cuda variants to overlay onto (cu13). Default 'cu13'." required: false default: "cu13" overlay_tag_suffix: @@ -86,9 +86,9 @@ jobs: # consumers pinned to the pre-flip names. if [ -z "${SUFFIX}" ]; then # Nightly: include dated tags - TAG_CONFIG='[{"cuda":"cu129","tags":["dev-cu12","nightly-dev-cu12-{date}-{short_sha}"]},{"cuda":"cu130","tags":["dev","dev-cu13","nightly-dev-{date}-{short_sha}","nightly-dev-cu13-{date}-{short_sha}"]}]' + TAG_CONFIG='[{"cuda":"cu130","tags":["dev","dev-cu13","nightly-dev-{date}-{short_sha}","nightly-dev-cu13-{date}-{short_sha}"]}]' else - TAG_CONFIG="[{\"cuda\":\"cu129\",\"tags\":[\"dev-cu12${SUFFIX}\"]},{\"cuda\":\"cu130\",\"tags\":[\"dev${SUFFIX}\",\"dev-cu13${SUFFIX}\"]}]" + TAG_CONFIG="[{\"cuda\":\"cu130\",\"tags\":[\"dev${SUFFIX}\",\"dev-cu13${SUFFIX}\"]}]" fi echo "tag_config=${TAG_CONFIG}" >> $GITHUB_OUTPUT @@ -97,7 +97,7 @@ jobs: # SUFFIX was computed above from inputs.tag / inputs.pr_number. if [ -n "${OVERLAY_DOCKERFILE_INPUT}" ]; then # Refuse to overlay without a tag/pr_number: SUFFIX would be empty, - # so base would point at the moving 'dev'/'dev-cu12'/'dev-cu13' + # so base would point at the moving 'dev'/'dev-cu13' # latest tags and overwrite mode would clobber them. if [ -z "${SUFFIX}" ]; then echo "overlay_dockerfile is set but neither 'tag' nor 'pr_number' was given." >&2 @@ -112,10 +112,8 @@ jobs: C="$(echo "${C}" | xargs)" if [ "${C}" = "cu13" ]; then BASES='["dev'"${SUFFIX}"'","dev-cu13'"${SUFFIX}"'"]' - elif [ "${C}" = "cu12" ]; then - BASES='["dev-cu12'"${SUFFIX}"'"]' else - echo "Unknown overlay cuda variant: ${C} (expected cu12 or cu13)" >&2 + echo "Unknown overlay cuda variant: ${C} (expected cu13)" >&2 exit 1 fi if [ -n "${OVERLAY_SUFFIX_INPUT}" ]; then @@ -213,7 +211,7 @@ jobs: if: ${{ !inputs.build_only && !inputs.tag && !inputs.pr_number }} uses: ./.github/workflows/_docker-cleanup-nightly.yml with: - tag_prefixes: '["nightly-dev", "nightly-dev-cu12", "nightly-dev-cu13"]' + tag_prefixes: '["nightly-dev", "nightly-dev-cu13"]' image_repo: ${{ inputs.image_repo || 'lmsysorg/sglang' }} secrets: inherit diff --git a/.github/workflows/release-docker-runtime.yml b/.github/workflows/release-docker-runtime.yml index 0e224bf91..eee7b1479 100644 --- a/.github/workflows/release-docker-runtime.yml +++ b/.github/workflows/release-docker-runtime.yml @@ -2,7 +2,7 @@ name: Release Docker Runtime Images # # Builds and publishes runtime Docker images (production-optimized, ~50% smaller): # - lmsysorg/sglang:v{version}-runtime, lmsysorg/sglang:latest-runtime -# - lmsysorg/sglang:v{version}-cu129-runtime, lmsysorg/sglang:latest-cu129-runtime +# - lmsysorg/sglang:v{version}-cu130-runtime, lmsysorg/sglang:latest-cu130-runtime # on: push: @@ -49,7 +49,6 @@ jobs: image_repo: ${{ inputs.image_repo || 'lmsysorg/sglang' }} tag_config: | [ - {"cuda": "cu130", "tags": ["v${{ needs.resolve-version.outputs.version }}-runtime", "latest-runtime", "v${{ needs.resolve-version.outputs.version }}-cu130-runtime", "latest-cu130-runtime"]}, - {"cuda": "cu129", "tags": ["v${{ needs.resolve-version.outputs.version }}-cu129-runtime", "latest-cu129-runtime"]} + {"cuda": "cu130", "tags": ["v${{ needs.resolve-version.outputs.version }}-runtime", "latest-runtime", "v${{ needs.resolve-version.outputs.version }}-cu130-runtime", "latest-cu130-runtime"]} ] secrets: inherit diff --git a/.github/workflows/release-docker.yml b/.github/workflows/release-docker.yml index edf21469e..fcc36a631 100644 --- a/.github/workflows/release-docker.yml +++ b/.github/workflows/release-docker.yml @@ -2,7 +2,7 @@ name: Release Docker Images # # Builds and publishes framework Docker images (full development environment): # - lmsysorg/sglang:v{version}, lmsysorg/sglang:latest (cuda 13) -# - lmsysorg/sglang:v{version}-cu129, lmsysorg/sglang:latest-cu129 +# - lmsysorg/sglang:v{version}-cu130, lmsysorg/sglang:latest-cu130 # on: push: @@ -49,7 +49,6 @@ jobs: image_repo: ${{ inputs.image_repo || 'lmsysorg/sglang' }} tag_config: | [ - {"cuda": "cu130", "tags": ["v${{ needs.resolve-version.outputs.version }}", "latest", "v${{ needs.resolve-version.outputs.version }}-cu130", "latest-cu130"]}, - {"cuda": "cu129", "tags": ["v${{ needs.resolve-version.outputs.version }}-cu129", "latest-cu129"]} + {"cuda": "cu130", "tags": ["v${{ needs.resolve-version.outputs.version }}", "latest", "v${{ needs.resolve-version.outputs.version }}-cu130", "latest-cu130"]} ] secrets: inherit diff --git a/.github/workflows/release-pypi-nightly.yml b/.github/workflows/release-pypi-nightly.yml index b072a8316..8a069e5de 100644 --- a/.github/workflows/release-pypi-nightly.yml +++ b/.github/workflows/release-pypi-nightly.yml @@ -113,13 +113,13 @@ jobs: environment: 'prod' strategy: fail-fast: false - # The wheel is CUDA-agnostic and built once — we just register the same - # artifact under cu129/sglang/ and cu130/sglang/ wheel indexes so users - # can install via either --extra-index-url. Serialize because both matrix - # runs clone and push to the same sgl-whl branch. + # The wheel is CUDA-agnostic and built once — we just register it under + # the cu130/sglang/ wheel index so users can install via + # --extra-index-url. Serialize because matrix runs clone and push to the + # same sgl-whl branch. max-parallel: 1 matrix: - cuda_version: ['129', '130'] + cuda_version: ['130'] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/release-whl-deepep.yml b/.github/workflows/release-whl-deepep.yml index 2a23e36d7..93b71f8ac 100644 --- a/.github/workflows/release-whl-deepep.yml +++ b/.github/workflows/release-whl-deepep.yml @@ -7,15 +7,6 @@ on: description: "Public wheel version (for example, 0.1.0 or 0.1.1rc0)" type: string required: true - target: - description: "CUDA target" - type: choice - required: false - default: "all" - options: - - "all" - - "cu129" - - "cu130" packaging-ref: description: "DeepEP ref containing the shared sgl_deep_ep overlay" type: string @@ -30,75 +21,8 @@ env: TORCH_VERSION: "2.13.0" jobs: - build-cu129-matrix: - if: | - github.repository == 'sgl-project/sglang' && - (inputs.target == 'all' || inputs.target == 'cu129') - strategy: - fail-fast: false - matrix: - python-version: ["3.10", "3.12"] - arch: [x86_64, aarch64] - include: - - arch: x86_64 - runner: x64-kernel-build-node - source-branch: sgl-deepep-cu12-x86 - - arch: aarch64 - runner: arm-kernel-build-node - source-branch: sgl-deepep-cu12-arm - runs-on: ${{ matrix.runner }} - steps: - - name: Clean workspace - run: | - docker run --rm -v "${{ github.workspace }}:/workspace" alpine:3 \ - sh -c 'rm -rf /workspace/..?* /workspace/.[!.]* /workspace/*' || true - - - name: Checkout SGLang - uses: actions/checkout@v4 - - - name: Checkout DeepEP implementation - uses: actions/checkout@v4 - with: - repository: sgl-project/DeepEP - ref: ${{ matrix.source-branch }} - path: DeepEP-source - submodules: recursive - - - name: Checkout DeepEP packaging overlay - uses: actions/checkout@v4 - with: - repository: sgl-project/DeepEP - ref: ${{ inputs['packaging-ref'] || 'sgl-deepep-packaging' }} - path: DeepEP-packaging - sparse-checkout: sgl_deep_ep - - - name: Set wheel version - env: - RELEASE_VERSION: ${{ inputs.version }} - run: | - printf '%s' "${RELEASE_VERSION}" > DeepEP-packaging/sgl_deep_ep/VERSION - - - name: Build wheel - run: | - chmod +x scripts/build_sgl_deepep.sh DeepEP-packaging/sgl_deep_ep/build_sgl_deep_ep.sh - scripts/build_sgl_deepep.sh \ - "${{ matrix.python-version }}" \ - "12.9" \ - "${{ github.workspace }}/DeepEP-source" \ - "${{ github.workspace }}/DeepEP-packaging/sgl_deep_ep" \ - "${{ matrix.arch }}" - - - name: Upload wheel - uses: actions/upload-artifact@v4 - with: - name: deepep-wheel-cu129-py${{ matrix.python-version }}-${{ matrix.arch }} - path: DeepEP-source/dist/*.whl - if-no-files-found: error - build-cu130-matrix: - if: | - github.repository == 'sgl-project/sglang' && - (inputs.target == 'all' || inputs.target == 'cu130') + if: github.repository == 'sgl-project/sglang' strategy: fail-fast: false matrix: @@ -168,19 +92,10 @@ jobs: if-no-files-found: error release-whl: - needs: [build-cu129-matrix, build-cu130-matrix] + needs: build-cu130-matrix if: | - always() && github.repository == 'sgl-project/sglang' && - ( - (inputs.target == 'cu129' && needs.build-cu129-matrix.result == 'success') || - (inputs.target == 'cu130' && needs.build-cu130-matrix.result == 'success') || - ( - inputs.target == 'all' && - needs.build-cu129-matrix.result == 'success' && - needs.build-cu130-matrix.result == 'success' - ) - ) + needs.build-cu130-matrix.result == 'success' runs-on: ubuntu-latest steps: - name: Checkout SGLang @@ -209,14 +124,8 @@ jobs: git clone --branch gh-pages \ "https://oauth2:${WHL_TOKEN}@github.com/sgl-project/whl.git" sgl-whl - - name: Update wheel indexes - run: | - if [[ "${{ inputs.target }}" == "all" || "${{ inputs.target }}" == "cu129" ]]; then - python3 scripts/update_deepep_whl_index.py --cuda 129 - fi - if [[ "${{ inputs.target }}" == "all" || "${{ inputs.target }}" == "cu130" ]]; then - python3 scripts/update_deepep_whl_index.py --cuda 130 - fi + - name: Update wheel index + run: python3 scripts/update_deepep_whl_index.py --cuda 130 - name: Push wheel indexes env: @@ -234,15 +143,10 @@ jobs: fi release-pypi: - needs: [build-cu129-matrix, build-cu130-matrix] + needs: build-cu130-matrix if: | - always() && github.repository == 'sgl-project/sglang' && - needs.build-cu130-matrix.result == 'success' && - ( - inputs.target == 'cu130' || - (inputs.target == 'all' && needs.build-cu129-matrix.result == 'success') - ) + needs.build-cu130-matrix.result == 'success' runs-on: ubuntu-latest steps: - name: Download PyPI wheels diff --git a/.github/workflows/release-whl-deepgemm.yml b/.github/workflows/release-whl-deepgemm.yml index b321bc946..ed24da92d 100644 --- a/.github/workflows/release-whl-deepgemm.yml +++ b/.github/workflows/release-whl-deepgemm.yml @@ -14,7 +14,6 @@ on: default: 'all' options: - 'all' - - 'cu129' - 'cu130' branch: description: "DeepGEMM branch to build from (default: dev)" @@ -33,92 +32,6 @@ env: TORCH_VER: "2.13.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 - - release-cu129: - needs: build-cu129-matrix - 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' && diff --git a/.github/workflows/release-whl-kernel.yml b/.github/workflows/release-whl-kernel.yml index f6e141741..560286a84 100644 --- a/.github/workflows/release-whl-kernel.yml +++ b/.github/workflows/release-whl-kernel.yml @@ -15,7 +15,6 @@ on: default: 'all' options: - 'all' - - 'cu129' - 'cu130' - 'rocm700' - 'rocm720' @@ -35,110 +34,6 @@ concurrency: cancel-in-progress: true jobs: - # cu130 is the PyPI-released variant; cu129 wheels are published only to the - # sgl-project/whl index (consumed via `pip install ...+cu129` for the legacy - # cuda 12.9 path), not to PyPI. - build-cu129-matrix: - if: | - github.repository == 'sgl-project/sglang' && - (github.event_name == 'push' || github.event.inputs.target == 'all' || github.event.inputs.target == 'cu129') - strategy: - matrix: - python-version: ["3.10"] - 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: - # Self-hosted build nodes retain the workspace across jobs. Prior builds - # leave root-owned artifacts under python/sglang/kernels/aot/build/ that actions/checkout - # cannot remove, causing EACCES on rmdir. Wipe them via a throwaway root - # container before checkout recreates the workspace. - - 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 - with: - submodules: "recursive" - ref: ${{ inputs.pr_number && format('refs/pull/{0}/head', inputs.pr_number) || '' }} - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - - name: Build wheels - run: | - cd python/sglang/kernels/aot - chmod +x ./build.sh - ./build.sh "${{ matrix.python-version }}" "${{ matrix.cuda-version }}" ${{ matrix.arch == 'aarch64' && 'aarch64' || '' }} - env: - BUILD_JOBS: 64 - NVCC_THREADS: 8 - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: wheel-python${{ matrix.python-version }}-cuda${{ matrix.cuda-version }}${{ matrix.arch == 'aarch64' && '-aarch64' || '' }} - path: python/sglang/kernels/aot/dist/* - - release-cu129: - needs: build-cu129-matrix - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ inputs.pr_number && format('refs/pull/{0}/head', inputs.pr_number) || '' }} - - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - path: python/sglang/kernels/aot/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 python/sglang/kernels/aot/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: | - python/sglang/kernels/aot/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 --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 whl index" - git push - build-cu130-matrix: if: | github.repository == 'sgl-project/sglang' && diff --git a/.github/workflows/retag-docker.yml b/.github/workflows/retag-docker.yml index 633a275ed..aa6ab03a7 100644 --- a/.github/workflows/retag-docker.yml +++ b/.github/workflows/retag-docker.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: source_tag: - description: "Existing image tag (e.g., v0.4.7-cu129-amd64)" + description: "Existing image tag (e.g., v0.4.7-cu130-amd64)" required: true target_tag: description: "New tag to apply (e.g., latest)" diff --git a/.github/workflows/trivy-scan-dev.yml b/.github/workflows/trivy-scan-dev.yml index f35476597..ab315cab6 100644 --- a/.github/workflows/trivy-scan-dev.yml +++ b/.github/workflows/trivy-scan-dev.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - tag: ${{ inputs.tag && fromJSON(format('["{0}"]', inputs.tag)) || fromJSON('["dev", "dev-cu12"]') }} + tag: ${{ inputs.tag && fromJSON(format('["{0}"]', inputs.tag)) || fromJSON('["dev", "dev-cu13"]') }} steps: - name: Cleanup workspace (remove root-owned files from prior runs) run: sudo rm -rf "$GITHUB_WORKSPACE"/* || true diff --git a/docker/Dockerfile b/docker/Dockerfile index 49d56652f..1dc3b079b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,7 +6,6 @@ ARG BUILD_TYPE=all ARG BRANCH_TYPE=remote ARG SGL_KERNEL_VERSION=0.4.6.post1 ARG SGL_VERSION -ARG SGL_DEEP_GEMM_VERSION=0.1.7 ARG USE_LATEST_SGLANG=0 ARG GDRCOPY_VERSION=2.5.1 ARG SGL_NCCL_VERSION=2.30.7 @@ -185,25 +184,11 @@ RUN curl --proto '=https' --tlsv1.2 --retry 3 --retry-delay 2 -sSf https://sh.ru RUN --mount=type=cache,target=/root/.cache/pip \ python3 -m pip install --upgrade pip setuptools wheel html5lib six \ && case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ - 13.0.3) CUINDEX=130 ;; \ + 13.0.3) ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ esac \ - && if [ "$CUDA_VERSION" = "12.6.3" ]; then \ - python3 -m pip install https://${GITHUB_ARTIFACTORY}/sgl-project/whl/releases/download/v${SGL_KERNEL_VERSION}/sglang_kernel-${SGL_KERNEL_VERSION}+cu124-cp310-abi3-manylinux2014_$(uname -m).whl --force-reinstall --no-deps \ - ; \ - elif [ "$CUDA_VERSION" = "12.9.2" ]; then \ - python3 -m pip install https://${GITHUB_ARTIFACTORY}/sgl-project/whl/releases/download/v${SGL_KERNEL_VERSION}/sglang_kernel-${SGL_KERNEL_VERSION}+cu129-cp310-abi3-manylinux2014_$(uname -m).whl --force-reinstall --no-deps \ - ; \ - elif [ "$CUDA_VERSION" = "13.0.3" ]; then \ - # --no-deps prevents pip from pulling torch from default PyPI - python3 -m pip install sglang-kernel==${SGL_KERNEL_VERSION} --force-reinstall --no-deps \ - ; \ - else \ - echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 \ - ; \ - fi + # --no-deps prevents pip from pulling torch from default PyPI + && python3 -m pip install sglang-kernel==${SGL_KERNEL_VERSION} --force-reinstall --no-deps # Copy dep spec + Rust crate source + proto files. setuptools-rust compiles the # Rust extension during the stub wheel build; the crate's build.rs references @@ -214,15 +199,11 @@ COPY rust/sglang-grpc /tmp/sglang_deps/rust/sglang-grpc COPY rust/sglang-mm /tmp/sglang_deps/rust/sglang-mm COPY proto /tmp/sglang_deps/proto -# Install sglang dependencies (torch, transformers, etc.). CUDA 12 DeepEP -# wheels live only on the SGLang index, so preinstall the local-version wheel; -# it satisfies the public-version pyproject pin during the full dependency solve. +# Install sglang dependencies (torch, transformers, etc.). # Generate constraints.txt to prevent reinstalling these deps in later stages. RUN --mount=type=cache,target=/root/.cache/pip \ --mount=type=cache,target=/root/.cargo/registry \ case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ 13.0.3) CUINDEX=130 ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ esac \ @@ -232,27 +213,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \ && echo '__version__ = "0.0.0"' > sglang/version.py \ && touch README.md \ && touch LICENSE \ - && SGL_DEEP_EP_VERSION="$(sed -n 's/^[[:space:]]*"sgl-deep-ep==\([^"]*\)",/\1/p' pyproject.toml)" \ - && test -n "${SGL_DEEP_EP_VERSION}" \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - python3 -m pip install \ - "sgl-deep-ep==${SGL_DEEP_EP_VERSION}+cu129" \ - --index-url "https://docs.sglang.ai/whl/cu129/" \ - --no-deps; \ - fi \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - sed -i 's/cuda-python>=13\.0/cuda-python>=12,<13/' pyproject.toml && \ - sed -i 's/flashinfer_python\[cu13\]/flashinfer_python[cu12]/' pyproject.toml && \ - sed -i 's/nvidia-cutlass-dsl\[cu13\]/nvidia-cutlass-dsl/' pyproject.toml; \ - fi \ && python3 -m pip install --extra-index-url https://download.pytorch.org/whl/cu${CUINDEX} ".[${BUILD_TYPE}]" \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - pip list --format=freeze | awk -F'==' '/-cu13(==|$)/ {print $1}' \ - | xargs -r python3 -m pip uninstall -y && \ - python3 -m pip install --index-url https://download.pytorch.org/whl/cu${CUINDEX} \ - torch==2.13.0 torchvision==0.28.0 torchaudio==2.11.0 --force-reinstall; \ - python3 -m pip install https://github.com/sgl-project/whl/releases/download/v${SGL_DEEP_GEMM_VERSION}/sgl_deep_gemm-${SGL_DEEP_GEMM_VERSION}+cu129-py3-none-manylinux2014_$(uname -m).whl --force-reinstall; \ - fi \ && cd /sgl-workspace \ && rm -rf /tmp/sglang_deps \ && pip freeze | grep -v "^sglang==" > /sgl-workspace/constraints.txt @@ -315,8 +276,6 @@ ARG FLASHINFER_VERSION # Stage jit-cache/cubin artifacts into /flashinfer_jit_output for clean COPY later RUN --mount=type=cache,target=/root/.cache/pip \ case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ 13.0.3) CUINDEX=130 ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ esac \ @@ -503,21 +462,12 @@ RUN --mount=type=cache,target=/var/cache/apt,id=framework-apt \ # Install Mooncake RUN --mount=type=cache,target=/root/.cache/pip \ - CUDA_MAJOR="${CUDA_VERSION%%.*}" && \ - if [ "$CUDA_MAJOR" -ge 13 ]; then \ - python3 -m pip install mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION}; \ - else \ - python3 -m pip install mooncake-transfer-engine==${MOONCAKE_VERSION}; \ - fi + python3 -m pip install mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION} # Install MSCCL++ Python dependencies and package (builds extension via CMake through pip) RUN --mount=type=cache,target=/root/.cache/pip \ git clone --depth=1 --branch ${MSCCLPP_VERSION} https://${GITHUB_ARTIFACTORY}/microsoft/mscclpp.git /tmp/mscclpp \ && case "${CUDA_VERSION}" in \ - 12.*) \ - CMAKE_ARGS="-DMSCCLPP_BYPASS_GPU_CHECK=ON -DMSCCLPP_USE_CUDA=ON -DMSCCLPP_GPU_ARCHS=80,90,100,100a,103,103a" \ - python3 -m pip install "/tmp/mscclpp[cuda12]"; \ - ;; \ 13.*) \ CMAKE_ARGS="-DMSCCLPP_BYPASS_GPU_CHECK=ON -DMSCCLPP_USE_CUDA=ON -DMSCCLPP_GPU_ARCHS=80,90,100,100a,103,103a" \ python3 -m pip install "/tmp/mscclpp[cuda13]"; \ @@ -553,22 +503,15 @@ RUN --mount=type=cache,target=/root/.cache/pip \ # resolving dependencies and generating constraints.txt. DeepEP needs 2.30.7 # at runtime; apply the override only after the constrained dependency solve. RUN --mount=type=cache,target=/root/.cache/pip \ - if [ "${CUDA_VERSION%%.*}" = "13" ]; then \ - python3 -m pip install --force-reinstall --no-deps \ - "nvidia-nccl-cu13==${SGL_NCCL_VERSION}"; \ - fi + python3 -m pip install --force-reinstall --no-deps \ + "nvidia-nccl-cu13==${SGL_NCCL_VERSION}" -# Per-CUDA-major package installs. The `nixl` stub package is needed (it owns -# the `nixl` import path) but unconditionally requires nixl-cu12, so we install -# it with --no-deps and pair it with the matching nixl-cu12 / nixl-cu13 binary -# to avoid shipping wrong-CUDA libs on cu13 images. -RUN --mount=type=cache,target=/root/.cache/pip if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - python3 -m pip install nixl nixl-cu12 --no-deps ; \ - python3 -m pip install "cuda-python>=12,<13" ; \ -elif [ "${CUDA_VERSION%%.*}" = "13" ]; then \ - python3 -m pip install nixl nixl-cu13 --no-deps ; \ - python3 -m pip install "cuda-python>=13,<14" ; \ -fi +# The `nixl` stub package is needed (it owns the `nixl` import path) but +# unconditionally requires nixl-cu12, so install it with --no-deps and pair it +# with the nixl-cu13 binary to avoid shipping wrong-CUDA libs. +RUN --mount=type=cache,target=/root/.cache/pip \ + python3 -m pip install nixl nixl-cu13 --no-deps \ + && python3 -m pip install "cuda-python>=13,<14" # Install the latest available AI Dynamo prerelease from NVIDIA's package index. RUN --mount=type=cache,target=/root/.cache/pip \ @@ -638,11 +581,6 @@ RUN if [ "$BRANCH_TYPE" = "local" ]; then \ # Clean up __pycache__/tests/pyc in same RUN to avoid writing ~28k files to layer RUN --mount=type=cache,target=/root/.cache/pip \ cd /sgl-workspace/sglang \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - sed -i 's/cuda-python>=13\.0/cuda-python>=12,<13/' python/pyproject.toml && \ - sed -i 's/flashinfer_python\[cu13\]/flashinfer_python[cu12]/' python/pyproject.toml && \ - sed -i 's/nvidia-cutlass-dsl\[cu13\]/nvidia-cutlass-dsl/' python/pyproject.toml; \ - fi \ && python3 -m pip install --no-deps -e "python[${BUILD_TYPE}]" \ && kernels lock python \ && ( success=0; \ @@ -659,8 +597,8 @@ RUN --mount=type=cache,target=/root/.cache/pip \ echo "sgl-kernel cubin download failed, retrying in 30s..." && sleep 30; \ done; \ # x86: if no prebuilt sgl-flash-attn3 variant matches this torch+CUDA \ - # combo (e.g. cu129 publishes no torch>=2.10 cubin), fall back to \ - # runtime JIT instead of failing the build, mirroring the aarch64 branch. \ + # combo, fall back to runtime JIT instead of failing the build, \ + # mirroring the aarch64 branch. \ if [ "$success" != "1" ]; then \ echo "WARNING: no matching sgl-flash-attn3 cubin variant for this torch+CUDA; kernels will be JIT-compiled at runtime"; \ success=1; \ diff --git a/docker/Dockerfile.cu134 b/docker/Dockerfile.cu134 index d6d1f9a00..049437799 100644 --- a/docker/Dockerfile.cu134 +++ b/docker/Dockerfile.cu134 @@ -493,19 +493,11 @@ RUN curl --proto '=https' --tlsv1.2 --retry 3 --retry-delay 2 -sSf https://sh.ru RUN --mount=type=cache,target=/root/.cache/pip \ python3 -m pip install --upgrade pip setuptools wheel html5lib six \ && case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ 13.0.3) CUINDEX=130 ;; \ 13.4.0) CUINDEX=134 ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ esac \ - && if [ "$CUDA_VERSION" = "12.6.3" ]; then \ - python3 -m pip install https://${GITHUB_ARTIFACTORY}/sgl-project/whl/releases/download/v${SGL_KERNEL_VERSION}/sglang_kernel-${SGL_KERNEL_VERSION}+cu124-cp310-abi3-manylinux2014_$(uname -m).whl --force-reinstall --no-deps \ - ; \ - elif [ "$CUDA_VERSION" = "12.9.2" ]; then \ - python3 -m pip install https://${GITHUB_ARTIFACTORY}/sgl-project/whl/releases/download/v${SGL_KERNEL_VERSION}/sglang_kernel-${SGL_KERNEL_VERSION}+cu129-cp310-abi3-manylinux2014_$(uname -m).whl --force-reinstall --no-deps \ - ; \ - elif [ "$CUDA_VERSION" = "13.0.3" ]; then \ + && if [ "$CUDA_VERSION" = "13.0.3" ]; then \ # --no-deps prevents pip from pulling torch from default PyPI python3 -m pip install sglang-kernel==${SGL_KERNEL_VERSION} --force-reinstall --no-deps \ ; \ @@ -527,15 +519,11 @@ COPY rust/sglang-grpc /tmp/sglang_deps/rust/sglang-grpc COPY rust/sglang-mm /tmp/sglang_deps/rust/sglang-mm COPY proto /tmp/sglang_deps/proto -# Install sglang dependencies (torch, transformers, etc.). CUDA 12 DeepEP -# wheels live only on the SGLang index, so preinstall the local-version wheel; -# it satisfies the public-version pyproject pin during the full dependency solve. +# Install sglang dependencies (torch, transformers, etc.). # Generate constraints.txt to prevent reinstalling these deps in later stages. RUN --mount=type=cache,target=/root/.cache/pip \ --mount=type=cache,target=/root/.cargo/registry \ case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ 13.0.3) CUINDEX=130 ;; \ 13.4.0) CUINDEX=134 ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ @@ -546,19 +534,6 @@ RUN --mount=type=cache,target=/root/.cache/pip \ && echo '__version__ = "0.0.0"' > sglang/version.py \ && touch README.md \ && touch LICENSE \ - && SGL_DEEP_EP_VERSION="$(sed -n 's/^[[:space:]]*"sgl-deep-ep==\([^"]*\)",/\1/p' pyproject.toml)" \ - && test -n "${SGL_DEEP_EP_VERSION}" \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - python3 -m pip install \ - "sgl-deep-ep==${SGL_DEEP_EP_VERSION}+cu129" \ - --index-url "https://docs.sglang.ai/whl/cu129/" \ - --no-deps; \ - fi \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - sed -i 's/cuda-python>=13\.0/cuda-python>=12,<13/' pyproject.toml && \ - sed -i 's/flashinfer_python\[cu13\]/flashinfer_python[cu12]/' pyproject.toml && \ - sed -i 's/nvidia-cutlass-dsl\[cu13\]/nvidia-cutlass-dsl/' pyproject.toml; \ - fi \ && if [ "$CUDA_VERSION" = "13.4.0" ]; then \ sed -i "s|^ \"flashinfer_python\[cu13\]==.*| \"flashinfer_python[cu13]==${FLASHINFER_VERSION}\",|" pyproject.toml; \ fi \ @@ -579,17 +554,8 @@ RUN --mount=type=cache,target=/root/.cache/pip \ TORCH_INDEX="https://download.pytorch.org/whl/cu${CUINDEX}"; \ fi \ && python3 -m pip install --extra-index-url "${TORCH_INDEX}" ".[${BUILD_TYPE}]" \ - && if [ "${CUDA_VERSION%%.*}" = "13" ]; then \ - python3 -m pip install --force-reinstall --no-deps \ - "nvidia-nccl-cu13==${NCCL_VERSION}"; \ - fi \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - pip list --format=freeze | awk -F'==' '/-cu13(==|$)/ {print $1}' \ - | xargs -r python3 -m pip uninstall -y && \ - python3 -m pip install --index-url https://download.pytorch.org/whl/cu${CUINDEX} \ - torch==2.13.0 torchvision==0.28.0 torchaudio==2.11.0 --force-reinstall; \ - python3 -m pip install https://github.com/sgl-project/whl/releases/download/v${SGL_DEEP_GEMM_VERSION}/sgl_deep_gemm-${SGL_DEEP_GEMM_VERSION}+cu129-py3-none-manylinux2014_$(uname -m).whl --force-reinstall; \ - fi \ + && python3 -m pip install --force-reinstall --no-deps \ + "nvidia-nccl-cu13==${NCCL_VERSION}" \ && if [ "$CUDA_VERSION" = "13.4.0" ]; then \ python3 -m pip install --force-reinstall --no-deps /tmp/cu134_wheels/*.whl; \ fi \ @@ -643,8 +609,6 @@ ARG FLASHINFER_VERSION # Stage jit-cache/cubin artifacts into /flashinfer_jit_output for clean COPY later RUN --mount=type=cache,target=/root/.cache/pip \ case "$CUDA_VERSION" in \ - 12.6.3) CUINDEX=126 ;; \ - 12.9.2) CUINDEX=129 ;; \ 13.0.3) CUINDEX=130 ;; \ 13.4.0) CUINDEX=134 ;; \ *) echo "Unsupported CUDA version: $CUDA_VERSION" && exit 1 ;; \ @@ -830,21 +794,12 @@ RUN --mount=type=cache,target=/var/cache/apt,id=framework-apt \ # Install Mooncake RUN --mount=type=cache,target=/root/.cache/pip \ - CUDA_MAJOR="${CUDA_VERSION%%.*}" && \ - if [ "$CUDA_MAJOR" -ge 13 ]; then \ - python3 -m pip install mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION}; \ - else \ - python3 -m pip install mooncake-transfer-engine==${MOONCAKE_VERSION}; \ - fi + python3 -m pip install mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION} # Install MSCCL++ Python dependencies and package (builds extension via CMake through pip) RUN --mount=type=cache,target=/root/.cache/pip \ git clone --depth=1 --branch ${MSCCLPP_VERSION} https://${GITHUB_ARTIFACTORY}/microsoft/mscclpp.git /tmp/mscclpp \ && case "${CUDA_VERSION}" in \ - 12.*) \ - CMAKE_ARGS="-DMSCCLPP_BYPASS_GPU_CHECK=ON -DMSCCLPP_USE_CUDA=ON -DMSCCLPP_GPU_ARCHS=80,90,100,100a,103,103a" \ - python3 -m pip install "/tmp/mscclpp[cuda12]"; \ - ;; \ 13.*) \ CMAKE_ARGS="-DMSCCLPP_BYPASS_GPU_CHECK=ON -DMSCCLPP_USE_CUDA=ON -DMSCCLPP_GPU_ARCHS=80,90,100,100a,103,103a" \ python3 -m pip install "/tmp/mscclpp[cuda13]"; \ @@ -882,17 +837,12 @@ RUN --mount=type=cache,target=/root/.cache/pip \ termplotlib \ "runai-model-streamer[s3,gcs,azure]>=0.15.7" -# Per-CUDA-major package installs. The `nixl` stub package is needed (it owns -# the `nixl` import path) but unconditionally requires nixl-cu12, so we install -# it with --no-deps and pair it with the matching nixl-cu12 / nixl-cu13 binary -# to avoid shipping wrong-CUDA libs on cu13 images. -RUN --mount=type=cache,target=/root/.cache/pip if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - python3 -m pip install nixl nixl-cu12 --no-deps ; \ - python3 -m pip install "cuda-python>=12,<13" ; \ -elif [ "${CUDA_VERSION%%.*}" = "13" ]; then \ - python3 -m pip install nixl nixl-cu13 --no-deps ; \ - python3 -m pip install "cuda-python>=13,<14" ; \ -fi +# The `nixl` stub package is needed (it owns the `nixl` import path) but +# unconditionally requires nixl-cu12, so install it with --no-deps and pair it +# with the nixl-cu13 binary to avoid shipping wrong-CUDA libs. +RUN --mount=type=cache,target=/root/.cache/pip \ + python3 -m pip install nixl nixl-cu13 --no-deps \ + && python3 -m pip install "cuda-python>=13,<14" # Install the latest available AI Dynamo prerelease from NVIDIA's package index. RUN --mount=type=cache,target=/root/.cache/pip \ @@ -965,11 +915,6 @@ RUN if [ "$BRANCH_TYPE" = "local" ]; then \ # Clean up __pycache__/tests/pyc in same RUN to avoid writing ~28k files to layer RUN --mount=type=cache,target=/root/.cache/pip \ cd /sgl-workspace/sglang \ - && if [ "${CUDA_VERSION%%.*}" = "12" ]; then \ - sed -i 's/cuda-python>=13\.0/cuda-python>=12,<13/' python/pyproject.toml && \ - sed -i 's/flashinfer_python\[cu13\]/flashinfer_python[cu12]/' python/pyproject.toml && \ - sed -i 's/nvidia-cutlass-dsl\[cu13\]/nvidia-cutlass-dsl/' python/pyproject.toml; \ - fi \ && if [ "$CUDA_VERSION" = "13.4.0" ]; then \ sed -i "s|^ \"flashinfer_python\[cu13\]==.*| \"flashinfer_python[cu13]==${FLASHINFER_VERSION}\",|" python/pyproject.toml; \ fi \ @@ -989,8 +934,8 @@ RUN --mount=type=cache,target=/root/.cache/pip \ echo "sgl-kernel cubin download failed, retrying in 30s..." && sleep 30; \ done; \ # x86: if no prebuilt sgl-flash-attn3 variant matches this torch+CUDA \ - # combo (e.g. cu129 publishes no torch>=2.10 cubin), fall back to \ - # runtime JIT instead of failing the build, mirroring the aarch64 branch. \ + # combo, fall back to runtime JIT instead of failing the build, \ + # mirroring the aarch64 branch. \ if [ "$success" != "1" ]; then \ echo "WARNING: no matching sgl-flash-attn3 cubin variant for this torch+CUDA; kernels will be JIT-compiled at runtime"; \ success=1; \ diff --git a/docker/sgl-deep-ep.Dockerfile b/docker/sgl-deep-ep.Dockerfile index a3743073b..4ccf930f3 100644 --- a/docker/sgl-deep-ep.Dockerfile +++ b/docker/sgl-deep-ep.Dockerfile @@ -6,7 +6,6 @@ FROM ${BASE_IMAGE}:cuda${CUDA_VERSION} ARG ARCHITECTURE=x86_64 ARG CUDA_TAG=cu130 ARG CUDA_VERSION=13.0 -ARG GDRCOPY_VERSION=2.5.1 ARG NCCL_VERSION=2.30.7 ARG PYTHON_TAG=cp312-cp312 ARG TORCH_VERSION=2.13.0 @@ -49,19 +48,6 @@ RUN set -eux; \ ln -sf "${cuda_stub}" /usr/lib64/libcuda.so; \ ln -sf "${cuda_stub}" "/usr/lib/${ARCHITECTURE}-linux-gnu/libcuda.so" -# DeepEP v2 uses NCCL Gin on CUDA 13. Keep GDRCopy only for the CUDA 12 -# legacy NVSHMEM/IBGDA build. -RUN set -eux; \ - if [ "${CUDA_TAG}" = cu129 ]; then \ - git clone --depth 1 --branch "v${GDRCOPY_VERSION}" \ - https://github.com/NVIDIA/gdrcopy.git /opt/gdrcopy; \ - make -C /opt/gdrcopy CUDA="${CUDA_HOME}" prefix=/usr/local lib_install; \ - printf '%s\n' /usr/local/lib > /etc/ld.so.conf.d/gdrcopy.conf; \ - ldconfig; \ - test -f /usr/local/include/gdrapi.h; \ - ldconfig -p | grep -q libgdrapi; \ - fi - RUN --mount=type=cache,id=sgl-deep-ep-pip-${CUDA_TAG}-${PYTHON_TAG}-${ARCHITECTURE},target=/root/.cache/pip \ set -eux; \ "${PYTHON_BIN}" -m pip uninstall -y deep-ep sgl-deep-ep || true; \ @@ -69,10 +55,8 @@ RUN --mount=type=cache,id=sgl-deep-ep-pip-${CUDA_TAG}-${PYTHON_TAG}-${ARCHITECTU "${PYTHON_BIN}" -m pip install --force-reinstall \ "torch==${TORCH_VERSION}" \ --index-url "https://download.pytorch.org/whl/${CUDA_TAG}"; \ - if [ "${CUDA_TAG}" = cu130 ]; then \ - "${PYTHON_BIN}" -m pip install --force-reinstall --no-deps \ - "nvidia-nccl-cu13==${NCCL_VERSION}"; \ - fi; \ + "${PYTHON_BIN}" -m pip install --force-reinstall --no-deps \ + "nvidia-nccl-cu13==${NCCL_VERSION}"; \ "${PYTHON_BIN}" -m pip install \ "auditwheel>=6.0" \ build \ diff --git a/docker/sgl-deep-gemm.Dockerfile b/docker/sgl-deep-gemm.Dockerfile index 9fc653014..c76b2a67a 100644 --- a/docker/sgl-deep-gemm.Dockerfile +++ b/docker/sgl-deep-gemm.Dockerfile @@ -27,8 +27,7 @@ RUN --mount=type=cache,id=sgl-deep-gemm-pip,target=/root/.cache/pip \ set -eux; \ case "${CUDA_VERSION}" in \ 13.0) CU_TAG=cu130 ;; \ - 12.9) CU_TAG=cu129 ;; \ - *) CU_TAG=cu130 ;; \ + *) echo "Unsupported CUDA version: ${CUDA_VERSION}" && exit 1 ;; \ esac; \ ${PYTHON_ROOT_PATH}/bin/pip install torch==${TORCH_VER} --index-url https://${PYTORCH_MIRROR}/whl/${CU_TAG}; \ ${PYTHON_ROOT_PATH}/bin/pip install --index-url ${PIP_DEFAULT_INDEX} \ diff --git a/docs/cookbook/autoregressive/MiniMax/MiniMax-M3.mdx b/docs/cookbook/autoregressive/MiniMax/MiniMax-M3.mdx index 8326f3dc8..d24cb14c1 100644 --- a/docs/cookbook/autoregressive/MiniMax/MiniMax-M3.mdx +++ b/docs/cookbook/autoregressive/MiniMax/MiniMax-M3.mdx @@ -39,7 +39,7 @@ Then run the **Python** output of the command panel below in that environment. T docker pull lmsysorg/sglang:dev-cu13-minimax-m3 ``` -The command panel below fills in the right tag per platform: `dev-cu13-minimax-m3` (CUDA 13 — B300, GB200, GB300), `dev-cu12-minimax-m3` (CUDA 12 — Hopper H200), or `dev-minimax-m3` (default). On AMD Instinct it uses the matching ROCm image (MI300X/MI325X → `aigmkt/minimax-m3-sglang-rocm700-mi30x`, MI350X/MI355X → `aigmkt/minimax-m3-sglang-rocm720-mi35x`). For how to launch the image, see [Install → Method 3: Using Docker](../../../docs/get-started/install#method-3-using-docker), substituting the inner `sglang serve ...` with what the command generator produces. +The command panel below fills in the right tag per platform: `dev-cu13-minimax-m3` (CUDA 13 — B300, GB200, GB300), `dev-cu12-minimax-m3` (CUDA 12 — Hopper H200; final build, the CUDA 12 lane is retired), or `dev-minimax-m3` (default). On AMD Instinct it uses the matching ROCm image (MI300X/MI325X → `aigmkt/minimax-m3-sglang-rocm700-mi30x`, MI350X/MI355X → `aigmkt/minimax-m3-sglang-rocm720-mi35x`). For how to launch the image, see [Install → Method 3: Using Docker](../../../docs/get-started/install#method-3-using-docker), substituting the inner `sglang serve ...` with what the command generator produces. These M3 dev images now **bundle MiniMax's MSA sparse-attention kernel** (`fmha_sm100`), so Blackwell users get the recommended fast path automatically — no manual install needed (see **§2.1**). On a custom image without it, the same recipe still serves on the built-in Triton sparse path. diff --git a/docs/cookbook/autoregressive/OpenBMB/MiniCPM-V-4_6.mdx b/docs/cookbook/autoregressive/OpenBMB/MiniCPM-V-4_6.mdx index 04ec72563..55a788b49 100644 --- a/docs/cookbook/autoregressive/OpenBMB/MiniCPM-V-4_6.mdx +++ b/docs/cookbook/autoregressive/OpenBMB/MiniCPM-V-4_6.mdx @@ -32,7 +32,8 @@ Pull the nightly Docker image (rolling tag, tracks `main`): # CUDA 13 (Hopper / Blackwell, default) docker pull lmsysorg/sglang:dev -# CUDA 12 (Ampere or older drivers) +# CUDA 12 (Ampere or older drivers). Final build: the CUDA 12 lane is retired, +# so this tag no longer tracks main. docker pull lmsysorg/sglang:dev-cu12 ``` diff --git a/docs/cookbook/autoregressive/ThinkingMachines/Inkling-Small.mdx b/docs/cookbook/autoregressive/ThinkingMachines/Inkling-Small.mdx index 5bc7305aa..ce9315173 100644 --- a/docs/cookbook/autoregressive/ThinkingMachines/Inkling-Small.mdx +++ b/docs/cookbook/autoregressive/ThinkingMachines/Inkling-Small.mdx @@ -35,7 +35,7 @@ There are two multi-arch (amd64 / arm64) CUDA builds plus a ROCm build; pick the ```bash Command docker pull lmsysorg/sglang:dev-inkling-dspark # CUDA 13 -docker pull lmsysorg/sglang:dev-cu12-inkling-dspark # CUDA 12 +docker pull lmsysorg/sglang:dev-cu12-inkling-dspark # CUDA 12 (final build; lane retired) docker pull lmsysorg/sglang:dev-inkling-small-dgx-spark # DGX Spark (GB10 / SM121) docker pull lmsysorg/sglang-rocm:dev-rocm720-mi35x-inkling-dspark # AMD MI350X / MI355X ``` @@ -309,4 +309,4 @@ To try it, select the **Long Context** strategy in the Deploy panel above for an The **DSpark** deploy strategy is the second speculative-decoding path for Inkling-Small. Unlike **MTP**, which drives Inkling-Small's own multi-layer draft head, DSpark runs a **separate draft checkpoint** — `RadixArk/Inkling-Small-DSpark` — served unquantized alongside the NVFP4 target. -DSpark support ships in the images listed in §1 (`dev-inkling-dspark` for CUDA 13, `dev-cu12-inkling-dspark` for CUDA 12), so no separate build is needed. Verified end-to-end on B200 (TP=8, NVFP4). +DSpark support ships in the images listed in §1 (`dev-inkling-dspark` for CUDA 13, `dev-cu12-inkling-dspark` for CUDA 12 — a final build, since that lane is retired), so no separate build is needed. Verified end-to-end on B200 (TP=8, NVFP4). diff --git a/docs/cookbook/autoregressive/ThinkingMachines/Inkling.mdx b/docs/cookbook/autoregressive/ThinkingMachines/Inkling.mdx index b7a74b979..4ac2d511b 100644 --- a/docs/cookbook/autoregressive/ThinkingMachines/Inkling.mdx +++ b/docs/cookbook/autoregressive/ThinkingMachines/Inkling.mdx @@ -35,7 +35,7 @@ There are two multi-arch (amd64 / arm64) CUDA builds plus a ROCm build; pick the ```bash Command docker pull lmsysorg/sglang:dev-inkling-dspark # CUDA 13 -docker pull lmsysorg/sglang:dev-cu12-inkling-dspark # CUDA 12 +docker pull lmsysorg/sglang:dev-cu12-inkling-dspark # CUDA 12 (final build; lane retired) docker pull lmsysorg/sglang-rocm:dev-rocm720-mi35x-inkling-dspark # AMD MI350X / MI355X ``` @@ -306,4 +306,4 @@ To try it, select the **Long Context** strategy in the Deploy panel above for an The **DSpark** deploy strategy is the second speculative-decoding path for Inkling. Unlike **MTP**, which drives Inkling's own multi-layer draft head, DSpark runs a **separate draft checkpoint** — `RadixArk/Inkling-DSpark-Preview` — served unquantized alongside the NVFP4 target. -DSpark support ships in the images listed in §1 (`dev-inkling-dspark` for CUDA 13, `dev-cu12-inkling-dspark` for CUDA 12), so no separate build is needed. Verified end-to-end on B200 (TP=8, NVFP4). +DSpark support ships in the images listed in §1 (`dev-inkling-dspark` for CUDA 13, `dev-cu12-inkling-dspark` for CUDA 12 — a final build, since that lane is retired), so no separate build is needed. Verified end-to-end on B200 (TP=8, NVFP4). diff --git a/docs/docs/developer_guide/contribution_guide.mdx b/docs/docs/developer_guide/contribution_guide.mdx index 09005fa17..dc1ef9f67 100644 --- a/docs/docs/developer_guide/contribution_guide.mdx +++ b/docs/docs/developer_guide/contribution_guide.mdx @@ -206,9 +206,9 @@ Develop SGLang's customized DeepGEMM package on the [`dev` branch of `sgl-projec ### Update sgl-deep-ep -Develop `sgl-deep-ep` in [`sgl-project/DeepEP`](https://github.com/sgl-project/DeepEP). Use the implementation branch for the target platform: `sgl-deepep` for CUDA 13 on x86_64 or aarch64, `sgl-deepep-cu12-x86` for CUDA 12.9 on x86_64, or `sgl-deepep-cu12-arm` for CUDA 12.9 on aarch64. Merge packaging changes into `sgl-deepep-packaging`. The [`sgl-deep-ep` README](https://github.com/sgl-project/DeepEP/blob/sgl-deepep-packaging/sgl_deep_ep/README.md) describes the platform prerequisites and release matrix. +Develop `sgl-deep-ep` in [`sgl-project/DeepEP`](https://github.com/sgl-project/DeepEP). Use `sgl-deepep`, the implementation branch for CUDA 13 on x86_64 or aarch64. Merge packaging changes into `sgl-deepep-packaging`. The [`sgl-deep-ep` README](https://github.com/sgl-project/DeepEP/blob/sgl-deepep-packaging/sgl_deep_ep/README.md) describes the platform prerequisites and release matrix. -To validate locally, check out the selected implementation branch as `DeepEP-source` and the packaging branch as `DeepEP-packaging`. Install the required build dependencies first; CUDA 12.9 builds also require GDRCopy. The following CUDA 13 example builds a wheel for the host architecture, installs that exact wheel, and verifies that its guarded package import succeeds: +To validate locally, check out the selected implementation branch as `DeepEP-source` and the packaging branch as `DeepEP-packaging`. Install the required build dependencies first. The following example builds a wheel for the host architecture, installs that exact wheel, and verifies that its guarded package import succeeds: ```bash DEEPEP_OUTPUT_DIR="$(mktemp -d)" @@ -223,17 +223,13 @@ python3 -m pip install --force-reinstall --no-deps \ python3 -c "import deep_ep; print(deep_ep.__file__)" ``` -Use `12.9` instead of `13.0` for a CUDA 12.9 build. The import check validates packaging and binary loading, but not communication correctness. On a configured multi-GPU host, also run the test appropriate for the implementation branch: +The import check validates packaging and binary loading, but not communication correctness. On a configured multi-GPU host, also run: ```bash -# CUDA 13 implementation branch python3 DeepEP-source/tests/elastic/test_ep.py --num-processes 8 - -# CUDA 12.9 implementation branches -python3 DeepEP-source/tests/test_intranode.py --num-processes 8 ``` -Adjust `--num-processes` to the available GPUs and run the internode or low-latency tests when those transports changed. After local validation, ask the SGLang team to run the [sgl-deep-ep release workflow](https://github.com/sgl-project/sglang/actions/workflows/release-whl-deepep.yml) with the new version, CUDA target, and packaging ref. After verifying the published wheels for the supported Python versions and architectures, update the `sgl-deep-ep` pin in `python/pyproject.toml` before landing dependent SGLang changes. +Adjust `--num-processes` to the available GPUs and run the internode or low-latency tests when those transports changed. After local validation, ask the SGLang team to run the [sgl-deep-ep release workflow](https://github.com/sgl-project/sglang/actions/workflows/release-whl-deepep.yml) with the new version and packaging ref. After verifying the published wheels for the supported Python versions and architectures, update the `sgl-deep-ep` pin in `python/pyproject.toml` before landing dependent SGLang changes. ## Tips for newcomers diff --git a/docs/docs/get-started/install.mdx b/docs/docs/get-started/install.mdx index 669bcf482..b7d715566 100644 --- a/docs/docs/get-started/install.mdx +++ b/docs/docs/get-started/install.mdx @@ -29,15 +29,11 @@ uv pip install --prerelease=allow sglang Some of SGLang's dependencies only publish pre-releases on PyPI, so without `--prerelease=allow` uv older than 0.12.0 silently installs SGLang 0.5.9. On [uv 0.12.0](https://github.com/astral-sh/uv/releases/tag/0.12.0) and newer the flag is a harmless no-op. -The major version of Cuda is 13 by default. To install sglang under Cuda 12 with pip or uv, please try the following commands: -```bash Command -pip install --upgrade pip -pip install uv -uv pip install --prerelease=allow sglang -uv pip install --force-reinstall torch==2.13.0 torchaudio==2.11.0 torchvision --index-url https://download.pytorch.org/whl/cu129 -uv pip install --force-reinstall sglang-kernel --index-url https://docs.sglang.ai/whl/cu129/ -uv pip install --force-reinstall sgl-deep-gemm --index-url https://docs.sglang.ai/whl/cu129/ --no-deps -``` + +SGLang requires CUDA 13. The CUDA 12 (`cu129`) wheels and images are retired, +because PyTorch 2.14 publishes no CUDA 12.9 builds. SGLang 0.5.19 is the last +release with a CUDA 12 lane. + ### Nightly builds @@ -49,13 +45,6 @@ pip install uv uv pip install --prerelease=allow --index-strategy unsafe-best-match --extra-index-url https://docs.sglang.ai/whl/cu130/ sglang ``` -To install a nightly build under Cuda 12, swap the index to `cu129`: -```bash Command -pip install --upgrade pip -pip install uv -uv pip install --prerelease=allow --index-strategy unsafe-best-match --extra-index-url https://docs.sglang.ai/whl/cu129/ sglang -``` - ### Quick fixes to common problems - If you encounter `OSError: CUDA_HOME environment variable is not set`. Please set it to your CUDA install root with either of the following solutions: 1. Use `export CUDA_HOME=/usr/local/cuda-` to set the `CUDA_HOME` environment variable. @@ -113,7 +102,7 @@ docker run --gpus all \ You can also find the nightly docker images [here](https://hub.docker.com/r/lmsysorg/sglang/tags?name=nightly). Notes: -- SGLang is shipped with CUDA 13 environment by default. To run SGLang on CUDA 12 environment, please use images with `-cu12` or `-cu129` suffix, such as `lmsysorg/sglang:latest-cu129` or `lmsysorg/sglang:dev-cu12`. +- SGLang images ship a CUDA 13 environment. The `-cu12` / `-cu129` images are no longer published; `lmsysorg/sglang:v0.5.19-cu129` is the last CUDA 12 tag. ## Method 4: Using Kubernetes diff --git a/docs/src/snippets/configs/MiniMaxAI/minimax-m3.jsx b/docs/src/snippets/configs/MiniMaxAI/minimax-m3.jsx index 333c4ff1d..09fb65dd4 100644 --- a/docs/src/snippets/configs/MiniMaxAI/minimax-m3.jsx +++ b/docs/src/snippets/configs/MiniMaxAI/minimax-m3.jsx @@ -93,9 +93,10 @@ sgl-eval run mmmu_pro \\ dockerImages: { // M3-specific dev images (multi-arch amd64+arm64). cu13 carries the sm_103 - // (B300/GB300) + Grace arm64 builds; cu12 is the Hopper/CUDA-12 build; - // dev-minimax-m3 is the rolling default. M3 model support is not yet in a - // tagged release, so :latest cannot serve it. + // (B300/GB300) + Grace arm64 builds; cu12 is the final Hopper/CUDA-12 build + // (that lane is retired, so it no longer rebuilds); dev-minimax-m3 is the + // rolling default. M3 model support is not yet in a tagged release, so + // :latest cannot serve it. b200: "lmsysorg/sglang:dev-minimax-m3", b300: "lmsysorg/sglang:dev-cu13-minimax-m3", gb200: "lmsysorg/sglang:dev-cu13-minimax-m3", diff --git a/docs/src/snippets/configs/thinkingmachines/inkling-small.jsx b/docs/src/snippets/configs/thinkingmachines/inkling-small.jsx index 40b019389..eb3e7d8ae 100644 --- a/docs/src/snippets/configs/thinkingmachines/inkling-small.jsx +++ b/docs/src/snippets/configs/thinkingmachines/inkling-small.jsx @@ -70,7 +70,8 @@ export const config = { -d '{ "model": "{{MODEL_NAME}}", "messages": [{"role":"user","content":"Hello"}] }'`, // NVIDIA: two multi-arch CUDA builds (dev-inkling-dspark for CUDA 13, - // dev-cu12-inkling-dspark for CUDA 12) — pick by your CUDA version, not by GPU. + // dev-cu12-inkling-dspark for CUDA 12, a final build since that lane is + // retired) — pick by your CUDA version, not by GPU. // Panel defaults to cu13. AMD: dev-rocm720-mi35x-inkling-dspark (sglang-rocm repo). // DGX Spark uses a dedicated arm64 CUDA 13 image with NCCL 2.30.7. // All tiers ship from the same images, DSpark included (except DGX Spark). diff --git a/docs/src/snippets/configs/thinkingmachines/inkling.jsx b/docs/src/snippets/configs/thinkingmachines/inkling.jsx index 05de1befa..9287736eb 100644 --- a/docs/src/snippets/configs/thinkingmachines/inkling.jsx +++ b/docs/src/snippets/configs/thinkingmachines/inkling.jsx @@ -73,7 +73,8 @@ export const config = { -d '{ "model": "{{MODEL_NAME}}", "messages": [{"role":"user","content":"Hello"}] }'`, // NVIDIA: two multi-arch CUDA builds (dev-inkling-dspark for CUDA 13, - // dev-cu12-inkling-dspark for CUDA 12) — pick by your CUDA version, not by GPU. + // dev-cu12-inkling-dspark for CUDA 12, a final build since that lane is + // retired) — pick by your CUDA version, not by GPU. // Panel defaults to cu13. AMD: dev-rocm720-mi35x-inkling-dspark (sglang-rocm repo). // All tiers ship from the same images, DSpark included. dockerImages: { diff --git a/python/sglang/kernels/aot/Dockerfile b/python/sglang/kernels/aot/Dockerfile index f8f2853c3..d1821c15c 100644 --- a/python/sglang/kernels/aot/Dockerfile +++ b/python/sglang/kernels/aot/Dockerfile @@ -98,8 +98,7 @@ RUN --mount=type=cache,id=sgl-kernel-pip,target=/root/.cache/pip \ set -eux; \ case "${CUDA_VERSION}" in \ 13.0) TORCH_VER=2.13.0; CU_TAG=cu130 ;; \ - 12.9) TORCH_VER=2.13.0; CU_TAG=cu129 ;; \ - *) TORCH_VER=2.13.0; CU_TAG=cu126 ;; \ + *) echo "Unsupported CUDA version: ${CUDA_VERSION}" && exit 1 ;; \ esac; \ ${PYTHON_ROOT_PATH}/bin/pip install torch==${TORCH_VER} --index-url ${PYTORCH_INDEX_BASE}/${CU_TAG}; \ ${PYTHON_ROOT_PATH}/bin/pip install ninja setuptools==75.0.0 wheel==0.41.0 numpy uv scikit-build-core --index-url ${PIP_DEFAULT_INDEX} diff --git a/python/sglang/kernels/aot/python/sgl_kernel/load_utils.py b/python/sglang/kernels/aot/python/sgl_kernel/load_utils.py index f55cc1ab0..6b2239529 100644 --- a/python/sglang/kernels/aot/python/sgl_kernel/load_utils.py +++ b/python/sglang/kernels/aot/python/sgl_kernel/load_utils.py @@ -167,12 +167,7 @@ def _load_architecture_specific_ops(): # All attempts failed cuda_version = torch.version.cuda - if cuda_version and cuda_version.startswith("12"): - install_hint = ( - "pip install sglang-kernel --index-url https://docs.sglang.ai/whl/cu129/" - ) - else: - install_hint = "pip install --upgrade sglang-kernel" + install_hint = "pip install --upgrade sglang-kernel" error_msg = f""" [sgl_kernel] CRITICAL: Could not load any common_ops library! diff --git a/python/sglang/kernels/aot/rename_wheels.sh b/python/sglang/kernels/aot/rename_wheels.sh index 76a513679..d5772b34d 100755 --- a/python/sglang/kernels/aot/rename_wheels.sh +++ b/python/sglang/kernels/aot/rename_wheels.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Align CUDA wheel filenames (+cu124/+cu129/+cu130) with internal METADATA Version and +# Align CUDA wheel filenames (+cu130) with internal METADATA Version and # WHEEL tags after build (fixes pip "inconsistent version" when only the .whl name changed). # Unpack → patch WHEEL/METADATA → wheel pack (RECORD regenerated; no hand-editing). set -ex @@ -7,11 +7,7 @@ set -ex WHEEL_DIR="dist" detect_cuda_suffix() { - if ls /usr/local/ 2>/dev/null | grep -q "12.4"; then - echo "+cu124" - elif ls /usr/local/ 2>/dev/null | grep -q "12.9"; then - echo "+cu129" - elif ls /usr/local/ 2>/dev/null | grep -q "13.0"; then + if ls /usr/local/ 2>/dev/null | grep -q "13.0"; then echo "+cu130" else echo "" diff --git a/python/sglang/kernels/jit/utils/arch.py b/python/sglang/kernels/jit/utils/arch.py index 9c68aacff..ade8d4927 100644 --- a/python/sglang/kernels/jit/utils/arch.py +++ b/python/sglang/kernels/jit/utils/arch.py @@ -42,7 +42,7 @@ def _jit_cuda_version() -> tuple[int, ...]: """CUDA version of the nvcc that JIT builds actually run. The target has to match the compiler, not the toolkit PyTorch was built - against: a cu129 wheel on a CUDA 12.8 toolkit would otherwise select + against: a cu130 wheel on a CUDA 12.8 toolkit would otherwise select `sm_120f`, which nvcc 12.8 rejects. Resolve nvcc the way tvm-ffi does (`CUDA_HOME` / `CUDA_PATH`, then `$PATH`, then `/usr/local/cuda`) and fall back to `torch.version.cuda` when it cannot be probed. diff --git a/scripts/build_sgl_deep_gemm.sh b/scripts/build_sgl_deep_gemm.sh index a042cfe0a..834d2efdb 100755 --- a/scripts/build_sgl_deep_gemm.sh +++ b/scripts/build_sgl_deep_gemm.sh @@ -3,12 +3,12 @@ # # Usage: build_sgl_deep_gemm.sh [ARCH] # PYTHON_VERSION: e.g. 3.10 -# CUDA_VERSION: e.g. 12.9 or 13.0 +# CUDA_VERSION: e.g. 13.0 # DEEPGEMM_SRC: path to a checkout of sgl-project/DeepGEMM # ARCH: x86_64 (default) or aarch64 # # Writes: -# /dist/ — wheel(s) tagged +cu129 / +cu130 and manylinux +# /dist/ — wheel(s) tagged +cu130 and manylinux # /dist-pypi/ — cu130 only: same wheel(s) with +cu130 stripped # (PyPI rejects local-version segments) set -ex @@ -25,7 +25,6 @@ ARCH="${4:-$(uname -i)}" case "${CUDA_VERSION}" in 13.0) CU_TAG=cu130 ;; - 12.9) CU_TAG=cu129 ;; *) echo "Unsupported CUDA_VERSION: ${CUDA_VERSION}" >&2 exit 1 diff --git a/scripts/build_sgl_deepep.sh b/scripts/build_sgl_deepep.sh index b1fc31c57..eb76f14a9 100755 --- a/scripts/build_sgl_deepep.sh +++ b/scripts/build_sgl_deepep.sh @@ -4,8 +4,8 @@ # Usage: # build_sgl_deepep.sh [architecture] # -# Writes CUDA-tagged wheels to /dist. CUDA 13 builds also write -# PyPI-ready wheels without the local CUDA version to /dist-pypi. +# Writes CUDA-tagged wheels to /dist, plus PyPI-ready wheels +# without the local CUDA version in /dist-pypi. set -euo pipefail @@ -14,7 +14,7 @@ usage() { Usage: build_sgl_deepep.sh [architecture] python-version: 3.10, 3.11, 3.12, or 3.13 - cuda-version: 12.9 or 13.0 + cuda-version: 13.0 deepep-source: checkout of the selected DeepEP implementation branch packaging-overlay: path to the shared DeepEP sgl_deep_ep directory architecture: x86_64 or aarch64 (defaults to the current machine) @@ -45,9 +45,6 @@ case "${PYTHON_VERSION}" in esac case "${CUDA_VERSION}" in - 12.9) - CUDA_TAG=cu129 - ;; 13.0) CUDA_TAG=cu130 ;; diff --git a/scripts/ci/cuda/ci_install_dependency.sh b/scripts/ci/cuda/ci_install_dependency.sh index c1afa9ed5..d69f3a253 100755 --- a/scripts/ci/cuda/ci_install_dependency.sh +++ b/scripts/ci/cuda/ci_install_dependency.sh @@ -2,7 +2,7 @@ # Install dependencies for CUDA CI jobs. # # CU_VERSION (default: cu130) controls PyTorch index URL, FlashInfer JIT cache -# index, and nvrtc variant selection. +# index, and the sglang wheel index. CUDA 13 only. set -euxo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -32,10 +32,14 @@ mark_step_done() { configure_environment() { # CU_VERSION controls PyTorch index URL, FlashInfer JIT cache index, and - # nvrtc variant selection (cu12 vs cu13). + # the sglang wheel index. Only CUDA 13 lanes exist: PyTorch 2.14 publishes + # no CUDA 12 wheels for the cu129 index the retired cu12 lane used. CU_VERSION="${CU_VERSION:-cu130}" CU_STRIP="${CU_VERSION#cu}" - CU_MAJOR="${CU_STRIP:0:2}" + case "${CU_STRIP}" in + 13*) ;; + *) echo "FATAL: unsupported CU_VERSION=${CU_VERSION}; only CUDA 13 is supported"; exit 1 ;; + esac OPTIONAL_DEPS="${1:-}" @@ -366,11 +370,6 @@ remove_stale_cuda12_nvidia_wheels() { local -a NVIDIA_WHEELS_TO_RESTORE=() local -a STALE_CUDA12_NVIDIA_WHEELS=() - if [ "$CU_MAJOR" != "13" ]; then - mark_step_done "${FUNCNAME[0]}" - return - fi - mapfile -t INSTALLED_NVIDIA_WHEELS < <( python3 -m pip list --format=freeze | sed -n '/^nvidia-.*==/p' ) @@ -462,30 +461,6 @@ install_pytorch_stack() { mark_step_done "${FUNCNAME[0]}" } -install_cuda12_deepep_wheel() { - if [ "$CU_MAJOR" = "13" ]; then - echo "CUDA 13 uses the public sgl-deep-ep wheel declared in python/pyproject.toml" - mark_step_done "${FUNCNAME[0]}" - return - fi - - local version - version=$(grep -Po -m1 '"sgl-deep-ep==\K[^"]+' python/pyproject.toml || true) - if [ -z "$version" ]; then - echo "ERROR: python/pyproject.toml must pin sgl-deep-ep" - exit 1 - fi - - # CUDA 12 wheels intentionally live only on the SGLang wheel index. Their - # local version satisfies the public-version pyproject pin, so the later - # editable SGLang install keeps this CUDA-matched wheel. - $PIP_CMD install "sgl-deep-ep==${version}+${CU_VERSION}" \ - --index-url "https://docs.sglang.ai/whl/${CU_VERSION}/" \ - --force-reinstall --no-deps $PIP_INSTALL_SUFFIX - - mark_step_done "${FUNCNAME[0]}" -} - require_prebuilt_rust_exts() { # Stages whose download succeeded set this to none. Runs before # setup_pip_toolchain uninstalls sglang, so clearing it here still reaches @@ -551,14 +526,10 @@ install_sglang() { } install_nccl() { - if [ "$CU_MAJOR" = "13" ]; then - # PyTorch pins 2.29.7, so this override must run after every command - # that resolves Python dependencies (including lmms-eval). - $PIP_CMD install "nvidia-nccl-cu13==2.30.7" \ - --force-reinstall --no-deps $PIP_INSTALL_SUFFIX - else - echo "CUDA ${CU_MAJOR} does not require the NCCL Gin wheel" - fi + # PyTorch pins 2.29.7, so this override must run after every command + # that resolves Python dependencies (including lmms-eval). + $PIP_CMD install "nvidia-nccl-cu13==2.30.7" \ + --force-reinstall --no-deps $PIP_INSTALL_SUFFIX mark_step_done "${FUNCNAME[0]}" } @@ -628,8 +599,8 @@ install_sglang_kernel() { if [ "${CUSTOM_BUILD_SGL_KERNEL:-}" != "true" ]; then # The PyPI default wheel tracks one CUDA version (currently cu130); other - # runners (e.g. h20 / cu129) need the +${CU_VERSION}-tagged wheel from the - # sglang index, linked against the right libnvrtc. + # runners need the +${CU_VERSION}-tagged wheel from the sglang index, + # linked against the right libnvrtc. SGL_KERNEL_WANTED="${SGL_KERNEL_VERSION_FROM_SRT}+${CU_VERSION}" if installed_wheel_ok sglang-kernel "${SGL_KERNEL_WANTED}" reject-local; then echo "sglang-kernel==${SGL_KERNEL_WANTED} already installed, keeping it" @@ -640,18 +611,11 @@ install_sglang_kernel() { echo "CUSTOM_BUILD_SGL_KERNEL=true: keeping freshly built sgl-kernel wheel." fi SGL_DEEP_GEMM_VERSION=$(grep -Po -m1 '(?<=sgl-deep-gemm==)[0-9A-Za-z\.\-]+' python/pyproject.toml) - if [ "$CU_MAJOR" = "13" ]; then - SGL_DEEP_GEMM_WANTED="${SGL_DEEP_GEMM_VERSION}" - else - SGL_DEEP_GEMM_WANTED="${SGL_DEEP_GEMM_VERSION}+cu129" - fi # No reject-local: nothing builds sgl-deep-gemm locally. - if installed_wheel_ok sgl-deep-gemm "${SGL_DEEP_GEMM_WANTED}"; then - echo "sgl-deep-gemm==${SGL_DEEP_GEMM_WANTED} already installed, keeping it" - elif [ "$CU_MAJOR" = "13" ]; then - $PIP_CMD install "sgl-deep-gemm==${SGL_DEEP_GEMM_VERSION}" --force-reinstall $PIP_INSTALL_SUFFIX + if installed_wheel_ok sgl-deep-gemm "${SGL_DEEP_GEMM_VERSION}"; then + echo "sgl-deep-gemm==${SGL_DEEP_GEMM_VERSION} already installed, keeping it" else - $PIP_CMD install "https://github.com/sgl-project/whl/releases/download/v${SGL_DEEP_GEMM_VERSION}/sgl_deep_gemm-${SGL_DEEP_GEMM_VERSION}+cu129-py3-none-manylinux2014_$(uname -m).whl" --force-reinstall $PIP_INSTALL_SUFFIX + $PIP_CMD install "sgl-deep-gemm==${SGL_DEEP_GEMM_VERSION}" --force-reinstall $PIP_INSTALL_SUFFIX fi mark_step_done "${FUNCNAME[0]}" @@ -739,17 +703,10 @@ stabilize_flashinfer_jit_paths() { install_extra_deps() { MOONCAKE_VERSION="0.3.13" NIXL_VERSION="1.3.0" - if [ "$CU_MAJOR" = "13" ]; then - MOONCAKE_PKG="mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION}" - MOONCAKE_STALE_PKG="mooncake-transfer-engine" - NIXL_BIN_NAME="nixl-cu13" - EXTRA_NVIDIA_SPECS="nvidia-cuda-nvrtc" - else - MOONCAKE_PKG="mooncake-transfer-engine==${MOONCAKE_VERSION}" - MOONCAKE_STALE_PKG="mooncake-transfer-engine-cuda13" - NIXL_BIN_NAME="nixl-cu12" - EXTRA_NVIDIA_SPECS="nvidia-cuda-nvrtc-cu12" - fi + MOONCAKE_PKG="mooncake-transfer-engine-cuda13==${MOONCAKE_VERSION}" + MOONCAKE_STALE_PKG="mooncake-transfer-engine" + NIXL_BIN_NAME="nixl-cu13" + EXTRA_NVIDIA_SPECS="nvidia-cuda-nvrtc" # Both variants own the same mooncake/ package files and bin/ scripts # (mooncake_master, etc.). Uninstalling the stale variant deletes shared # files that the live variant's RECORD still references, so we force a @@ -834,20 +791,18 @@ verify_imports() { import ctypes import importlib.metadata import os -import sys -if sys.argv[1] == "13": - if importlib.metadata.version("nvidia-nccl-cu13") != "2.30.7": - raise SystemExit("nvidia-nccl-cu13 was changed after the final CI override") - nccl = ctypes.CDLL("libnccl.so.2") - nccl_version = ctypes.c_int() - status = nccl.ncclGetVersion(ctypes.byref(nccl_version)) - if status != 0 or nccl_version.value != 23007: - raise SystemExit( - f"expected NCCL runtime 2.30.7, got status={status}, " - f"raw_version={nccl_version.value}" - ) - print("NCCL package and runtime versions are 2.30.7") +if importlib.metadata.version("nvidia-nccl-cu13") != "2.30.7": + raise SystemExit("nvidia-nccl-cu13 was changed after the final CI override") +nccl = ctypes.CDLL("libnccl.so.2") +nccl_version = ctypes.c_int() +status = nccl.ncclGetVersion(ctypes.byref(nccl_version)) +if status != 0 or nccl_version.value != 23007: + raise SystemExit( + f"expected NCCL runtime 2.30.7, got status={status}, " + f"raw_version={nccl_version.value}" + ) +print("NCCL package and runtime versions are 2.30.7") import torch print(torch.version.cuda) @@ -882,7 +837,7 @@ for mod in ("server", "grpc", "multimodal"): except Exception as exc: raise SystemExit(f"{name} is present but does not load: {exc!r}") print(f"{name} loads") -' "$CU_MAJOR" +' mark_step_done "${FUNCNAME[0]}" } @@ -904,7 +859,6 @@ main() { remove_stale_cuda12_nvidia_wheels uninstall_stale_flashinfer install_pytorch_stack - install_cuda12_deepep_wheel setup_cargo_cache install_sglang release_cargo_cache_lock diff --git a/scripts/ci/utils/docker_build_metadata_args.py b/scripts/ci/utils/docker_build_metadata_args.py index 79a41a656..ea83d6449 100644 --- a/scripts/ci/utils/docker_build_metadata_args.py +++ b/scripts/ci/utils/docker_build_metadata_args.py @@ -3,7 +3,7 @@ import datetime import json import sys -MOVING_TAGS = {"dev", "dev-cu12", "dev-cu13", "latest"} +MOVING_TAGS = {"dev", "dev-cu13", "latest"} def render_tag_template(tag: str, version: str, date: str, short_sha: str) -> str: diff --git a/scripts/rename_sgl_deep_gemm_whl.sh b/scripts/rename_sgl_deep_gemm_whl.sh index 7a91c1842..570675abf 100755 --- a/scripts/rename_sgl_deep_gemm_whl.sh +++ b/scripts/rename_sgl_deep_gemm_whl.sh @@ -8,7 +8,7 @@ # # Usage: rename_wheels.sh # WHEEL_DIR: directory containing the *.whl file (e.g. DeepGEMM/dist) -# CU_TAG: cu129 | cu130 +# CU_TAG: cu130 # ARCH: x86_64 | aarch64 set -ex diff --git a/scripts/update_deepep_whl_index.py b/scripts/update_deepep_whl_index.py index fd9b09720..c0c9a7c7d 100644 --- a/scripts/update_deepep_whl_index.py +++ b/scripts/update_deepep_whl_index.py @@ -5,7 +5,7 @@ import hashlib import pathlib import re -SUPPORTED_CUDA_VERSIONS = ("129", "130") +SUPPORTED_CUDA_VERSIONS = ("130",) WHEEL_PATTERN = re.compile( r"^sgl_deep_ep-(?P[0-9][^-]*)-[^-]+-[^-]+-[^-]+\.whl$" ) diff --git a/scripts/update_deepgemm_whl_index.py b/scripts/update_deepgemm_whl_index.py index 9be622a9f..f02dede82 100644 --- a/scripts/update_deepgemm_whl_index.py +++ b/scripts/update_deepgemm_whl_index.py @@ -1,14 +1,14 @@ # Generates a PEP 503 simple index for sgl-deep-gemm wheels under # sgl-whl/cu/sgl-deep-gemm/index.html. Mirrors the layout used by # update_kernel_whl_index.py so consumers can `pip install -# sgl-deep-gemm --extra-index-url https://...whl/cu129`. +# sgl-deep-gemm --extra-index-url https://...whl/cu130`. import argparse import hashlib import pathlib import re -SUPPORTED_CUDA_VERSIONS = ["129", "130"] +SUPPORTED_CUDA_VERSIONS = ["130"] def update_wheel_index(cuda_version, wheel_dir): diff --git a/scripts/update_kernel_whl_index.py b/scripts/update_kernel_whl_index.py index 3c89e70a7..46845479b 100644 --- a/scripts/update_kernel_whl_index.py +++ b/scripts/update_kernel_whl_index.py @@ -5,9 +5,9 @@ import hashlib import pathlib import re -# All the CUDA versions that the wheels will cover -SUPPORTED_CUDA_VERSIONS = ["129", "130"] DEFAULT_CUDA_VERSION = "130" +# Local version a CUDA wheel carries, e.g. sglang_kernel-0.4.6.post1+cu130-...whl +CUDA_LOCAL_VERSION_PATTERN = re.compile(r"\+cu(\d+)") def check_wheel_cuda_version(path_name, target_cuda_version): @@ -19,16 +19,17 @@ def check_wheel_cuda_version(path_name, target_cuda_version): ): return False - # For other CUDA versions, the wheel path name will contain the cuda version suffix, e.g. sglang_kernel-0.4.0+cu130-cp310-abi3-manylinux2014_x86_64.whl - if target_cuda_version != DEFAULT_CUDA_VERSION: - return target_cuda_version in path_name + # Match on the wheel's own +cuNNN tag rather than a list of known versions, + # so a wheel built for a CUDA version this script has never heard of is + # rejected instead of landing in the target index. + match = CUDA_LOCAL_VERSION_PATTERN.search(path_name) + if match is not None: + return match.group(1) == target_cuda_version - # For the default CUDA version, the wheel path name will not contain any cuda version suffix, e.g. sglang_kernel-0.4.0-cp310-abi3-manylinux2014_x86_64.whl - # So we need to check if the wheel path name contains any other cuda version suffix - for cuda_version in SUPPORTED_CUDA_VERSIONS: - if cuda_version != DEFAULT_CUDA_VERSION and cuda_version in path_name: - return False - return True + # An untagged wheel is the default-CUDA build, e.g. + # sglang_kernel-0.4.0-cp310-abi3-manylinux2014_x86_64.whl (PyPI rejects + # local versions, so that upload strips the tag). + return target_cuda_version == DEFAULT_CUDA_VERSION def update_wheel_index(cuda_version=DEFAULT_CUDA_VERSION, rocm_version=None): diff --git a/scripts/update_nightly_whl_index.py b/scripts/update_nightly_whl_index.py index f79fda6a3..05d556690 100755 --- a/scripts/update_nightly_whl_index.py +++ b/scripts/update_nightly_whl_index.py @@ -35,7 +35,7 @@ def update_wheel_index( Args: commit_hash: Short git commit hash (e.g., 'c5f1e86') nightly_version: Full nightly version string (e.g., '0.5.6.post1.dev7716+gc5f1e86') - cuda_version: CUDA version string (e.g., '129' or '130') + cuda_version: CUDA version string (e.g., '130') build_date: Build date in YYYY-MM-DD format (e.g., '2025-12-13') """ dist_dir = pathlib.Path("dist") @@ -176,7 +176,7 @@ def main(): "--cuda-version", type=str, default="130", - help="CUDA version (e.g., '129' or '130'). Defaults to '130'.", + help="CUDA version (e.g., '130'). Defaults to '130'.", ) parser.add_argument( "--build-date", diff --git a/test/registered/unit/tools/test_docker_build_metadata_args.py b/test/registered/unit/tools/test_docker_build_metadata_args.py index 7aca2444b..92811a5ef 100644 --- a/test/registered/unit/tools/test_docker_build_metadata_args.py +++ b/test/registered/unit/tools/test_docker_build_metadata_args.py @@ -76,9 +76,9 @@ class TestDockerBuildMetadataArgs(unittest.TestCase): def test_release_metadata_prefers_versioned_tag(self): args = self.run_helper( - cuda="cu129", + cuda="cu134", tag_config=[ - {"cuda": "cu129", "tags": ["v{version}", "latest"]}, + {"cuda": "cu134", "tags": ["v{version}", "latest"]}, {"cuda": "cu130", "tags": ["v{version}-cu130", "latest-cu130"]}, ], ) @@ -99,7 +99,7 @@ class TestDockerBuildMetadataArgs(unittest.TestCase): cuda="cu130", image_repo="lmsysorg/sglang-staging", tag_config=[ - {"cuda": "cu129", "tags": ["v{version}-runtime", "latest-runtime"]}, + {"cuda": "cu134", "tags": ["v{version}-runtime", "latest-runtime"]}, { "cuda": "cu130", "tags": ["v{version}-cu130-runtime", "latest-cu130-runtime"], @@ -114,11 +114,11 @@ class TestDockerBuildMetadataArgs(unittest.TestCase): def test_dev_nightly_metadata_prefers_unique_tag_from_checked_out_commit(self): args = self.run_helper( - cuda="cu129", + cuda="cu134", version="", build_commit="1234567890abcdef", tag_config=[ - {"cuda": "cu129", "tags": ["dev", "nightly-dev-{date}-{short_sha}"]}, + {"cuda": "cu134", "tags": ["dev", "nightly-dev-{date}-{short_sha}"]}, { "cuda": "cu130", "tags": ["dev-cu13", "nightly-dev-cu13-{date}-{short_sha}"], @@ -140,7 +140,7 @@ class TestDockerBuildMetadataArgs(unittest.TestCase): cuda="cu130", version="", tag_config=[ - {"cuda": "cu129", "tags": ["dev-my-test"]}, + {"cuda": "cu134", "tags": ["dev-my-test"]}, {"cuda": "cu130", "tags": ["dev-cu13-my-test"]}, ], ) @@ -153,7 +153,7 @@ class TestDockerBuildMetadataArgs(unittest.TestCase): def test_missing_cuda_entry_fails(self): with self.assertRaisesRegex(ValueError, "cu130"): self.helper.select_tag( - json.dumps([{"cuda": "cu129", "tags": ["v{version}"]}]), + json.dumps([{"cuda": "cu134", "tags": ["v{version}"]}]), "cu130", "0.6.0", "20260429",