์ธ๊ณต์ง๋ฅ
SGLang: ๊ตฌ์กฐํ๋ ์ธ์ด ๋ชจ๋ธ ํ๋ก๊ทธ๋จ์ ํจ์จ์ ์ธ ์คํ
대규모 언어 모델(Large Language Models, LLM)은 복잡한 작업을 위해 다중 생성 호출, 고급 프롬프트 기술, 제어 흐름 및 구조화된 입력/출력이 필요로 한다. 그러나 이러한 응용 프로그램을 프로그래밍하고 실행하기 위한 효율적인 시스템은 부족하다. SGLang는 이러한 문제를 해결하기 위해 구조화된 언어 모델 프로그램의 효율적인 실행을 제공하는 새로운 시스템이다. SGLang는 프론트엔드 언어와 런타임으로 구성된다. 프론트엔드는 생성과 병렬성 제어를 위한 원시 함수를 제공하여 프로그래밍을 단순화하고, 런타임은 RadixAttention과 같은 새로운 최적화를 통해 실행을 가속화한다. 실험 결과, SGLang는 다양한 대규모 언어 및 멀티모달 모델에서 기존의 최첨단 추론 시스템보다 최대 6.4배 더 높은 처리량을 달성한다.
최근의 LLM 기능 향상으로 인해 더广い 범위의 일반 작업을 처리할 수 있게 되었으며, 독립적인 에이전트로 작동할 수 있다. 이러한 응용 프로그램에서는 LLM이 다중 라운드 계획, 추론 및 외부 환경과의 상호 작용에 참여한다. 이것은 도구 사용, 다중 입력 모달리티 및 다양한 프롬프트 기술을 통해 가능하다. 이러한 새로운 사용 사례는 복잡한 작업을 완료하기 위해 종종 의존적인 다중 LLM 생성 호출을 필요로 한다.
이러한 변화를 통해 LLM의 사용법이 단순한 채팅에서 더 복잡한 프로그래밍 방식으로 전환하고 있다. 이러한 프로그램은 “언어 모델 프로그램”이라고 하며, 고급 프롬프트 기술 및 에이전트 워크플로우도 포함된다. 언어 모델 프로그램에는 두 가지 공통 속성이 있다. 첫째, 언어 모델 프로그램은 일반적으로 복잡한 작업을 완료하고 전체 품질을 향상시키기 위해 다중 LLM 호출과 제어 흐름을 포함한다. 둘째, 언어 모델 프로그램은 구조화된 입력을 받고 구조화된 출력을 생성하여 언어 모델 프로그램의 구성 및 기존 소프트웨어 시스템과의 통합을 가능하게 한다.
이 문서에서는 SGLang 프레임워크에 대해 더 깊이 있게 살펴보고, 그 아키텍처를 분석하고, 기존 프레임워크와 비교할 것이다. 따라서 시작해 보자.
SGLang 소개
언어 모델 프로그램을 표현하고 실행하는 현재 시스템은 비효율적이다. SGLang는 언어 모델 프로그램의 효율적인 사용과 관련된 두 가지 주요 문제를 식별한다.
- 프로그래밍 복잡성: 언어 모델 프로그램을 개발하는 것은 언어 모델의 비결정적 특성으로 인해 어려울 수 있다. 이것은 광범위한 문자열 조작, 프롬프트의 실험적 조정, 취약한 출력 파싱, 다중 입력 모달리티의 처리 및 병렬성 메커니즘의 구현을 포함한다. 이러한 복잡성은 심지어 간단한 프로그램의 가독성을 크게 줄인다.
- 실행 비효율성: 언어 모델 프로그램을 실행하는 것은冗余한 계산 및 메모리 사용으로 인해 비효율적이다. 최첨단 추론 엔진은 지연을 줄이고 처리량을 개선하기 위해 최적화되었지만, 작업에 대한 직접적인 지식이 отсутств하여 상당한 비효율성을 초래한다. 예를 들어, Key-Value(KV) 캐시의 재사용은 생성 추론에 필수적인 중간 텐서의 재사용을 포함한다. 현재 시스템은 KV 캐시를 여러 LLM 호출에서 공통 접두사를 공유하는 경우에 효과적으로 재사용할 수 있는 메커니즘을 缺하고 있다. 이는 불필요한 계산 및 메모리 낭비를 초래한다. 또한, 구조화된 출력을 위한 제약된 디코딩은 기존 시스템에서 최적화되지 않다.
이러한 문제를 해결하기 위해 SGLang는 언어 모델 프로그램을 위한 구조화된 생성 언어를 도입한다. 핵심 아이디어는 언어 모델 프로그램의 다중 호출 구조를 효율적인 실행을 위해 체계적으로 활용하는 것이다. 다음 그림에서 볼 수 있듯이, SGLang는 두 부분으로 구성된다. 프론트엔드와 백엔드 런타임이다.

