본문으로 건너뛰기

커스텀 모델 파이프라인 구축 가이드

11분 읽기
AI용 문서 안내

개요​

왜 커스텀 모델 파이프라인이 필요한가​

SaaS 기반 AI 코딩 도구(예: Kiro, GitHub Copilot)는 빠르게 시작할 수 있지만, 엔터프라이즈 환경에서는 근본적인 한계에 부딪힙니다.

제약SaaS (Kiro 등)자체 호스팅 파이프라인
LoRA Fine-tuning불가능도메인별 어댑터 학습 가능
데이터 주권코드가 외부 전송VPC 내부에서 완결
모델 선택제공 모델만 사용오픈소스 모델 자유 선택
비용 제어토큰 단가 고정SLM Cascade로 66% 절감 가능
고객별 최적화범용 모델 공유Multi-LoRA로 고객별 특화
기본 전략

Base Model + LoRA 어댑터 패턴으로 하나의 GPU 위에 여러 도메인 전문 모델을 동시에 서빙합니다. 기본 모델 가중치를 공유하므로 GPU 메모리 효율이 극대화됩니다.

파이프라인 전체 흐름​

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램

학습 파이프라인에서 도메인 데이터를 QLoRA로 학습하고, 평가를 통과한 어댑터만 레지스트리에 등록합니다. 서빙 파이프라인에서는 vLLM Multi-LoRA로 여러 어댑터를 동시에 로드하고, Bifrost Cascade를 통해 SLM/LLM 간 비용 최적화 라우팅을 수행합니다.

관련 문서

LoRA 학습·배포 파이프라인 (도메인 특화)​

이 섹션은 도메인 특화 전략에서 LoRA Fine-tuning과 Multi-LoRA 핫스왑 배포를 실제로 구현하는 방법을 다룹니다. 도메인 특화의 전략적 배경과 의사결정 기준은 도메인 특화 (LoRA + RAG)를 참조하세요.


LoRA Fine-tuning 파이프라인​

QLoRA GPU 절감​

QLoRA(Quantized LoRA)는 기본 모델을 INT4로 양자화한 상태에서 LoRA 어댑터만 학습하는 기법입니다. Full Fine-tuning 대비 GPU 요구사항을 극적으로 줄여줍니다.

모델Full Fine-tuningLoRA (FP16)QLoRA (INT4)
Llama-3.3-70BH100x16+ (비현실적)H100x2~4H100x1
VRAM~840 GB (BF16+AdamW)~142-180 GB~40 GB
학습 시간-5일2-3일
비용-$8,000$2,000
INT4 양자화 정밀도

QLoRA는 학습 중 기본 모델 가중치를 INT4로 유지하므로, 극히 정밀한 수치 연산이 필요한 태스크(예: 금융 계산)에서는 LoRA(FP16) 대비 미세한 정확도 차이가 발생할 수 있습니다. 도메인 평가 단계에서 반드시 검증하세요.

학습 데이터 형식​

학습 데이터는 JSONL 형식의 입력-출력 쌍으로 준비합니다.

{
"input": "COBOL: PERFORM CALC-INTEREST USING WS-PRINCIPAL WS-RATE.",
"output": "Java: @Transactional public BigDecimal calcInterest(BigDecimal principal, BigDecimal rate) { return principal.multiply(rate).setScale(2, RoundingMode.HALF_UP); }"
}

데이터 수집 전략:

소스변환 방법예상 데이터량
레거시 COBOL 코드COBOL → Java 변환 쌍 생성10,000+ 모듈
사내 프레임워크프레임워크 패턴 → 코드 쌍5,000+ 패턴
코드 리뷰 히스토리수정 전 → 수정 후 쌍20,000+ 커밋
기술 문서문서 → 구현 코드 쌍3,000+ 페이지
데이터 품질이 모델 품질을 결정합니다

데이터 양보다 품질이 중요합니다. 시니어 개발자가 검수한 1,000개의 고품질 쌍이, 자동 생성된 10,000개보다 효과적입니다. 최소 500개의 검수된 쌍에서 시작하세요.

학습 프레임워크​

NeMo Framework (NVIDIA)​

