[LLM 컨셉] QLoRA: 4비트 양자화로 실현하는 극한의 튜닝 효율
**QLoRA (Quantized LoRA)**는 앞서 배운 LoRA 기법에 양자화(Quantization) 기술을 결합한 방식입니다. 65B(650억 개) 파라미터를 가진 거대 모델을 단 한 대의 48GB GPU에서 튜닝할 수 있게 함으로써, LLM 학습의 하드웨어 장벽을 완전히 허물어버린 기술입니다.
1. 양자화(Quantization)란 무엇인가?
컴퓨터는 숫자를 표현할 때 정밀도(Precision)를 사용합니다.
- FP32/FP16: 숫자를 아주 정밀하게 표현하지만 메모리를 많이 차지합니다.
- INT4 (4-bit): 숫자를 단 4비트로만 표현합니다. 메모리는 극적으로 줄어들지만, 정보가 뭉개져 성능이 떨어질 위험이 있습니다.
QLoRA의 핵심은 모델의 본체는 4비트로 꽉 압축해서 메모리에 올리고, 학습이 일어나는 LoRA 부분만 고정밀도로 처리하여 메모리 절약과 성능 유지라는 두 마리 토끼를 잡는 것입니다.
2. QLoRA를 가능하게 하는 3대 혁신 기술
QLoRA는 단순히 비트 수만 줄인 것이 아니라, 성능 저하를 막기 위한 세 가지 정교한 장치를 도입했습니다.
① 4-bit NormalFloat (NF4)
데이터가 정규 분포를 따른다는 가정하에, 정보 손실을 최소화하도록 설계된 새로운 데이터 타입입니다. 일반적인 4비트 정수보다 훨씬 더 정밀하게 모델의 가중치를 표현할 수 있습니다.
② Double Quantization (이중 양자화)
양자화를 하기 위해 필요한 '상수값'들조차 다시 한번 양자화하는 방식입니다. 이를 통해 파라미터당 추가로 메모리를 아껴, 모델 전체의 메모리 점유율을 더욱 낮춥니다.
③ Paged Optimizers
GPU 메모리가 갑자기 부족해질 때(Spike), 데이터를 CPU 메모리(RAM)로 일시적으로 옮겨 학습이 끊기지 않게 관리하는 기술입니다. 덕분에 메모리 한계치에 아슬아슬하게 걸쳐있는 모델도 '메모리 부족(OOM)' 에러 없이 학습할 수 있습니다.
3. LoRA vs QLoRA 비교
| 구분 | LoRA | QLoRA |
| 베이스 모델 정밀도 | FP16 / BF16 (16비트) | NF4 (4비트) |
| 메모리 사용량 | 낮음 | 매우 낮음 (LoRA 대비 1/3~1/4 수준) |
| 하드웨어 요구사항 | 고사양 GPU 필요 (모델 크기에 비례) | 보급형 GPU(RTX 3090 등)로도 대형 모델 가능 |
| 성능(Accuracy) | 전체 미세 조정과 유사 | LoRA와 대등한 수준 유지 |
4. QLoRA의 실무적 의의: "LLM의 민주화"
QLoRA의 등장으로 이제 개인 개발자나 중소기업도 수천만 원짜리 장비 없이 오픈소스 모델(Llama 3, Mistral 등)을 자신의 목적에 맞게 튜닝할 수 있게 되었습니다.
- 실제 사례: 65B 모델을 튜닝하려면 과거엔 780GB 이상의 VRAM이 필요했지만, QLoRA를 쓰면 48GB VRAM 한 장으로 가능해졌습니다.
5. [선생님의 심화 보충] 학습은 4비트로 하나요?
가장 많이 오해하는 부분입니다. QLoRA에서 베이스 모델은 4비트로 저장되어 메모리를 아끼지만, 실제 연산(Forward/Backward pass)이 일어날 때는 잠시 16비트(BF16/FP16)로 복원되어 계산됩니다. 즉, 저장은 압축해서, 계산은 정밀하게 하는 것이 QLoRA 성능의 비결입니다.
✍️ 공부를 마치며
QLoRA는 우리가 가진 제한된 자원 안에서 최신 AI 기술을 주무를 수 있게 해주는 가장 강력한 도구입니다. 이제 우리는 모델을 학습시키고 다듬는 '내부적인 기술'을 모두 섭렵했습니다.
메모리 효율을 극대화한 4-bit 튜닝 기술과 실습
1️⃣ 기본 개념
- LLM(거대 언어 모델) → 질문에 답하지만 이전 대화 기억 X
- 챗봇에서 대화 기억을 유지하려면 메모리 기능이 필요함
- 메모리 = "이전 대화를 저장하고 다음 답변 시 참고하는 기능"
2️⃣ 대화 유형
- 싱글 턴 대화 → 질문 1 + 답변 1, 과거 대화 사용 X
- 멀티 턴 대화 → 이전 질문과 답변을 이어서 대화 (→ 메모리 필요)
3️⃣ 메모리 종류와 특징
① ConversationBufferMemory
- 모든 대화를 순차적으로 저장
- load_memory_variables() → 대화 전체를 문자열로 가져옴
- return_messages=True → 메시지를 객체(HumanMessage, AIMessage)로 반환
② ConversationBufferWindowMemory
- 최근 k개 대화만 저장 → 오래된 대화 자동 삭제
- 대화 길어져도 토큰 초과 방지
③ ConversationTokenBufferMemory
- 메시지 개수가 아니라 **토큰 수(max_token_limit)**로 제한
- 토큰이 초과되면 오래된 대화 삭제
④ ConversationEntityMemory
- LLM이 대화에서 **엔티티(인물, 장소, 개념)**를 추출해 핵심 정보만 기억
- 대화가 길어져도 중요한 정보만 유지
⑤ ConversationKGMemory
- 대화를 지식 그래프로 변환하여 기억
- 엔티티 간 관계(예: “셜리 → 디자이너 → 우리 회사”)를 파악
⑥ ConversationSummaryMemory / ConversationSummaryBufferMemory
- 대화를 요약해서 저장 → 긴 대화에서도 전체 맥락 유지
- Buffer 버전은 최근 대화는 원본으로, 오래된 대화만 요약
⑦ VectorStoreRetrieverMemory
- 과거 대화를 벡터 DB에 저장
- 질문 시 관련성 높은 대화만 검색해서 참고
- 시간 순서가 아닌 의미 기반 검색
4️⃣ 메모리 데이터 저장 방식
- 인메모리 → 프로그램 종료 시 사라짐 (휘발성)
- SQLite / DB 저장 → 종료 후에도 대화 기록 유지
- RunnableWithMessageHistory → 메모리와 체인을 쉽게 연결
5️⃣ 핵심 사용 패턴
- 메모리 객체 생성
- save_context(inputs, outputs)로 대화 저장
- load_memory_variables()로 대화 불러옴
- return_messages=True → 메시지 객체 형태 반환
- 메모리 종류에 따라 대화 길이, 요약, 검색 방식 선택
🚀 핵심 요약
- 챗봇이 멀티턴 대화를 하려면 메모리 필수
- BufferMemory → 기본 (전체 대화 기억)
- Window/Token → 최근 대화만 기억 (메모리 절약)
- Entity/KG → 핵심 정보, 관계 중심 기억
- Summary → 긴 대화 요약
- VectorStore → 의미 기반 검색
- DB 연결 → 대화 기록을 영구적으로 저장
`FAISS`---facebook에서 만든 유사도 찾는 모듈
참고 : obsidian://open?vault=Obsidian%20Vault&file=LLM%2Flangchain%20-%20%EB%A9%94%EB%AA%A8%EB%A6%AC
obsidian://open?vault=Obsidian%20Vault&file=LLM%2Flangchain%20-%20Document%20Loader
'AI > LLM' 카테고리의 다른 글
| [Vector DB] 지식의 저장소 (3) | 2025.08.01 |
|---|---|
| [RAG 기초] 환각 현상의 구세주 (0) | 2025.07.31 |
| [PEFT 1] 효율적 튜닝 LoRA (0) | 2025.07.29 |
| [RLHF] 인간의 가치 정렬 (0) | 2025.07.25 |
| [SFT] 지시어 이행 학습 (0) | 2025.07.24 |