NPU는 무엇인가?

Featured image

NPU라고 해서 Neural processing unit이라고 한다. 어떤 사람들은 network processing unit이라고 하기도 하는데, 요새 사람들이 이야기하는 것은 전자가 맞다고 봐야할 것이다. 같은 의미로 MLU (machine learning unit)이라고 부르기도 한다. 이름이야 어떻게 붙든 그냥 곱하기 더하기 집단이라고 보면 된다.

구체적으로 이게 뭘 의미하는 것이냐 하면 수많은 multiplier가 집적되어있는 것을 의미한다. 옛날 사람들의 용어로 보면 빠르게 MAC (Multiply and Accumulate)을 처리하는 엔진이다. 쉽게 말해 DSP인데 neural network을 위한 MAC으로 최적화된 것이다.

neural network을 하기 위한 MAC은 별 건가? 할 수 있는데, 별 거 아니다. 대개 조건을 제작을 의뢰한 쪽에서 주게 되어있다. 무슨 말이냐면 무슨 함수 하나를 작성한다고 보면 입력과 출력이 정의되어야 하고 HW의 경우는 언제 일을 다 끝마쳐야 한다라는 조건까지 주게 된다. 그렇게 되면 입력과 출력의 폭이 얼마나 되어야 되고 MAC을 몇 개나 두어야 되고 어디서 어디까지 pipelining을 해야 할지 등등이 자동으로 계산된다. 또 동시에 몇개나 가동시켜야 하는지 까지 결정되면 해당 유닛의 개수를 몇 개나 해야할지도 아울러 결정된다.

Deep learning은 artificial neural network에 기반하고 있고, 그 artificial neural network를 이루는 최소의 구성요소를 대개 perceptron이라고 하는데 쉽게 말해서 그냥 여러 개의 입력 가지가 있고 그 각각의 가지에 저마다의 weight를 갖고 있고 그것이 최종적으로 모두 더해진 것이 출력으로 내보내어지는 그런 구조이다. 그러니까 그냥 MAC인 것이다. 시간으로 연속적으로 돌리든지 아니면 동시에 돌리든지 그것은 입력의 데이터 폭, 개개의 데이터 크기 등등을 고려해서 결정이 된다. 이를테면 그냥 8bit magnitude 혹은 signed number (linear scale)로도 해결이 된다고 하면 이를테면 128b짜리 bus에 연결되어있는 NPU 같으면 16개의 데이터가 동시에 주어지는 것이니까 이상적인 경우 clock cycle x 16 MACs이 되는 것이다. 1GHz라고 보면 16G MAC이 되는 것이다. 이런 유닛을 10개 가지고 있다 치면 160 GMAC이 되는 것이고. 또는 같은 128b (8 x 16) 데이터를 가지고 종류가 다른 128종의 weight를 동시에 곱할 수 있게 해놨다면 T Mac으로 올라가게 되고 그런 것이다.

물론 이렇게 곱해지는 값이 곱셈기에 빠르게 로딩되어야 되고 계산 결과도 빠르게 로직으로부터 흘러나와야 되니까 효율적인 데이터 입출력/배분 구조를 가지고 있어야하고, 들고 나고 하는 값의 dynamic range가 클 수 있는데 이것들이 상대적으로 낮은 전력으로 빠르게 계산되게 하려면 precision을 낮추어도 결과 품질의 변화가 없게끔 trade off이 잘 되어있어야 한다. 하드웨어의 세계로 오면 모든 문제가 단순화되기 때문에 이론을 배우는 것보단 그것을 현실화해놓은 결과를 구경하는 것이 훨씬 더 재미가 있다. 현실적인 한계에 대해서도 더 빨리 알 수 있게 되고.

즉, 쓸데없이 높은 정확도를 갖지 않더라도 좋은 결과를 낼 수 있게 들어가고 나오는 신호들을 정의해야 한다는 것이다. 물론 수많은 실험을 통해서 검증이 되어야 가능한 일이긴 하지만 말이다.

