GenAI 기초 2탄, 파인튜닝 세부 기술 - 양자화

김형섭 (Matthew)·2024년 6월 4일
2

Gen AI

목록 보기
1/4
post-thumbnail

Why

이 글은 1편 LLM 이해하기에서 이어지는 글 입니다.

1편 바로가기

바로 이 글에서 파인튜닝을 설명하기 위해

1편에서 LLM에 대해 알아보며 빌드업 한 것입니다.

파인튜닝

1편에서 파인튜닝 부분을 잠시 요약 하겠습니다.

이제 FM 모델과 LLM을 알았으니, 지금 제가 하는 중인 파인튜닝 이해는 쉽습니다.

파인튜닝의 결과물은 이렇습니다.

원본 FM 모델 + 내가 학습한 부분만 가지고 있는 작은 모델 = 우리의 모델

간단합니다.

즉, 인간의 말을 잘하는 FM 모델은 메타를 시작으로 여러 대형 회사가 내놓았습니다.

그러나 FM은 보편적 지식만 가지고 학습한 모델 입니다.

우리는 아임웹을 잘 아는 모델(내 목적에 특별히 더 학습한)이 필요하죠.

그래서 FM모델을 갖고와서는, 원래 있던 룰은 그대로 두고

그 위에 우리 아임웹의 지식을 갖다 부어 추가적인 룰을 만들어요.

그리고 그 룰을 병합하면!

짠! 우리 모델이 태어나는 것입니다.

결국, 파인튜닝은 FM에 작은 모델을 붙여 학습한 것

파인튜닝은 바로 이것입니다.

그런데, 어떻게 할까요?

파인튜닝 방법론

의외로 이론은 간단합니다.

  1. 질문과 그에 맞는 올바른 답변을 세트로 CSV, JSON 같은 형식의 데이터를 준비 합니다.
  2. 이 데이터를 활용해서 LLM용 프롬프트를 만듭니다.
    1. 프롬프트는 대충 이렇게 만들어요.
    2. "아래 질문에 해당하는 답을 친절하게 대답해줘. 질문: 넌 누구니? 대답: 난 천재야"
  3. 데이터 준비를 다 했으면, 루프를 시작합니다.
    1. 프롬프트에서 대답만 뺀 채로 모델에게 물어봅니다.
  4. 모델이 추론 합니다.
  5. 모델이 추론 합 답을 정답과 비교해서 비슷하면 보상을 주어서 모델의 가중치를 조정 합니다.
    1. 예를 들어, "아래 질문에 해당하는 답을 친절하게 대답해줘. 질문: 넌 누구니? 대답:" 이라고 모델에 입력하면,
    2. “난 외계인이야”, “넌 누군데?” 이러면 0점
    3. “난 AI야” 이러면 1점
    4. “난 천재야” 이러면 100점을 주는거죠.
    5. 올바른 답을 얻기위해 수백/수천번을 물어봐야 함은 인지상정이고요.
  6. 그렇게 모든 데이터에 대해서 계~속 반복 합니다.
  7. 그러다가 모델의 룰이 점점 우리 데이터세트에 정답에 가까운 답을 하는 쪽으로 발전하면, 학습을 멈춥니다.
    1. 학습을 반복 할수록, 답을 얼마나 잘못하는지 말하는 Loss 율이 점점 떨어지게 됩니다.
    2. 학습은 Step 기반 과 Epoch 기반으로 조정 할수 있는데요.
      1. Step은 한 질문 데이터 하나 하나 진행한 횟수를 말하고요
      2. Epoch 은 제공한 모든 데이터를 한번 다 돌리면 1이 되는 값 입니다.
    3. 경험상, 일반적으로 2~3 Epoch 정도는 돌려야 모델이 감을 잡기 시작 합니다.
  8. 그렇게 수백 시간 걸려 학습을 마친 모델이, 튜닝된 우리만의 고유한 모델이 됩니다.

ML(Machine Learning) 경험이 있으신 분은, 결국 LLM 학습도 머신러닝 기계학습과 크게 다를 바가 없다는 걸 아실겁니다.

데이터를 준비해서, 예상 질/답을 하고, 모델이 답에 가까운 말을 할때까지 계~~속 학습해서, 그 결과물을 취하는 것입니다.

간단한 설명을 위해서 데이터셋을 학습용테스트용으로 나눈다는 말까진 하지 않았습니다.

아무튼 비교적 간단해요.

