ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5.1 GPU에 올라가는 데이터 살펴보기
    LLM/LLM을 활용한 실전 AI 애플리케이션 개발 2025. 2. 9. 14:59

     

    딥러닝 데이터 처리는 행렬 곱셈과 더하는 연산의 반복

    GPU의 메모리는 한정적이고, 가격이 비싸서, 최적화 하는 기술발전이 빠르게 이뤄지고 있다.

    * 참고 : Nvidia H100 80G ($25,000 / 3,643만원)

     

    1) 딥러닝 연산 시 어떤 데이터가 메모리를 사용하는지 알아본다

    2) 다음으로, GPU 1개 사용시 메모리를 효율적으로 사용할 수 있는 그레이디언트 누적(gradient accumulation)과 그레이디언트 체크포인팅(gradient checkpointing)을 알아본다

    3) GPU를 병렬적으로 사용하는 분산 학습에 대해 알아보고, 같은 데이터가 여러 GPU 에 저장되는 비효율 개선위한 MS의 딥스피드 제로(Deepspeed ZeRO)에 대해서도 살펴본다

    4) LLM 모델 학습 시 전체 모델을 업데이트 하지 않고, 일부만 업데이트하는 LoRA(Low Rank Adaptation) 에 대해 알아본다

    5) 마지막으로 적은 비트 사용 데이터 타입으로 메모리 효율성을 높은 QLoRA(Quantized LoRA) 에 대해 알아본다

     

    사전설치

    !pip install transformers==4.40.1 datasets==2.19.0 accelerate==0.30.0 peft=0.10.0 bitsandbytes=0.43.1 -qqq

     

     5.1 GPU 에 올라가는 데이터 살펴보기

     GPU를 사용할 때 가장 자주 만나는 에러 중 하나는 OOM(Out Of Memory) 에러다. 메모리에 데이터가 가득차 더 이상 새로운 데이터를 추가하지 못해 발생하는 에러다

     

    5.1.1 딥러닝 모델의 데이터 타입

    소수연산을 위해 32비트 부동소수점(float32)을 사용한다.

    더 세밀한 계산이 필요하다면 64비트 부동소수점(float64)을 사용한다

    과거 32비트(4바이트) 를 많이 사용했지만, 용량 절약을 위해 fp16(2바이트) 또는 bf16(brain float16,2바이트) 을 주로 사용한다

     

    S는 부호 Sign

    E는 지수 Exponent : 지수는 숫자의 크기를 결정하며, 2의 거듭제곱 형태

    M은 가수 Mantissa : 가수는 정규화된 숫자의 소수점 이하 부분이다.즉 가수는 1.M의 형태에서 1을 제외한 나머지 부분을 뜻한다

     

    지수는 수를 표현할 수 있는 범위의 크기를 결정

    가수는 표현할 수 있는 수의 촘촘함을 결정한다

     

    fp32는 지수8비트, 가수로 23비트 사용 

    fp16은 지수 5비트, 가수로 10비트를 사용( 지수가 5비트 밖에 없어, 범위가 너무 좁음)

    bf16은 지수 8비트, 가수로 7비트만 사용 ( fp16 의 범위를 늘리기 위해 조정, 세밀함은 희생 )

     

    예로, LLM 파라미터가 8억 또는 70억개라면 , 데이터가 flaot32(4byte), bf16(2byte) 사용했을 때 아래처럼 사용한다

    데이터 사이즈 byte 파라미터 용량 byte 용량 gb
    4(fp32) 800,000,000 3,200,000,000 3.0
    2(bf16) 800,000,000 1,600,000,000 1.5
    4 7,000,000,000 28,000,000,000 26.1
    2 7,000,000,000 14,000,000,000 13.0

     

    5.1.2 양자화로 모델 용량 줄이기

    모델 파라미터의 데이터 타입이 더 많은 비트를 사용할수록 모델의 용량이 커지기 때문에 더 적은 비트로 모델을 표현하는 양자화 Quantization 기술이 개발됐다.

    예로, fp32로 저장하던 모델을 fp16 형식으로 저장하면 모델의 용량은 절반이 된다( 4byte -> 2 byte )

    하지만 fp32가 더 넓은 수를 더 세밀하게 표현할 수 있기 때문에 fp16으로 변환하면 fp32의 수가 담고 있던 정보가 소실 될 수 있어, 모델의 성능이 저하된다.

    그래서, 양자화 기술에서는 더 적은 비트를 사용하면서도, 원본 데이터의 정보를 소실없이 유지하는 것이 핵심이다.

     

    그림5.2 두 데이터 형식의 최댓값을 각각 대응시키고,

    최솟값을 각각 대응시키는 가장 간단한 양자화 방식

     

    그림 5.3 존재하는 데이터의 최댓값 범위로 양자화 하는 방법

    - 이상치(outlier)가 있는 경우 취약

     

    이상치의 영향을 줄이고 낭비를 줄이는 방법

    K개의 데이터를 묶은 블록(block) 단위로 양자화를 수행하는 방법 ( 예: 구간별로 3개로 나눠서 양자화)

     

    그림 5.5 퀀타일(Quantile)

    데이터를 크기순으로 등수를 매겨, int8 값에 동일한 개수의 fp32 값이 대응되도록 배치하는 방식

    장점: 값의 낭비는 없지만

    단점 : 매번 모든 입력 데이터의 등수를 확인하고 배치해야 하기 때문에 계산량도 많고, 그 순서를 기억해야 하서, 별도로 메모리를 사용해야 함

    quantile [kwɑ́ntail] 명사 통계 변위치(變位置), 분위수
    - 1. 자료 크기 순서에 따른 위치값
    - 2. 정규분포를 크게 벗어나거나, 산포가 큰 상황에서 분위수가 대푯값으로 사용됨
    - 3. 주로 사용되는 분위수는 100분위수, 10분위수, 4분위수

     

     

     

     

    5.1.3 GPU 메모리 분해하기

    GPU 메모리에는 크게 다음과 같은 데이터가 저장된다

    • 모델 파라미터
    • 그레이디언트 gradient
    • 옵티마이저 상태 optimizer state
    • 순전파 상태 foward activation

    딥러닝 학습 과정을 간단히 요약하면

    1. 순전파를 수행하고, 

    2. 계산한 손실로부터 역전파를 수행하고

    3. 옵티마이저를 통해 모델을 업데이트 한다.

     

    이 때 역전파를 수행하기 위해 저장하고 있는 값들이 순전파 상태 값이다.

    그레이디언트는 역전파 결과 생성된다.

     

    fp16(2바이트)모델을 기준으로하고, AdamW 와 같은 옵티마이저를 사용한다고 할 때, 최소한의 메모리

    • 모델 파라미터 : 2 바이트 * 파라미터 수(B, 10억 개) = N
    • 그레이디언트: 2 바이트 * 파라미터 수(B, 10억 개) = N
    • 옵티마이저 상태: 2 바이트 * 파라미터 수(B, 10억 개) * 2(상태 수) = 2N

    모두 합치면 대략 4N 의 메모리가 기본적으로 필요하고,

    순전파 상태(배치크기, 시퀀스 길이, 잠재 상태 크기에 따라 달라짐)을 저장하기 위한 메모리가 추가로 필요하다.

     

     

     

     

     

     

     

     

     

     


    가수 Mantissa 추가 설명

    ex : 숫자 10.5를 부동소수점으로 표현하는 경우

    10.5 를 이진수로 변환하면 10과 0.5를 각각 이진수로 변경해야 한다.

    10을 이진수로 변환하는 경우

    • 10÷2=5 (나머지 0)
    • 5÷2=2 (나머지 1)
    • 2÷2=1 (나머지 0)
    • 1÷2=0 (나머지 1)

    즉 1010 = 10102

     

    0.5을 이진수로 변환하는 경우

    0.5 × 2= 1.0

    즉 0.510 = 0.12

     

    둘을 합친다면 

    10.510 = 1010.12

    부동소수점에서 숫자는 정규화된 형태로 저장한다. 

     

    정규화한 숫자는 항상 1.XXX 형태로 저장하기 때문에 1010.12 값은 소수점 왼쪽으로 세번 이동시킨다.

    따라서 다음과 같이 값이 저장된다.

    10.5 = 1.01012 × 23

     

    여기서 지수 부분은 3이고 

    가수 부분은 "1.0101"에서 1을 제외하고 0101만 저장한다. 

     

    또한 IEEE 754 32비트 부동소수점 형식에서는 가수를 23비트로 저장하기 때문에, 나머지 자리는 0으로 채워진다.

    따라서, 10.5의 가수는 01010000000000000000000이 된다.

    출처 : https://mozartnt.tistory.com/m/83


     

     

     

     

    책 출처 : https://ridibooks.com/books/3649000042

     

    LLM을 활용한 실전 AI 애플리케이션 개발

    LLM을 활용한 실전 AI 애플리케이션 개발 작품소개: 트랜스포머 아키텍처부터 RAG 개발, 모델 학습, 배포, 최적화, 운영까지 라마인덱스와 LLM을 활용한 AI 애플리케이션 개발의 모든 것이 책에서는

    ridibooks.com

     

    댓글

Designed by Tistory.