[리뷰] Accelerating Sparse Deep Neural Networks

daewoo kim
15 min readDec 11, 2021

--

다음 내용은 NVIDIA가 “Accelerating Sparse Deep Neural Networks” 논문에서 소개한 Ampere GPU 아키텍처가 sparsity를 지원하는 방법이다. 이 논문은 다음과 같은 기여를 포함한다.

  • (1) Fine-grained 2:4 구조적 pruning 접근 방식
  • (2) 메모리에 pruned 텐서를 효율적으로 저장하기 위한 압축 포맷
  • (3) 2:4 sparse 텐서를 포함한 sparse 행렬 곱셈(matrix multiplication)을 가속하기 위한 HW 아키텍처
  • (4) 많은 표준 networks에 정확도 손실을 제거하기 위해 pruned weights를 재학습하는 경험적으로 검증된 workflow

Sparse Matrix 와 Sparsity란?

Sparse matrix는 많은 zero로 구성된 matrix로 matrix의 sparsity(희소성)은 matrix 크기에서 대한 zero들의 비중이다. Sparse matrix의 장점은 많은 zero들로 구성되어 있기 때문에 상당 수의 곱셈 연산을 할 필요가 없으며 저장할 필요도 없다. 이와 같은 성질은 학습과 추론시 메모리 footprint와 속도에 이득이 되다. 반면 Sparsity는 뉴럴네트워크의 정확도/성능에 영향을 미친다.

Pruning

딥러닝 영역에서 Large Model이 사용되기 시작하면서 뉴럴네트워크의 parameters를 pruning하는 것은 모델의 크기와 추론 시간을 줄이기 위한 중요 기술로 등장하였다. Pruning은 특정 parameters를 zero로 만들어 모델의 sparsity을 유도한다. 하지만 현존하는 pruning 방법은 모델 정확도 유지와 추론 성능(속도)를 동시에 달성하기엔 어려움이 많다. 각 sparsity 방법에 따른 장단점은 다음과 같다.

  • Fined-grained sparsity: 정확도를 유지하지만 메모리 접근 이용이 나쁘고, 최신 벡터 및 행렬 수학 파이프라인을 활용하지 못해 GPU와 같은 아키텍처에서 기존 dense 모델보다 성능이 좋지 않다.
  • Coarse-grained sparsity: 프로세서 리소스를 더 잘 활용하지만 적당한 sparsity 비율 이상에서 정확도를 유지하는데 실패한다.

뉴럴네트워크 모델을 위한 pruning 방식은 다음과 같은 범주로 그룹화할 수 있다.

  • Dense 모델을 학습하고 pruning 한 후, 모델의 남은 weight를 fine-tuning
  • Sparse 모델을 얻기 위해 점전적인 pruning으로 dense 모델을 학습
  • 선험적으로 선택된 sparsity 패턴으로 sparse 모델을 학습
  • 학습된 dense 버전기반으로 결정된 sparsity 패턴으로 sparse 모델을 학습

뉴럴 네트워크를 높은 수준의 sparsity로 pruning하기 위한 다양한 접근 방식이 제안되었지만, 아직까지 추론 속도 향상을 달성하면서 정확도를 유지하는 방법은 없다.

NVIDIA Ampere 아키텍처에서 Sparsity Support

NVIDIA는 sparsity 채택 문제를 해결하기 위해 2:4 sparsity를 소개한다. 2:4 패턴은 4개 값의 각 그룹에 대해 최소 2개는 zero이어야 한다. 이는 50% sparsity을 유도하며 하이퍼파라미터 탐색없이 정확도를 유지할 수 있어 80% sparsity보다 더 실용적이다. 2:4 sparsity 패턴이 Matrix에 적용될 때, 다른 sparsity 방식에 비해 2:4 패턴은 다음과 같은 이점이 있다.

  • 효율적인 memory 접근
  • 오버헤드가 낮은 압축 포맷
  • Ampere GPU 아키텍처에서 수학 처리량이 2배 증가함

2:4 Sparsity의 benefits