대규모 모델 학습에 최적화된 NVIDIA의 공식 프레임워크입니다. Multi-GPU, Multi-Node 분산 학습을 네이티브로 지원합니다.

python train_lora.py \
--config-path=conf \
--config-name=llama3_70b_lora \
model.data.train_ds.file_path=cobol_to_java.jsonl \
model.peft.lora_tuning.adapter_dim=16
NeMo 설정 핵심 파라미터
  • adapter_dim (rank): 16이 일반적. 복잡한 도메인은 32~64까지 증가 가능
  • adapter_dropout: 0.05 권장 (과적합 방지)
  • target_modules: attention layer (q_proj, k_proj, v_proj, o_proj)

Unsloth (최대 2배 빠른 학습)​

단일 노드에서 LoRA/QLoRA 학습 속도를 최대 2배 높이고 VRAM 사용량을 최대 70%까지 절감하는 오픈소스 라이브러리입니다 (Unsloth 자사 벤치마크 기준).

from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
model_name="meta-llama/Llama-3.3-70B-Instruct",
max_seq_length=4096,
load_in_4bit=True, # QLoRA: INT4 양자화
)

model = FastLanguageModel.get_peft_model(
model,
r=16, # LoRA rank
lora_alpha=32, # LoRA scaling factor
target_modules=["q_proj", "k_proj", "v_proj"],
)

trainer = SFTTrainer(
model=model,
train_dataset=dataset,
max_seq_length=4096,
)
trainer.train()
프레임워크장점적합한 경우
NeMoMulti-Node 분산 학습, NVIDIA 공식 지원H100 클러스터 보유 시, 대규모 학습
Unsloth2배 빠른 학습, 메모리 절감, 간편한 API단일 노드, 빠른 프로토타이핑

체크포인트 관리​

학습된 LoRA 어댑터는 S3에 저장하고, MLflow로 버전을 관리합니다.

# 어댑터 저장 구조
s3://model-registry/
└── lora-adapters/
├── bank-ledger/
│ ├── v1.0/adapter_model.safetensors
│ ├── v1.1/adapter_model.safetensors
│ └── latest -> v1.1
├── stock-order/
│ └── v1.0/adapter_model.safetensors
└── insurance-contract/
└── v1.0/adapter_model.safetensors
MLflow 연동

MLflow에 학습 메트릭(loss, accuracy)과 어댑터 경로를 함께 기록하면, 어떤 데이터셋과 하이퍼파라미터 조합이 최적인지 추적할 수 있습니다.


Multi-LoRA 핫스왑 배포​

아키텍처​

vLLM의 Multi-LoRA 기능을 활용하면, 하나의 기본 모델 위에 여러 LoRA 어댑터를 동시에 로드하여 고객별 맞춤 서빙이 가능합니다.

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
Multi-LoRA 메모리 효율

기본 모델(예: 70B)은 한 번만 GPU 메모리에 로드됩니다. 각 LoRA 어댑터는 rank 16 기준 약 100-200MB 수준으로, 10개의 어댑터를 동시에 로드해도 추가 메모리는 2GB 미만입니다.

vLLM Multi-LoRA 설정​

vllm serve meta-llama/Llama-3.3-70B-Instruct \
--enable-lora \
--lora-modules \
bank-ledger=/models/lora/bank \
stock-order=/models/lora/stock \
insurance-contract=/models/lora/insurance \
--max-lora-rank 16

주요 옵션:

옵션설명기본값
--enable-loraMulti-LoRA 활성화false
--lora-modules이름=경로 형태로 어댑터 등록-
--max-lora-rank최대 LoRA rank16
--max-loras동시 로드 가능한 최대 어댑터 수1
--max-cpu-lorasCPU 메모리에 캐시할 어댑터 수-
핫스왑 주의사항

vLLM은 요청 시점에 어댑터를 GPU 메모리로 로드합니다. --max-loras보다 많은 어댑터를 사용하면 스왑 지연 시간(수백ms)가 발생합니다. 자주 사용하는 어댑터 수에 맞게 --max-loras를 설정하세요.

요청 시 어댑터 지정​

