LLM

GPU 학습(1)

won-ian 2024. 8. 18. 22:10

※ 'LLM을 활용한 실전 AI 애플리케이션 개발' 책을 정리한 내용입니다. 

 

GPU(Graphic Processing Unit)

단순한 곱셈을 동시에 여러 개 처리하는 데 특화된 처리 장치

 

GPU는 한정된 메모리를 갖고 있는데, 최근 LLM의 등장과 함께 모델의 크기가 커지면서 하나의 GPU에 모델을 올리지 못하는 등 더 많은 GPU가 필요해지고 있다. 하지만 GPU는 가격이 비싸기 때문에 풍부하게 사용하기에는 금전적인 문제가 발생한다. 그래서 이러한 문제를 해결하기 위한 연구가 많이 진행되고 있다.

 

딥러닝 모델을 학습시키고 추론하기 위해 GPU를 사용할 때 가장 자주 만나는 에러 중 하나는 OOM(out of memory)이다.

 

컴퓨터에서는 일반적으로 소수 연산을 위해 32비트 부동소수점(32float)을 사용한다. 만약 더 세밀한 계산이 필요하다면 64비티 부동소수점(64float)을 사용한다. 이처럼 LLM 모델도 몇 비트의 데이터 형식으로 표현하는지에 따라서 용량이 달라질 수 있다. 성능을 높이기 위해서는 파라미터를 늘려야 하는데, 그럴 수록 OOM 문제가 발생하기 때문에 성능은 유지하면서 점점 더 적은 비트의 데이터 타입을 사용하는 방향으로 딥러닝 분야가 발전하고 있다. 최근에는 주로 16비트로 수를 표현하는 fp16 또는 bf16을 주로 사용한다.

 

S는 부호(sign), E는 지수(exponent), M은 가수(mantissa)로 지수는 수를 표현할 수 있는 범위의 크기를 결정하고 가수는 표현할 수 있는 수의 촘촘함을 결정한다. fp16은 표현할 수 있는 수의 범위가 좁아 딥러닝 연산 과정에서 수를 제대로 표현하지 못하는 문제가 발생해서 bf16은 이런 문제를 줄이기 위해서 개발된 것이다.

 

 

양자화(quantization)

더 적은 비트로 모델을 표현하는 기술이다. 

 

원본 데이터의 정보를 최대한 유지하면서 더 적은 용량의 데이터 형식으로 변환하려면, 변환하려는 데이터 형식의 수를 최대한 낭비하지 않고 사용해야 한다. fp32의 데이터를 int8로 변환한다면(32비트 -> 8비트) 두 데이터 형식의 최댓값을 각각 대응시키고 최솟값을 각각 대응시키는 가장 간단한 양자화 방식을 사용했는데, 이는 양쪽 끝 수는 사용하는 데이터가 없이 존재해 낭비되는 문제가 발생한다(int 8값 낭비). 이는 fp32 범위의 양쪽 끝에는 데이터가 없기 때문에 발생한다.

 

이를 해결하는 방법은 존재하는 데이터의 최댓값 범위로 양자화하는 방법이 있다. 그러면 전에 int 8 값이 낭비되던 문제를 해결할 수 있다. 하지만 이상치(outlier)가 있는 경우는 문제가 발생하게 된다. 

※이상치(outlier) : 보통 관측된 데이터의 범위에서 많이 벗어난 아주 작은 값이나 큰 값

 

최종적으로 이상치의 영향을 줄이고 int8 형식의 낭비를 줄일 수 있는 방법은 먼저, 전체 데이터에 동일한 변환을 수행하는 것이 아니라 K개의 데이터를 묶은 블록 단위로 양자화를 수행하는 방법이 있다. 또 다른 방법으로는 퀀타일(quantile)방식이 있다. 이는 절대 최댓값(absmax)만 보는 것이 아니라 입력 데이터를 크기순으로 등수를 매겨 int8 값에 동일한 개수의 fp32 값이 대응되도록 배치하는 방식이다.

 

이는 하나의 입력 데이터에 많은 데이터가 하나의 값에 대응되기 때문에 int 8 값의 낭비도 없다. 하지만 매번 모든 입력 데이터의 등수를 확인하고 배치해야 하기 때문에 계산량도 많고 그 순서를 모두 기억해야해서 별도로 메모리를 사용해야 한다는 단점이 있다.

'LLM' 카테고리의 다른 글

GPU 학습(3)  (0) 2024.08.20
GPU 학습(2)  (0) 2024.08.19
LLM 모델 만들기(3)  (0) 2024.08.17
LLM 모델 만들기(2)  (0) 2024.08.16
LLM 모델 만들기(1)  (0) 2024.08.15