그러나 데이터셋 만큼 배수로 수천 수만번 추론 하기 때문에 시간과 비용이 많이 듭니다.
그런데, 시간과 비용에 절대적인 영향을 미치는 장비가 있습니다.

위 방법의 문제

바로, 메모리 입니다.

메모리가 어마무시하게 많이 필요합니다.

모델이 계속 추론을 반복해야 하고, 또 학습 데이터 자체도 메모리에 올려야 하고,
중간단계의 결과물도 메모리에 계속 갖고 있어야 합니다.
정말 메모리가 어마 어마하게 필요합니다.

근데, 더 큰 문제는 여기서 말하는 메모리는 PC RAM이 아니고, GPU VRAM 입니다.
학습이란, GPU와 바로 붙어있는 VRAM에서 데이터를 어마어마하게 꺼내쓰고 저장하고 하는데,
그 데이터 양이 무지하게 크므로, 시간이 많이 걸리게 됩니다.

쪼개서 할수도 없어요.
모델이 학습 과정에 추론을 해야 해서, 전체 모델 데이터가 메모리에 있어야 합니다.

결국 VRAM은 모델 용량 의 최소 2배 이상을 확보해야 합니다.

그럼 VRAM 을 많이 넣으면 되는거 아닌가?

하지만, VRAM은 엄청나게 비싸요.
PC는 DDR5 를 쓰지만, 소비자용 고성능 GPU 카드는 DDR6 을 씁니다.
그리고 VRAM은 보통 그래픽카드에 내장되어 확장이 불가능 합니다.

다만 맥북은 VRAM과 RAM이 통합되어 용량면에서 이득이 있으나, 대역폭은 느립니다. 따로 검색해보세요~!

Nvidia 의 최신 세대인 4090 이 딸랑 24GB 이고 GPU는 VRAM으로 DDR6 을 쓰는데요.
DDR5 에 비해 대역폭이 약 2배 입니다. (결국 한번에 2배의 양을 주고 받음)

그런데, 소비자용 GPU 말고 AI 용 카드가 따로 있습니다.
T4, V100, A100, H100 같은 모델명을 가진 Nvidia 제품군 인데요.
일단 CPU / 냉각 장치 같은 다른 장비는 다 치우고, 순수 카드의 RAM만 보면
T4 16GB / V100 40GB / A100 40GB, 80GB / H100 80GB 처럼 제공되는데요.

이런 AI용 카드에 들어가는 VRAM은 DDR6 이 아니라 HBM 이라는 고대역폭 초고성능 메모리를 사용 합니다.
DDR6 과 비교도 할수 없는 수치로 대역폭(최대 400GB, DDR5의 20배)이 올라갑니다.

어마어마하죠? 가격도 어마어마 하겠죠? 80배 향상인데요.

AI 용 GPU 가격이 얼마길래

4090 24GB 를 1장에 300만원대면 구할 수 있으나
A100 80GB는 4천만원이 넘고, 물량도 없으며
H100 80GB는 8천만원이 넘고 역시 구할 수 없습니다.
(구글, 메타, MS가 싹 쓸어갔다는 그 카드 입니다.)

이것이 바로, 개인이나 중소기업이 LLM 연구가 어렵다고 하는 이유 입니다.
그런데요.

그렇다고 손가락만 빨 수는 없잖아요?
소프트웨어로 해결을 해보는 다양한 시도가 늘어났습니다.

오늘 딱 1가지만 먼저 소개할께요.
바로 모델 양자화 입니다.

모델을 구동할때 필요한 VRAM 사이즈를 줄이는데 목적이 있습니다.

네, LLM을 잘 다루려면, 메모리 싸움을 잘 해야 합니다.

양자화 (Quantization)

“뭐지, 또 수학인가” 하시는 분들을 위해 미리 말씀 드리면, 수학은 아니고 압축 입니다. (그게 그건가?)
엄밀하게 말하자면 수치 계산을 하는 것이기 때문에 수학을 쓰기는 합니다.

어려운건 치우고 아주 쉽게 설명 할게요
모델의 가중치의 룰 하나하나는 각각의 소숫점 숫자값 입니다.
일반적으로 FP32 즉, 32 Bit 부동소숫점 단위로 모델이 만들어 집니다.

다 빼고 말하면 약 소숫점 7자리까지 오차없이 정확히 저장할수 있는 단위 입니다.
이렇게 수십억개의 모델 가중치를 소수점으로 저장하고 있는게 모델인데요.

문제는 숫자 하나를 저장하는데 메모리 32 Bit 가 필요한 것이죠.
그럼 가중치당 4바이트 (32bit / 8) [1바이트 = 8비트)가 필요합니다.