OpenAI 호환 API로 요청하며, extra_body에 LoRA 이름을 지정합니다.

response = client.chat.completions.create(
model="meta-llama/Llama-3.3-70B-Instruct",
messages=[{"role": "user", "content": "COBOL 원장 코드를 Java로 변환해줘"}],
extra_body={"lora_name": "bank-ledger"}
)

고객별 라우팅 (Bifrost + X-Customer-Domain 헤더)​

kgateway의 HTTPRoute를 사용하여 HTTP 헤더 기반으로 고객별 LoRA 어댑터를 라우팅합니다.

# kgateway HTTPRoute - 고객별 LoRA 라우팅
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: lora-routing
spec:
rules:
- matches:
- headers:
- name: X-Customer-Domain
value: bank
backendRefs:
- name: vllm-svc
port: 8000
라우팅 흐름

클라이언트(Aider/Cline) → X-Customer-Domain: bank 헤더 설정 → kgateway → Bifrost → vLLM (lora_name=bank-ledger 자동 매핑)

고객별 추론 추적 및 비용 청구​

각 고객의 추론 요청을 LLM 트레이싱 시스템으로 추적하여 LoRA 어댑터별 성능을 모니터링하고 월별 비용을 청구합니다.

from langfuse import Langfuse

langfuse = Langfuse()

trace = langfuse.trace(
name="inference",
user_id="customer-bank-A",
metadata={
"lora": "bank-ledger",
"model": "glm-5-32b",
"domain": "ledger"
}
)

월별 비용 청구 예시:

고객요청 수토큰 수GPU 시간비용
A은행100,000500M50시간$2,500
B증권50,000250M25시간$1,250
C보험30,000150M15시간$750

구현 방법은 Agent 모니터링 및 LLM 트레이싱 배포를 참조하세요.


SLM Cascade Routing (비용 최적화)​

Cascade 아키텍처​

모든 요청을 대형 모델(LLM)로 보내는 것은 비용 낭비입니다. 요청의 70%는 소형 모델(SLM)로도 충분히 처리 가능합니다.

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램

비용 분석​

SLM 단독LLM 단독Cascade (70:30)
월 비용$500$8,900$3,020
정확도70%95%92%
비용 절감--66%
ROI 계산

위 비용 분석 표(70:30 트래픽 가정)를 기준으로 Cascade 도입 시 월 $5,880(연간 $70,560)을 절감할 수 있습니다. 설정에 소요되는 시간은 1-2일 수준입니다. 실제 절감액은 트래픽 구성·복잡도 분포·품질 기준에 따라 달라집니다.

Bifrost Cascade Config​

{
"providers": {
"openai": {
"keys": [
{
"name": "slm",
"value": "dummy",
"weight": 0.7,
"models": ["llama-8b"]
},
{
"name": "llm",
"value": "dummy",
"weight": 0.3,
"models": ["glm5"]
}
],
"network_config": {
"base_url": "http://glm5-serving:8000"
}
}
}
}
Bifrost Complexity Router (2026-06 지원)

Bifrost는 2026-06-12 출시된 governance plugin v1.5.19부터 Complexity Router를 지원합니다. 요청을 SIMPLE/MEDIUM/COMPLEX/REASONING 티어로 자동 분류하고 complexity_tier CEL 변수로 라우팅 규칙에 사용할 수 있습니다. 다만 티어 분류만 자동이며 라우팅 규칙은 사용자가 명시적으로 작성해야 합니다. 상세 가이드: Bifrost Complexity Router

SLM 배포 YAML​

apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-slm
namespace: agentic-serving
spec:
replicas: 1
selector:
matchLabels:
app: vllm-slm
template:
metadata:
labels:
app: vllm-slm
spec:
nodeSelector:
node.kubernetes.io/instance-type: g6.xlarge
containers:
- name: vllm
image: vllm/vllm-openai:latest
command: ["vllm", "serve"]
args:
- "meta-llama/Llama-3.1-8B-Instruct"
- "--served-model-name=llama-8b"
- "--tensor-parallel-size=1"
- "--max-model-len=32768"
- "--host=0.0.0.0"
- "--port=8000"
resources:
limits:
nvidia.com/gpu: 1
ports:
- containerPort: 8000
name: http
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
name: vllm-slm-svc
namespace: agentic-serving
spec:
selector:
app: vllm-slm
ports:
- port: 8000
targetPort: 8000
protocol: TCP
g6.xlarge 인스턴스 스펙
  • GPU: NVIDIA L4 1개 (24GB VRAM)
  • 비용: ~$0.805/hr (On-Demand), ~$0.19-0.49/hr (Spot, 지역별)
  • 8B 모델 서빙에 충분한 사양

