대규모 언어 모델(LLM)은 여러 세대 호출, 고급 프롬프팅 기술, 제어 흐름 및 구조화된 입력/출력이 필요한 복잡한 작업에 점점 더 많이 활용되고 있습니다. 그러나 이러한 애플리케이션을 프로그래밍하고 실행하기 위한 효율적인 시스템이 부족합니다. 새롭게 도입된 시스템인 SGLang은 복잡한 언어 모델 프로그램의 효율적인 실행을 제공하여 이를 해결하고자 합니다. SGLang은 프런트엔드 언어와 런타임으로 구성됩니다. 프런트엔드는 생성 및 병렬 제어를 위한 기본 요소를 사용하여 프로그래밍을 간소화하는 반면, 런타임은 KV 캐시 재사용을 위한 RadixAttention 및 더 빠른 구조화된 출력 디코딩을 위한 압축된 유한 상태 머신과 같은 새로운 최적화를 통해 실행을 가속화합니다. 실험 결과 SGLang은 다양한 대규모 언어 및 멀티모달 모델에서 최첨단 추론 시스템에 비해 최대 6.4배 더 높은 처리량을 달성하여 에이전트 제어, 논리적 추론, 소수 샷 학습 벤치마크, JSON 디코딩, 검색 증강 생성 파이프라인 및 멀티턴 채팅과 같은 작업을 처리합니다.
LLM 기능의 최근 발전으로 유용성이 확장되어 광범위한 일반 작업을 처리하고 자율 에이전트로 기능할 수 있게 되었습니다. 이러한 응용 프로그램에서 LLM은 다중 라운드 계획, 추론 및 외부 환경과의 상호 작용에 참여합니다. 이는 도구 사용, 다중 입력 모달리티 및 few-shot 학습, 자기 일관성, 생각의 골격 및 생각의 나무와 같은 다양한 프롬프트 기술을 통해 용이해집니다. 이러한 새로운 사용 사례에는 여러 개의 종종 종속적인 LLM 생성 호출이 필요하여 복잡한 작업을 완료하기 위해 다중 호출 구조를 사용하는 추세를 나타냅니다.
이러한 변화는 간단한 채팅에서 LLM의 보다 정교한 프로그램적 사용으로의 전환을 의미하며, 여기서 프로그램은 LLM의 생성 프로세스를 스케줄링하고 제어합니다. 이러한 프로그램을 “언어 모델 프로그램”(LM 프로그램)이라고 합니다. 고급 프롬프트 기술과 에이전트 워크플로는 LM 프로그램의 범위에 속합니다. LM 프로그램에는 두 가지 공통적인 속성이 있습니다. (1) LM 프로그램은 일반적으로 복잡한 작업을 완료하고 전반적인 품질을 향상시키기 위해 제어 흐름과 함께 여러 LLM 호출을 포함합니다. (2) LM 프로그램은 구조화된 입력을 받고 구조화된 출력을 생성하여 LM 프로그램을 구성하고 기존 소프트웨어 시스템에 통합할 수 있습니다.
이 글에서는 SGLang 프레임워크를 더 깊이 파고들어 아키텍처를 탐구하고, 성능을 분석하고, 최신 프레임워크와 비교해보겠습니다. 시작해볼까요.
SGLang 소개
LM 프로그램이 널리 사용되고 있음에도 불구하고, 이를 표현하고 실행하기 위한 현재 시스템은 여전히 비효율적이다. SGLang은 LM 프로그램의 효율적인 사용과 관련된 두 가지 주요 과제를 파악한다.
- 프로그래밍 복잡성: LM 프로그램을 개발하는 것은 LLM의 비결정적 특성으로 인해 지루하고 어렵습니다. 여기에는 광범위한 문자열 조작, 프롬프트의 실험적 조정, 취약한 출력 구문 분석, 여러 입력 모달리티 처리 및 병렬 메커니즘 구현이 포함됩니다. 이러한 복잡성은 간단한 프로그램의 가독성을 크게 떨어뜨립니다.
- 실행 비효율성: LM 프로그램을 실행하는 것은 중복된 계산과 메모리 사용으로 인해 비효율적입니다. 대기 시간을 줄이고 처리량을 개선하도록 최적화된 최첨단 추론 엔진은 작업 부하에 대한 직접적인 지식이 부족하여 상당한 비효율성을 초래합니다. 주목할 만한 예로 생성 추론에 필수적인 재사용 가능한 중간 텐서로 구성된 키-값(KV) 캐시를 재사용하는 것입니다. 현재 시스템은 여러 시스템에서 KV 캐시 재사용을 용이하게 하는 효과적인 메커니즘이 부족합니다. 법학 석사 공통 접두사를 공유하는 호출은 불필요한 계산과 낭비되는 메모리로 이어진다. 또한 JSON 모드와 같은 구조화된 출력에 대한 제한된 디코딩은 기존 시스템이 한 번에 하나의 토큰만 디코딩하기 때문에 최적이 아니다.
이러한 과제를 해결하기 위해 SGLang은 LLM을 위한 구조화된 생성 언어를 도입합니다. 핵심 아이디어는 효율적인 실행을 위해 LM 프로그램의 다중 호출 구조를 체계적으로 활용하는 것입니다. 다음 그림에서 볼 수 있듯이 SGLang에는 프런트엔드 언어와 백엔드 런타임의 두 부분이 있습니다.
프런트엔드는 LM 프로그램의 프로그래밍을 간소화하고, 런타임은 실행을 가속화합니다. 이러한 부분은 더 나은 성능을 위해 함께 작동하거나 독립적으로 기능할 수 있습니다.
SGLang은 Python에 내장된 도메인별 언어로, 생성(예: extend, gen, select) 및 병렬 제어(예: fork, join)를 위한 기본 요소를 제공합니다. Python의 제어 흐름 및 라이브러리와 호환되므로 사용자는 기본 Python 구문으로 고급 프롬프트 워크플로를 쉽게 개발할 수 있습니다. SGLang에는 인터프리터와 컴파일러가 포함되어 있습니다. 인터프리터는 프롬프트 상태를 스트림으로 관리하고 비동기 실행을 위해 기본 작업을 스트림에 제출하여 동기화 및 프로그램 내 병렬성에 대한 적절한 제어를 보장합니다. 또한 SGLang 프로그램을 추적하고 추가 최적화를 위해 컴파일할 수 있습니다. SGLang의 런타임은 LM 프로그램의 실행을 가속화하기 위한 몇 가지 새로운 최적화를 제안합니다.
- Radix주의: 이 기술은 여러 세대 호출에서 KV 캐시를 자동으로 재사용할 수 있게 합니다. 기존 추론 엔진에서 요청의 KV 캐시는 처리 후 삭제되어 여러 호출에서 재사용이 불가능하고 실행 속도가 느려집니다. SGLang은 KV 캐시의 LRU 캐시를 라딕스 트리 내에 유지 관리하여 KV 캐시를 기존 캐시로 관리하고 효율적인 매칭, 삽입 및 제거를 위해 라딕스 트리를 사용합니다. 이를 통해 런타임은 다양한 재사용 패턴을 효율적으로 처리할 수 있습니다.
- 압축 유한 상태 머신: 이 기술은 구조화된 출력에 대한 더 빠른 제약 디코딩을 가능하게 합니다. 기존 시스템은 다음 토큰에 대한 제약만 따르므로 한 번에 하나의 토큰을 디코딩할 수 있습니다. 대신 SGLang은 제약을 분석하고 이를 표현하기 위한 압축 유한 상태 머신을 빌드하여 가능한 한 다중 토큰 경로를 단일 단계 경로로 압축하여 한 번에 여러 토큰을 디코딩하여 더 빠른 속도를 낼 수 있습니다.
- API 추측 실행: 다음과 같은 API 전용 모델의 경우 OpenAI의 GPT-4SGLang은 다중 호출 프로그램을 최적화하기 위해 API 추측 실행을 도입합니다.
SGLang을 사용하여 에이전트 제어, 논리적 추론, few-shot 학습 벤치마크, JSON 디코딩, 검색 증강 생성 파이프라인, 멀티 턴 채팅, 멀티 모달리티 처리를 포함한 다양한 LLM 애플리케이션을 구현했습니다. 성능은 NVIDIA A10G 및 A100 GPU에서 Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B(이미지), LLaVA-NeXT-34B(비디오)를 포함한 모델에서 테스트되었습니다. 실험 결과에 따르면 SGLang은 Guidance, vLLM, LMQL을 포함한 기존 프로그래밍 및 추론 시스템에 비해 광범위한 워크로드, 모델 및 하드웨어 설정에서 최대 6.4배 더 높은 처리량을 달성합니다.
SGLang: 프로그래밍 모델 및 방법론
SGLang 프로그래밍 모델은 실행 예제를 통해 소개되며, 언어 기본 요소와 실행 모드를 설명하고 런타임 최적화 기회를 개략적으로 설명합니다. 이 모델은 유연하고 구성 가능한 기본 요소를 제공함으로써 다중 호출 워크플로(예: 문자열 조작, API 호출, 제약 조건 사양, 병렬 처리)에서 지루한 작업을 간소화합니다. SGLang은 Python에 내장된 도메인별 언어입니다. 다음 그림은 브랜치-솔브-병합 프롬프팅 방법을 사용하여 이미지에 대한 에세이를 평가하는 프로그램을 보여줍니다.
기능 다차원적 판단자 세 가지 인수가 필요합니다. `s`, `path`, 그리고 `essay`. s는 프롬프트 상태를 관리하고, path는 이미지 파일 경로이며, essay는 essay 텍스트입니다. 새로운 문자열과 SGLang 기본형은 다음을 사용하여 실행을 위해 상태 s에 추가할 수 있습니다. += 연산자. 먼저, 이 함수는 이미지와 에세이를 프롬프트에 추가합니다. 그런 다음 select를 사용하여 에세이가 이미지와 관련이 있는지 확인하고 결과를 저장합니다. 에스[“related”]. 관련이 있는 경우 프롬프트는 gen을 사용하여 결과를 저장하기 위해 다른 차원에서 병렬 평가를 위해 세 개의 사본으로 포크됩니다. 에프[“judgment”]. 다음으로, 판단을 병합하고 요약을 생성하고 문자 등급을 지정합니다. 마지막으로, 정규 표현식 제약 조건으로 정의된 스키마에 따라 JSON 형식으로 결과를 반환합니다. 정규식. SGLang은 이 프로그램을 크게 단순화합니다. OpenAI API와 같은 인터페이스를 사용하는 동일한 프로그램은 수동 문자열 조작 및 병렬 제어로 인해 코드 줄이 2.1배 더 적게 필요합니다.
SGLang은 프롬프트 상태, 생성 및 병렬 처리를 제어하기 위한 기본 요소를 제공하며, 이는 Python 구문 및 라이브러리와 함께 사용할 수 있습니다. 기본 요소는 다음과 같습니다.
일반: 모델을 호출하여 결과를 생성하고 첫 번째 인수에 지정된 이름의 변수에 저장합니다. 정규 표현식(예: JSON 스키마)으로 정의된 문법을 따르도록 출력을 제한하는 `regex` 인수를 지원합니다.
- 선택: 목록에서 가장 확률이 높은 옵션을 선택하기 위한 모델을 호출합니다.
- += 또는 extend: 프롬프트에 문자열을 추가합니다.
- [variable_name]: 생성 결과를 가져옵니다.
- fork: 프롬프트 상태의 병렬 포크를 생성합니다.
- join: 프롬프트 상태에 다시 합류합니다.
- 이미지 및 비디오: 이미지와 비디오 입력을 받습니다.
SGLang 프로그램을 실행하는 가장 간단한 방법은 인터프리터를 사용하는 것입니다. 인터프리터에서는 프롬프트가 비동기 스트림으로 처리됩니다. 다음과 같은 기본형 확장, 생성 및 선택 비동기 실행을 위해 스트림에 제출됩니다. 이러한 비차단 호출을 통해 Python 코드는 생성이 완료될 때까지 기다리지 않고도 계속 실행할 수 있으며, 이는 CUDA 커널을 비동기적으로 시작하는 것과 유사합니다. 각 프롬프트는 백그라운드 스레드에서 스트림 실행자에 의해 관리되어 프로그램 내 병렬성을 가능하게 합니다. 생성 결과를 가져오면 준비가 될 때까지 차단되어 올바른 동기화가 보장됩니다. 또는 SGLang 프로그램을 계산 그래프로 컴파일하여 그래프 실행자와 함께 실행하여 더 많은 최적화를 수행할 수 있습니다. 이 논문에서는 기본적으로 인터프리터 모드를 사용하고 부록 D에서 컴파일러 모드 결과에 대해 설명합니다. SGLang은 자체 SGLang 런타임(SRT)과 같은 API 모델을 갖춘 개방형 가중치 모델을 지원합니다. 오픈AI 그리고 인류학적 모델.
LLM을 위한 프로그래밍 시스템은 고수준(예: LangChain, DSPy)과 저수준(예: LMQL, Guidance, SGLang)으로 분류할 수 있습니다. 고수준 시스템은 DSPy의 프롬프트 최적화기와 같은 미리 정의되거나 자동 생성된 프롬프트를 제공합니다. 저수준 시스템은 일반적으로 프롬프트를 변경하지 않지만 프롬프트와 기본형을 직접 조작할 수 있습니다. SGLang은 LMQL 및 Guidance와 유사한 저수준 시스템입니다. 다음 표는 기능을 비교합니다.
SGLang은 런타임 효율성에 더 중점을 두고 있으며 자체 공동 설계 런타임과 함께 제공되어 새로운 최적화가 가능합니다. 고급 언어(예: DSPy)는 저수준 언어(예: SGLang)로 컴파일될 수 있습니다. 더 나은 런타임 효율성을 위해 DSPy에서 백엔드로 SGLang을 통합하는 방법은 나중에 설명합니다.
위의 예는 9개 시간 지점에 걸쳐 LRU 퇴출 정책을 사용한 RadixAttention 작업을 보여주며, 다양한 요청에 대한 라딕스 트리의 동적 진화를 보여줍니다. 이러한 요청에는 두 개의 채팅 세션, few-shot 학습 문의 일괄 처리, 자체 일관성 샘플링이 포함됩니다. 각 트리 에지에는 하위 문자열 또는 토큰 시퀀스를 나타내는 레이블이 있습니다. 노드는 다른 상태를 반영하도록 색상으로 구분됩니다. 새로 추가된 노드는 녹색, 시간 지점 동안 액세스한 캐시된 노드는 파란색, 퇴출된 노드는 빨간색입니다.
1단계: 라딕스 트리는 처음에는 비어있습니다.
2단계: 서버는 들어오는 사용자 메시지 “Hello”를 처리하고 LLM 출력 “Hi”로 응답합니다. 시스템 프롬프트 “You are a helpful assistant”, 사용자 메시지 “Hello!”, LLM 응답 “Hi!”는 새 노드에 연결된 단일 에지로 트리에 통합됩니다.
3단계: 새로운 프롬프트가 도착하고 서버는 라딕스 트리에서 프롬프트의 접두사(즉, 대화의 첫 번째 턴)를 찾아 KV 캐시를 재사용합니다. 새로운 턴은 트리에 새 노드로 추가됩니다.
4단계: 새로운 채팅 세션이 시작됩니다. 3단계의 노드는 두 개의 노드로 분할되어 두 채팅 세션이 시스템 프롬프트를 공유할 수 있습니다.
5단계: 두 번째 채팅 세션은 계속됩니다. 그러나 메모리 제한으로 인해 4단계의 노드를 제거해야 합니다. 새로운 턴은 4단계의 나머지 노드 뒤에 추가됩니다.
6단계: 서버는 few-shot 학습 쿼리를 수신하고 이를 처리하여 트리에 삽입합니다. 루트 노드는 새 쿼리가 기존 노드와 접두사를 공유하지 않기 때문에 분할됩니다.
7단계: 서버는 추가 few-shot 학습 쿼리의 배치를 수신합니다. 이러한 쿼리는 동일한 few-shot 예제 세트를 공유하므로 6단계의 노드가 분할되어 공유가 가능합니다.
8단계: 서버는 첫 번째 채팅 세션에서 새 메시지를 수신합니다. 두 번째 채팅 세션에서 가장 최근에 사용되지 않은 모든 노드를 제거합니다.
9단계: 서버는 8단계의 노드에 있는 질문에 대한 더 많은 답변을 샘플링하라는 요청을 받습니다. 이는 자체 일관성 프롬프트를 위한 것일 가능성이 높습니다. 이러한 요청을 위한 공간을 확보하기 위해 여러 노드가 제거됩니다.
이 예제는 RadixAttention이 다양한 유형의 요청에 응답하여 노드를 동적으로 할당하고 제거하는 방법을 보여주며, 이를 통해 효율적인 KV 캐시 재사용 및 메모리 관리를 보장합니다.
SGLang: 평가 및 결과
오픈 웨이트 모델에 대한 결과
대기 시간과 처리량 결과는 다음 그림에 나와 있습니다. SGLang은 처리량을 최대 6.4배까지 개선하고 대기 시간을 최대 3.7배까지 줄입니다. 이러한 개선은 KV 캐시 재사용, 단일 프로그램 내의 병렬성 활용, 더 빠른 제약 디코딩의 결과입니다.
이러한 벤치마크에서 캐시 적중률은 50%에서 99% 사이입니다. 그림 13(부록)은 이들 모두에 대해 달성되고 최적의 캐시 적중률을 나열하며, SGLang의 캐시 인식 스케줄링이 평균적으로 최적 적중률의 96%에 접근함을 보여줍니다.
텐서 병렬성을 갖춘 더 큰 모델에 대한 결과
더 큰 모델인 Mixtral-8x7B와 Llama-70B는 동일한 벤치마크 세트에서 텐서 병렬성으로 테스트되었으며, 결과는 다음 그림에 보고되어 있습니다. 더 큰 모델에서의 속도 향상은 더 작은 모델에서 관찰된 것과 유사한 추세를 보이며, 이는 SGLang의 최적화가 더 큰 모델에 잘 일반화됨을 나타냅니다. 텐서 병렬성의 효율적인 구현이 부족하여 Guidance와 LMQL은 생략되었습니다.
다중 모달 모델에 대한 결과
SGLang은 이미지 및 비디오 기본 요소를 사용하여 다중 모달 모델을 기본적으로 지원합니다. 이 논문의 최적화는 다중 모달 모델과 호환됩니다. RadixAttention의 경우 입력 이미지의 해시가 계산되어 기수 트리의 키로 사용되므로 동일한 이미지의 이미지 토큰의 KV 캐시를 재사용할 수 있습니다. LLaVA-v1.5-7B(이미지)는 llava-bench-in-the-wild에서 실행되었고 LLaVA-NeXT-34B(비디오)는 ActivityNet에서 실행되었습니다. 이러한 모델은 다른 기준 시스템에서 잘 지원되지 않으므로 모델 작성자의 Hugging Face Transformers에서 원래 구현한 것을 기준으로 사용했습니다. 다음 표에서 볼 수 있듯이 SGLang은 이러한 벤치마크에서 최대 6배 더 높은 처리량을 제공합니다. llava-bench-in-the-wild에서 동일한 이미지에 대한 여러 질문을 처리했으며 이 경우 SGLang 런타임이 KV 캐시를 재사용했습니다.
프로덕션 배포
SGLang은 Chatbot Arena에 배포되어 오픈 웨이트 모델을 제공합니다. 일부 모델의 트래픽이 낮아서 SGLang 작업자가 각각 한 명만 제공합니다. 한 달 후, LLaVA-Next-34B의 RadixAttention 캐시 적중률은 52.4%, Vicuna-33B의 경우 74.1%로 관찰되었습니다. 캐시 적중률은 일반적인 시스템 메시지, 자주 재사용되는 예제 이미지, 멀티턴 채팅 기록에서 나왔습니다. 이를 통해 Vicuna-33B의 첫 번째 토큰 대기 시간이 평균 1.7배 감소했습니다.
마지막 생각
이 글에서는 복잡한 언어 모델 프로그램의 효율적인 실행을 제공함으로써 이 문제를 해결하고자 하는 새롭게 도입된 시스템인 SGLang에 대해 이야기했습니다. SGLang은 프런트엔드 언어와 런타임으로 구성됩니다. 프런트엔드는 생성 및 병렬 제어를 위한 기본 요소를 사용하여 프로그래밍을 간소화하는 반면, 런타임은 KV 캐시 재사용을 위한 RadixAttention 및 더 빠른 구조화된 출력 디코딩을 위한 압축된 유한 상태 머신과 같은 새로운 최적화를 통해 실행을 가속화합니다. 실험 결과 SGLang은 다양한 대규모 언어 및 멀티모달 모델에서 최첨단 추론 시스템에 비해 최대 6.4배 더 높은 처리량을 달성하여 에이전트 제어, 논리적 추론, few-shot 학습 벤치마크, JSON 디코딩, 검색 증강 생성 파이프라인 및 멀티턴 채팅과 같은 작업을 처리합니다.
게시물 SGLang: 구조화된 언어 모델 프로그램의 효율적인 실행 처음 등장 유나이트.AI.