본문으로 건너뛰기

[sglang] SGLang의 새로운 캐시 전략: T-LRU로 에이전트 워크로드의 TTFT 최적화하기

PR 링크: sgl-project/sglang#34012 상태: Merged | 변경: +349 / -8

들어가며

최근 LLM 서빙 시스템, 특히 에이전트 기반의 워크로드에서는 긴 대화 맥락(context)을 유지하는 것이 중요합니다. 하지만 기존의 LRU(Least Recently Used) 방식은 단순히 최근에 사용된 데이터를 보존하려다 보니, 정작 다음 요청의 TTFT(Time To First Token)를 줄이는 데 필요한 핵심 맥락보다 불필요한 꼬리(tail) 부분을 유지하는 비효율이 발생합니다. SGLang에 도입된 T-LRU(Tail-Optimized LRU)는 이 문제를 해결하기 위해, 다음 프리필(prefill)에 필요한 최소한의 맥락을 제외한 나머지 부분을 우선적으로 제거하여 전체적인 시스템 성능을 최적화합니다.

코드 분석

1. TLRUStrategy 구현 (python/sglang/srt/mem_cache/evict_policy.py)

핵심은 get_priority 함수입니다. T-LRU는 TEL-safe(Tail-Eviction-Safe)한 노드를 '무한히 오래된 것'으로 간주하여 우선적으로 제거합니다.

# Before/After: 새로운 전략 클래스 추가
class TLRUStrategy(EvictionStrategy):
    def get_priority(self, node: TreeNode) -> Tuple[int, float]:
        budget = max(
            node._tlru_history_len + self.next_prompt_estimate - self.threshold, 0
        )
        cached_without_this_node = node._tlru_cached_prefix_len - len(node.key)
        tel_safe = cached_without_this_node >= budget
        return (-1 if tel_safe else 0, node.last_access_time)

여기서 budget은 TTFT SLO를 지키기 위해 유지해야 할 최소 토큰 수를 의미합니다. tel_safe가 참이면 해당 노드는 우선 제거 대상이 됩니다.

2. 상태 관리 및 최적화 (python/sglang/srt/mem_cache/unified_cache/unified_tree_core.py)

리뷰어 ispobock의 피드백을 반영하여, 불필요한 오버헤드를 줄이기 위해 변수명을 명확히 하고 기본 LRU 경로에서는 이 로직이 실행되지 않도록 가드(guard)를 추가했습니다.

# Before: 일반적인 depth 사용
# After: T-LRU 전용 필드 사용으로 가독성 및 안전성 확보
node._tlru_cached_prefix_len = ...
node._tlru_history_len = ...

왜 이게 좋은가

T-LRU는 단순히 캐시 히트율을 높이는 것이 아니라, TTFT(Time To First Token) 분포를 개선하는 데 목적이 있습니다. 벤치마크 결과에 따르면, C=32 환경에서 p99 TTFT가 8.6% 개선되었으며, ITL(Inter-Token Latency)의 경우 p99에서 무려 43.9%까지 개선되는 효과를 보였습니다.

핵심 교훈

  1. 워크로드 인지형 캐싱: 범용적인 LRU보다 특정 도메인(에이전트 대화)의 특성을 반영한 정책이 훨씬 효율적입니다.
  2. 우선순위 기반 제거: 별도의 제거 패스를 추가하는 대신, 기존 eviction 드라이버가 사용하는 우선순위 함수를 재정의함으로써 복잡도를 낮췄습니다.
  3. 성능과 트레이드오프: 평균적인 처리량(throughput)은 유지하면서 꼬리 지연 시간(tail latency)을 획기적으로 줄이는 전략은 실무 환경에서 매우 강력한 도구가 됩니다.

리뷰어 피드백 반영

리뷰 과정에서 _set_depth_and_raise_convo_length 함수가 모든 삽입 시 실행되는 문제를 지적받아, policy == "tlru"일 때만 동작하도록 최적화했습니다. 또한, 변수명을 depth에서 _tlru_history_len으로 변경하여 다른 정책과의 혼동을 방지한 점은 코드 유지보수 측면에서 매우 훌륭한 개선입니다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글