본문 바로가기

Paper

[논문 정리] Laconic Deep Learning Computing

Abstract

Laconic을 하드웨어 가속기(Hardware Accelerator)로 제시하여 실행 시간을 단축하고 딥 러닝 네트워크의 추론을 위한 에너지 효율을 높임

→ 다른 최첨단 가속기를 능가하는 저비용, 단순성, 에너지 효율적 설계를 위해 작업 감소 잠재력을 포기

Motivation

성능을 향상시키기 위해서 에너지 사용량을 줄일 필요

convolution neural network에서 activation과 weight의 곱이 대부분의 연산 → 효과가 있는 연산만 적게 실행

큰 연산을 작은 여러개의 연산으로 분할

  1. "A", activation이 zero이면 skip
  2. "A+W", activation이나 weight이 zero이면 skip
  3. "Ap"
  4. "Ap+Wp"

연산을 bit level로 분할

 

  1. Ap, Ap+Wp : activation 이나 weight 각각의 precision이 target
  2. "Ab+Wb", activation bit나 weight bit가 zero이면 skip
  3. "At"
  4. "At+Wt"

Background

  • Convolutional layers
    CNN은 convolutional layer와 fully-connected layer로 이루어져있다
    Input activation을 이용하여 output activation을 만드는 convolution layer의 처리가 CNN에서의 대부분의 연산을 차지한다
    (c,x,y)의 input activation block
    N개의 (c,h,k)개의 filter
    layer는 각각의 filter를 input activation의 window((c,k,h) 크기의 subarray)와 dot product하여 하나의 (O_h,O_k)의 output activation을 만든다
    filter가 N개니까 (N,O_h,O_k)의 output이 다음 layer의 input으로 전달
    이 때 stride는 상수 S
    stride가 S니까 O_h는 $\lceil x/s \rceil$ O_k는 $\lceil y/s \rceil$
    fully connected layer는 x=h, y=k인 경우라고 생각하면 된다

  • Baseline system
    DadianNao 가속기에 영향을 받은 data-parallel engine을 baseline design으로 사용
    16bit fixed-point activations과 weight을 가진다
    8개의 inner product ip 사용, 이 inner product ip는 16개의 input activation, weight을 입력으로 받을 수 있다
    8개의 ip에 각각 16개의 input activation 보내는데 weight은 ip 각각 가지고 있도록 한다
    매 사이클마다 각 ip는 16개의 Input activation을 weight과 곱하고 16개의 32bit input adder tree를 사용하여 하나의 partial output activation으로 만든다
    이 partial result는 여러 사이클동안 더해져 final output activation을 만든다
    activation memory가 activation 제공, weight memory가 weight 제공

Laconic : A simplified example

4비트 activation, weight 예시

  • Bit-Parallel Processing
    두개의 activation과 weight의 곱을 병렬로 처리
    한 사이클에 두개의 4b X 4b 처리

 

  • Bit-Serial Processing
    LM은 8개의 input activation과 weight을 처리하여 매 사이클마다 32개의 1b X 1b를 만들어낸다
    LM은 activation과 weight을 직렬로 처리하기 때문에 16개의 output activation을 P_a * P_w cycle에 생성
    P_a : activation precision, P_w : weight precision

 

  • Laconic
    activation과 weight이 벡터로 표현

Laconic

input과 weight 모두에서 중요한 비트만 계산하여 총 연산량을 줄이는 것이 목표

LAC 컨버터가 input activations과 weight을 essential 한 bit만 남기도록 변환

one-offset을 처리하도록 LAC 구현

activation과 weight을 0이 아닌 부호가 있는 2의 거듭제곱 booth-encoded로 표현

각각의 activation과 weight을 그것의 one-offset의 list로 표현

각각의 one-offset은 부호와 크기의 pair로 표현

 

ex) activation이 10진법 -2라면 이진법으로는 1110이고 $-2^{1}$이라 (-,1), 7은 $2^3 -2^0$이라 (+,3),(-,0)

 

LAC는 weight과 input activation의 곱을 ($s_i, t_i$)를 사용하여 나타낸다

$W \times A = \sum (-1)^s 2^t \times \sum (-1)^{s\prime}2^{t\prime}$

이 식은 $A \times W$를 구할 때 각 input activation의 $t\prime$과 weight의 t의 곱을 구하는 것

모든 term들은 2의 n승이므로 곱의 결과 또한 2의 제곱수

따라서 LAC는 몇 제곱인지 나타내는 $t'+t$를 먼저 더한 후 $2^{t'+t}$의 final value를 디코더를 통해서 계산

efficient adder tree를 이용하여 모든 합을 더한다

 

Step 1

16개의 4비트 weight과 activation을 one-offset,sign으로 입력 받는다

4비트 두개를 더하면 5비트가 될 수 있으므로 $t+t'$는 5비트로 output

이 때 각 term의 부호를 결정하기 위해서 XOR 게이트 사용 후 step3로 넘긴다

 

Step 2

5비트를 32비트로 표현

$00001_2$ → $00000000000000000000000000000001_2$

$10000_2$ → $10000000000000000000000000000000_2$

 

Step 3

각 bucket에 16개의 32비트 input이 몇개 들어오는지 저장

총 16개의 input이 있으니까 각 bucket은 최소 -16 최대 16의 값을 저장해야 하므로 6비트가 필요

 

Step 4

각 bucket에 몇개가 있는지가 저장되어 있었는데 그 개수를 bucket의 수가 의미하는 만큼 shift 후 더하기

위 방법보다 더 효율적인 방법

$N^n$ 을 concat 하여 36후 shift, 36,32비트로 concat하는 것 자체가 shift 역할을 함

overlapping 하는 부분이 없는 것이 보장되므로 concat 후 shift하는 것이 효율적

 

Step 5

38비트의 partial sum 만들기

 

Step 6

accumulator에 partial sum 더하여 총 A X W 구하기

Enhanced Adder Tree 보충

$N^0$~$N^{31}$을 6그룹으로 나눈다

이 때 각 그룹 내에서 N을 6씩 차이나게 한 후 concat 하면 자연스럽게 shift 효과

더 작은 N의 부호가 0인지 1인지 확인 후 0이면 그냥 더하고 1이면 더 큰 N-1후 concat

순서대로 더해가면 된다