본문 바로가기
Studies/AI for Hardware

Computing-in-Memory (1) : Backgrounds

by veritedemoi 2022. 1. 3.

Motivations for Computing-in-Memory


 

von Neumann Architecture [1]

  우리가 기계를 이용해서 컴퓨팅을 할 수 있게 된 역사는 그리 길지 않다. 흔히 처음으로 개발된 컴퓨터라고 불리는 ENIAC의 등장도 1946년이니, 겨우 70여 년을 조금 넘었다. 이 70여 년의 컴퓨팅 역사에서 거의 모든 때에 주로 쓰인 연산 장치는 von Neumann 구조 [1] 기반의 프로세서였다. 인간이 하기 어려운 연산을 처리하는 기능에서 각종 명령어들을 통해 사용자 친화적인 애플리케이션을 구동하는 기능까지, 프로세서(CPU)는 전반적으로 모든 작업이 가능했다. 그리고 CPU의 발전은 발열을 줄이고, 클럭 주파수를 높이거나 코어 및 스레드의 개수를 늘리는 방향으로 이루어졌다. 하지만 무어의 법칙을 쫓는 데에 한계에 다다르면서 CPU의 발전 속도가 주춤대기 시작할 즈음, Machine 및 Deep Learning으로 일컫어지는 '기계 학습'이 빛을 보기 시작했다.

 

 

 

  '기계 학습'을 가능케 하는 알고리즘은 그 양은 어마어마하지만 복잡하지는 않은 연산들의 처리를 필요로 한다. 그 연산은 어떤 두 벡터를 내적하고 그 값들을 합하는, MAC (Multiplication and Accumulation) 연산이다. 물론 MAC 연산 말고도 activation function이나 loss 계산 등의 다른 종류의 연산도 알고리즘에 쓰이지만, 일반적으로 방대한 양의 데이터(벡터)를 기반으로 하기 때문에 MAC의 비중이 압도적으로 많다 [2].

The range of computations required in neural-network applications [2]

  위에서 볼 수 있듯, MAC라는 연산의 양이 많아짐에 따라 복잡한 연산들을 순차적으로 정확하게 연산하는 게 주된 기능인 CPU의 입지는 좁아져갔다. 그리고 동시에 GPU가 각광을 받기 시작했다. GPU는 예전부터 수많은 픽셀을 빠르게 처리해야 하는 그래픽 분야에 주로 쓰였다. 그래픽을 처리할 목적으로 만들어졌기 때문에 CPU와 달리 Cache가 적고 ALU가 굉장히 많다는 특징이 있다. 그 특징이 곧 병렬 컴퓨팅의 가능성 [2]을 열면서 기계학습이나 슈퍼컴퓨팅이 화제가 됨에 따라 자연스럽게 GPU가 CPU와 컴퓨팅 시장을 양분하게 되었다.

Power of parallel computing, CPU vs. GPU [2]

  Serial processing을 제공하는 CPU에 parallel processing이 가능한 GPU가 더해져 Acceleration―GPU를 그래서 ML/DL Accelerator라고 일컫는다이 가능해졌다. 하지만 여기서 모든 문제가 해결됐다고 결론 내리기에는 개선해야 할 요소들이 많았다. 가장 많이 꼽히는 것으로 에너지 소모 효율이 낮다는 점과 von Neumann bottleneck이 해결되지 않아 생기는 Latency가 있다. 사실 기계학습을 서버나 고성능 컴퓨터에서 사용할 경우에는 앞서 언급한 두 요소가 큰 문제가 되지 않을 수 있다. 컴퓨터가 외부로부터 안정적으로 전력을 공급받을 수 있고, 사용하는 알고리즘 혹은 모델의 크기가 유별나게 크지 않다면 연산 속도가 낮다고 체감되지 않기 때문이다.

 

  하지만 실질적으로 ML/DL이 궁극적으로 향하고 있는 목표는 서버와 같은 환경에서 구현되는 게 아니라, Edge device에서 사용되는 것이다. 스마트폰이나 자율주행차와 같은 기기에서는 배터리가 사용되므로 안정적인 전력 공급이 어렵고, Real-time processing이 잦기 때문에 latency가 매우 낮아야 한다. 이런 조건 때문에 기성 CPU/GPU만으로는 edge device에서 AI 알고리즘을 구현하는 게 비효율적이라는 전망이 나온다. 이런 이유로 에너지 효율성과 빠른 연산 속도를 목표로 하는 새로운 구조, Computing-in-Memory Architecture가 제안된다. 

 

Why 'Memory'?