NVIDIA가 제안한 2:4 Sparsity 패턴을 만족하는 matrix의 예제는 아래 그림(Fig. 1)과 같다. 아이디어는 매우 간단하다. Full dense matrix를 사용하는 것은 유용하지 않으므로 weight의 절반만 유지하여 precision에 최소한의 영향만을 미친다는 것이다.

2:4 Sparsity 패턴의 유일한 제약사항은 4개의 cell마다 최대 2개의 sparse cell이 있어야 한다는 것이다. 2:4 Sparsity 패턴은 Compressed Matrix와 Metadata 정보로 구성되어 있다.

  • Compressed Matrix: None-Zero 데이터 영역. (R*C/2개. 원소)
  • Metadata 정보: Compressed 포맷을 디코딩하기 위한 정보로 2-bits을 이용하여 4개 값의 그룹내 각 Non-Zero 값의 위치를 인코딩. (R*C/2 개. 2-bits)

Note: 2개 이상의 zero를 갖는 4개의 cell 그룹에 대해서도 일관성 있는 포맷을 유지하기 위해 compressed 포맷은 2개의 값을 여전히 저장한다.

A100 GPU는이와 같은 sparse matrices를 효과적으로 처리하기 위한 새로운 명령어를 가지고 있으며 dense matrices에 비해 처리속도를 2배로 증가시켰다.

2:4 Sparsity 패턴을 사용할 때 주요 이점은 다음과 같다.

(1) 효과적인 메모리 접근: 구조화되 않은 sparsity 패턴은 메모리에 접근할 때 캐시 라인의 utilization을 낮춰 메모리 대역폭 활용도를 낮춘다. 2:4 sparsity 패턴은 더 큰 matrix의 매 sub-block에 동일한 수준의 sparsity를 가지므로 HW가 대용량 메모리 읽기를 완전히 활용할 수 있다. Sparsity가 Matrix 내 일정하므로 간접 참조가 필요하지 않다.

(2) 압축된 포맷 효율성: 비정형 sparsity를 위한 CSR 포맷을 사용하는 것은 최대 200%의 metadata 때문에 스토리지 오버헤드가 발생할 수 있다. 4-value 블록 사이즈때문에 2:4 sparse 스토리지 포맷은 value당 2-bits 메타데이터만을 요구한다. 16-bit 오퍼랜드의 경우, compressed 포맷에 sparse 텐서를 저장하는 것은 스토리지 용량의 44%를 절감한다.

  • 4 dense elements: 4*16bits=64bits
  • 2:4 sparsity: 2*16bits+2*2bits=36bits

Tensor Scores 상에서 구조적인 sparse GEMM

NVIDIA Ampere GPU 아키텍처는 2:4 sparsity를 처리하도록 Tensor 코어를 확장합니다. 따라서 Sparse 텐서 코어는 Sparse Matrix x Dense Matrix= Dense Matrix 연산을 수행한다.(두 번째 입력 matrix와 출력 matrix는 dense matrix임). 아래 그림(Fig.2)은 2:4 sparse GEMM 작업이 텐서 코어에 매핑되는 방법을 보여준다.

피연산자 중 하나가 50% Sparsity이면 필요한 multiply-and-add 연산을 절반으로 줄여 동일한 dense GEMM에 비해 최대 2배의 성능을 증가시킨다. Sparse 텐서 코어는 FP16, BF16 및 INT8 입력/출력 유형을 지원한다. 또한, TF32 모드는 FP32 입/출력에 대해 지원되지만 그 패턴은 1:2 sparse가 된다. Peak dense 및 Sparse tensor core 처리량은 아래 (Table 1)에서 보여주는 것과 같다.

첫 번째 오퍼랜드가 compressed 2:4 형식으로 저장된 행렬인지 확인하는 것은 응용 프로그램의 책임이다. cuSPARSELt 및 기타 라이브러리는 압축 및 Sparse 수학 연산을 위한 API를 제공하는 반면, 8.0 버전이상의 TensorRT SDK는 2:4 Sparse Weight에 대해 이러한 함수를 자동으로 수행한다. NVIDIA 라이브러리는 Sparse Matrix Multiplication의 입력 차원이 16bit (FP16/BF16) 및 8b 정수 포맷의 경우 각각 16 및 32의 배수여야 합니다.

