Machine-learning에서 MVM은 training/inference 모두 총 연산의 약 70~95%를 차지한다. IMC는 MVM에 특화되어 있어 CNN과 같은 연산에 효율적이다. 그러나 MVM 이외의 element-wise 연산들 또한 해결되어야 한다. 높은 data locality를 띄는 MVM과 달리, element-wise 연산은 기존의 digital acceleration으로 충분히 해결 가능하고, 이는 data movement와 memory accessing보다는 computation energy가 중요하다.
MVM의 output을 대상으로 수행되는 element-wise 연산들은 IMC 근처에서 수행되는 것이 효율적이다. 이는 IMC로 부터의 data 이동을 감소시킬 수 있다.
CIMA는 M-BC(Multiplying Bit Cell)을 통해 charge-domain computation을 기반으로 inner product operation을 수행한다. M-BC는 기본적으로 1b XNOR 연산을 수행하지만, input masking을 통해 AND 연산 수행이 가능하다. CIMA는 최대 2304x256 크기로 설정 가능하며, 4x4의 tile로 구성되어있다. 기존 연구에 따르면 1만개 정도의 row로 구성되어도 capacitor mismatch로 인해 SNR이 제한되지 않는다.
각 column의 하단에는 ABN(Analog Batch Normalization) block과 ADC가 위치한다.
ABN은 batch normalization 혹은 activation binarization을 수행한다. Binarized activation에 대해서는 batch normalization은 단순히 preactivation의 비교로 치환된다.
ADC는 8b SAR 구조이며, output을 digital 신호로 변환하여 NMC block으로 전달한다.
Column의 갯수와 ADC의 precision은 energy/throughput VS SNR의 trade-off를 통해 결정된다. Column 갯수를 증가시키면 communication/readout overhead를 더욱 감소시킬 수 있지만, output dynamic range가 증가하여 readout complexity를 증가시킨다.
CIMA의 logical column은 3개의 physical column으로 구성되어있다. Logical column의 갯수는 9의 배수로 설정하였는데, 이는 최근 CNN들이 3x3 kernel을 많이 사용하기 때문이다. 또한 이는 layout상에서의 pitch matching에도 도움을 준다.
1b IMC는 bit-parallel/bit-serial(BPBS)을 통해 multi-bit으로 확장되었다. BPBS scheme은 weight는 column 단위로 저장을 하고, input-vector는 row 단위로 LSB 먼저 sequential하게 입력된다.
Multi-bit 연산의 경우, column의 출력들은 각자 shift되어 더해짐으로서 multi-bit output을 구할 수 있다.
BPBS를 통해 input-vector와 weight를 임의의 precision으로 표현할 수 있지만, ADC의 precision으로 인해 rounding error가 발생한다. ADC로 인한 rounding error는 SQNR(Signal-to-Quantization Noise Ratio)로 나타낼 수 있다.
개의 M-BC는 의 output dynamic range를 가진다. 만약 ADC의 precision이 이보다 크면, 정수 연산은 완벽히 수행가능하다. 그러나, row-parallelism을 위해 을 증가시키면, 필요한 ADC precision이 커지게되고, 이는 overhead로 작용한다. 따라서, ADC의 precision은 ADC overhead와 SQNR간의 trade-off를 통해 결정된다. 2304개의 row는 12b의 ADC precision을 필요로 하지만, 8b ADC를 사용했을때 약 15%의 area overhead와 약 18%의 energy overhead를 발생시킨다.
Quantization effect는 parameter training algorithm에서 고려될 수 있다. 즉, quantization effect를 고려하여 NN를 학습할 수 있다.
Column의 갯수는 column-gating switch를 통해 최댓값인 2304보다 적게 설정할 수 있으며, 64의 배수로 설정 가능하다. 이를 통해 필요에 따라 column들을 비활성화 시킴으로써 ADC의 rounding effect를 경감시킬 수 있다. Input의 sparsity 또한 dynamic range를 감소시킬 수 있으며, ADC의 rounding effect를 경감시킬 수 있다.
CIMU의 실행단계는 총 5단계로 나눌 수 있다.
1. Configuration
Input-vector와 weight의 bit precision, dimension과 NMC 연산 등을 설정한다. Configuration은 가장 처음에 1번 수행되거나 application에 따라 간헐적으로 수행된다.
2. Load matrix
Weight가 CIMU 내부로 load된다. Weight는 다음과 같은 source들로부터 전달된다.
CPU를 제외한 나머지 source들은 DMA를 활용하여 weight transfer가 가능하다.
3. Load vector
Input-vector에 CIMU 내부로 load된다. Weight의 경우와 마찬가지로 4개의 source들로부터 전달된다.
4. MVM execution
MVM 연산이 수행된다. MVM 연산은 CPU가 CIMU control register에 값을 쓰며 수행되며, 연산에 끝나면 CPU에 interrupt를 발생시킨다.
5. Result collection
CIMU peripheral buffer에 저장된 연산 결과를 앞서 언급한 4개의 source들로 전달한다.
w2b reshaping buffer는 CIMU 외부의 32b processor와 CIMU가 효율적으로 interface하기 위해 존재한다. 32b bus를 통해 input-vector를 입력받고 최대 8개의 serial한 input stream를 생성한다. BPBS 연산을 수행하기 위해 parallel한 input-vector를 serial한 형태로 transform 해주는 역할을 수행한다.
w2b reshaping buffer는 input-vector의 convolutional reuse 또한 지원한다. Buffer 내부의 register files에 위치한 input-vector를 재사용하여 새로운 input-vector의 입력을 최소화한다.
w2b reshaping buffer의 동작은 다음과 같다.
1. 32b input-vector를 4개의 8b register로 이루어진 set에 저장한다.
2. 24개의 set을 연속적인 input-vector로 채운다(총 768b).
3. 24개의 set에 저장된 data가 8개의 register file로 이동한다. 이 과정에서 data reshaping이 수행된다. 예를 들어 1b input-vector의 경우, 768b의 data가 8개의 register files로 한번에 parallel하게 register file로 이동한다. 8b input-vector의 경우, 8b이 serial하게 CIMA로 입력되어야 하므로, 모든 8b register에서 1b씩 1개의 register file로 이동한다(768/8=96b). 이후 8개의 register file을 모두 채울 때까지 반복한다.
위와 같은 동작으로 인해, reshaping은 input-vector의 bit-precision 에 비례하는 cycle을 필요로 한다. Reshaping은 24번의 32b data transfer마다 1번 수행된다. 따라서, 32b bus의 최대 utilization은 1b input-vector의 경우 , 8b input-vector의 경우 이다.
8개의 register file은 8개의 8b input-vector(64b)와 input-vector 각각에 sparsity-mask bit(8b)을 저장하기 충분하도록 각각 72x96으로 구성되어있다. 이는 4개의 8b input-vector가 저장될 수 있고, double buffering도 지원하여 CIMA의 readout이 수행될 동안 weight loading이 가능하다. Readout은 한번에 총 column의 3/4인 72b씩 수행된다. 따라서 convolutional reuse의 경우, 3/4의 column이 readout되는 동안, 1/4의 column에 대해 weight loading이 가능하다. Register file 뒷단의 shifting interface를 통해 convolutional striding을 지원한다. CIMA의 column이 2304로 최대인 경우, input-vector가 CIMA로 이동하는데 총 4 cycle이 소요되며, column activation이 줄어듬에 따라 필요한 cycle이 감소한다.
Sparsity/And-logic controller는 input-vector의 sparsity에 비례한 energy saving과 SQNR 상승, M-BC의 and-logic functionality를 위해 존재한다. Energy saving은 input-vector element인 을 gating 함으로써, M-BC의 capacitor charing을 방지하여 달성 가능하다. 이 둘의 energy는 CIMA 총 energy의 약 66%를 차지한다. SQNR은 이전에 언급하였듯이 sparsity가 증가함에 따라 output dynamic range가 감소하여 증가한다. And-logic functionality는 단순히 input-vector 을 high로 masking하여 M-BC의 capacitor가 charge되지 못하도록 한다. 이를 통해 M-BC의 XNOR functionality를 AND functionality로 수정한다.
ADC는 8b SAR 구조이다. SAR ADC의 control logic은 모든 column의 ADC가 공유하며 CDAC, compataror, output-code register만 각자 가진다.
ABN은 energy-efficient한 batch normalization과 binary-activation NN에 대해 binarization을 수행한다. ABN 연산은 NMC block에서 수행가능하며, 추후 area saving을 위해 제거될 예정이다.
NMC block은 BPBS 연산에 필요한 digital 연산과 MVM output에 대한 element-wise 연산을 수행한다. NN에서 MVM 연산이 지배적이므로, IMC가 energy와 throughput 측면에서 큰 이득을 볼 수 있었지만, element-wise 연산도 가속화될 필요가 있어 data 이동을 최소화하기 위해 IMC와 가까운 곳에서 element-wise 연산이 수행될 필요가 있다.
NMC block은 8개의 CIMA column들을 multiplexing한다. 이는 layout pitch를 맞추고, digital hardware가 CIMA에 비해 높은 주파수로 동작하기 때문이다.
Adder는 값에 offset을 주기 위해 사용되며, ADC offset 보정이나 batch normalization 등에서 사용된다. Multiplier는 값을 scaling하기 위해 사용되며, ADC gain error 보정이나 batch normalization 등에서 사용된다. Barrel shifter는 2의 지수승의 곱셈에 사용되는데, BPBS bit-weighting 등에 사용된다. ReLU unit은 activation function을 적용하는데 사용되며, 현재는 ReLU만 지원하지만 LUT를 통해 다른 nonlinear function들을 지원할 예정이다.
32b processor에 의한 input/output-vector tranfer가 CIMU의 throughput을 제한하지 않아야 한다. Input-vector transfer, CIMU computation, Output-vector transfer에 각각 필요한 cycle을 라 하면, 이들은 input-vector bit-precision 와 weight bit-precision 에 종속적이다.
는 element당 bit수 때문에 에 종속적이며, 는 BPBS scheme에 의해 에 종속적이다. 는 output-vector의 element당 bit수와 dimension 때문에 에 종속적이다. Input/output-vector transfer는 CPU의 개입을 줄여 bandwidth를 최대화하기 위해 DMA에 의해 수행된다.
대부분의 경우에서 에 지배적이였는데, 가 1b 정도로 낮을 경우엔 그렇지 않았다. 이는 의 bit-precision이 낮을 경우, output-vector의 갯수가 많아지기 때문이다. 실험적으로 확인한 높은 의 비율은, CIMU utilization이 충분히 높으며 input/output transfer에 의해 bottlenet이 크지 않음을 나타낸다.
CIMA에 weight를 load하기 위한 cycle인 는 CIMA에 저장된 bit수와 물리적 크기에 의해 결정된다. CIMA는 논리적으로는 2304x256 크기이지만, 물리적으로는 768x768 크기이다. 따라서 각 row에 대해 24번의 32b DMA transfer가 필요하고, 총 768번의 row-wise write가 필요하다. DMA transfer에는 1 cycle이 소요되고, row-wise write에는 20 cycle이 소요되어, 이다. Row-wise write는 pipelining을 통해 감소될 수 있어 까지 감소될 수 있다.
측정결과, ADC output INL은 최대 약 4 LSB 정도로 나타났다. 이는 ADC와 IMC 모두에 의한 것이다. Nonlinearity의 가장 큰 요인은 M-BC와 ADC에서의 charge-injection switching noise이다.
SQNR도 시뮬레이션 결과와 유사하게 측정되었다. 이는 회로상의 non-ideality가 차지하는 비율이 작으며, 모델링 가능한 quantization effect가 지배적임을 나타낸다.
NN을 architecture에 mapping하기 위한 software library도 같이 개발되었다. 크게 2가지의 library가 개발되었다.
BPBS quantized NN을 위한 training library
BPBS 연산은 기존의 정수 연산과는 다른 rounding error를 발생하기 때문에 BPBS quantization에 맞는 training library를 개발할 필요가 있었다. Charge-domain high-SNR computation으로 인해 BPBS rounding이 정확하게 modeling될 수 있었고, loss function과 통합되어 기존의 standard quantized NN training과 유사하게 진행될 수 있었다. Training library는 TensorFlow/Keras를 기반으로 제작되어 bit-precision과 quantization type(interger/BPBS)를 설정하도록 제작되었다.
CIMU를 co-processor/stand-alone으로 사용하기 위한 inference-system library
Inference-system library는 BPBS CIMU computation simulation을 제공하며, 학습된 NN 모델을 chip에 deploy하는 역할도 수행한다.