AI/LLM

[PEFT 2] 양자화 튜닝 QLoRA

jumemory 2025. 7. 30. 11:49

[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️⃣ 핵심 사용 패턴

  1. 메모리 객체 생성
  2. save_context(inputs, outputs)로 대화 저장
  3. load_memory_variables()로 대화 불러옴
  4. return_messages=True → 메시지 객체 형태 반환
  5. 메모리 종류에 따라 대화 길이, 요약, 검색 방식 선택

🚀 핵심 요약

  • 챗봇이 멀티턴 대화를 하려면 메모리 필수
  • 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