[sglang] sglang, Qwen3.5-397B FP8 모델 성능 벤치마크 추가 및 CI 개선
PR 링크: sgl-project/sglang#21669 상태: Merged | 변경: +None / -None
들어가며
최근 대규모 언어 모델(LLM)의 발전 속도는 눈부십니다. 더 크고 강력한 모델들이 등장하면서, 이를 효율적으로 서빙하고 성능을 측정하는 것은 매우 중요한 과제가 되었습니다. 특히, AMD GPU 환경에서의 최신 모델 성능을 지속적으로 추적하고 검증하는 것은 생태계 확장에 필수적입니다.
이번 PR은 sglang 레포지토리에서 Qwen3.5-397B-A17B-FP8 모델에 대한 AMD GPU (MI30x, MI35x) 성능 벤치마크 테스트를 추가하고, CI(Continuous Integration) 워크플로우를 개선하는 데 중점을 두고 있습니다. 이를 통해 AMD GPU 환경에서 sglang의 Qwen3.5 모델 서빙 성능을 체계적으로 측정하고, 잠재적인 성능 회귀를 조기에 발견할 수 있는 기반을 마련했습니다.
코드 분석
이번 PR의 핵심 변경 사항은 크게 두 가지로 나눌 수 있습니다:
- CI 워크플로우 업데이트: 새로운 성능 벤치마크 테스트를 기존 CI 파이프라인에 통합하고, 테스트 실패 시에도 전체 CI가 중단되지 않도록 유연성을 확보했습니다.
- 정확도 테스트 결과 요약 개선: LM-eval 정확도 테스트 결과를 GitHub Step Summary에 보기 좋게 표시하도록 수정하여, CI 결과 확인의 편의성을 높였습니다.
1. CI 워크플로우 업데이트 (.github/workflows/*.yml)
기존에는 AMD GPU 환경에서 Qwen3.5 모델의 정확도 테스트만 수행했습니다. 이번 PR에서는 여기에 성능 벤치마크 테스트를 추가했습니다. 특히, MI30x와 MI35x GPU 모두에 대해 ROCm 기본 버전과 ROCm 7.2 버전에 대한 워크플로우 파일(nightly-test-amd.yml, nightly-test-amd-rocm720.yml)을 업데이트했습니다.
주요 변경점:
-
새로운 성능 테스트 단계 추가: 각 워크플로우 파일에
Performance Test라는 이름의 새로운 Step이 추가되었습니다. 이 단계에서는nightly-perf-8-gpu-qwen35-fp8및nightly-perf-8-gpu-mi35x-qwen35-fp8와 같은 새로운 성능 테스트 스위트를 실행합니다.-
MI30x/MI35x ROCm 7.2 워크플로우 예시 (일부):
diff --git a/.github/workflows/nightly-test-amd-rocm720.yml b/.github/workflows/nightly-test-amd-rocm720.yml index 14929952ebd6..272972077769 100644 --- a/.github/workflows/nightly-test-amd-rocm720.yml +++ b/.github/workflows/nightly-test-amd-rocm720.yml @@ -621,7 +621,7 @@ jobs: echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0}
-
-
8-GPU Qwen 3.5 (Accuracy + Performance combined) ROCm 7.2
nightly-8-gpu-qwen35-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-qwen35-rocm720,')) runs-on: linux-mi325-8gpu-sglang @@ -653,6 +653,18 @@ jobs: echo "$(<github_summary.md )" >> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0} -
- name: Performance Test ROCm 7.2 (8-GPU Qwen 3.5 FP8) -
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 SGLANG_USE_AITER=1 \ -
-e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \ -
python3 run_suite.py --hw amd --suite nightly-perf-8-gpu-qwen35-fp8 --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} -
8-GPU GLM-5 (Accuracy) ROCm 7.2
nightly-8-gpu-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-glm5-rocm720,')) ```
-
continue-on-error: true적용: 성능 테스트 단계에continue-on-error: true옵션이 추가되었습니다. 이는 정확도 테스트가 통과하더라도 성능 테스트에서 실패할 경우, CI 작업 전체가 실패하는 것을 방지합니다. CI의 안정성을 높이고, 정확도 검증이라는 더 중요한 목표를 놓치지 않도록 합니다. 성능 문제는 별도로 추적하고 수정할 수 있습니다. -
SGLANG_USE_AITER=1환경 변수 설정: 성능 테스트 실행 시SGLANG_USE_AITER=1환경 변수를 설정하여, attention backend로aiter를 사용하도록 명시했습니다. 이는Qwen/Qwen3.5-397B-A17B-FP8모델과 함께 사용되는 최적화된 attention 구현입니다.
2. 정확도 테스트 결과 요약 개선 (test/registered/amd/accuracy/*.py)
기존에는 LM-eval 정확도 테스트 결과가 CI 로그에만 출력되어 확인이 다소 불편했습니다. 이번 PR에서는 test_qwen35_eval_amd.py와 test_qwen35_eval_mi35x.py 파일에서 test_lm_eval 메소드를 오버라이드하여, 테스트 결과를 GitHub Step Summary에 보기 좋은 테이블 형태로 출력하도록 수정했습니다.
주요 변경점:
-
test_lm_eval메소드 오버라이드: 각 테스트 파일에서test_lm_eval메소드를 재정의하여,lm-eval실행 결과를 파싱하고 GitHub Step Summary 형식에 맞게 가공합니다.-
MI30x 테스트 파일 예시 (일부):
diff --git a/test/registered/amd/accuracy/mi30x/test_qwen35_eval_amd.py b/test/registered/amd/accuracy/mi30x/test_qwen35_eval_amd.py index dae0e31c10f7..112630ed474c 100644 --- a/test/registered/amd/accuracy/mi30x/test_qwen35_eval_amd.py +++ b/test/registered/amd/accuracy/mi30x/test_qwen35_eval_amd.py @@ -8,6 +8,10 @@ import os import unittest
-
-
from pathlib import Path -
import numpy as np -
import yaml from sglang.srt.utils import kill_process_tree from sglang.test.ci.ci_register import register_amd_ci @@ -15,7 +19,9 @@ from sglang.test.test_utils import ( DEFAULT_URL_FOR_TEST, CustomTestCase, -
is_in_ci, popen_launch_server, -
write_github_step_summary, ) register_amd_ci(est_time=3600, suite="nightly-amd-accuracy-8-gpu-qwen35", nightly=True) @@ -38,7 +44,7 @@ "--tp", str(TP_SIZE), "--attention-backend",
-
"triton",
-
"aiter", "--trust-remote-code", "--model-loader-extra-config", '{"enable_multithread_load": true}', @@ -59,6 +65,41 @@ def tearDownClass(cls): kill_process_tree(cls.process.pid) -
def test_lm_eval(self): -
"""Override to write accuracy results to GitHub step summary.""" -
import requests -
requests.get(self.base_url + "/flush_cache") -
eval_config = yaml.safe_load( -
Path(self.model_config_name).read_text(encoding="utf-8") -
) -
results = self.launch_lm_eval(eval_config) -
rtol = eval_config.get("rtol", self.default_rtol) -
model_name = eval_config.get("model_name", self.model) -
success = True -
summary = f"### lm-eval accuracy ({model_name})\n" -
summary += "| task | metric | expected | measured | status |\n" -
summary += "| ---- | ------ | -------- | -------- | ------ |\n" -
for task in eval_config["tasks"]: -
for metric in task["metrics"]: -
expected = metric["value"] -
measured = results["results"][task["name"]][metric["name"]] -
passed = bool(np.isclose(expected, measured, rtol=rtol)) -
status = "✅" if passed else "❌" -
summary += f"| {task['name']} | {metric['name']} | {expected:.4f} | {measured:.4f} | {status} |\n" -
print( -
f"{task['name']} | {metric['name']}: " -
f"expected={expected:.3f} | measured={measured:.3f} | rtol={rtol}" -
) -
success = success and passed -
if is_in_ci(): -
write_github_step_summary(summary) -
self.assertTrue(success, "lm-eval validation failed")
if name == "main": unittest.main() ```
attention-backend변경: 기존triton에서aiter로 변경되었습니다. 이는Qwen/Qwen3.5-397B-A17B-FP8모델에 최적화된 attention 구현을 사용하기 위함입니다. (참고: 성능 테스트 단계에서도SGLANG_USE_AITER=1을 통해aiter를 사용하도록 설정했습니다.)
왜 이게 좋은가?
이번 PR은 sglang 프로젝트의 안정성과 성능 검증 체계를 강화하는 데 크게 기여합니다.
- 체계적인 성능 측정 기반 마련: Qwen3.5-397B FP8 모델에 대한 AMD GPU 성능 벤치마크 테스트가 CI에 통합됨으로써, 향후 모델 업데이트나 라이브러리 변경 시 발생할 수 있는 성능 회귀를 자동으로 탐지할 수 있게 되었습니다. 이는 모델 성능을 지속적으로 관리하고 최적화하는 데 필수적입니다.
- CI 안정성 향상:
continue-on-error: true옵션의 도입은 CI 파이프라인의 유연성을 높입니다. 성능 테스트는 중요하지만, 때로는 일시적인 환경 문제나 미미한 성능 저하로 인해 전체 CI가 실패하는 것은 비효율적일 수 있습니다. 이 변경으로 인해 정확도 테스트와 같은 핵심 검증이 실패하지 않는 한, CI는 성공적으로 완료될 수 있으며 성능 이슈는 별도로 추적 및 해결할 수 있습니다. - 개발자 경험 개선: LM-eval 정확도 테스트 결과를 GitHub Step Summary에 시각적으로 표시함으로써, 개발자들은 CI 결과 페이지에서 각 테스트 케이스의 성공/실패 여부와 측정값을 한눈에 파악할 수 있습니다. 이는 디버깅 시간을 단축하고 코드 변경의 영향을 빠르게 이해하는 데 도움을 줍니다.
- AMD GPU 생태계 지원 강화: 최신 대규모 모델에 대한 AMD GPU 성능 벤치마크를 추가함으로써, sglang이 AMD 하드웨어에서도 경쟁력 있는 성능을 제공함을 입증하고 관련 생태계의 발전에 기여합니다.
일반적인 교훈:
- CI는 단순한 코드 검증을 넘어선다: CI는 코드의 정확성뿐만 아니라 성능, 안정성까지 포괄하는 시스템으로 발전해야 합니다. 새로운 모델이나 기능이 추가될 때마다 관련 성능 벤치마크를 CI에 통합하는 것을 고려해야 합니다.
- 테스트 실패의 중요도 구분: 모든 테스트 실패가 동일한 심각도를 갖는 것은 아닙니다.
continue-on-error와 같은 옵션을 활용하여 핵심 검증과 부가 검증을 구분하고, CI 파이프라인의 안정성을 유지하면서도 중요한 피드백을 놓치지 않도록 설계해야 합니다. - 결과 시각화의 중요성: 테스트 결과를 단순히 로그로 남기는 것을 넘어, 사용자가 쉽게 이해하고 활용할 수 있도록 시각화하는 것이 중요합니다. GitHub Step Summary, 대시보드 등 다양한 방법을 활용할 수 있습니다.
References
- Qwen3.5-397B-A17B-FP8 - 사용된 모델의 Hugging Face 페이지
- AMD ROCm - AMD GPU 컴퓨팅 플랫폼
- LM-eval-harness - 언어 모델 평가 도구
- torch.compile - PyTorch 컴파일러 (sglang 내부에서 사용될 수 있음)
- Attention Backend (aiter) - sglang의 attention backend 관련 문서 (추정)
참고 자료
- https://huggingface.co/Qwen/Qwen3.5-397B-A17B-FP8
- https://rocm.docs.amd.com/en/latest/
- https://github.com/EleutherAI/lm-evaluation-harness
- https://pytorch.org/docs/stable/generated/torch.compile.html
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [sglang] SGLang AMD 환경에서의 GLM-5-FP8 성능 벤치마크 도입 및 최적화
- [sglang] sglang 성능 최적화: torch.compile 퓨전 복원을 통한 TopK 후처리 개선
- [sglang] SGLang의 AMD GPU 성능 최적화: Aiter CK 커널을 활용한 LayerNorm 오버헤드 제거
- [sglang] sglang, GLM-5.1-FP8 모델 성능 및 정확도 벤치마크 추가: AMD GPU 환경에서의 최적화 분석
- [sglang] SGLang: MiniMax-M2.5 MoE 모델을 위한 FP8 FlashInfer TRT-LLM 라우팅 최적화
PR Analysis 의 다른글
- 이전글 [cpython] CPython 최적화: _BINARY_OP_EXTEND를 통한 타입 정보 전파로 성능 향상
- 현재글 : [sglang] sglang, Qwen3.5-397B FP8 모델 성능 벤치마크 추가 및 CI 개선
- 다음글 [sglang] SGLang NIXL 이기종 TP 환경에서 디스어그리게이션 KV 캐시 전송 버그 수정 및 성능 개선
댓글