von Neumann bottleneck

  그렇다면 왜 굳이 'memory'를 이용한 내용이 제안된 걸까? 그 배경에는 von Neumann bottleneck이 있다. 이 구조에서 프로세서는 Cache의 용량이 작다는 한계를 가진다. 그래서 지속적으로 메모리와 연산에 쓰일 데이터를 주고받아야 하는데, 바로 여기서 performance gap과 data movement energy 문제로 인해 병목현상이 발생한다.

 

Source : [2]

  Performance gap은 위 그림을 보면 쉽게 알 수 있다. 간단하게 말하면 메모리의 성능이 프로세서를 따라가지 못하고 있음을 나타내는 현상이다. 그림에 나와있듯 임베디드 메모리를 구동하는 클럭의 속도는 프로세서에 미치지 못하고 있고, 이는 자연스럽게 전체적인 처리 속도의 저하를 일으킨다. 이런 문제를 개선하지 못하면 edge device에서 real-time processing은 절대 이룰 수 없는 목표로 남게 된다.

 

Source : [3]

  게다가 위의 표를 보면, Data를 Readout(Sensing)하거나 Bus 등으로 주고받는 데에 소모하는 에너지가 매우 높은 것을 알 수 있다 [3]. 일례로, AlphaGo는 12GW에 달하는 에너지 소모로 악명이 높았는데 이는 수 백개의 CPU와 GPU가 연산하는 과정보다 저장된 데이터를 연산을 위해 읽고 커뮤니케이션 하는 과정에 쓰인 에너지가 대부분이었다. 이렇게 energy hungry한 특성을 앞서 언급한 것과 마찬가지로 배터리 기반의 edge device에서는 구현할 수 없다.

 

  그래서 기억 장치와 연산 장치를 분리시켜놓은 기존 구조에서 마치 '사람의 뇌'처럼 기억 장치가 연산까지 할 수 있는 구조가 제안되었다. 굳이 기억 장치에 저장된 데이터를 수시로 열람하거나 새로 저장하려고 에너지를 쓰지 않고도, 훨씬 더 빠르고 효율적인 연산을 구현하는 게 목표인 구조다. 

 

Various Domain in Computing-in-Memory


  제시되는 대부분의 Computing-in-Memory 구조들은 CPU나 GPU처럼 ALU가 별도로 있는 회로가 아니다. 그렇다면, 어떻게 'computing'을 할 수 있다는 걸까? 바로 Domain 내에서 가변적인 요소들에 Mapping을 함으로써 컴퓨팅이 가능해진다. 즉,  weight vector와 input vectormultiply하고 accumulate하는 과정을 회로가 갖고 있는 가변적인 파라미터들에 1:1로 매칭하는 원리다.

 

  크게 2가지 정도의 domain이 있다. Time-domain과 Charge-domain이 가장 많이 제안되었다.  먼저 time-domain은 회로 시스템에서 '시간'에 관련된 parameter들에 weight vector와 input vector를 매핑한다. 예를 들어, Wordline에 인가되는 signal의 pulse-width 혹은 pulse-count를 input vector에 매핑하고, 메모리 내부의 각 bitcell 안에 저장된 data를 weight vector에 매핑한 경우가 있다. 이렇게 매핑을 하게 되면 그에 따라 bitline에서 voltage의 변화가 일어난다. 바로 그 변화가 MAC 연산의 결과값에 해당하게 된다. 그리고 charge-domain은 위 단락에서 들었던 예에서 input vector가 signal의 pulse-amplitude를 input vector에 매핑하는 차이를 갖는 경우가 있다. 이런 매핑 방식도 마찬가지로 bitline에서 voltage의 변화가 일어나서 결과적으로 MAC 연산이 구현됨을 확인할 수 있다. 

 

  개인적으로 domain을 나누는 명확한 기준이 있는 건 아니라고 생각한다. 모든 Computing-in-Memory 구조의 본질적인 컴퓨팅 구현은 공통적으로 bitcell을 통한 current drive를 기반으로 이뤄지기 때문이다. 그렇다면, domain이 time이나 charge 등으로 이름이 붙여져도 결과적으로는 current가 우리가 sensing하는 node에서 더 흘러들어오는지(charging), 아니면 빠져나가는지(discharging)를  파악하는 게 목표가 되어야 한다.

 

 

References

[1] N. Verma et al., "In-Memory Computing: Advances and Prospects, " in IEEE Solid-State Circuits Magazine, vol. 11, no. 3, pp. 43-55, Summer 2019

[2] Synopsys.com

[3] J. Wang et al., "A 28-nm Compute SRAM With Bit-Serial Logic/Arithmetic Operations for Programmable In-Memory Vector Computing, " in IEEE Journal of Solid-State Circuits, vol. 55, no. 1, pp. 76-86, Jan. 2020

댓글