프론트엔드는 언어 모델 프로그램의 프로그래밍을 단순화하고, 런타임은 실행을 가속화한다. 이러한 부분은 함께 작동하거나 독립적으로 작동할 수 있다.
SGLang는 Python에 내장된 도메인 특화 언어로, 생성 및 병렬성 제어를 위한 원시 함수를 제공한다. 이는 Python의 제어 흐름 및 라이브러리를 사용하여 고급 프롬프트 워크플로우를 쉽게 개발할 수 있다. SGLang에는 인터프리터와 컴파일러가 포함되어 있다. 인터프리터는 프롬프트 상태를 스트림으로 관리하고, 원시 연산을 스트림에 제출하여 비동기식으로 실행한다. 이는 프로세스 내 병렬성을 가능하게 한다. 또한, SGLang 프로그램은 추적 및 컴파일되어 추가 최적화를 위해 사용할 수 있다.
- RadixAttention: 이 기술은 다중 생성 호출에서 KV 캐시를 자동으로 재사용할 수 있다. 기존의 추론 엔진에서는 요청이 처리된 후 KV 캐시가 폐기되어 재사용이 불가능하다. SGLang는 radix 트리 내에서 LRU 캐시를 관리하여 KV 캐시를 전통적인 캐시로 사용하고, radix 트리를 효율적인 일치, 삽입 및 폐기를 위해 사용한다. 이는 다양한 재사용 패턴을 효율적으로 처리할 수 있다.
- 압축된 유한 상태 기계: 이 기술은 구조화된 출력을 위한 더 빠른 제약된 디코딩을 가능하게 한다. 기존 시스템은 다음 토큰에 대한 제약만을 고려하여 한 번에 하나의 토큰만 디코딩할 수 있다. 반면에, SGLang는 제약을 분석하고, 이를 나타내는 압축된 유한 상태 기계를 구축하여, 가능할 때 여러 토큰을 한 번에 디코딩할 수 있다.
- API 스펙큘레이티브 실행: API 전용 모델인 OpenAI의 GPT-4와 같은 모델을 위해, SGLang는 다중 호출 프로그램을 최적화하기 위한 API 스펙큘레이티브 실행을 도입한다.
SGLang를 사용하여 다양한 언어 모델 응용 프로그램이 구현되었다. 이는 에이전트 제어, 논리적 추론, 少샷 학습 벤치마크, JSON 디코딩, 검색 증강 생성 파이프라인, 다중 회신 채팅 및 다중 모달리티 처리를 포함한다. 성능은 Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B(이미지) 및 LLaVA-NeXT-34B(비디오)와 같은 모델에서 NVIDIA A10G 및 A100 GPU에서 테스트되었다. 실험 결과, SGLang는 기존 프로그래밍 및 추론 시스템과 비교하여, 다양한 작업, 모델 및 하드웨어 설정에서 최대 6.4배 더 높은 처리량을 달성한다.
SGLang: 프로그래밍 모델 및 방법론
SGLang 프로그래밍 모델은 실행 예를 통해 소개되며, 언어 원시 함수 및 실행 모드를 설명하고, 런타임 최적화 기회를 개략적으로 설명한다. 이 모델은 다중 호출 워크플로우에서 번거로운 작업을 단순화한다. SGLang는 Python에 내장된 도메인 특화 언어로, 생성 및 병렬성 제어를 위한 원시 함수를 제공한다.

