트랜스포머·PEFT 2일 과정9장 · 모델 평가와 활용, QLoRA7 / 20← 이전목차다음 →MetaContents

9장. 모델 평가와 활용, QLoRA

서비스에 활용하는 방법

프랜차이즈 카페를 떠올려 봅니다. 커피 머신(기반 모델)은 하나인데, 지점마다 레시피 카드(어댑터)만 바꿔 꽂아 각자의 메뉴를 냅니다. 늘 같은 메뉴만 파는 지점은 레시피를 머신에 아예 새겨 넣습니다(병합). 메뉴판의 가격처럼 자주 바뀌는 정보는 레시피가 아니라 계산대 옆 안내판(RAG)에 붙여 둡니다.

어댑터 교체, 병합 배포, RAG 조합, 지속 개선의 네 가지 활용 방법을 나란히 놓은 비교 그림

그림의 네 상자는 학습한 어댑터를 실제 서비스에 쓰는 방법입니다. 왼쪽 둘은 "어떻게 올려 둘까", 셋째는 "무엇을 어댑터에 맡기고 무엇을 검색에 맡길까", 넷째는 "어떻게 계속 좋아지게 할까"입니다.

서비스 활용 방법

방식설명카페로 치면
다중 어댑터 운영기반 모델 하나에 업무별 LoRA(상담, 요약, 분류)를 두고 요청마다 바꿔 끼운다. vLLM, TGI 같은 서빙 엔진이 여러 LoRA 를 함께 띄운다머신 하나, 레시피 카드 여러 장
병합 모델 배포merge_and_unload() 뒤 일반 모델처럼 배포한다. 필요하면 GGUF 로 바꿔 llama.cpp, Ollama 로 내 PC 에서 돌린다레시피를 머신에 새기기
Hub 공유push_to_hub() 로 어댑터만 올려 팀과 나눈다. 쓰기(Write) 권한 토큰이 필요하고, 기반 모델의 라이선스를 확인한다레시피 카드를 본사에 공유
RAG 와 조합형식, 말투, 절차는 파인튜닝으로 익히고, 사실 정보는 RAG 로 준다레시피는 카드, 가격은 안내판
지속 개선실제 사용 기록에서 실패 사례를 모아 SFT 데이터에 더하고 다시 학습한다손님 불만을 레시피에 반영

짧은 예시

Python
# 기반 모델 하나 + 업무별 어댑터(폴더 이름은 설명용)를 요청마다 골라 쓰는 흐름 흉내
adapters = {
    "상담": "outputs/cs-lora",
    "요약": "outputs/summary-lora",
    "분류": "outputs/classify-lora",
}

def route(task):
    # 업무 이름으로 어댑터를 고르고, 없으면 어댑터 없이 기반 모델로 답한다
    return adapters.get(task, "(어댑터 끔: 기반 모델)")

for task in ["요약", "날씨"]:
    print(task, "→", route(task))
# 결과: 요약 → outputs/summary-lora / 날씨 → (어댑터 끔: 기반 모델)

# 저장 공간 견주기: 업무 3개를 어댑터로 둘 때와 병합 모델 3벌로 둘 때(MB)
n = len(adapters)
print(round(942 + n * 33.6, 1), n * 942)
# 결과: 1042.8 2826 → 어댑터 방식이 약 2.7배 작다

이 코드가 뜻하는 것

카페 점원이 주문서의 메뉴 이름을 보고 레시피 카드를 고르는 일입니다. 맞는 카드가 없는 주문(날씨 질문)은 카드 없이 기본 머신으로 만듭니다. 이것이 실습 2에서 본 부작용을 피하는 "필요할 때만 켜기"입니다. 여기서 레시피 카드 꽂이가 adapters, 점원이 route 입니다.

줄하는 일쉽게 말하면
adapters = {...}업무 이름 → 어댑터 폴더레시피 카드 꽂이
adapters.get(task, "...")맞는 어댑터, 없으면 기본값카드 고르기
942 + n * 33.6기반 하나 + 어댑터 n개머신 하나에 카드 세 장
n * 942병합 모델 n벌머신 세 대

업무가 늘수록 차이가 커집니다. 어댑터 10개는 942 + 336 = 1,278 MB 이지만, 병합 모델 10벌은 9,420 MB 입니다.

주의할 점

  • 어댑터 교체 운영은 기반 모델이 같아야 합니다. Qwen2.5-0.5B-Instruct 로 학습한 어댑터를 다른 모델에 붙일 수 없습니다.
  • 사실 정보(가격, 정책, 날짜)를 파인튜닝으로 외우게 하면, 정보가 바뀔 때마다 다시 학습해야 합니다. 이런 정보는 RAG 로 줍니다.
  • Hub 에 올릴 때 쓰는 토큰은 코드에 직접 적지 않습니다. 교안에는 hf_... 같은 자리표시자만 씁니다.
← 이전 절9장 · 어댑터 불러오기, 끄고 켜기, 병합하기다음 절 →9장 · QLoRA 의 원리