Release Docker Images Nightly ROCm7.2 (AMD) #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release Docker Images Nightly ROCm7.2 (AMD) | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| job_select: | |
| description: 'Select which release job to run' | |
| required: false | |
| type: choice | |
| default: 'all' | |
| options: | |
| - 'all' | |
| - publish | |
| gpu_arch: | |
| description: 'Select which ROCm 7.2 GPU arch to build' | |
| required: false | |
| type: choice | |
| default: 'all' | |
| options: | |
| - 'all' | |
| - gfx942-rocm724 | |
| - gfx950-rocm724 | |
| - gfx942-rocm720 | |
| - gfx950-rocm720 | |
| schedule: | |
| - cron: '0 12 * * *' | |
| concurrency: | |
| # A PR number if a pull request and otherwise the commit hash. This cancels | |
| # queued and in-progress runs for the same PR (presubmit) or commit | |
| # (postsubmit). The workflow name is prepended to avoid conflicts between | |
| # different workflows. | |
| group: ${{ github.workflow }}-${{ github.event.number || github.sha }} | |
| cancel-in-progress: True | |
| jobs: | |
| publish: | |
| if: github.repository == 'sgl-project/sglang' && (github.event_name != 'workflow_dispatch' || inputs.job_select == 'all' || inputs.job_select == 'publish') | |
| runs-on: amd-docker-scale | |
| environment: 'prod' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| gpu_arch: ${{ fromJson((github.event_name == 'workflow_dispatch' && inputs.gpu_arch != 'all' && inputs.gpu_arch != '') && format('["{0}"]', inputs.gpu_arch) || '["gfx942-rocm720", "gfx950-rocm720", "gfx942-rocm724", "gfx950-rocm724"]') }} | |
| build_type: ['all'] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Required for git describe to find tags | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.10" | |
| - name: "Set Date" | |
| run: | | |
| echo "DATE=$(date +%Y%m%d)" >> $GITHUB_ENV | |
| - name: Get version from latest tag | |
| id: version | |
| run: | | |
| # Use the shared helper so stable/post releases sort above rc tags. | |
| VERSION=$(python3 scripts/release/get_version_tag.py --tag-only | sed 's/^v//') | |
| if [ -z "$VERSION" ]; then | |
| echo "::error::Could not determine version from git tags" | |
| exit 1 | |
| fi | |
| # Get short commit hash of current HEAD | |
| COMMIT_HASH=$(git rev-parse --short HEAD) | |
| # Compose pretend version for setuptools_scm: e.g., 0.5.8.post1.dev20260211+g1a2b3c4 | |
| PRETEND_VERSION="${VERSION}.dev${{ env.DATE }}+g${COMMIT_HASH}" | |
| echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
| echo "pretend_version=${PRETEND_VERSION}" >> $GITHUB_OUTPUT | |
| echo "Detected version: ${VERSION}" | |
| echo "Pretend version for pip: ${PRETEND_VERSION}" | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_AMD_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_AMD_TOKEN }} | |
| - name: Build and Push to rocm/sgl-dev | |
| run: | | |
| version=${{ steps.version.outputs.version }} | |
| pretend_version=${{ steps.version.outputs.pretend_version }} | |
| echo "Version: ${version}" | |
| echo "Pretend version: ${pretend_version}" | |
| if [ "${{ matrix.gpu_arch }}" = "gfx942-rocm724" ]; then | |
| rocm_tag="rocm724-mi30x" | |
| elif [ "${{ matrix.gpu_arch }}" = "gfx950-rocm724" ]; then | |
| rocm_tag="rocm724-mi35x" | |
| elif [ "${{ matrix.gpu_arch }}" = "gfx942-rocm720" ]; then | |
| rocm_tag="rocm720-mi30x" | |
| elif [ "${{ matrix.gpu_arch }}" = "gfx950-rocm720" ]; then | |
| rocm_tag="rocm720-mi35x" | |
| else | |
| echo "Unsupported gfx arch" | |
| exit 1 | |
| fi | |
| tag=v${version}-${rocm_tag} | |
| echo "IMAGE_TAG=${tag}-${{ env.DATE }}" >> $GITHUB_ENV | |
| # remove --build-arg NIC_BACKEND=ainic for auto detection nic support in mori | |
| # UBUNTU_MIRROR forces apt over HTTPS to dodge port-80 reachability flakes | |
| # to Canonical's archive.ubuntu.com mirror IPs from the amd-docker-scale runner. | |
| docker build . -f docker/rocm.Dockerfile --build-arg SGL_BRANCH=${{ github.ref_name }} --build-arg BUILD_TYPE=${{ matrix.build_type }} --build-arg GPU_ARCH=${{ matrix.gpu_arch }} --build-arg ENABLE_MORI=1 --build-arg ENABLE_NIXL=1 --build-arg SETUPTOOLS_SCM_PRETEND_VERSION=${pretend_version} --build-arg UBUNTU_MIRROR=https://archive.ubuntu.com -t rocm/sgl-dev:${tag}-${{ env.DATE }} --no-cache | |
| docker push rocm/sgl-dev:${tag}-${{ env.DATE }} | |
| # Persist the tag right after rocm/sgl-dev push succeeds so the local | |
| # registry mirror can run even if a later step in this job (lmsys push) | |
| # fails. By default this step only runs when the previous step succeeded, | |
| # so the artifact only exists when an image actually landed on Docker Hub. | |
| - name: Save published image tag | |
| run: | | |
| mkdir -p image-tag | |
| echo "${{ env.IMAGE_TAG }}" > "image-tag/${{ matrix.gpu_arch }}.txt" | |
| - name: Upload image tag artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: image-tag-${{ matrix.gpu_arch }} | |
| path: image-tag/${{ matrix.gpu_arch }}.txt | |
| retention-days: 1 | |
| - name: Login to Docker Hub (lmsys) | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Push to lmsysorg/sglang-rocm | |
| run: | | |
| docker tag rocm/sgl-dev:${{ env.IMAGE_TAG }} lmsysorg/sglang-rocm:${{ env.IMAGE_TAG }} | |
| docker push lmsysorg/sglang-rocm:${{ env.IMAGE_TAG }} | |
| # Mirror the freshly published rocm/sgl-dev image to the in-network Docker | |
| # registry so AMD CI runners can pull without hitting Docker Hub rate limits. | |
| # The tag is read verbatim from the publish job's artifact so this job uses | |
| # exactly the same tag that publish pushed (only the registry prefix differs). | |
| # `!cancelled()` lets us still mirror successful matrix legs when other legs | |
| # of publish failed; legs without an artifact will fail at download and be | |
| # the only ones marked red. | |
| push_local_registry: | |
| if: ${{ false }} | |
| runs-on: linux-mi300-1gpu-sglang | |
| environment: 'prod' | |
| needs: publish | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| gpu_arch: ${{ fromJson((github.event_name == 'workflow_dispatch' && inputs.gpu_arch != 'all' && inputs.gpu_arch != '') && format('["{0}"]', inputs.gpu_arch) || '["gfx942-rocm720", "gfx950-rocm720", "gfx942-rocm724", "gfx950-rocm724"]') }} | |
| steps: | |
| - name: Download image tag artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: image-tag-${{ matrix.gpu_arch }} | |
| - name: Read image tag | |
| run: | | |
| image_tag=$(tr -d '[:space:]' < "${{ matrix.gpu_arch }}.txt") | |
| if [ -z "${image_tag}" ]; then | |
| echo "::error::Image tag artifact is empty" | |
| exit 1 | |
| fi | |
| echo "IMAGE_TAG=${image_tag}" >> $GITHUB_ENV | |
| echo "Resolved IMAGE_TAG=${image_tag}" | |
| - name: Login to Docker Hub (AMD) | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_AMD_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_AMD_TOKEN }} | |
| - name: Mirror rocm/sgl-dev to local registry | |
| run: | | |
| src="rocm/sgl-dev:${{ env.IMAGE_TAG }}" | |
| dst="10.44.14.109:5000/rocm/sgl-dev:${{ env.IMAGE_TAG }}" | |
| docker pull "${src}" | |
| docker tag "${src}" "${dst}" | |
| docker push "${dst}" |