함수 multi_dimensional_judge는 세 가지 인수를 받는다. `s`, `path`, `essay`이다. s는 프롬프트 상태를 관리하고, path는 이미지 파일 경로이며, essay는 에세이 텍스트이다. 새로운 문자열과 SGLang 원시 함수를 상태 s에 추가하여 실행할 수 있다. 먼저, 함수는 이미지와 에세이를 프롬프트에 추가한다. 그런 다음, 에세이가 이미지와 관련이 있는지 확인하고, 결과를 s[“related”]에 저장한다. 관련이 있다면, 프롬프트를 세 개의 복사본으로 분기하여 병렬로 평가한다. gen을 사용하여 결과를 f[“judgment”]에 저장한다. 다음으로, 판단을 병합하고, 요약을 생성하며, 등급을 할당한다. 마지막으로, 결과를 JSON 형식으로 반환한다. SGLang는 이 프로그램을 크게 단순화한다. OpenAI API와 같은 인터페이스를 사용하는 동일한 프로그램은 2.1배 더 많은 코드 줄을 필요로 한다.
SGLang는 프롬프트 상태, 생성 및 병렬성을 제어하기 위한 원시 함수를 제공한다. 여기에는 다음이 포함된다.
gen: 모델을 호출하여 생성하고, 결과를 변수에 저장한다. regex 인수를 지원하여, 출력을 정규 표현식으로 정의된 문법을 따르도록 제약할 수 있다.
- select: 모델을 호출하여 가장 높은 확률의 옵션을 선택한다.
- += 또는 extend: 문자열을 프롬프트에 추가한다.
- [변수 이름]: 생성 결과를 가져온다.
- fork: 프롬프트 상태의 병렬 분기를 생성한다.
- join: 프롬프트 상태를 재결합한다.
- image 및 video: 이미지 및 비디오 입력을 받는다.
SGLang 프로그램을 실행하는 가장 간단한 방법은 인터프리터를 통해 실행하는 것이다. 여기서 프롬프트는 비동기식 스트림으로 처리된다. extend, gen 및 select와 같은 원시 함수는 스트림에 제출되어 비동기식으로 실행된다. 이러한 비차단 호출은 Python 코드가 생성이 완료될 때까지 기다리지 않고 계속 실행할 수 있게 한다. 각 프롬프트는 백그라운드 스레드의 스트림 실행기에 의해 관리되며, 프로세스 내 병렬성을 가능하게 한다. 생성 결과를 가져올 때는 결과가 준비될 때까지 블록된다. 이는 올바른 동기화를 보장한다. 대안으로, SGLang 프로그램은 컴퓨팅 그래프로 컴파일되어 그래프 실행기로 실행될 수 있다. 이는 더 많은 최적화를 허용한다. 이 문서에서는 기본적으로 인터프리터 모드를 사용하며, 컴파일러 모드 결과는 부록 D에서 논의한다. SGLang는 자체 SGLang 런타임(SRT)을 사용하여 오픈 웨이트 모델을 지원하며, OpenAI 및 Anthropic 모델과 같은 API 모델도 지원한다.
LLM을 위한 프로그래밍 시스템은 고수준 및 저수준으로 분류할 수 있다. 고수준 시스템은 미리 정의된 또는 자동 생성된 프롬프트를 제공한다. 저수준 시스템은 일반적으로 프롬프트를 변경하지 않지만, 프롬프트 및 원시 함수의 직접 조작을 허용한다. SGLang는 LMQL 및 Guidance와 유사한 저수준 시스템이다. 다음 표는 이러한 시스템의 기능을 비교한다.

SGLang는 런타임 효율성에 중점을 두며, 고유한 런타임을 제공하여 새로운 최적화를 허용한다. 고수준 언어는 저수준 언어로 컴파일될 수 있다. DSPy에서 백엔드로서 SGLang의 통합은 나중에 런타임 효율성을 개선하기 위해 示される다.

