///
Search
Duplicate
🏞️

FastFormers: Highly Efficient Transformer Models for Natural Language Understanding

Created
7/4/2021, 6:46:00 AM
발표일자
2021/02/08
발표자
유원홍
Tags
Transformer
Distillation
BERT
LanguageModeling
✅main
포스팅 종류
논문리뷰

FastFormers: Highly Efficient Transformer Models for Natural Language Understanding

논문 정보

태그

Transformer-base model
Optimization
NLU(Natural Language Understanding)

Abstract (초록)

배경: NLU(Natural Language Understanding) 응용에서 transformer 기반의 모델이 SOTA(state-of-the-art) 이다.
모델이 점점 커지고 다양한 task들에서 좋은 성능을 보이고 있음
문제: 하지만 컴퓨팅 성능 최적화가 필요하다
모델의 inference-time 성능을 고려해볼때 비효율적임
FastFormers: Transformer 기반의 모델의 추론 시간 성능을 개선하기 위한 여러가지 방법들을 조합한 것
적용한 주요 요소
Knowledge distillation
Structured pruning
Numerical optimization
개선 지표
추론 시간
CPU: 9.8x ~ 233.9x 향상
GPU: 12.4x 향상
컴퓨팅 비용 (Azure F16s_v2)
4,223 USD → 18USD
472만원 → 2만원
에너지 소모 (SustaiNLP 2020 가이드)
6.9x ~ 125.8x 향상
(실험 모델)
BERT and RoBERTa

1. Introduction

2018년에 BERT가 소개된 이후로 Transformer 기반의 사전 학습된 언어 모델이 NLU분야에서 지배적이었다.
accuracy는 전례없는 향상이 있었지만, 추론에서의 모델의 컴퓨팅 비용은 개선이 필요하다.
Inference time 효율은 운영환경에서 대부분의 비용을 결정하기 때문에 추론에 집중
적용한 방법
(accuracy 유지하면서)
Knowledge Distillation
depth 와 hidden state 사이즈 관련해서 모델 사이즈를 줄임
Structured Pruning
self-attention heads와 intermediate hidden states in the feed-forward layers 를 줄여서 모델 사이즈를 줄임
Model Quantization
하드웨어 가속 기능을 활용하는 최적화
CPU: 8-bit integer → VNNI (Vector Neural Network Instructions) 활용
GPU: 16-bit floating point → Tensor Cores 활용
Computational Graph Optimizations
graph nodes 융합
onnxruntim library 활용
CPU와 GPU자원을 최대한 활용하는 최적화 셋업
측정
Performance(효과, Effectiveness) 평가
SuperGLUE 기준 지표
SuperGLUE: general purpose open domain NLU benchmark
Efficiency(효율) 측정
wall-clock times (Elapsed real time, 현실세계에서 소요 시간)
to track energy usage, carbon emissions, and compute utilization of your system
Trasformer NLU 모델의 추론을 효율적으로 만드는 여러 최적화 방법들을 분석, 조합하여 최종적으로 이를 이용할 수 있는 코드를 배포했음

2. Knowledge Distillation

기준 논문: Distilling the Knowledge in a Neural Network (Hinton et al., 2015)
Teacher (large) model → Student (smaller) model
Teacher 기준 모델로 Student 모델을 학습
Transformer 기반 구조 모델에 적용했을때 NLU 뿐만 아니라 NLG(Natural Language Generation, 예: machine translation) 에서도 좋은 개선이 이루어짐

Methods

두가지 접근 방식
task-specific distillation
TinyBERT (TinyBERT, Distilling BERT for natural language understanding) 에서 제안된 방식
teacher를 특정 task에 맞게 학습을 시키고 distillation을 수행 (그림 a의 4번)
task-agnostic distillation
pre-trained 모델을 teacher 모델로 해서 main distillation을 진행 (그림 b의 1번)
task-specific 의 경우, student model의 초기화가 최종 accuracy에 많은 영향을 줌.
distilrboerta-base(RoBERTa 의 경우)와 TinyBERT (BERT 의 경우), 두 pre-distilled model로 student model 초기화 (그림 a의 3번)

Results

