diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000000..39b40040af --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,234 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +name: Dynamo Release + +on: + workflow_dispatch: + push: + branches: + - release-workflow + +jobs: + operator: + environment: release + strategy: + fail-fast: false + matrix: + platform: + - { arch: amd64, runner: cpu-amd-m5-2xlarge } + - { arch: arm64, runner: cpu-arm-r8g-4xlarge } + name: operator (${{ matrix.platform.arch }}) + runs-on: ${{ matrix.platform.runner }} + steps: + - name: Checkout code + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: docker + - name: Login to ECR + shell: bash + env: + ECR_HOSTNAME: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_DEFAULT_REGION }}.amazonaws.com + run: | + aws ecr get-login-password --region ${{ secrets.AWS_DEFAULT_REGION }} | docker login --username AWS --password-stdin ${ECR_HOSTNAME} + - name: Build Container + id: build-image + shell: bash + env: + ECR_HOSTNAME: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_DEFAULT_REGION }}.amazonaws.com + run: | + cd deploy/cloud/operator + docker buildx build --load \ + --platform linux/${{ matrix.platform.arch }} \ + --build-arg DOCKER_PROXY=${ECR_HOSTNAME}/dockerhub/ \ + -f Dockerfile \ + -t dynamo-operator:latest . + # - name: Docker Tag and Push + # uses: ./.github/actions/docker-tag-push + # with: + # local_image: dynamo-operator:latest + # push_tag: ai-dynamo/dynamo:${{ github.sha }}-operator-${{ matrix.platform.arch }} + # aws_push: 'false' + # azure_push: 'true' + # aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + # aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + # azure_acr_hostname: ${{ secrets.AZURE_ACR_HOSTNAME }} + # azure_acr_user: ${{ secrets.AZURE_ACR_USER }} + # azure_acr_password: ${{ secrets.AZURE_ACR_PASSWORD }} + + vllm: + environment: release + strategy: + fail-fast: false + matrix: + platform: + - { arch: amd64, runner: gpu-l40-amd64 } + - { arch: arm64, runner: cpu-arm-r8g-4xlarge } + name: vllm (${{ matrix.platform.arch }}) + runs-on: ${{ matrix.platform.runner }} + steps: + - name: Checkout code + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - name: Build Container + id: build-image + uses: ./.github/actions/docker-build + with: + framework: vllm + target: runtime + platform: 'linux/${{ matrix.platform.arch }}' + base_image_tag: ${{ matrix.platform.arch == 'arm64' && '25.06-cuda12.9-devel-ubuntu24.04' || '' }} + runtime_image_tag: ${{ matrix.platform.arch == 'arm64' && '12.9.0-runtime-ubuntu24.04' || '' }} + cuda_version: ${{ matrix.platform.arch == 'arm64' && '129' || '' }} + torch_backend: ${{ matrix.platform.arch == 'arm64' && 'cu129' || '' }} + ngc_ci_access_token: ${{ secrets.NGC_CI_ACCESS_TOKEN }} + ci_token: ${{ secrets.CI_TOKEN }} + aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + sccache_s3_bucket: ${{ secrets.SCCACHE_S3_BUCKET }} + aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + # - name: Docker Tag and Push + # uses: ./.github/actions/docker-tag-push + # with: + # local_image: ${{ steps.build-image.outputs.image_tag }} + # push_tag: ai-dynamo/dynamo:${{ github.sha }}-vllm-${{ matrix.platform.arch }} + # aws_push: 'true' + # azure_push: 'true' + # aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + # aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + # azure_acr_hostname: ${{ secrets.AZURE_ACR_HOSTNAME }} + # azure_acr_user: ${{ secrets.AZURE_ACR_USER }} + # azure_acr_password: ${{ secrets.AZURE_ACR_PASSWORD }} + + sglang: + environment: release + strategy: + fail-fast: false + matrix: + platform: + - { arch: amd64, runner: gpu-l40-amd64 } + - { arch: arm64, runner: cpu-arm-r8g-4xlarge } + name: sglang (${{ matrix.platform.arch }}) + runs-on: ${{ matrix.platform.runner }} + steps: + - name: Checkout repository + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Build Container + id: build-image + uses: ./.github/actions/docker-build + with: + framework: sglang + target: runtime + platform: 'linux/${{ matrix.platform.arch }}' + ngc_ci_access_token: ${{ secrets.NGC_CI_ACCESS_TOKEN }} + ci_token: ${{ secrets.CI_TOKEN }} + aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + sccache_s3_bucket: ${{ secrets.SCCACHE_S3_BUCKET }} + aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + # - name: Docker Tag and Push + # uses: ./.github/actions/docker-tag-push + # with: + # local_image: ${{ steps.build-image.outputs.image_tag }} + # push_tag: ai-dynamo/dynamo:${{ github.sha }}-sglang-${{ matrix.platform.arch }} + # # OPS-1145: Switch aws_push to true + # aws_push: 'false' + # azure_push: 'true' + # aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + # aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + # azure_acr_hostname: ${{ secrets.AZURE_ACR_HOSTNAME }} + # azure_acr_user: ${{ secrets.AZURE_ACR_USER }} + # azure_acr_password: ${{ secrets.AZURE_ACR_PASSWORD }} + + trtllm: + environment: release + strategy: + fail-fast: false + matrix: + platform: + - { arch: amd64, runner: gpu-l40-amd64 } + - { arch: arm64, runner: cpu-arm-r8g-4xlarge } + name: trtllm (${{ matrix.platform.arch }}) + runs-on: ${{ matrix.platform.runner }} + steps: + - name: Checkout code + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Build Container + id: build-image + uses: ./.github/actions/docker-build + with: + framework: trtllm + target: runtime + platform: 'linux/${{ matrix.platform.arch }}' + ngc_ci_access_token: ${{ secrets.NGC_CI_ACCESS_TOKEN }} + ci_token: ${{ secrets.CI_TOKEN }} + aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + sccache_s3_bucket: ${{ secrets.SCCACHE_S3_BUCKET }} + aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + # - name: Docker Tag and Push + # uses: ./.github/actions/docker-tag-push + # with: + # local_image: ${{ steps.build-image.outputs.image_tag }} + # push_tag: ai-dynamo/dynamo:${{ github.sha }}-sglang-${{ matrix.platform.arch }} + # # OPS-1145: Switch aws_push to true + # aws_push: 'false' + # azure_push: 'true' + # aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + # aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + # azure_acr_hostname: ${{ secrets.AZURE_ACR_HOSTNAME }} + # azure_acr_user: ${{ secrets.AZURE_ACR_USER }} + # azure_acr_password: ${{ secrets.AZURE_ACR_PASSWORD }} + + wheels: + environment: release + strategy: + fail-fast: false + matrix: + platform: + - { arch: amd64, runner: gpu-l40-amd64 } + - { arch: arm64, runner: cpu-arm-r8g-4xlarge } + name: wheels (${{ matrix.platform.arch }}) + runs-on: ${{ matrix.platform.runner }} + steps: + - name: Checkout code + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Build Container + id: build-image + uses: ./.github/actions/docker-build + with: + image_tag: dynamo-base:0.0.0 + framework: none + target: wheel_builder + platform: 'linux/${{ matrix.platform.arch }}' + ngc_ci_access_token: ${{ secrets.NGC_CI_ACCESS_TOKEN }} + ci_token: ${{ secrets.CI_TOKEN }} + aws_default_region: ${{ secrets.AWS_DEFAULT_REGION }} + sccache_s3_bucket: ${{ secrets.SCCACHE_S3_BUCKET }} + aws_account_id: ${{ secrets.AWS_ACCOUNT_ID }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + - name: Extract Wheels + id: extract-wheels + run: | + set -x + docker run -d --rm dynamo-base:0.0.0 sleep 10 + CONTAINER_ID=$(docker ps -a | grep dynamo-base:0.0.0 | awk '{print $1}') + DIST_DIR=$(docker exec ${CONTAINER_ID} ls -1 /opt/dynamo/dist) + REGEX='(ai_dynamo.*any.whl).*(ai_dynamo_runtime.*.whl)' + [[ $DIST_DIR =~ $REGEX ]] + DYNAMO_ANY_WHL=$(echo ${BASH_REMATCH[1]}) + DYNAMO_RUNTIME_WHL=$(echo ${BASH_REMATCH[2]}) + docker cp ${CONTAINER_ID}:/opt/dynamo/dist/${DYNAMO_RUNTIME_WHL} . + docker cp ${CONTAINER_ID}:/opt/dynamo/dist/${DYNAMO_ANY_WHL} . + ls | grep *.whl