오늘은 Machine Learning와 관련된 포스트다.
Floating Point Precision과 Fixed-point Precision의 차이에 대해 알아보고자 한다.
먼저, Pascal GPU (and CUDA 8)에선 16bit FP (Floating Point)와 8/16bit INT (Integer) 연산이 가능하다.
특히 AI와같은 HPC (High-Performance Computing) 계열 어플리케이션에선 높은 정밀도가 요구되는 연산이 필요하기 때문에 32bit (FP16, Single Float) 또는 64-bit (FP64, Double Float) FP 연산을 사용한다. 일부 어플리케이션에선 128bit, 256bit FP연산을 사용하기도 한다. 하지만, Machine Learning (Deep Neural Network) 연산의 경우에는 16bit FP 연산 정밀도만으로도 충분한 결과를 얻을 수 있다.
16bit (FP16, Half Precision) FP 데이터 형식을 사용하게 되면 32bit, 64bit FP 대비 메모리 사용량이나 데이터 로딩 시간이 감소한다. 또한, DNN (Deep Neural Network)의 경우 8bit INT를 사용하는데 정확도 면에서 큰 차이가 없기 때문에 다른 종속 변수들과 비교대비 가장 효율이 좋은 8bit INT를 사용하는 것이다.
그렇다면 여기서 언급하는 Floating Point Precision 이란 ?
The floating-point representation is by far the most common way of representing in computers an approximation to real numbers.
라고 wikipedia (참고문헌 2)에 정의되어 있다. 즉, real number를 컴퓨터가 이해할 수 있는 근사값(approximated)로 표현하는 방법을 일컫는다. 구성은 sign bit, exponent big, mantissa bit로 구성되어 있다. (아래 그림)
각각의 차지하는 공간은 다음과 같다. - IEEE 754 Standard 기준
16bit : 1 sign bit, 5 exponent bits, 10 mantissa bits
32bit : 1 sign bit, 8 exponent bits, 23 mantissa bits
64bit : 1 sign bit, 11 exponent bits, 52 mantissa bits
특히 32bit FP의 경우엔 최대 20억 개의 다른 수를 표현할 수 있는 반면, 16bit FP의 경우엔 최대 3만 개 정도의 수만 표현이 가능하다.
결과적으로 16bit는 32bit 대비 부정확한 수치를 표현한다. 하지만 NVIDIA GPU에선 32bit 대신 16bit를 사용하는 가장 큰 이유는 성능 때문이다. 32bit FP 연산 한 번에 2개의 16bit FP 연산을 수행할 수 있기 때문에 그에 따른 Throughput은 정확하게 2배 증가하게 된다.
대표적으로 Float 형 실수 (32bit)를 IEEE 부동 소수점 방식으로 표현하면 다음과 같다.
또한 Double 형 실수 (64bit)를 IEEE 부동 소수점 방식으로 표현하면 다음과 같다.
Fixed-point Precision
A fixed-point number presentation is a real data type for a number that has a fixed number of digits after the radix point.
Fixed-point number 표현은 는 radix 지점 이후 (=소수점 이후) 고정된 자릿수를 가진 숫자의 실제 데이터 유형이라고 wikipedia (참고문헌3)에 정의되어 있다.
Fixed Point Precision은 위와 같이 mantisa 부분의 자리수 bit가 사전에 미리 정하여 고정된 bit 수의 mantisa를 표현하는 것이다. 위 그림은 32bit 실수를 fixed-point precision으로 표현한 것이다. 하지만 이 방식은 exponential 부분과 mantisa 부분의 bit 수가 크지 않기 때문에 표현의 범위가 매우 한정적이다.
즉, 위 내용을 이해하고자 한 이유는 Xilinx Alveo Card가 추론 연산을 가속화하기 위해 Fixed Point Precision을 쓰고 있기 때문이다. 그렇기 때문에 Xilinx ML Suite의 Image Classification Example에선 Quantizor를 통해서 Float INT8 형태로 scaling parameter들을 .json 파일에 출력하게 된다.
참고문헌 1 : https://en.wikipedia.org/wiki/Floating_point
참고문헌 2 : https://en.wikipedia.org/wiki/Fixed-point_arithmetic
참고문헌 3 : https://en.wikipedia.org/wiki/IEEE_754
참고문헌 4 : http://tcpschool.com/cpp/cpp_datatype_floatingPointNumber
'네트워크 개념' 카테고리의 다른 글
Network Delay의 4가지 종류 (0) | 2019.08.15 |
---|---|
변조(Modulation)의 정의와 변조의 방식 (0) | 2019.08.15 |
CSMA, CSMA/CD, CSMA/CA 란? (2) (0) | 2019.08.14 |
CSMA, CSMA/CD, CSMA/CA 란? (1) (0) | 2019.08.14 |
RIP, OSPF 프로토콜이란 ? (0) | 2019.08.14 |