(SustaiNLP 2020 조직에서 제공하는 지표의) 기준 BERT의 accuracy보다 더 크면서 작은 distilled 모델을 선별
다른 모델 타입으로의 distillation은 잘 동작하지 않았음
예) RoBERTa BERT 간 distillation
input token (sub-word) embedding이 달라, embedding space가 다른 것이 이유일 것으로 추정하고 있음
cased 와 uncased, task-specific 와 task-agnostic 모두 학습해보고 더 좋은 accuracy 값을 가지는 모델를 채택
MultiRC, ReCoRD와 같이 더 어려운 task는 BERT 기반 모델보다 RoBERTa 기반 모델이 더 좋은 성능을 보임

3. Structured Pruning

weights pruning 접근 방식의 기준 논문
The Lottery Ticket Hypothesis (Frankle and Carbin, 2018)
randomly pruning 대신에 structured pruning을 적용
randomly pruning의 문제점
대부분의 파라매터 수를 줄이기 위한 pruning 방식은 randomly pruning 이지만, 이 방식으로 computer storage 에 올라가는 model 크기는 줄일 수 있어도, 추론 성능은 개선 되지 않음
컴퓨팅 자원을 더 효율적으로 사용하는 것에 집중한 아닌 방식이기 때문
structured pruning
([리뷰 추가] structured → trasformer-aware)
the heads of Multi-Head Attention (MHA) 들 중 몇몇을 잘라버림
feed-forward layer에 intermediate hidden states를 잘라버리고, 남은 attention 모듈과 feed-forward layers를 연결
DynaBERT에서 제안한 추가 방식

Methods

importance score (score-base pruning)
heads in MHA와 hidden states 중 덜 중요한 요소 찾기
단순 magnitude 기반 pruning이 아닌 first order gradient 정보를 활용
단순 weight의 크기가 아니라 weight이 학습이 많이, 잘 되고 있는지로 판단
[리뷰 추가] pruning 방식들
가지치기 이후에 남아있는 heads와 hidden states를 다시 연결
pruned model으로 knowledge distillation 를 수행하면 더 좋은 accuracy 결과를 얻을 수 있었음. (해당 논문, DynaBERT)
따라서 knowledge distillation 최적화를 할 때 초기 student model 를 pruned model로 사용하기로 함

Results

MultiRC와 ReCoRD를 제외한 다른 tasks는 데이터가 충분하지 않아 앞에 두 tasks에만 주로 structured pruning을 적용
RoBERTa 기반의 distilRoberta-base 를 기준 모델로 실험
inference speed 와 accuracy의 trade-off 관계를 볼 수 있음

4. Low precision Inference

numerical computation의 효율화
모델 파라매터들의 quantization (lower precision)
최근 CPU, GPU들은 낮은 정밀도를 가진 산술 연산을 가속화 할 수 있는 기능이 있음
CPU: 8-bit
예) Cascade Lake CPU의 AVX(Advanced Vector eXtensions)-512-VNNI
GPU: 16-bit
예) V100 GPUs 의 Tensor Cores

CPU의 경우: 8-bit quantized matrix multiplication

quantization methods + packing functionality
8-bit quantized matrix의 곱 연산이 32-bit floating point 산술연산에 비해 매우 빠름
빠른 이유
memory bandwidth bottleneck 감소
CPU 연산 수 감소
packing operation (TODO)
the parameter weight matrix to be tiled and transposed
vector registers와 CPU cache memories를 효율적으로 활용하기 위함
몇몇 matrix의 곱셈는 32-bit floating point로 유지
packing operation이 계속 반복되면 그 또한 부하가 발생
Q, K와 같은 inner product은 상수가 아니기 때문에 32-bit 유지
그외 모든 matrix 곱은 상수 weight matrix를 가지므로 (학습이 끝난 이후이기 때문) 8-bit matrix product와 cached weight packing을 활용
FBGEMM(Facebook GEneral Matrix Multiplication) 활용
onnxruntime framework에 통합됨
dynamic quantization method 사용
quantization range를 input matrix에 따라 동적으로 결정
input matrix는 전체 input tensor를 고려하여 결정
weight matrix는 column 별로 quantization range 결정
([리뷰 추가] covariate shift를 고려한 듯)
Cascade Lake CPU에서 3.0x까지 속도향상