2:4 Sparse Matrix Multiplication이 dense multiplications 대비 달성하는 Speedups은 산술 강도(arithmetic intensity)와 GEMM 차원과 같은 여러가지 factor에 의존한다. 위의 그림(Fig. 3)은 GEMM 차원의 샘플링에 따른 speedup을 보여준다.

더 큰 GEMM은 더 높은 산술 강도를 갖는 경향이 있기 때문에 Sparse Tensor Core가 제공하는 2배의 속도 향상에 더 가까워진다. 언어 모델링 네트워크의 경우, N은 종종 sequence length에 batch size를 곱한 것입니다. Sequence length가 256이고 N이 10K이면 batch size는 40이 필요하다. M과 K는 일반적으로 네트워크 정확도를 높이기 위해 확장되는 네트워크 계층의 hidden dimension과 관련이 있다. 예를 들어, GPT-3는 12,288의 hidden dimension을 사용한다.

Network Pruning Workflow

2:4 Sparsity 패턴으로 뉴럴네트워크를 pruning하는 workflow는 본래의 정확도을 유지하고 하이퍼파라미터 검색을 피한다. 뉴럴네트워크 사이즈와 배포시 런타임을 줄이는 대신, 더 높은 학습 비용을 필요로 한다. 다음 그림(Fig. 4)은 NVIDIA 가 제안하는 2:4 sparsity를 적용한 전형적인 뉴럴 네트워크 학습 과정이다.

  1. Step-1. Sparsity없이 dense 모델을 학습한다.
  2. Step-2. 2:4 Sparsity 패턴으로 모델을 프루닝한다.
  3. Step-3. 프루닝된 모델을 재학습한다. i) Weight를 Step-2로부터 가져온 값으로 초기화한다. ii) Step-1과 같은 optimizer와 스케줄(lr, schedule, # of epochs)를 사용한다. iii) Step-2에서 계산된 Sparsity 패턴을 유지한다.

Step-1의 설명은 일반적인 학습 내용이니 건너뛰고 Step-2와 Step-3에 대한 자세한 설명은 다음과 같다.

Step-2: Weight Pruning

아래 그림(Fig. 5)과 같이 2:4 패턴 요구 사항을 만족하기 위해 4개의 각 그룹에서 가장 작은 두 개의 weights를 제거한다.

Step-2에서 pruning의 영향을 최소화하기 위해 채널 변경(channel permutation)을 사용하여 뉴럴네트워크의 weight의 레이아웃을 변경한다. 아래 그림 (Fig.6)은 이것이 임의의 dense 행렬(좌측-상단)에서 어떻게 작동하는지 보여준다. 이 dense 행렬을 2:4 sparsity 제약 조건(우측-상단)으로 정리하면 상대적으로 큰 일부값이 손실되어 최종 총 weight의 합은 83.7이 된다. 큰 값을 더 고르게 분포시키기 위해 weight 행렬의 열을 먼저 변경함으로써(좌측-하단), 가지치기 후(우측-하단) 최종 총 weight의 합은 102.9으로 보존된다.

Step-3: Sparse retraining

Step-2에서 weight의 절반이 제거될 때, 모델 정확도를 복원하기 위해 재학습을 사용한다. 하이퍼파라미터 검색을 피하기 위해 랜덤 초기화보다 Step-1의 weight로 초기화하고 Step-1의 학습 세션을 간단히 반복한다. 이때 모든 하이퍼파라미터와 optimizer states를 리셋하는 것이 중요하다. Step-2에서 제거된 weight는 2:4 Sparsity 패턴을 유지하기 위해 zero 값을 유지해야 한다.

Sparsity 와 Quantization을 조합하기

일부 네트워크는 Quantization 직후에도 정확도를 유지하지만, 다른 네트워크는 손실된 정확도를 복구하기 위해 fine-tuning이 필요하다. Quantization과 Sparsity를 동시에 적용하기 위해서 sparsity를 위해 뉴럴네트워크를 프루닝 및 재학습한 후, Quantization calibration(및 잠재적으로 fine-tuning)을 적용하는 것이 좋다.

결과

NVIDIA는 Image Classification, Image Segmentation/Detection, GANs, NLP에 대해서 위의 Network Pruning Workflow 방식을 적용한 후, Dense FP16, Sparse FP16, Sparse INT8 별 뉴럴네트워크의 정확도를 측정하였다.

Image Classification Networks

16의 짝수 배수인 GEMM-K 차원이 없기 때문에 첫 번째 레이어(3채널 입력에서 7 x 7 Conv)를 제외한 모든 Conv 및 FC 레이어를 pruning한다. 1st 레이어와 FC 레이어를 포함한 Conv 레이어의 weight 및 input activation 텐서는 INT8로 양자화된다. Entropy와 max calibration은 각각 activations와 weights에 사용된다. Per-tensor scaling factors는 Conv의 weight 텐서에 사용되며 per-row scaling factors는 FC 레이어의 weight 텐서에 사용된다.

아래 표(Table 2)에서 sparse FP16/INT8 모두 dense FP16의 정확도를 유지하며, dense FP16에 비해 약간 다른 결과가 나온 것은 랜덤 시드나 fine-tuning 비결정론의 원인으로 run-to-run 간 변동 범위 내에 있다.

Lower-parameter를 가진 뉴럴네트워크(Table.3)은 기본적인 pruning workflow를 적용했을 때 정확도를 완전히 복구하지 못했다. 아래 Table.3에서 보이는 것처럼 Pruning이 이 모델들을 위한 정확도의 완전히 복구하기 전, weights를 변경하였다. (permute)

Natural Language Processing(NLP)

NLP 태스크상의 pruning workflow의 행동을 스터디하기 위해 RNN기반 번역 네트워크(GNMT), Transformer기반 번역 네트워크(FairSeq Transformer), 두 개 언어 모델링 네트워크(Transformer-XL & BERT)을 테스트하였다.

Language Translation(언어번역)

언어 번역 네트워크는 단일 단계로 학습되며, pruning 후 원래 하이퍼 매개변수를 사용하여 학습 세션을 반복한다. Fine-tuning 후 네트워크는 max calibration을 사용하여 INT8로 quantization된다.

Per-tensor scaling factor는 activation 텐서에 사용되고 per-row scaling factor는 FC 및 RNN 레이어의 weight 텐서에 사용된다. Table.6은 dense FP16 네트워크과 2:4 패턴과 일치하도록 재학습된 네트워크의 정확도를 보여준다. Sparse FP16/INT8 모두 Dense FP16보다 더 높은 정확도를 보인다.

Language Modeling(언어 모델링)

Transformer-XL과 BERT-Large의 경우, transformer block/layer 안의 모든 GEMM 레이어가 pruning된다. (Attention 레이어는 어떠한 weight을 포함하지 않기 때문에 pruning되지 않는다.)

BERT를 INT8로 quantization 할 때 batched-GEMM 레이어를 포함한 모든 GEMM 레이어는 residual connection의 데이터와 함께 INT8 오퍼랜드에서 작동한다. 이러한 공격적인 quantization는 약간의 정확도 저하를 유발할 수 있지만 sparse 네트워크 모두 dense 네트워크의 정확도와 일치한다.

결론 및 Future works

  • NVIDIA가 제안한 Sparsity Workflow는 학습된 dense 네트워크의 weight를 pruning 한 후 학습 세션을 반복한다. 이와 같은 접근 방식은 재학습 시 하이퍼파라미터 변경이나 검색이 필요하지 않는 장점이 있다.
  • 이러한 Sparsity Workflow는 학습 시간을 2배로 늘리므로 향후 연구 방향은 더 짧은 fine-tuning 스케줄을 찾는 것이다. 또한 용량의 한계까지 학습된 모델의 Sparsity의 영향성을 탐색하는 작업이 남아 있다.

--

--

daewoo kim

AI developer & Author | Working@semiconductor-industry. I write and share about what I learn.