평가 파이프라인​

LoRA 어댑터 평가 매트릭스​

학습된 어댑터는 배포 전 반드시 다중 평가를 통과해야 합니다.

평가 방법목적도구자동화
RAGASRAG 정확도 (faithfulness, relevancy)ragasCI/CD 통합
SWE-bench코딩 퀄리티 (실제 이슈 해결력)swe-benchCI/CD 통합
도메인 전문가 리뷰비즈니스 정합성 검증Langfuse Annotation수동
Red-teaming보안/안전성 (prompt injection 등)GarakCI/CD 통합
평가 기준선 (Threshold)

어댑터 배포를 위한 최소 기준:

  • RAGAS Faithfulness: >= 0.85
  • SWE-bench Resolved: >= 30%
  • 도메인 전문가 승인: 3명 중 2명 이상
  • Garak 보안 테스트: 0 critical findings

LoRA A/B 테스트​

새로운 어댑터 버전을 배포하기 전, LLM 트레이싱 시스템의 태그 기능을 활용한 A/B 테스트로 성능을 비교합니다. 요청 메타데이터에 lora 버전을 태그로 기록하면 대시보드에서 어댑터별 성능을 비교할 수 있습니다.

구현 예시는 Agent 모니터링 - A/B 테스트를 참조하세요.

A/B 테스트 비교 항목:

메트릭측정 방법의미
정확도SWE-bench / 도메인 테스트코드 변환 정확성
지연 시간LLM 트레이싱 p50/p95응답 속도
토큰 효율output_tokens / input_tokens답변 간결성
사용자 만족도Annotation Score실제 사용자 평가

Phase별 구축 로드맵​

Phase기간구성비용 (USD)주요 액션
1즉시Base Model + Steering$8,900/월 (GPU)vLLM 배포, Bifrost + Langfuse 연동
21-2주+ VectorRAG+인프라Milvus 배포, 내부 문서 임베딩
32-4주+ SLM Cascade+$500/월SLM 배포, Bifrost cascade 설정
41-2개월+ LoRA Fine-tuning+$2K (1회)학습 데이터 수집 → QLoRA → 평가 → Multi-LoRA 배포
글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
투자 대비 효과 (ROI)

Phase 4까지 완료 시(가상 시나리오, 아래 전제에 따라 상이):

  • COBOL→Java 전환: 10,000 모듈 x 1.5시간 절감 = 15,000시간 절감 (~$750K, 시간당 인건비 가정)
  • LoRA 학습 비용: $2,000 (1회)
  • 월 운영 비용 절감: $5,880 (Cascade 도입 효과)
  • ROI: 약 375배 (절감액 ~$750K ÷ 1회 학습 비용 $2,000 기준)

참고 자료​

공식 문서​

자료링크
LoRA Paper (Hu et al., 2021)arxiv.org/abs/2106.09685
QLoRA Paper (Dettmers et al., 2023)arxiv.org/abs/2305.14314
vLLM Multi-LoRAdocs.vllm.ai/en/latest/features/lora/
Unsloth Fast Traininggithub.com/unslothai/unsloth
NeMo Frameworkdocs.nvidia.com/nemo-framework
RAGAS Evaluationdocs.ragas.io
Bifrost AI Gatewaydocs.getbifrost.ai
Agent 모니터링agent-monitoring.md
LLM 트레이싱 배포monitoring-observability-setup.md
커스텀 모델 배포 가이드custom-model-deployment.md
MLOps 파이프라인 (Kubeflow·MLflow·ArgoCD)mlops-pipeline-eks.md
Continuous Training Pipelinecontinuous-training/index.md