GPU의 경우: 16-bit model conversion

하드웨어 수준 지원
V100 GPU의 경우 16-bit floating point 연산을 하드웨어 수준에서 지원
input output에 별도의 처리가 필요 없음
모델이 전체적으로 16-bit floating point 데이터타입으로 변경됨
16-bit floating point 가 더 작은 범위를 표현하기 때문에 numerical overflow 가 발생하기도 하지만 accuracy의 차이는 발견하지 못했음
Transformer model이 memory bandwidth bound workload이기 때문에 효과가 큼
3.53x까지 속도 향상
(V100 GPU의 경우 8-bit quantized 연산을 지원하지만 Tensor cores에 효율적인 방식을 제공하지 않아 8-bit quantization은 활용하지 않음)

5. Runtime Optimization

Multi-processing Optimization

배경
([리뷰 추가] CPU inference의 최적화)
SustaiNLP 2020 shared task의 평가 머신 환경 - 2 x Cascade Lake 6248 CPU = 40 physical cores
HuggingFace의 Transformers (Pytorch, Tensorflow 용 둘 다)은 default 실행 엔진에서 보통 하나의 operator를 위해 가용가능한 모든 CPU 코어를 사용한다. 이 방식은 아래와 같은 이유로 최적화된 방법이 아니다.
문제
compressed Transformer 구조에서의 operators는 40개의 코어를 모두 병렬적으로 활용할 만큼 크지 않다
병렬처리로 바꾸는 과정에서 발생하는 비용이 병렬성으로 얻는 이익보다 더 크게 발생해버림
cache locality가 떨어짐
해결
multiple instance inference (with multi processing)
multi instance + multi thread (하나의 instance 내에서의 threads)
multiple instance inference 구현방식: python의 multiprocessing 모듈을 활용
multi-threading이 multi-processing보다 더 유용할 것이라고 생각이 들겠지만, python의 multi-threading은 GIL(Global Interpreter Lock)때문에 실제로 multi-threading의 주요한 이점을 활용할 수 없다
따라서 multi instance를 구현할 때 multi-threading이 아닌 multi-processing 방식으로 구현
리눅스의 taskset 명령을 활용하여 각 inference instance 들이 특정 물리 코어에 고정되도록 설정
제한된 코어로 instance와 thread 개수 배분
hyper-threading은 cache 활용을 떨어뜨리기 때문에 전체 thread 숫자가 전체 코어 숫자를 넘지 않도록 함
모델, 하드웨어 세팅, 데이터셋에 따라 최적화된 multi processes 숫자는 달라짐

Computational graph optimizations

pruning graph nodes
fusing graph nodes
추가적인 메모리 할당/복사를 감소
fusion을 통해 하나의 operator의 크기를 키워서 병렬성 개선
GELU (Gaussian Error Linear Units) → ReLU (Rectified Linear Units)
FBGEMM (Facebook GEneral Matrix Multiplication) 활용
ReLU와 bias 덧샘 연산 뒤에 오는 matrix 곱샘연산을 fusing
FBGEMM 의 fused post processing operation 활용
onnxruntime 활용
multi-head attention node fusion

6. Results

6.1 Combined results

CPU로 BoolQ task 수행한 결과
Azure F16s v2 instance - Intel(R) Xeon(R) Platinum 8168 CPUs (8 physical cores)
[리뷰 추가] 가장 성능 향상이 많이 이루어지는 경우(CPU + BoolQ task) 를 선정해서 최종 결과를 남김
모든 최적화 방법을 적용한 결과 233x 까지 속도 향상 (- 1.2 accuracy 손실)
추가로 dynamic sequence length (dynamic shape batching) 최적화 적용
각 배치마다 input sequence length를 다르게 함
input의 fixed sequence length으로 인해 zero padding이 추가되어 (GPU에 비해 병렬성이 떨어지는)CPU 연산에서 성능 저하를 발생시킴
batch generation 코드 수정
CPU는 GPU에 비해 낮은 병렬성을 가지므로 zero padding으로 인한 성능 저하가 상대적으로 큼
3.51x 속도 개선
(TODO: zero padding에 따른 embedding이 달라지는 문제는?)
8-bit quantization과 onnxruntime graph optimization은 2.26x 속도 향상이 있었는데 compressed 된 모델에 적용하여 개별로 최적화를 적용한 3.0x 속도 향상보다는 작은 수치가 나옴
이미 압축이 되어 있으면 효과가 약간 감소
(8 threads 대신에) 8 concurrent & independent instances
structured pruning은 multi-instance inference 조건에서 1.81x 향상으로 같은 pruned 모델의 one inference instance 의 1.26x 향상보다 더 좋은 향상이 이루어졌음
pruning (+ multi-instance)→ 좋은 결과
multi-instance inference는 작은 모델에서 더 좋은 효과를 보임