그래서 7B 모델은 70억개니까 7,000,000,000×4=28,000,000,000 바이트
약, 26 GB가 나옵니다. 7B 모델이 메모리가 VRAM이 26 GB가 필요한 것이지요.

409024GB 이므로, 4090 으로도 7B 모델을 돌릴 수 없겠죠?

양자화는 이 메모리 사이즈를 좀 줄여보자는 겁니다.

일단 32 Bit 를 줄여서 8 bit 으로 저장 할수 있다면, 메모리 용량도 1/4 이 되겠죠?

그럼 이제 어떻게 줄일거냐 입니다.

양자화에서 소숫점 숫자를 적은 bit 로 저장하는 방법

여기서 수학이 사용 됩니다.

일단 32 bit8 bit 로 줄여요.
그리고 나중에 연산할때 8 bit 를 다시 32 bit 로 복구하여 추론하는거죠.

예를 들어 원본이 0.15625 인 값을 8bit 로 줄일때 스케일을 통해 정수 범위로 인코딩 하면
(1.0−(−1.0))/(255−0)=2/255≈0.0078 이렇게 0~255 범위의 정수로 줄일수 있습니다.
(8비트는 256가지의 정수를 저장할수 있죠)

0번에는 얼마, 1번에는 얼마 이런식으로 제로포인트라는 기법으로 딕셔너리를 만들고요.
위 경우는 8bit 로 바꾸면 128이 됩니다.

이제 위 정보를 안다면, 역산으로 나중에 1280.15625 를 알수 있지만
이때 정확히 0.15625 이하의 소숫점 값은 사라집니다. 그 주변의 값도 128이 되기 때문 입니다.

여기서 가중치의 손실이 발생하죠.

애써 학습하여 룰을 만들었는데 몇가지 룰이 양자화 거치면서 사라지기 때문 입니다.
그래서 원본 모델의 가중치와 다르게 손실이 있는채로 텍스트를 생성하게 됩니다.
(모델이 약간 이상한 말을 할 수 있음)

그래서 양자화를 거친 모델은 용량은 줄지만 원본 모델보다 성능은 떨어질수 밖에 없습니다.
그런데 성능이 얼마나 차이가 날까요?

양자화 시 모델 정확도 손실표

아래는 Llama2 7B 를 양자화 했을때의 예시 입니다.
(100% 정확한 값은 아니며 근사치 입니다.)

양자화 방식정밀도 (비트)메모리 사용량 (GB)정확도 (F1 스코어)
FP32322885.0
FP16161484.8
INT88783.5
INT443.580.0

위 표가 말해주듯이 정밀도를 떨어 트릴수록, 필요한 메모리 용량은 급격히 줄어들지만,
정확도 (추론 정확도)는 크게 떨어지지 않는 모습이 관찰 됩니다.

따라서 나의 학습 데이터와 추론 프롬프트에 따른 양자화별 성능을 평가해보고
우리의 요구사항에 맞는 양자화 선택이 필요하죠.

개인적인 경험으로는 대체로 INT8 까지는 훌륭한 선택이 되었습니다.

이제 종합을 해보겠습니다.

  • FM 모델을 가져와 내 데이터로 파인튜닝 할 수 있습니다.
  • 이때 모델의 가중치에 따라 필요한 VRAM 이 어마어마 합니다.
  • 한편으로 모델을 양자화 한다면, 이 VRAM 사용량을 극적으로 줄일 수 있어서,
    점점 파인튜닝과 모델 추론이 더 작은 디바이스에서 가능하게 대중화 되고 있죠.

마무리

추론은 위처럼 해결 했다 하더라도, 학습에는 역시 원본 모델이 필요합니다.
원본 모델은 대부분 FP32 또는 FP16 정밀도를 사용하고 있기 때문에
학습에 필요한 하드웨어 VRAM 요구사항이 어마어마 해집니다.

그런데 이문제도 해결할 기술이 나왔습니다.

다음 글에서는 추론이 아닌 학습 단계에 필요한 VRAM 사용량을 줄일 수 있는 획기적인 기술인
LoRA 그리고 QLoRA를 알아보도록 하겠습니다.

오늘은 다소 글이 길었습니다.
그래도 양자화에 대해 조금이라도 쉽게 이해가 되셨기를 바래요.

감사합니다.

아임웹 CTO 매튜 드림.

profile
CTO at Imweb, 20년차 개발 장인, 전) 플레이오토 CTO/창업자

0개의 댓글