본문 바로가기

AI·LLM 엔지니어링

RAG 비용 최적화 — GPU·CPU 자원 절감으로 운영비 줄이는 법

반응형

📘 LangChain 기반 RAG 시스템 구축

9편. RAG 시스템 비용 최적화 + GPU/CPU 자원 절감 전략

LangChain 기반 RAG 시스템: 데이터 준비부터 평가까지 전 과정 공개 – 9편

RAG 시스템을 실제 운영환경에 올리면 가장 먼저 부딪히는 문제가 있다.

“왜 이렇게 돈이 많이 들지?”
특히 GPU 모델(vLLM, TensorRT-LLM, OpenAI API 등)을 쓰는 경우,
요청량이 조금만 늘어도 비용이 급격히 증가한다.

이 글에서는 실제 운영 환경에서 GPU/CPU 자원 사용량을 절반 이하로 줄였던 경험을 기반으로
RAG 시스템의 비용 절감 포인트를 정리한다.


🧩 1. 비용 최적화의 핵심 원칙 3가지

1) 모델은 “최소 필요 스펙”으로 돌려라

10B 모델이 필요 없는 서비스가 대부분이다.
다수의 RAG QA 서비스는 3B~7B 모델로도 충분하다.

추가적으로:

  • 응답 정확도에 영향 없는 선에서 KV Cache 재활용
  • 로우 프리시전(4bit/8bit) 양자화 사용
  • 대규모 모델은 서머리/리라이팅 전용처럼 역할을 분리

2) Retrieval 비용 > Generation 비용

실제로 RAG 비용의 절반 이상은 retriever 비용에서 발생한다.

원인:

  • 대형 임베딩 모델 (bge-m3, e5-large, jina-embeddings-large-v2)
  • 대형 벡터 인덱스 (Qdrant/HNSW 인덱스 크기 증가)
  • 지나치게 긴 문서 chunk

그래서 Retrieval 비용 최적화가 전체 비용 최적화의 핵심이다.


3) 로드/캐싱/프리컴퓨팅 활용

가장 쉬운 비용 절감.

  • LLM 출력 캐싱
  • Retrieval 캐싱
  • Rerank 결과 캐싱
  • Chunking 결과 캐싱
  • DB Preload

🧱 2. RAG 비용 최적화 아키텍처

아래는 실무에서 사용 중인 구조의 단순화 버전이다.

[Client]
   ↓
[API Gateway]
   ↓
[RAG Orchestrator]
   ├─ Retrieval Cache Layer (Redis/Memcached)
   ├─ Rerank Cache
   ├─ Generation Cache
   └─ Load Balancer
        ├─ GPU Node (vLLM)
        └─ CPU Node (Embedding, Retrieval)

핵심 원칙:

  • Retrieval/Embedding은 CPU로
  • LLM Generation만 GPU로
  • 빈출 쿼리는 캐싱으로 우선 처리
  • GPU는 항상 Stateless + Auto Scaling

🔍 3. GPU 비용 절감 전략

① GPU → CPU로 가능한 작업 이전

GPU가 비싼 이유는 “모든 작업을 GPU에 때려넣기 때문”이다.

CPU로 가능한 작업은 모두 CPU로 넘긴다:

  • 텍스트 전처리
  • chunking
  • metadata filtering
  • bm25 검색
  • rerank (ColBERT 제외)
  • 서브 요약

② 양자화 모델 사용

GPU 메모리는 곧 비용이다.
4bit/8bit 양자화는 선택이 아니라 필수다.

LangChain + vLLM:

from vllm import LLM

llm = LLM(
    model="meta-llama-3-8b-instruct-q4",
    dtype="auto",
    gpu_memory_utilization=0.90
)

4bit 변환 자체는 텍스트 QA에서 거의 손실이 없다.


③ GPU Batch Size 극대화

LLM 서비스 비용 절감 공식은 단순하다:

Batch size ↑ → Throughput ↑ → 비용 ↓

vLLM 설정:

llm = LLM(
    model="meta-llama-3-8b-instruct-q4",
    max_num_seqs=32
)

④ GPU Auto Scaling 필수

GPU는 idle 상태로 있어도 비용이 발생한다.

AWS 기준:

  • g6e.xlarge → 시간당 1.4불
  • g6e.2xlarge → 시간당 2.8불

즉,
트래픽 변동 큰 시스템은 무조건 Auto Scaling 필요


🖥️ 4. CPU 비용 절감 전략

1) Embedding 모델 크기 줄이기

bge-large, jina-large 등을 쓰면 임베딩 비용이 폭증한다.
대안:

  • bge-small
  • e5-small
  • jina-small

테스트 결과 대부분 RAG 서비스에서 성능 차이는 크지 않았다.


2) 인덱스 최적화 (Qdrant 기준)

hnsw_config:
   m: 16
   ef_construct: 200
quantization_config:
   scalar:
      type: int8

int8 quantization
검색 성능 큰 변화 없이 디스크 사용량을 50% 줄인다.


3) Redis로 Retrieval 캐싱

“동일한 질문”으로 오는 호출이 일정 비율 존재한다.

Redis 캐싱 코드 예:

key = f"retrieval:{query}"
cached = redis.get(key)
if cached:
    return json.loads(cached)

이것만으로 Retrieval 비용 30~60% 절감 가능.


🔄 5. LLM Generation 비용 절약

1) 응답 길이를 제한하기

LLM 토큰은 곧 돈이다.

max_tokens=256

다수의 QA 서비스는 256 토큰으로 충분하다.


2) 압축된 Chunk 사용

Chunk 크기를 줄이면 retrieval 결과량이 줄고
LLM이 읽어야 하는 input tokens도 감소한다.

Chunk 크기 예:

  • 512 → 300 → 256 → 200 → 150

보통 256~300이 sweet spot.


3) Rerank Top-k 축소

기본값 3이면 충분하다.

  • 3개: 성능 안정적 + 비용 절감
  • 5개 이상: 과도한 토큰 증가

🧰 6. 실전 팁 3개 (실제 운영 경험 기반)

💡 팁 1. 임베딩은 절대 Real-time으로 하지 말 것

대부분의 문서 RAG는 오프라인 임베딩 파이프라인으로 해결된다.
Real-time embedding은 비용을 수십 배 올린다.

💡 팁 2. GPU를 LLM 전용으로 고정하라

Retrieval, Indexing, ETL 등 ANY 작업도 GPU로 돌리면 비용 폭발.
GPU는 “LLM Inferencing 전용”으로 설계하는 것이 비용 최적화의 핵심.

💡 팁 3. 캐시 적중률 40%만 돼도 GPU 비용 반값 된다

Retrieval / Rerank / Generation을 모두 캐싱하면
LLM 호출 횟수가 절반 이하로 줄어든다.


🏷️ 태그

  • RAG
  • LLM
  • LangChain
  • vLLM
  • 비용 최적화
  • GPU 최적화
  • CPU 최적화
  • 캐싱 전략
  • AI 엔지니어링
  • 생성형 AI

 

반응형