본문으로 건너뛰기

[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의 핵심 변경 사항은 크게 두 가지로 나눌 수 있습니다:

  1. CI 워크플로우 업데이트: 새로운 성능 벤치마크 테스트를 기존 CI 파이프라인에 통합하고, 테스트 실패 시에도 전체 CI가 중단되지 않도록 유연성을 확보했습니다.
  2. 정확도 테스트 결과 요약 개선: 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-fp8nightly-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.pytest_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 프로젝트의 안정성과 성능 검증 체계를 강화하는 데 크게 기여합니다.

  1. 체계적인 성능 측정 기반 마련: Qwen3.5-397B FP8 모델에 대한 AMD GPU 성능 벤치마크 테스트가 CI에 통합됨으로써, 향후 모델 업데이트나 라이브러리 변경 시 발생할 수 있는 성능 회귀를 자동으로 탐지할 수 있게 되었습니다. 이는 모델 성능을 지속적으로 관리하고 최적화하는 데 필수적입니다.
  2. CI 안정성 향상: continue-on-error: true 옵션의 도입은 CI 파이프라인의 유연성을 높입니다. 성능 테스트는 중요하지만, 때로는 일시적인 환경 문제나 미미한 성능 저하로 인해 전체 CI가 실패하는 것은 비효율적일 수 있습니다. 이 변경으로 인해 정확도 테스트와 같은 핵심 검증이 실패하지 않는 한, CI는 성공적으로 완료될 수 있으며 성능 이슈는 별도로 추적 및 해결할 수 있습니다.
  3. 개발자 경험 개선: LM-eval 정확도 테스트 결과를 GitHub Step Summary에 시각적으로 표시함으로써, 개발자들은 CI 결과 페이지에서 각 테스트 케이스의 성공/실패 여부와 측정값을 한눈에 파악할 수 있습니다. 이는 디버깅 시간을 단축하고 코드 변경의 영향을 빠르게 이해하는 데 도움을 줍니다.
  4. AMD GPU 생태계 지원 강화: 최신 대규모 모델에 대한 AMD GPU 성능 벤치마크를 추가함으로써, sglang이 AMD 하드웨어에서도 경쟁력 있는 성능을 제공함을 입증하고 관련 생태계의 발전에 기여합니다.

일반적인 교훈:

  • CI는 단순한 코드 검증을 넘어선다: CI는 코드의 정확성뿐만 아니라 성능, 안정성까지 포괄하는 시스템으로 발전해야 합니다. 새로운 모델이나 기능이 추가될 때마다 관련 성능 벤치마크를 CI에 통합하는 것을 고려해야 합니다.
  • 테스트 실패의 중요도 구분: 모든 테스트 실패가 동일한 심각도를 갖는 것은 아닙니다. continue-on-error와 같은 옵션을 활용하여 핵심 검증과 부가 검증을 구분하고, CI 파이프라인의 안정성을 유지하면서도 중요한 피드백을 놓치지 않도록 설계해야 합니다.
  • 결과 시각화의 중요성: 테스트 결과를 단순히 로그로 남기는 것을 넘어, 사용자가 쉽게 이해하고 활용할 수 있도록 시각화하는 것이 중요합니다. GitHub Step Summary, 대시보드 등 다양한 방법을 활용할 수 있습니다.

References

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글