본문으로 건너뛰기

[sglang] run_eval에 latency 및 throughput 메트릭 추가

PR 링크: sgl-project/sglang#21793 상태: Merged | 변경: +22 / -0

들어가며

SGLang의 run_eval 프레임워크는 모델 정확도(score)만 보고했다. 하지만 CI에서 모델 서빙 성능의 회귀를 감지하려면 latency와 throughput 메트릭도 함께 추적해야 한다. 이 PR은 completion token 수를 수집하여 output throughput(token/s)과 latency(s) 메트릭을 추가한다.

핵심 코드 분석

1. Completion token 수집

Before:

class ChatCompletionSampler:
    def __call__(self, message_list):
        response = self.client.chat.completions.create(...)
        return response.choices[0].message.content or ""

After:

class ChatCompletionSampler:
    def __init__(self, ...):
        self._completion_tokens: list[int] = []

    def __call__(self, message_list):
        response = self.client.chat.completions.create(...)
        if response.usage and response.usage.completion_tokens is not None:
            self._completion_tokens.append(response.usage.completion_tokens)
        return response.choices[0].message.content or ""

매 API 호출마다 usage.completion_tokens를 리스트에 누적한다.

2. Throughput 계산 및 보고

Before:

metrics = result.metrics | {"score": result.score}
print(f"Score: {metrics['score']:.3f}")

After:

metrics = result.metrics | {"score": result.score}
metrics["latency"] = latency
total_completion_tokens = sum(sampler._completion_tokens)
if total_completion_tokens > 0 and latency > 0:
    metrics["output_throughput"] = total_completion_tokens / latency
    print(f"Output throughput: {metrics['output_throughput']:.3f} token/s")

repeat 모드에서는 각 반복의 latency를 평균하고, completion token을 전체 합산하여 throughput을 계산한다.

왜 이게 좋은가

  • 성능 회귀 감지: 정확도뿐 아니라 처리 속도도 CI에서 추적하여 서빙 성능 회귀를 조기에 발견
  • 기존 코드 변경 최소화: _completion_tokens 리스트 하나만 추가하여 sampler의 기존 동작에 영향 없음
  • dump_metric 통합: 기존 메트릭 수집 프레임워크에 자연스럽게 통합

정리

22줄의 작은 추가로 SGLang 평가 프레임워크에 latency와 output throughput 메트릭을 도입했다. OpenAI API의 usage 정보를 활용하여 추가적인 계측 오버헤드 없이 성능 지표를 수집한다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글