fp32, fp16, bf16, fp8, e4m3fn 등 개념 정리
개념정리
로컬 이미지나 비디오를 생성하기 위해서 모델 파일을 받을 때 hunyuan_video_t2v_720p_bf16 이런식으로 되어 있어서 어떠한 파일을 받아야 할 지 난감할 때가 있습니다.
컴퓨터는 2진법의 숫자로 정보를 처리하는데 기본 단위를 비트라고 합니다.
이러한 비트수를 얼마나 할당하느냐에 따라 위와 같이 나누고 있습니다.
인공지능 분야에서는 모델의 정확도와 메모리 효율성을 동시에 고려해야 하기 때문에 다양한 데이터 타입을 사용해야 하는데 그중에서 우리는 그 다양한 타입 중 하나를 선택해서 사용한다고 생각하면 될 것 같아요.
지난 글에서도 정리를 했지만 좀더 정리하는 차원에서 같이 보시면 좋을 것 같습니다.
이미지 생성시 보이는 용어 Fp16, Fp8 차이가 뭘까?
숫자의 표현 방식
부동소수점 방식
예 )123.456
우리는 일반적으로 이렇게 숫자(고정소수점 방식)를 사용하지만 데이터 학습에 있어서 이 숫자를 1.23456 x10^2 , 12.3456 X10^1 이런식으로 다양하게 표현을 해볼 수 있습니다. 결과는 같지만 표현방식들이 다를 수 가 있어요. 이러한 표현방식을 부동소수점 (fp,Floating point) 표현 방식입니다.
좀더 자세히 풀어쓰면 부동소수점 표현 방식은 부호, 지수, 가수로 나뉩니다.
부호(양수인지 음수인지 나타내는 부분)
지수(10의 지수) - Exponent
가수 (123456 , 위 숫자의 유효숫자) -Mantissa
1.23456 x 10²: 부동소수점 표기법으로, 가수는 1.23456, 지수는 2가 되죠.
12.3456 x 10¹: 역시 부동소수점 표기법으로, 가수는 12.3456, 지수는 1이 되죠.
0.123456 x 10³: 이처럼 소수점의 위치를 얼마든지 지수를 통해서 조절할 수 있어요. 가수는 0.123456 지수는 3이됩니다.
왜 컴퓨터가 이 표현방법을 좋아할까
가수에 있는 소수점을 막 이동하고 지수를 바꿔가면서 표현할 수 있는 것들이 매우 많아져요. 쉽게 이야기 하면 눈금자가 고정되어 있지 않기 때문에 다양한 대상을 더 다양하게 측정하면서 정확도를 높일 수 있는 척도로 활용되고 있다고 보면 될 것 같아요.
마찬가지로 인공지능 학습에 있어서도 수많은 실수 연산을 하게 되는데 부동소수점 방식은 이러한 실수 연산을 효율적으로 처리할 수 있도록 돕는다고 합니다.
따라서 아래와 같은 구분을 해봅니다.
fp32 (32비트 부동소수점): 전통적으로 모델 학습에서 많이 사용되어 왔어요. 높은 정밀도로 학습을 안정적으로 진행할 수 있지만, 메모리 사용량이 많고 계산 속도가 느릴 수 있어요.
fp16 (16비트 부동소수점): fp32보다 메모리 사용량이 적고 계산 속도가 빠르지만, 표현 범위가 좁아서 overflow 문제가 발생할 수 있어요.
bf16 (16비트 부동소수점): fp와 방식이 다소 다름. fp16보다 표현 범위가 넓어서 overflow 문제를 줄일 수 있고, 인공지능 모델 학습에 더 적합하다는 평가를 받고 있어요.
bf8 (8비트 부동소수점) :메모리 사용량이 매우 적고 계산 속도가 빠르다는 장점이 있어요.
e4m3fn??
우리가 보통 개인용 컴퓨터에서는 고사양이 아니면 fp 8 방식이 쓰이기도 합니다. 이 fp8에서 사용한 비트 분할 방식입니다.
e4m3fn은 8개의 비트가 어떻게 나뉘어 사용되는지를 나타내는 표기법이에요. 8비트 부동소수점은 다음과 같은 세 가지 구성 요소로 나뉘어 표현된다고 이야기했었죠?
부호(sign): 숫자가 양수인지 음수인지 (1비트)
지수(exponent): 소수점의 위치를 결정 (e로 표시)
가수(mantissa): 숫자의 유효숫자를 저장 (m으로 표시)
e4: 지수(exponent) 부분에 4개의 비트가 할당되었다는 것을 의미해요.
m3: 가수(mantissa) 부분에 3개의 비트가 할당되었다는 것을 의미해요.
fn: fn은 정규화(normalization) 방식과 관련된 부분이에요. 이 경우에는 가수가 "고정된" 형태로 저장된다는 것을 의미합니다.
가수 부분이 클 수록 정밀도가 높아지고 지수 할당량이 클수록 범위가 넓어진다고 이해 하시면 됩니다.
e2m5fn 처럼 가수 부분을 크게 할당하면 이게 더 좋은 것이 아닌가라고 생각할 수도 있습니다. 금융 거래나 과학 계산처럼 정밀한 계산이 필요한 경우에는 e2m5fn과 같이 가수에 더 많은 비트를 할당하는 것이 더 유리할 수 있지만, 상황에 따라서 가수가 항상 큰게 좋은 것은 아닙니다.
일종의 밀당인데, 표현범위를 넓히면 정밀도가 떨어지고, 정밀도를 높이면 표현범위가 떨어지는 것과 같아서 상황에 따라 적절한 비트 분할 방식을 사용하면 될 거에요.
bf16과 fp16의 차이
fp16 : Half-Precision Floating-Point
bf16 : Brain Floating-Point
fp16 | bf16 |
---|---|
부호(sign): 1비트 | 부호(sign): 1비트 |
지수(exponent): 5비트 | 지수(exponent): 8비트 |
가수(mantissa): 10비트 | 가수(mantissa): 7비트 |
따라서 이러한 방식 차이가 있고, 가수 부분의 비트수가 fp 16이 커서 정밀도가 높다고 볼 수 있습니다.
GPU에서 텍스처 처리나 렌더링에 많이 사용돼요. 비교적 작은 범위의 숫자들을 다루면서 높은 정밀도를 요구하는 작업에 적합해요.
하지만 bf16은 딥러닝 모델 학습에 많이 사용돼요. 모델 가중치(weight)나 활성값(activation)이 넓은 범위를 가질 수 있기 때문에, 표현 범위가 넓은 bf16이 더 효율적이에요. 머신러닝 알고리즘에서 안정적으로 연산할 수 있는 넓은 표현 범위가 중요하기 때문에 bf16이 선호됩니다.
이러한 차이로 이해하시면 좋을 것 같습니다.