위의 예는 RadixAttention 작업을 보여준다. 여기에는 LRU 폐기 정책이 있으며, 다양한 요청에 대한 노드의 동적 할당 및 폐기를示한다. 이러한 요청에는 두 개의 채팅 세션, 少샷 학습 질의의 일괄 처리 및 자기 일관성 샘플링이 포함된다. 각 트리 에지에는 서브스트링 또는 토큰 시퀀스를 나타내는 레이블이 있다. 노드는 상태를 나타내는 색상으로 표시된다. 초록색은 새로 추가된 노드, 파란색은 접근된 노드, 빨간색은 폐기된 노드이다.
단계 1: Radix 트리는 초기에 비어 있다.
단계 2: 서버는 들어오는 사용자 메시지 “Hello”를 처리하고, LLM 출력 “Hi”로 응답한다. 시스템 프롬프트 “You are a helpful assistant”, 사용자 메시지 “Hello!”, LLM 응답 “Hi!”는 트리에 단일 에지로 연결된 새로운 노드로 통합된다.
단계 3: 새로운 프롬프트가 도착하고, 서버는 프롬프트의 접두사를 radix 트리에서 찾고, KV 캐시를 재사용한다. 새로운 턴은 트리에 새로운 노드로 추가된다.
단계 4: 새로운 채팅 세션이 시작된다. 단계 3의 노드는 두 채팅 세션이 시스템 프롬프트를 공유할 수 있도록 두 개의 노드로 분할된다.
단계 5: 두 번째 채팅 세션이 계속된다. 그러나 메모리 제한으로 인해 단계 4의 노드가 폐기되어야 한다. 새로운 턴은 단계 4의 남은 노드之后에 추가된다.
단계 6: 서버는 少샷 학습 질의를 받고, 이를 처리하여 트리에 삽입한다. 루트 노드는 새로운 질의와 기존 노드가 공통 접두사를 공유하지 않기 때문에 분할된다.
단계 7: 서버는 추가 少샷 학습 질의의 일괄 처리를 받는다. 이러한 질의는 동일한 少샷 예제 집합을 공유하므로, 단계 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의 경우, 입력 이미지의 해시를 계산하여 radix 트리의 키로 사용하여, 동일한 이미지 토큰의 KV 캐시를 재사용할 수 있다. LLaVA-v1.5-7B(이미지) 및 LLaVA-NeXT-34B(비디오)가 테스트되었다. 이러한 모델은 다른 기준 시스템에서 잘 지원되지 않기 때문에, Hugging Face Transformers의 원래 구현이 기준으로 사용되었다. 다음 표에서示된 바와 같이, SGLang는 이러한 벤치마크에서 최대 6배 더 높은 처리량을 제공한다.

제품 배포
SGLang는 Chatbot Arena에서 오픈 웨이트 모델을 서비스하기 위해 배포되었다. 일부 모델의 트래픽이 낮기 때문에, 각 모델당 하나의 SGLang 워커만 서비스한다. 한 달 후, LLaVA-Next-34B의 경우 52.4%, Vicuna-33B의 경우 74.1%의 RadixAttention 캐시 적중률이 관찰되었다. 캐시 적중은 공통 시스템 메시지, 자주 재사용되는 예제 이미지 및 다중 회신 채팅 기록에서 발생했다. 이는 Vicuna-33B의 첫 번째 토큰 지연을 평균 1.7배 줄였다.

최종 생각
이 문서에서, 우리는 SGLang에 대해 논의했다. SGLang는 구조화된 언어 모델 프로그램의 효율적인 실행을 제공하는 새로운 시스템이다. SGLang는 프론트엔드 언어와 런타임으로 구성된다. 프론트엔드는 생성 및 병렬성 제어를 위한 원시 함수를 제공하여 프로그래밍을 단순화하고, 런타임은 RadixAttention과 같은 새로운 최적화를 통해 실행을 가속화한다. 실험 결과, SGLang는 다양한 대규모 언어 및 멀티모달 모델에서 기존의 최첨단 추론 시스템보다 최대 6.4배 더 높은 처리량을 달성한다.












