본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

왜 전용 인퍼런스 서버

~24 min · serving, tgi, vllm

Level 0스카우트
0 XP0/50 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

pipeline()은 한 사람의 데모까지야

pipeline()은 요청마다 tokenize와 메모리 할당을 반복하고 요청 사이에서 KV cache를 함께 관리하지 못해. 한 사용자의 실험에는 충분하지만 동시 요청이 늘면 여러 호출이 GPU 하나를 비효율적으로 다투게 돼.

추론 서버는 요청들을 함께 운영해

  • 연속 배치는 이전 요청이 끝나기 전에도 새 요청을 현재 배치에 넣어.
  • PagedAttention과 KV cache 관리는 GPU 메모리 조각화를 줄여 더 많은 대화를 담아.
  • 스트리밍은 SSE나 토큰 단위로 첫 결과를 빨리 전달해.
  • 서빙 시점 양자화는 AWQ·GPTQ·bnb·fp8·int4 가운데 실행 형식을 고르게 해.
  • 상태와 지표 끝점/health, /metrics, /info로 운영 상태를 보여 줘.

TGI와 vLLM을 기준점으로 잡아

HF의 공식 서버는 TGI이고, vLLM은 널리 쓰이는 커뮤니티 표준이야. 기능이 많이 겹치지만 배포 환경과 모델 지원이 달라 둘 다 알아둘 가치가 있어.

Code

비교: 동시 사용자 10 명에 pipeline vs TGI·bash
# Pipeline 접근: Python 프로세스 하나, 순차
# 단일 GPU 7B 모델 throughput top out 보통 2-5 req/s

# TGI 접근: TGI 프로세스 하나, continuous batching
# 같은 하드웨어 같은 워크로드 throughput: 30-100 req/s

# 예시지 prescriptive 아님 — 너 하드웨어에서 측정해.
httpx 로 concurrency spot 테스트·python
import httpx
import asyncio

async def hit(client, prompt):
    r = await client.post(
        "http://localhost:8080/generate",
        json={"inputs": prompt, "parameters": {"max_new_tokens": 50}},
        timeout=60,
    )
    return r.json()

async def main():
    async with httpx.AsyncClient() as client:
        results = await asyncio.gather(*[hit(client, "ping") for _ in range(20)])
        print(len(results), results[0])

asyncio.run(main())

External links

Exercise

TGI README + vLLM README 읽어. config 노브 차이 다섯 개 (예: max_concurrent_requests vs max_num_seqs) 리스트. 단일 A100 의 7B Llama 에 어떤 거 띄울지 골라. 3 문장으로 정당화.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.