Ethos라는 이름이 붙은 칩이 많이 각광을 받고 있는 듯 하다. Arm 프로세서가 그래픽 처리를 위해 Mali라는 것을 택하듯, Deep learning을 위해서 취하는 NPU 아키텍쳐가 Ethos인 것이라고 이해하면 될 것 같다. 다른 ML 관련 블록과의 차별점은 task를 어떤 식으로 처리하느냐 MAC을 어떻게 관리해서 효율을 극대화하느냐 일텐데, 어차피 작업이 정의가 되고 그 작업을 S/W로 구현해서 동작시킬 때 이것도 다 결정이 된다. 어려운 분석방법이나 툴을 동원할 것도 아니고 병렬화할 것이냐 직렬화(시간적으로 순차적: 파이프라인)할 거냐 정도의 구분 정도만 해도 일은 다 끝난다. 특별히 무슨 칩의 이름을 붙이거나 하는 것도 별 의미가 없다. 빨리 잘만 돌고 문제만 안 생기면 그게 최고지 어느 메이커의 무슨 아키텍쳐가 되야 한다 이어야 할 이유는 없다. 뭐랄까 기술과 상관없는 마케팅 팀이 따라붙은 듯한 느낌만 받게 될 뿐.

여기에 한 가지 더 따라붙는 용어가 DPU라는 것인데 이것은 Display Processing Unit 되시겠다. 어떤 사람들은 이것을 Deep learning Processing unit이라고 부른다. 후자는 위의 NPU와 같은 의미를 갖는 것이라고 보면 된다. 그러니까 아직 이바닥 용어는 확립되지 않았다는 것을 알 수 있다.

전자의 경우는 GPU가 있는데 DPU는 또 뭐하는 거냐? GPU와 DPU는 정확히 차이가 뭐냐 물어볼 수 있을 거다.

여기서 GPU는 anti-aliasing처럼 영상 필터를 적용할 때 쓰는 용도라고 보면된다. 이 때 여러 개의 데이터를 한꺼번에 처리하고 (SIMD 같은 것임) 필터를 만드려면 MAC이 있어야 되니까 ML을 위한 연산 기능도 할 수 있다. Mali에는 video processor가 따로 있어서 일반적인 GPU가 하는 H.264/265 codec이 그 안에 구현되어있다.

DPU는 정확히 말하자면 모바일의 디스플레이처럼 비교적 저 해상도 디스플레이를 위한 화면 처리용 프로세서라고 보면 된다. 이름이 좀 거창하긴 한데 원래 디스플레이와 직결되는 장치는 예전엔 그냥 프레임 버퍼라고 불렀다. 그냥 앞단의 그래픽 프로세서가 처리 결과를 메모리에 기록하면 그것을 그대로 읽어서 비디오신호로 내보내는 것이 프레임 버퍼의 역할인데 여기서는 특별히 DPU라고 부르고 일종의 압축 기능을 부가했다고 보면 된다. 압축이라고 해봐야 거의 무손실의 프레임 버퍼 데이터 압축이다.

내용을 전부 요약하자면, Arm 프로세서에서 이야기하는 GPU는 그래픽용의 프로세서인데 옛날 사람들이 이해하기 쉬운 용어로 바꿔보자면 SIMD processor? Vector processor 쯤 (인텔에서는 MMX라 부르던) 되는 것이고 DPU는 약간 진화된 프레임 버퍼라고 보면 되는데 이게 대개 저해상도의 모바일 디바이스 용도라고 보면 되고 H.264/265 codec 같은 것은 VPU 혹은 Video process에서 처리 된다. 어차피 이것은 Mali이건 3rd party 이건 별도의 가속기 상태로 SoC에 들어있으니까 의미 없다. ML을 위해서 별도로 디자인되어 나온 것을 NPU라고 한다고 보면 된다.