[sglang] sglang, AMD MI35x 환경에서 GLM-5-MXFP4 모델의 성능 및 정확도 테스트 추가
PR 링크: sgl-project/sglang#21773 상태: Merged | 변경: +None / -None
들어가며
최근 대규모 언어 모델(LLM)의 발전은 하드웨어 가속 및 최적화 기술의 중요성을 더욱 부각시키고 있습니다. 특히 다양한 하드웨어 아키텍처에서의 모델 성능 검증은 필수적입니다.
sglang 프로젝트의 이번 PR은 AMD의 MI35x GPU 환경에서 GLM-5-MXFP4 모델에 대한 야간 정확도(nightly accuracy) 및 성능(performance) 테스트를 추가하는 것을 목표로 합니다. 또한, 더 이상 사용되지 않는 이전 버전의 GLM-5 모델 테스트를 제거하여 CI(Continuous Integration) 파이프라인을 정리합니다. 이 글에서는 해당 PR의 코드 변경 사항을 분석하고, 이러한 변경이 왜 sglang 프로젝트의 안정성과 성능 검증에 기여하는지 상세히 설명하겠습니다.
코드 분석
이번 PR은 주로 CI 워크플로우 파일과 새로운 테스트 파일을 추가 및 수정하는 데 중점을 둡니다. 주요 변경 사항은 다음과 같습니다.
1. CI 워크플로우 파일 (.github/workflows/nightly-test-amd.yml, .github/workflows/nightly-test-amd-rocm720.yml) 변경
이 PR은 기존 AMD GPU 환경에서의 야간 테스트 워크플로우 파일을 수정하여 새로운 GLM-5-MXFP4 모델 테스트를 포함시키고, 더 이상 사용되지 않는 이전 GLM-5 모델 관련 테스트 작업을 제거합니다.
nightly-test-amd-rocm720.yml 변경 사항
기존 작업 제거:
- - nightly-8-gpu-glm5-rocm720
새로운 작업 추가:
+ - nightly-8-gpu-mi35x-glm5-mxfp4-rocm720
설명:
nightly-test-amd-rocm720.yml 파일에서는 ROCm 7.2 환경에서 실행되는 8-GPU MI35x 설정에 대한 기존 nightly-8-gpu-glm5-rocm720 작업을 제거하고, 대신 nightly-8-gpu-mi35x-glm5-mxfp4-rocm720 작업을 추가했습니다. 이는 GLM-5-MXFP4 모델이 GLM-5의 후속 또는 대체 모델임을 나타내며, 최신 모델에 대한 테스트를 우선시하는 전략입니다.
또한, 기존의 nightly-8-gpu-mi35x-glm5-rocm720 작업이 nightly-8-gpu-mi35x-glm51-rocm720로 변경되고, 새로운 nightly-8-gpu-mi35x-glm5-mxfp4-rocm720 작업이 추가되었습니다. 이는 GLM-5.1 및 GLM-5-MXFP4 모델에 대한 MI35x 환경에서의 테스트를 명확히 구분하고 관리하기 위함입니다.
기존 작업 제거:
- # MI35x 8-GPU GLM-5 (Accuracy only) ROCm 7.2
- nightly-8-gpu-mi35x-glm5-rocm720:
- if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-glm5-rocm720,'))
- runs-on: linux-mi35x-gpu-8
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- with:
- ref: ${{ inputs.ref || github.ref }}
- - name: Setup docker (ROCm 7.2)
- run: |
- touch github_summary.md
- bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720
- env:
- GITHUB_WORKSPACE: ${{ github.workspace }}
- - name: Install dependencies
- run: |
- bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps
- # Install tabulate for run_suite.py (missing in MI35x container)
- bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate
- bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75
- - name: Accuracy Test MI35x ROCm 7.2 (8-GPU GLM-5 NSA)
- timeout-minutes: 180
- run: |
- > github_summary.md # Clear summary file
- bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
- -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
- python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-glm5 --nightly --timeout-per-file 7200 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
- echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
- exit ${TEST_EXIT_CODE:-0}
- # MI35x 8-GPU GLM-5.1 (Accuracy + Performance combined) ROCm 7.2
- nightly-8-gpu-mi35x-glm51-rocm720:
- if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-glm51-rocm720,'))
- runs-on: linux-mi35x-gpu-8
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- with:
- ref: ${{ inputs.ref || github.ref }}
- - name: Setup docker (ROCm 7.2)
- run: |
- touch github_summary.md
- bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720
- env:
- GITHUB_WORKSPACE: ${{ github.workspace }}
- - name: Install dependencies
- run: |
- bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps
- bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate
- bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75
- - name: Accuracy Test MI35x ROCm 7.2 (8-GPU GLM-5.1 NSA)
- timeout-minutes: 180
- run: |
- > github_summary.md # Clear summary file
- bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
- -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
- python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-glm51 --nightly --timeout-per-file 7200 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
- echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
- exit ${TEST_EXIT_CODE:-0}
- - name: Performance Test MI35x ROCm 7.2 (8-GPU GLM-5.1)
- timeout-minutes: 120
- continue-on-error: true
- run: |
- > github_summary.md # Clear summary file
- bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
- -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
- python3 run_suite.py --hw amd --suite nightly-perf-8-gpu-mi35x-glm51 --nightly --timeout-per-file 5400 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
- echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
- exit ${TEST_EXIT_CODE:-0}
+ # MI35x 8-GPU GLM-5.1 (Accuracy + Performance combined) ROCm 7.2
+ nightly-8-gpu-mi35x-glm51-rocm720:
+ if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-glm51-rocm720,'))
+ runs-on: linux-mi35x-gpu-8
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref || github.ref }}
+ - name: Setup docker (ROCm 7.2)
+ run: |
+ touch github_summary.md
+ bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720
+ env:
+ GITHUB_WORKSPACE: ${{ github.workspace }}
+ - name: Install dependencies
+ run: |
+ bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps
+ bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate
+ bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75
+ - name: Accuracy Test MI35x ROCm 7.2 (8-GPU GLM-5.1 NSA)
+ timeout-minutes: 180
+ run: |
+ > github_summary.md # Clear summary file
+ bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
+ -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
+ python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-glm51 --nightly --timeout-per-file 7200 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
+ echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
+ exit ${TEST_EXIT_CODE:-0}
+
+ - name: Performance Test MI35x ROCm 7.2 (8-GPU GLM-5.1)
+ timeout-minutes: 120
+ continue-on-error: true
+ run: |
+ > github_summary.md # Clear summary file
+ bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
+ -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
+ python3 run_suite.py --hw amd --suite nightly-perf-8-gpu-mi35x-glm51 --nightly --timeout-per-file 5400 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
+ echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
+ exit ${TEST_EXIT_CODE:-0}
+
# MI35x 8-GPU GLM-5-MXFP4 (Accuracy + Performance combined) ROCm 7.2
nightly-8-gpu-mi35x-glm5-mxfp4-rocm720:
if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-glm5-mxfp4-rocm720,'))
runs-on: linux-mi35x-gpu-8
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref }}
- name: Setup docker (ROCm 7.2)
run: |
touch github_summary.md
bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720
env:
GITHUB_WORKSPACE: ${{ github.workspace }}
- name: Install dependencies
run: |
bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps
bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate
bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75
- name: Accuracy Test MI35x ROCm 7.2 (8-GPU GLM-5-MXFP4)
timeout-minutes: 180
run: |
> github_summary.md
bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
-e SGLANG_USE_AITER=1 \
-e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-glm5-mxfp4 --nightly --timeout-per-file 7200 ${{ inputs.continue_on_error && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$?
echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
exit ${TEST_EXIT_CODE:-0}
- name: Performance Test MI35x ROCm 7.2 (8-GPU GLM-5-MXFP4)
timeout-minutes: 300
continue-on-error: true
run: |
> github_summary.md
bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \
-e SGLANG_USE_AITER=1 \
-e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \
python3 registered/amd/perf/mi35x/test_glm5_mxfp4_perf_mi35x.py || TEST_EXIT_CODE=$?
echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true
exit ${TEST_EXIT_CODE:-0}
nightly-test-amd.yml 파일에서도 유사하게, 기존 nightly-8-gpu-glm5 및 nightly-8-gpu-mi35x-glm5 작업들이 제거되고, nightly-8-gpu-mi35x-glm5-mxfp4 작업이 추가되었습니다. 이는 GLM-5-MXFP4 모델에 대한 테스트를 표준화하고 이전 모델에 대한 CI 부담을 줄이기 위한 결정입니다.
2. 새로운 테스트 파일 추가
PR은 GLM-5-MXFP4 모델에 대한 정확도 및 성능 테스트를 위한 두 개의 새로운 파일을 추가합니다.
test/registered/amd/accuracy/mi35x/test_glm5_mxfp4_eval_mi35x.py: 이 파일은 AMD MI35x 환경에서 GLM-5-MXFP4 모델의 정확도를 평가하는 GSM8K 5-shot 데이터셋에 대한 테스트를 정의합니다. PR 설명에 따르면 이 모델은 ~92-93%의 정확도를 목표로 하며, 임계값은 0.90으로 설정되었습니다.test/registered/amd/perf/mi35x/test_glm5_mxfp4_perf_mi35x.py: 이 파일은 동일한 MI35x 환경에서bench_one_batch함수를 사용하여 GLM-5-MXFP4 모델의 성능을 측정합니다. 테스트는 1024 토큰의 입력과 1024 토큰의 출력을 기준으로 수행됩니다.
리뷰 반영: 성능 테스트 설정 조정
리뷰어 1am9trash의 제안에 따라, test_glm5_mxfp4_perf_mi35x.py 파일에 --reasoning-parser=glm45 --tool-call-parser=glm47 옵션이 추가되었습니다. 이는 GLM-5-FP8 및 NV 테스트에서 사용되는 설정과 일치시키기 위함입니다. 또한, 성능 테스트의 입력/출력 길이도 4096/512에서 1024/1024로 조정되었습니다. 이는 모델의 최대 컨텍스트 길이(context length)인 4096을 초과하지 않으면서도 현실적인 사용 사례를 반영하기 위한 변경입니다.
# test/registered/amd/perf/mi35x/test_glm5_mxfp4_perf_mi35x.py (예시)
# ...
args = [
"--model", "amd/GLM-5-MXFP4",
"--reasoning-parser", "glm45",
"--tool-call-parser", "glm47",
"--input-len", "1024",
"--output-len", "1024",
"--batch-size", "1",
"--n-predict", "1024",
"--n-warmup", "1",
"--n-runs", "1",
]
# ...
리뷰어 michaelzhang-ai는 이 변경이 다른 AMD 성능 테스트(test_deepseek_r1_mxfp4_perf_mi35x.py, test_grok2_perf_mi35x.py 등)에서 사용되는 패턴과 일치한다고 언급하며 코드의 일관성을 강조했습니다.
왜 이게 좋은가?
이 PR은 몇 가지 중요한 이유로 sglang 프로젝트에 긍정적인 영향을 미칩니다.
- 최신 모델 지원 강화: GLM-5-MXFP4와 같은 최신 모델에 대한 테스트를 추가함으로써, sglang이 최신 LLM 아키텍처 및 양자화 기법을 지원하고 있음을 보장합니다. 이는 사용자들이 최신 모델을 sglang 프레임워크에서 안정적으로 사용할 수 있도록 하는 데 필수적입니다.
- 하드웨어 다양성 확보: AMD MI35x GPU 환경에 대한 테스트는 sglang이 다양한 하드웨어 플랫폼에서 일관된 성능과 정확도를 제공함을 검증합니다. 이는 특히 GPU 시장에서 AMD의 점유율이 증가함에 따라 중요성이 커지고 있습니다.
- CI 파이프라인 효율화: 사용되지 않는 이전 모델의 테스트 작업을 제거함으로써 CI 파이프라인이 더 간결해지고, 테스트 실행 시간이 단축될 수 있습니다. 이는 개발팀이 더 빠르게 피드백을 받고 반복 작업을 수행하는 데 도움을 줍니다.
- 성능 및 정확도 검증: GSM8K 정확도 테스트와
bench_one_batch성능 테스트는 모델이 실제 사용 시나리오에서 기대하는 성능을 발휘하는지 확인하는 중요한 지표입니다. 특히 MXFP4와 같은 양자화 기법은 성능 향상을 목표로 하므로, 이에 대한 검증은 필수적입니다. - 코드 일관성 및 유지보수성 향상: 리뷰 과정을 통해 성능 테스트 설정이 다른 AMD 테스트와 일관성을 유지하게 되면서, 코드베이스 전체의 유지보수성이 향상되었습니다. 이는 장기적으로 프로젝트의 안정성에 기여합니다.
리뷰 과정에서 지적된 것처럼, 성능 테스트의 입력/출력 길이 조정(1024/1024)은 모델의 컨텍스트 길이를 고려한 합리적인 선택입니다. 이는 테스트가 모델의 실제 동작 범위를 벗어나지 않으면서도 유효한 성능 지표를 측정하도록 보장합니다.
결론
이번 PR은 sglang 프로젝트의 CI 시스템을 현대화하고, AMD 하드웨어에서의 최신 모델 지원을 강화하는 중요한 단계입니다. GLM-5-MXFP4 모델에 대한 정확도 및 성능 테스트를 추가하고, 불필요한 테스트를 제거함으로써 프로젝트의 안정성과 개발 효율성을 동시에 높였습니다. 특히 리뷰 과정을 통해 성능 테스트 설정이 최적화된 점은 주목할 만합니다. 이러한 지속적인 테스트 및 최적화 노력은 sglang이 고성능 LLM 추론을 위한 강력한 프레임워크로 자리매김하는 데 핵심적인 역할을 할 것입니다.
참고 자료
- https://github.com/sgl-project/sglang/blob/main/test/registered/amd/accuracy/mi35x/test_glm5_mxfp4_eval_mi35x.py
- https://github.com/sgl-project/sglang/blob/main/test/registered/amd/perf/mi35x/test_glm5_mxfp4_perf_mi35x.py
- https://huggingface.co/amd/GLM-5-MXFP4
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] [AMD] Triton 커널 퓨전을 통한 Qwen3.5 MoE 라우팅 최적화 분석
- 현재글 : [sglang] sglang, AMD MI35x 환경에서 GLM-5-MXFP4 모델의 성능 및 정확도 테스트 추가
- 다음글 [vllm] vLLM TurboQuant: KV 캐시 압축으로 LLM 서빙 효율 극대화
댓글