6.2 Shared task submissions

SustaiNLP 2020 shared task 에 submitssion
Track1에 4개 system, Track3에 2개 system 제출
hybrid system Track의 경우는 ReCoRD task만 GPU를, 나머지 tasks는 CPU를 inference에 사용
[리뷰추가] 대회의 조건에서 가장 높은 점수를 받을 수 있는 조건으로 설정
GPU inference는 GPU 한개로 제한
scaling of multiple GPUs가 sub-linear
4 GPUs 3.0x (1 GPU당 x0.75)
2 GPUs 1.8x (1 GPU당 x0.9)
한개의 GPU가 가장 좋은 효율
소요 시간에 따라 task 별로 다른 최적화 방식을 적용
most time consuming tasks인 MultiRC와 ReCoRD 인 경우, 모든 압축과 최적화 방식을 적용
batch size
GPU 활용시 256 batch size
CPU에서는 single batch size
예외) CD - 4 / COPA - 8
데이터 셋이 작은 (CB, COPA, WiC)의 경우 GPU 테스트에서 큰 속도 개선을 보기 힘들었음
최적화 전 초기 처리 속도가 1~2초이고 wall-clock time 측정 해상도가 1초이므로 (???: 측정을 어떻게 한 거지?)
CPU가 GPU보다 모델 압축에 따른 속도 향상이 컸음
(WiC 은 onnxruntime 최적화를 활용할 수 없었음)
output layer에서 for loop 제어가 있으므로

7. Conclusion

NLU task를 위한 Transformer기반 모델의 추론 효율을 개선하기 위한 FastFormers 소개

적용한 최적화

Knowledge Distillation
Structured Pruning
Numerical Optimization

개선 지표

200배까지의 속도 향상
200배까지의 추론 비용 절감 (Azure cost)
22배까지의 에너지 절감 (SustaiNLP 2020)
END

참고했던 자료 메모

요약

자연어 이해 NLU(Natural Language Understanding) 분야에서의 모델 압축
transformer 기반 모델에 대한 일반적인 압축 구현 방법론
논문에서는 BERT and RoBERTa 로 실험
지금까지 나온 transformer 기반 모델 최적화 방법들을 종합한 구현체

NLU

NLU(Natural Language Understanding) 자연어 이해 : 자연어 형태의 문장을 이해하는 기술

Transformer

Attention is all you need (Vaswani et al., 2017)

Bert

Bidirectional - to understand the text you're looking you'll have to look back (at the previous words) and forward (at the next words)
Transformers - The Attention Is All You Need paper presented the Transformer model. The Transformer reads entire sequences of tokens at once. The attention mechanism allows for learning contextual relations between words (e.g. his in a sentence refers to Jim).
(Pre-trained) contextualized word embeddings - The ELMO paper introduced a way to encode words based on their context. Nails has multiple meanings - fingernails and metal nails.

model compression

Knowledge Distillation

Structured Pruning

The Lottery Ticket Hypothesis

Low precision Inference

참고 자료

2018-2020 NLU 연구 동향
BERT 압축 - 딥러닝 모델 압축 방법론과 BERT 압축

용어

Ablation study: 모델이나 알고리즘을 구성하는 다양한 구성요소(component) 중 어떠한 “feature”를 제거할 때, 성능(performance)에 어떠한 영향을 미치는지 파악하는 방법을 말한다.
onnx: Open Neural Network Exchange. The open standard for machine learning interoperability.
SustaiNLP2020
주요 지표: Task performance, Energy consumption