최신글

스터디정리-프롬프트를 보내고 토큰을 받기까지, 서빙엔진 안에서 벌어지는 일

반응형

Hands-On LLM Serving and Optimization책의 챕터 3은 서빙엔진(serving engine)의 기본 기능을 직접 코드로 구현해보며 체감하는 시간입니다. API 서비스, 모델 실행 관리, batch, 스트리밍 네 가지 기능을 순서대로 살펴봅니다. 이 네 가지를 알면 vLLM 같은 서빙엔진의 옵션이 무엇을 조절하는 값인지 이해할 수 있습니다.

- 실습 예제코드: https://github.com/choisungwook/portfolio/tree/master/computer_science/ai/study-llmserving/ch3

 

기능 1 - 요청을 받는 API service

사용자 또는 client가 서빙엔진에 프롬프트를 요청하면, LLM 모델이 생성한 토큰을 응답으로 받습니다.

 

client가 서빙엔진에 요청을 보내고 응답을 받을 수 있는 이유는 서빙엔진이 API를 제공하기 때문입니다. 그래서 서빙엔진은 client 요청을 받기 위해 API 서비스를 제공합니다. API규격은 2026.8월 기준으로 openAI스펙을 준수하는 서빙엔진이 많습니다.

 

기능 2 - 모델 실행 관리

API 서비스는 사용자 요청을 받고 응답을 돌려주는 기능만 합니다. 사용자 요청을 AI 모델이 실행하도록, 서빙엔진은 executor를 가지고 있습니다. 이 예제에서는 Model executor라고 부릅니다.

LLM engine은 API service와 Model executor 사이를 중재합니다.

 

AI 모델이 응답을 생성하기까지 시간이 걸리므로, LLM engine은 큐를 사용해 Model executor와 통신합니다.

 

기능 3 - 여러 요청을 받고 응답하기

기능 2의 LLM engine은 client 요청을 한 번에 하나씩만 처리합니다. 그래서 사용자 요청이 3개 전송되면 순서대로 프롬프트를 실행하고 응답을 줍니다. A, B, C 순서대로 요청했다면 A, B, C 순서대로 응답을 받습니다. B, C 요청이 아무리 짧아도 A가 끝날 때까지 기다려야 합니다.

 

또한 GPU 자원이 넉넉해서 A, B, C 요청을 한 번에 실행할 수 있더라도 한 번에 한 요청만 실행하기 때문에, GPU 관점에서도 요청을 하나씩 실행하는 것은 낭비입니다.

 

그래서 사용자 요청을 한 번에 여러 개 실행하는 기능이 있는데, 이 기능을 batch라고 합니다. 사용자가 요청한 프롬프트를 구분하기 위해 고유한 시퀀스(sequence)를 설정하고, GPU 사양에 따라 batch size를 설정한 뒤 프롬프트를 한 번에 실행합니다. 실행되지 않은 프롬프트는 큐에서 대기합니다.

 

프롬프트에 시퀀스를 설정하고 AI 모델에게 실행을 요청하는 컴포넌트가 LLM engine에 필요한데, 이 예제에서는 Workload manager라고 부릅니다.

 

기능 4 - 스트리밍

AI 모델은 토큰을 하나씩 생성하기 때문에, 응답이 모두 완성될 때까지 기다리면 사용자 경험이 나쁩니다. 그래서 AI 모델이 생성한 토큰을 생성되는 대로 응답으로 주는데, 이 과정을 스트리밍이라고 부릅니다. 스트리밍은 주로 SSE(Server-Sent Events)를 사용합니다. SSE는 HTTP 위에서 서버가 client에게 데이터를 계속 흘려보내는 방식입니다.

 

마치며

살펴본 4가지 기능은 vLLM, SGLang 등 알려진 서빙엔진에 이미 구현되어 있습니다. 저희는 서빙엔진 옵션만 상황에 맞게 적절히 설정하면 됩니다. 이 글에서 살펴본 기능 이외에도 KV 캐시 설정 등 운영에 필요한 수많은 옵션이 서빙엔진에 있습니다.

반응형