[AMD] prepare for MI300x PR runner pool: registry mirror, runner routing, threshold tuning (#23156)
This commit is contained in:
@@ -92,6 +92,8 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
||||||
|
DOCKERHUB_AMD_USERNAME: ${{ secrets.DOCKERHUB_AMD_USERNAME }}
|
||||||
|
DOCKERHUB_AMD_TOKEN: ${{ secrets.DOCKERHUB_AMD_TOKEN }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# When called via workflow_call with ref set, use a unique group per caller run to avoid
|
# When called via workflow_call with ref set, use a unique group per caller run to avoid
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
||||||
|
DOCKERHUB_AMD_USERNAME: ${{ secrets.DOCKERHUB_AMD_USERNAME }}
|
||||||
|
DOCKERHUB_AMD_TOKEN: ${{ secrets.DOCKERHUB_AMD_TOKEN }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# When called via workflow_call with ref set, use a unique group per caller run to avoid
|
# When called via workflow_call with ref set, use a unique group per caller run to avoid
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
||||||
|
DOCKERHUB_AMD_USERNAME: ${{ secrets.DOCKERHUB_AMD_USERNAME }}
|
||||||
|
DOCKERHUB_AMD_TOKEN: ${{ secrets.DOCKERHUB_AMD_TOKEN }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# When called via workflow_call with run_all_tests=true, use a unique group per run to
|
# When called via workflow_call with run_all_tests=true, use a unique group per run to
|
||||||
|
|||||||
@@ -59,6 +59,14 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
|
runner_arch:
|
||||||
|
description: 'AMD runner pool to dispatch GPU jobs to'
|
||||||
|
required: false
|
||||||
|
type: choice
|
||||||
|
default: mi300
|
||||||
|
options:
|
||||||
|
- mi300
|
||||||
|
- mi325
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
ref:
|
ref:
|
||||||
@@ -84,6 +92,8 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
AITER_COMMIT_OVERRIDE: ${{ inputs.aiter_ref }}
|
||||||
|
DOCKERHUB_AMD_USERNAME: ${{ secrets.DOCKERHUB_AMD_USERNAME }}
|
||||||
|
DOCKERHUB_AMD_TOKEN: ${{ secrets.DOCKERHUB_AMD_TOKEN }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Scheduled and run_all_tests runs get unique groups (never cancel each other).
|
# Scheduled and run_all_tests runs get unique groups (never cancel each other).
|
||||||
@@ -165,6 +175,7 @@ jobs:
|
|||||||
|
|
||||||
# =============================================== sgl-kernel ====================================================
|
# =============================================== sgl-kernel ====================================================
|
||||||
sgl-kernel-unit-test-amd:
|
sgl-kernel-unit-test-amd:
|
||||||
|
name: ${{ format('sgl-kernel-unit-test-amd (linux-{0}-1gpu-sglang)', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -176,11 +187,7 @@ jobs:
|
|||||||
needs.check-changes.outputs.sgl_kernel == 'true'
|
needs.check-changes.outputs.sgl_kernel == 'true'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
strategy:
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -226,6 +233,7 @@ jobs:
|
|||||||
exit $failures
|
exit $failures
|
||||||
|
|
||||||
sgl-kernel-unit-test-2-gpu-amd:
|
sgl-kernel-unit-test-2-gpu-amd:
|
||||||
|
name: ${{ format('sgl-kernel-unit-test-2-gpu-amd (linux-{0}-2gpu-sglang)', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -237,11 +245,7 @@ jobs:
|
|||||||
needs.check-changes.outputs.sgl_kernel == 'true'
|
needs.check-changes.outputs.sgl_kernel == 'true'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
strategy:
|
runs-on: ${{ format('linux-{0}-2gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [linux-mi325-2gpu-sglang]
|
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -280,6 +284,7 @@ jobs:
|
|||||||
# =============================================== primary ====================================================
|
# =============================================== primary ====================================================
|
||||||
|
|
||||||
stage-a-test-1-gpu-small-amd:
|
stage-a-test-1-gpu-small-amd:
|
||||||
|
name: ${{ format('stage-a-test-1-gpu-small-amd (linux-{0}-1gpu-sglang)', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -291,11 +296,7 @@ jobs:
|
|||||||
((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true'))
|
((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true'))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
strategy:
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -320,6 +321,7 @@ jobs:
|
|||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-a-test-1-gpu-small-amd ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-a-test-1-gpu-small-amd ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
jit-kernel-unit-test-amd:
|
jit-kernel-unit-test-amd:
|
||||||
|
name: ${{ format('jit-kernel-unit-test-amd (linux-{0}-1gpu-sglang)', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -331,11 +333,7 @@ jobs:
|
|||||||
needs.check-changes.outputs.jit_kernel == 'true'
|
needs.check-changes.outputs.jit_kernel == 'true'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
strategy:
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -386,6 +384,7 @@ jobs:
|
|||||||
max-wait-minutes: '240'
|
max-wait-minutes: '240'
|
||||||
|
|
||||||
stage-b-test-1-gpu-small-amd:
|
stage-b-test-1-gpu-small-amd:
|
||||||
|
name: ${{ format('stage-b-test-1-gpu-small-amd (linux-{0}-1gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, wait-for-stage-a-amd]
|
needs: [check-changes, wait-for-stage-a-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -400,9 +399,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
part: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
part: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -421,11 +419,12 @@ jobs:
|
|||||||
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 45
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 14 --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 14 --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
stage-b-test-1-gpu-small-amd-nondeterministic:
|
stage-b-test-1-gpu-small-amd-nondeterministic:
|
||||||
|
name: ${{ format('stage-b-test-1-gpu-small-amd-nondeterministic (linux-{0}-1gpu-sglang)', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
needs: [check-changes, wait-for-stage-a-amd]
|
needs: [check-changes, wait-for-stage-a-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -437,11 +436,7 @@ jobs:
|
|||||||
((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true'))
|
((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true'))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
strategy:
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -460,7 +455,7 @@ jobs:
|
|||||||
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 45
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd-nondeterministic --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd-nondeterministic --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
@@ -504,6 +499,7 @@ jobs:
|
|||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd-mi35x ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-small-amd-mi35x ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
stage-b-test-1-gpu-large-amd:
|
stage-b-test-1-gpu-large-amd:
|
||||||
|
name: ${{ format('stage-b-test-1-gpu-large-amd (linux-{0}-1gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, wait-for-stage-a-amd]
|
needs: [check-changes, wait-for-stage-a-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -518,9 +514,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
|
||||||
part: [0, 1, 2]
|
part: [0, 1, 2]
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -539,11 +534,12 @@ jobs:
|
|||||||
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 45
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-large-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-1-gpu-large-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 --timeout-per-file 2700 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
stage-b-test-2-gpu-large-amd:
|
stage-b-test-2-gpu-large-amd:
|
||||||
|
name: ${{ format('stage-b-test-2-gpu-large-amd (linux-{0}-2gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, wait-for-stage-a-amd]
|
needs: [check-changes, wait-for-stage-a-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -558,9 +554,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-2gpu-sglang]
|
|
||||||
part: [0, 1]
|
part: [0, 1]
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-2gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -579,11 +574,12 @@ jobs:
|
|||||||
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 45
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-2-gpu-large-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 --timeout-per-file 1800 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-b-test-2-gpu-large-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 --timeout-per-file 2700 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
multimodal-gen-test-1-gpu-amd:
|
multimodal-gen-test-1-gpu-amd:
|
||||||
|
name: ${{ format('multimodal-gen-test-1-gpu-amd (linux-{0}-1gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -599,9 +595,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
max-parallel: 1 # Run one at a time to avoid eviction from resource exhaustion during AITER kernel JIT
|
max-parallel: 1 # Run one at a time to avoid eviction from resource exhaustion during AITER kernel JIT
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-1gpu-sglang]
|
part: [0, 1, 2, 3]
|
||||||
part: [0, 1, 2, 3] # 2 partitions: 11 tests ÷ 2 = ~5-6 tests each
|
runs-on: ${{ format('linux-{0}-1gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
runs-on: ${{matrix.runner}}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -715,6 +710,7 @@ jobs:
|
|||||||
free -h
|
free -h
|
||||||
|
|
||||||
multimodal-gen-test-2-gpu-amd:
|
multimodal-gen-test-2-gpu-amd:
|
||||||
|
name: ${{ format('multimodal-gen-test-2-gpu-amd (linux-{0}-2gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, call-gate]
|
needs: [check-changes, call-gate]
|
||||||
if: |
|
if: |
|
||||||
always() && !cancelled() &&
|
always() && !cancelled() &&
|
||||||
@@ -730,9 +726,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
max-parallel: 1 # Run one at a time to avoid eviction from resource exhaustion during AITER kernel JIT
|
max-parallel: 1 # Run one at a time to avoid eviction from resource exhaustion during AITER kernel JIT
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-2gpu-sglang]
|
|
||||||
part: [0, 1, 2] # 3 partitions: 2 parametrized + 1 standalone (test_disagg_server.py)
|
part: [0, 1, 2] # 3 partitions: 2 parametrized + 1 standalone (test_disagg_server.py)
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-2gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -812,7 +807,7 @@ jobs:
|
|||||||
docker exec ci_sglang rocm-smi --showmeminfo vram 2>/dev/null || echo "rocm-smi not available"
|
docker exec ci_sglang rocm-smi --showmeminfo vram 2>/dev/null || echo "rocm-smi not available"
|
||||||
|
|
||||||
- name: Run diffusion server tests (2-GPU)
|
- name: Run diffusion server tests (2-GPU)
|
||||||
timeout-minutes: 80
|
timeout-minutes: 90
|
||||||
run: |
|
run: |
|
||||||
# AMD CI: All 2-GPU tests including LoRA
|
# AMD CI: All 2-GPU tests including LoRA
|
||||||
# Tests: T2V, T2I, I2V, LoRA
|
# Tests: T2V, T2I, I2V, LoRA
|
||||||
@@ -871,6 +866,7 @@ jobs:
|
|||||||
max-wait-minutes: '480'
|
max-wait-minutes: '480'
|
||||||
|
|
||||||
stage-c-test-4-gpu-amd:
|
stage-c-test-4-gpu-amd:
|
||||||
|
name: ${{ format('stage-c-test-4-gpu-amd (linux-{0}-4gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, call-gate, wait-for-stage-b-amd]
|
needs: [check-changes, call-gate, wait-for-stage-b-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -885,9 +881,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-4gpu-sglang]
|
|
||||||
part: [0]
|
part: [0]
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-4gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -906,7 +901,7 @@ jobs:
|
|||||||
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
run: bash scripts/ci/amd/amd_ci_install_dependency.sh
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 60
|
timeout-minutes: 90
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh \
|
bash scripts/ci/amd/amd_ci_exec.sh \
|
||||||
-e NCCL_CUMEM_ENABLE=0 \
|
-e NCCL_CUMEM_ENABLE=0 \
|
||||||
@@ -919,7 +914,7 @@ jobs:
|
|||||||
--suite stage-c-test-4-gpu-amd \
|
--suite stage-c-test-4-gpu-amd \
|
||||||
--auto-partition-id ${{ matrix.part }} \
|
--auto-partition-id ${{ matrix.part }} \
|
||||||
--auto-partition-size 1 \
|
--auto-partition-size 1 \
|
||||||
--timeout-per-file 1800 \
|
--timeout-per-file 5400 \
|
||||||
--enable-retry \
|
--enable-retry \
|
||||||
--max-attempts 2 \
|
--max-attempts 2 \
|
||||||
--retry-wait-seconds 120 \
|
--retry-wait-seconds 120 \
|
||||||
@@ -927,6 +922,7 @@ jobs:
|
|||||||
${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
stage-c-test-large-8-gpu-amd:
|
stage-c-test-large-8-gpu-amd:
|
||||||
|
name: ${{ format('stage-c-test-large-8-gpu-amd (linux-{0}-8gpu-sglang, {1})', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325'), matrix.part) }}
|
||||||
needs: [check-changes, call-gate, wait-for-stage-b-amd]
|
needs: [check-changes, call-gate, wait-for-stage-b-amd]
|
||||||
if: |
|
if: |
|
||||||
always() &&
|
always() &&
|
||||||
@@ -939,13 +935,12 @@ jobs:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
env:
|
env:
|
||||||
RUNNER_LABELS: linux-mi325-8gpu-sglang
|
RUNNER_LABELS: ${{ format('linux-{0}-8gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
runner: [linux-mi325-8gpu-sglang]
|
|
||||||
part: [0, 1, 2]
|
part: [0, 1, 2]
|
||||||
runs-on: ${{matrix.runner}}
|
runs-on: ${{ format('linux-{0}-8gpu-sglang', inputs.runner_arch || (github.event_name == 'pull_request' && 'mi300' || 'mi325')) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -970,7 +965,7 @@ jobs:
|
|||||||
docker exec ci_sglang bash -c "cd /sglang-checkout && NCCL_DEBUG=INFO RCCL_DEBUG=INFO torchrun --nproc_per_node=8 scripts/ci/amd/test_rccl_multi_gpu.py"
|
docker exec ci_sglang bash -c "cd /sglang-checkout && NCCL_DEBUG=INFO RCCL_DEBUG=INFO torchrun --nproc_per_node=8 scripts/ci/amd/test_rccl_multi_gpu.py"
|
||||||
|
|
||||||
- name: Run test
|
- name: Run test
|
||||||
timeout-minutes: 60
|
timeout-minutes: 120
|
||||||
run: |
|
run: |
|
||||||
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-c-test-large-8-gpu-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 --timeout-per-file 3600 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
bash scripts/ci/amd/amd_ci_exec.sh -w "/sglang-checkout/test" python3 run_suite.py --hw amd --suite stage-c-test-large-8-gpu-amd --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 --timeout-per-file 3600 ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }}
|
||||||
|
|
||||||
|
|||||||
@@ -154,18 +154,15 @@ find_latest_image() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Then try the local registry.
|
# If not found locally, fall back to pulling from public registry.
|
||||||
for days_back in {0..6}; do
|
# We intentionally do not probe ${LOCAL_DOCKER_REGISTRY} here with
|
||||||
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
# `docker manifest inspect --insecure` because that command runs in the
|
||||||
echo "Checking for image: ${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >&2
|
# runner pod's network namespace, which on every observed AMD scale set
|
||||||
if docker manifest inspect --insecure "${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >/dev/null 2>&1; then
|
# cannot reach 172.29.8.23:5000 (every probe either fast-fails with TLS
|
||||||
echo "Found available image: ${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >&2
|
# reject or hits a 30s TCP timeout, multiplied across 7 daily candidates).
|
||||||
echo "${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}"
|
# The actual local-registry pull still happens in the call site below via
|
||||||
return 0
|
# `docker pull "${LOCAL_DOCKER_REGISTRY}/${IMAGE}"`, which goes through the
|
||||||
fi
|
# docker daemon on the host and inherits its insecure-registries config.
|
||||||
done
|
|
||||||
|
|
||||||
# Finally, try the public registry.
|
|
||||||
for days_back in {0..6}; do
|
for days_back in {0..6}; do
|
||||||
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
||||||
echo "Checking for image: rocm/sgl-dev:${image_tag}" >&2
|
echo "Checking for image: rocm/sgl-dev:${image_tag}" >&2
|
||||||
@@ -260,14 +257,17 @@ elif [[ -n "${BUILD_FROM_DOCKERFILE}" ]]; then
|
|||||||
else
|
else
|
||||||
# Find the latest pre-built image
|
# Find the latest pre-built image
|
||||||
IMAGE=$(find_latest_image "${GPU_ARCH}")
|
IMAGE=$(find_latest_image "${GPU_ARCH}")
|
||||||
echo "Pulling Docker image: ${IMAGE}"
|
# Try the local docker registry first (avoids Docker Hub rate limits and is
|
||||||
if [[ "${IMAGE}" == "${LOCAL_DOCKER_REGISTRY}/"* ]]; then
|
# faster on the LAN); if that fails for any reason, fall back to the
|
||||||
# Local registry is on-LAN; no need to retry.
|
# public registry with exponential-backoff retries. Capture stderr so the
|
||||||
docker pull "${IMAGE}"
|
# real failure reason (TLS handshake, 404, connection refused, etc.) is
|
||||||
docker tag "${IMAGE}" "${IMAGE#${LOCAL_DOCKER_REGISTRY}/}"
|
# visible in the job log instead of being silently swallowed.
|
||||||
IMAGE="${IMAGE#${LOCAL_DOCKER_REGISTRY}/}"
|
if local_pull_output=$(docker pull "${LOCAL_DOCKER_REGISTRY}/${IMAGE}" 2>&1); then
|
||||||
|
echo "Pulled from local docker registry: ${LOCAL_DOCKER_REGISTRY}/${IMAGE}"
|
||||||
|
docker tag "${LOCAL_DOCKER_REGISTRY}/${IMAGE}" "${IMAGE}"
|
||||||
else
|
else
|
||||||
# Public registry pulls can hit rate limits; retry with backoff.
|
echo "Local docker registry pull failed; falling back to public registry: ${IMAGE}" >&2
|
||||||
|
printf '%s\n' "${local_pull_output}" | sed 's/^/ [local-pull] /' >&2
|
||||||
retry_with_backoff 6 docker pull "${IMAGE}"
|
retry_with_backoff 6 docker pull "${IMAGE}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -141,18 +141,11 @@ find_latest_image() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Then try the local registry.
|
# If not found locally, fall back to pulling from public registry.
|
||||||
for days_back in {0..6}; do
|
# See amd_ci_start_container.sh for why we don't probe
|
||||||
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
# ${LOCAL_DOCKER_REGISTRY} with `docker manifest inspect --insecure` from
|
||||||
echo "Checking for image: ${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >&2
|
# the runner pod's network namespace; the actual local-registry pull
|
||||||
if docker manifest inspect --insecure "${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >/dev/null 2>&1; then
|
# happens at the call site below via the docker daemon on the host.
|
||||||
echo "Found available image: ${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}" >&2
|
|
||||||
echo "${LOCAL_DOCKER_REGISTRY}/rocm/sgl-dev:${image_tag}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Finally, try the public registry.
|
|
||||||
for days_back in {0..6}; do
|
for days_back in {0..6}; do
|
||||||
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
image_tag="${base_tag}-$(date -d "${days_back} days ago" +%Y%m%d)"
|
||||||
echo "Checking for image: rocm/sgl-dev:${image_tag}" >&2
|
echo "Checking for image: rocm/sgl-dev:${image_tag}" >&2
|
||||||
@@ -210,14 +203,17 @@ find_latest_image() {
|
|||||||
|
|
||||||
# Pull and run the latest image
|
# Pull and run the latest image
|
||||||
IMAGE=$(find_latest_image "${GPU_ARCH}")
|
IMAGE=$(find_latest_image "${GPU_ARCH}")
|
||||||
echo "Pulling Docker image: ${IMAGE}"
|
# Try the local docker registry first (avoids Docker Hub rate limits and is
|
||||||
if [[ "${IMAGE}" == "${LOCAL_DOCKER_REGISTRY}/"* ]]; then
|
# faster on the LAN); if that fails for any reason, fall back to the
|
||||||
# Local registry is on-LAN; no need to retry.
|
# public registry with exponential-backoff retries. Capture stderr so the
|
||||||
docker pull "${IMAGE}"
|
# real failure reason (TLS handshake, 404, connection refused, etc.) is
|
||||||
docker tag "${IMAGE}" "${IMAGE#${LOCAL_DOCKER_REGISTRY}/}"
|
# visible in the job log instead of being silently swallowed.
|
||||||
IMAGE="${IMAGE#${LOCAL_DOCKER_REGISTRY}/}"
|
if local_pull_output=$(docker pull "${LOCAL_DOCKER_REGISTRY}/${IMAGE}" 2>&1); then
|
||||||
|
echo "Pulled from local docker registry: ${LOCAL_DOCKER_REGISTRY}/${IMAGE}"
|
||||||
|
docker tag "${LOCAL_DOCKER_REGISTRY}/${IMAGE}" "${IMAGE}"
|
||||||
else
|
else
|
||||||
# Public registry pulls can hit rate limits; retry with backoff.
|
echo "Local docker registry pull failed; falling back to public registry: ${IMAGE}" >&2
|
||||||
|
printf '%s\n' "${local_pull_output}" | sed 's/^/ [local-pull] /' >&2
|
||||||
retry_with_backoff 6 docker pull "${IMAGE}"
|
retry_with_backoff 6 docker pull "${IMAGE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from sglang.test.test_utils import (
|
|||||||
write_github_step_summary,
|
write_github_step_summary,
|
||||||
)
|
)
|
||||||
|
|
||||||
register_amd_ci(est_time=1800, suite="stage-c-test-large-8-gpu-amd")
|
register_amd_ci(est_time=3600, suite="stage-c-test-large-8-gpu-amd")
|
||||||
|
|
||||||
DEEPSEEK_V32_MODEL_PATH = "deepseek-ai/DeepSeek-V3.2"
|
DEEPSEEK_V32_MODEL_PATH = "deepseek-ai/DeepSeek-V3.2"
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,8 @@ class TestDeepseekV3MTP(CustomTestCase):
|
|||||||
f'{metrics["accuracy"]=:.3f}\n'
|
f'{metrics["accuracy"]=:.3f}\n'
|
||||||
f"{avg_spec_accept_length=:.2f}\n"
|
f"{avg_spec_accept_length=:.2f}\n"
|
||||||
)
|
)
|
||||||
self.assertGreater(metrics["accuracy"], 0.935)
|
# relax for mi300x
|
||||||
|
self.assertGreaterEqual(metrics["accuracy"], 0.93)
|
||||||
if is_in_amd_ci():
|
if is_in_amd_ci():
|
||||||
self.assertGreater(avg_spec_accept_length, 2.8)
|
self.assertGreater(avg_spec_accept_length, 2.8)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ common_args = [
|
|||||||
"1",
|
"1",
|
||||||
"--enable-dp-lm-head",
|
"--enable-dp-lm-head",
|
||||||
"--mem-fraction-static",
|
"--mem-fraction-static",
|
||||||
"0.6",
|
"0.72", # relax for mi300x
|
||||||
"--chunked-prefill-size",
|
"--chunked-prefill-size",
|
||||||
"32768",
|
"32768",
|
||||||
"--max-running-requests",
|
"--max-running-requests",
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from sglang.test.test_utils import (
|
|||||||
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
|
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
|
||||||
DEFAULT_URL_FOR_TEST,
|
DEFAULT_URL_FOR_TEST,
|
||||||
CustomTestCase,
|
CustomTestCase,
|
||||||
|
is_in_amd_ci,
|
||||||
popen_launch_server,
|
popen_launch_server,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -73,6 +74,9 @@ class TestTorchCompileMoe(CustomTestCase):
|
|||||||
throughput = max_tokens / (tok - tic)
|
throughput = max_tokens / (tok - tic)
|
||||||
if is_cuda():
|
if is_cuda():
|
||||||
self.assertGreaterEqual(throughput, 285)
|
self.assertGreaterEqual(throughput, 285)
|
||||||
|
elif is_in_amd_ci():
|
||||||
|
# relax for mi300x
|
||||||
|
self.assertGreaterEqual(throughput, 240)
|
||||||
else:
|
else:
|
||||||
self.assertGreaterEqual(throughput, 270)
|
self.assertGreaterEqual(throughput, 270)
|
||||||
|
|
||||||
|
|||||||
@@ -142,9 +142,6 @@ class TestBenchServing1GPUPart1(CustomTestCase):
|
|||||||
self.assertLess(res["median_itl_ms"], 10)
|
self.assertLess(res["median_itl_ms"], 10)
|
||||||
|
|
||||||
def test_online_lora_latency(self):
|
def test_online_lora_latency(self):
|
||||||
if is_in_amd_ci():
|
|
||||||
pass
|
|
||||||
|
|
||||||
res = self._run_lora_latency_test(enable_background_task=False)
|
res = self._run_lora_latency_test(enable_background_task=False)
|
||||||
|
|
||||||
if is_in_ci():
|
if is_in_ci():
|
||||||
@@ -154,12 +151,13 @@ class TestBenchServing1GPUPart1(CustomTestCase):
|
|||||||
f"median_ttft_ms: {res['median_ttft_ms']:.2f} ms\n"
|
f"median_ttft_ms: {res['median_ttft_ms']:.2f} ms\n"
|
||||||
)
|
)
|
||||||
self.assertLess(res["median_e2e_latency_ms"], 2400)
|
self.assertLess(res["median_e2e_latency_ms"], 2400)
|
||||||
self.assertLess(res["median_ttft_ms"], 58)
|
# relax for mi300x (LoRA TTFT ~2x slower than mi325)
|
||||||
|
if is_in_amd_ci():
|
||||||
|
self.assertLess(res["median_ttft_ms"], 100)
|
||||||
|
else:
|
||||||
|
self.assertLess(res["median_ttft_ms"], 58)
|
||||||
|
|
||||||
def test_online_lora_latency_with_concurrent_adapter_updates(self):
|
def test_online_lora_latency_with_concurrent_adapter_updates(self):
|
||||||
if is_in_amd_ci():
|
|
||||||
pass
|
|
||||||
|
|
||||||
res = self._run_lora_latency_test(enable_background_task=True)
|
res = self._run_lora_latency_test(enable_background_task=True)
|
||||||
|
|
||||||
if is_in_ci():
|
if is_in_ci():
|
||||||
@@ -169,7 +167,11 @@ class TestBenchServing1GPUPart1(CustomTestCase):
|
|||||||
f"median_ttft_ms: {res['median_ttft_ms']:.2f} ms\n"
|
f"median_ttft_ms: {res['median_ttft_ms']:.2f} ms\n"
|
||||||
)
|
)
|
||||||
self.assertLess(res["median_e2e_latency_ms"], 4000)
|
self.assertLess(res["median_e2e_latency_ms"], 4000)
|
||||||
self.assertLess(res["median_ttft_ms"], 80)
|
# relax for mi300x (LoRA TTFT ~2x slower than mi325)
|
||||||
|
if is_in_amd_ci():
|
||||||
|
self.assertLess(res["median_ttft_ms"], 130)
|
||||||
|
else:
|
||||||
|
self.assertLess(res["median_ttft_ms"], 80)
|
||||||
|
|
||||||
def _run_lora_latency_test(self, enable_background_task: bool):
|
def _run_lora_latency_test(self, enable_background_task: bool):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -41,8 +41,9 @@ class TestBenchServing1GPUPart2(CustomTestCase):
|
|||||||
f"### test_vlm_offline_throughput\n"
|
f"### test_vlm_offline_throughput\n"
|
||||||
f"Output throughput: {res['output_throughput']:.2f} token/s\n"
|
f"Output throughput: {res['output_throughput']:.2f} token/s\n"
|
||||||
)
|
)
|
||||||
|
# relax for mi300x
|
||||||
if is_in_amd_ci():
|
if is_in_amd_ci():
|
||||||
self.assertGreater(res["output_throughput"], 2000)
|
self.assertGreater(res["output_throughput"], 900)
|
||||||
else:
|
else:
|
||||||
self.assertGreater(res["output_throughput"], 2500)
|
self.assertGreater(res["output_throughput"], 2500)
|
||||||
|
|
||||||
@@ -116,12 +117,16 @@ class TestBenchServing1GPUPart2(CustomTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(res["successful_requests"], res["total_requests"])
|
self.assertEqual(res["successful_requests"], res["total_requests"])
|
||||||
bounds = {
|
# relax for mi300x
|
||||||
10: (45, 50),
|
if is_in_amd_ci():
|
||||||
25: (50, 60),
|
bounds = {10: (60, 65), 25: (70, 80), 50: (80, 90)}
|
||||||
50: (60, 65),
|
default_bounds = (90, 90)
|
||||||
}
|
else:
|
||||||
avg_latency_bound, p95_latency_bound = bounds.get(batch_size, (60, 65))
|
bounds = {10: (45, 50), 25: (50, 60), 50: (60, 65)}
|
||||||
|
default_bounds = (60, 65)
|
||||||
|
avg_latency_bound, p95_latency_bound = bounds.get(
|
||||||
|
batch_size, default_bounds
|
||||||
|
)
|
||||||
self.assertLess(res["avg_latency_ms"], avg_latency_bound)
|
self.assertLess(res["avg_latency_ms"], avg_latency_bound)
|
||||||
self.assertLess(res["p95_latency_ms"], p95_latency_bound)
|
self.assertLess(res["p95_latency_ms"], p95_latency_bound)
|
||||||
|
|
||||||
@@ -146,9 +151,15 @@ class TestBenchServing1GPUPart2(CustomTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(res["successful_requests"], res["total_requests"])
|
self.assertEqual(res["successful_requests"], res["total_requests"])
|
||||||
self.assertLess(res["avg_latency_ms"], 20)
|
# relax for mi300x
|
||||||
self.assertLess(res["p95_latency_ms"], 25)
|
if is_in_amd_ci():
|
||||||
self.assertGreater(res["throughput"], 60)
|
self.assertLess(res["avg_latency_ms"], 35)
|
||||||
|
self.assertLess(res["p95_latency_ms"], 40)
|
||||||
|
self.assertGreater(res["throughput"], 30)
|
||||||
|
else:
|
||||||
|
self.assertLess(res["avg_latency_ms"], 20)
|
||||||
|
self.assertLess(res["p95_latency_ms"], 25)
|
||||||
|
self.assertGreater(res["throughput"], 60)
|
||||||
|
|
||||||
def test_embeddings_api_batch_scaling(self):
|
def test_embeddings_api_batch_scaling(self):
|
||||||
"""Test embeddings API performance with different batch sizes"""
|
"""Test embeddings API performance with different batch sizes"""
|
||||||
@@ -173,12 +184,16 @@ class TestBenchServing1GPUPart2(CustomTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(res["successful_requests"], res["total_requests"])
|
self.assertEqual(res["successful_requests"], res["total_requests"])
|
||||||
bounds = {
|
# relax for mi300x
|
||||||
10: (60, 65),
|
if is_in_amd_ci():
|
||||||
25: (115, 120),
|
bounds = {10: (80, 90), 25: (140, 150), 50: (230, 240)}
|
||||||
50: (190, 195),
|
default_bounds = (300, 300)
|
||||||
}
|
else:
|
||||||
avg_latency_bound, p95_latency_bound = bounds.get(batch_size, (250, 250))
|
bounds = {10: (60, 65), 25: (115, 120), 50: (190, 195)}
|
||||||
|
default_bounds = (250, 250)
|
||||||
|
avg_latency_bound, p95_latency_bound = bounds.get(
|
||||||
|
batch_size, default_bounds
|
||||||
|
)
|
||||||
self.assertLess(res["avg_latency_ms"], avg_latency_bound)
|
self.assertLess(res["avg_latency_ms"], avg_latency_bound)
|
||||||
self.assertLess(res["p95_latency_ms"], p95_latency_bound)
|
self.assertLess(res["p95_latency_ms"], p95_latency_bound)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from sglang.test.test_utils import (
|
|||||||
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
|
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
|
||||||
DEFAULT_URL_FOR_TEST,
|
DEFAULT_URL_FOR_TEST,
|
||||||
CustomTestCase,
|
CustomTestCase,
|
||||||
|
is_in_amd_ci,
|
||||||
popen_launch_server,
|
popen_launch_server,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,6 +48,12 @@ class TestPyTorchSamplingBackend(CustomTestCase):
|
|||||||
metrics = run_eval(args)
|
metrics = run_eval(args)
|
||||||
self.assertGreaterEqual(metrics["score"], 0.65)
|
self.assertGreaterEqual(metrics["score"], 0.65)
|
||||||
|
|
||||||
|
@unittest.skipIf(
|
||||||
|
is_in_amd_ci(),
|
||||||
|
"Skip on MI300x: greedy decode is not bit-exact across runs on MI300x "
|
||||||
|
"(kernel-level numerical jitter), so the assertEqual on identical "
|
||||||
|
"regenerated text is flaky on this runner pool.",
|
||||||
|
)
|
||||||
def test_greedy(self):
|
def test_greedy(self):
|
||||||
|
|
||||||
first_text = None
|
first_text = None
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from sglang.test.test_utils import (
|
|||||||
CustomTestCase,
|
CustomTestCase,
|
||||||
auto_config_device,
|
auto_config_device,
|
||||||
get_benchmark_args,
|
get_benchmark_args,
|
||||||
|
is_in_amd_ci,
|
||||||
is_in_ci,
|
is_in_ci,
|
||||||
popen_launch_server,
|
popen_launch_server,
|
||||||
run_benchmark,
|
run_benchmark,
|
||||||
@@ -70,7 +71,8 @@ class TestMultiTokenizer(CustomTestCase, MMLUMixin):
|
|||||||
f"median_e2e_latency_ms: {res['median_e2e_latency_ms']:.2f} ms\n"
|
f"median_e2e_latency_ms: {res['median_e2e_latency_ms']:.2f} ms\n"
|
||||||
)
|
)
|
||||||
self.assertLess(res["median_e2e_latency_ms"], 11000)
|
self.assertLess(res["median_e2e_latency_ms"], 11000)
|
||||||
self.assertLess(res["median_ttft_ms"], 86)
|
# relax for mi300x
|
||||||
|
self.assertLess(res["median_ttft_ms"], 130 if is_in_amd_ci() else 86)
|
||||||
self.assertLess(res["median_itl_ms"], 10)
|
self.assertLess(res["median_itl_ms"], 10)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user