홍광수 과장, 한재근 과장, Data Scientist, NVIDIA
BERT (Bidirectional Encoder Representations from Transformers) 모델은 구글이 공개한 자연어 처리 모델로서, 기존의 SOTA (State-of-the-Art) 모델이었던 ELMO (Embeddings from Language Model)의 성능을 크게 앞지르는 한편 Fine-tuning 만으로 범용적인 태스크에 모델을 적용할 수 있다는 가능성을 보여준 모델입니다. 때문에 오늘날 대부분의 자연어 처리 모델은 BERT를 기반으로 설계되고 있습니다. 하지만 BERT는 논문에서 제시된 구성에 따라 BERT-Large 모델을 Tesla V100 32G * 8 GPU 서버 한 대로 Pre-training시, 약 2주간 학습이 필요한 무거운 모델입니다. 따라서, 모델의 성능을 평가하고 향상시키는 과정을 감안했을 때, 실제 BERT를 기반으로 서비스할 수 있는 모델을 구축하기에는 많은 비용과 시간이 필요합니다. 뿐만 아니라, 이렇게 무거운 모델을 바탕으로 서비스를 하는 것은 비용 및 반응 속도 측면에서 실용적이지 못하기 때문에, BERT 모델의 크기를 줄이는 경우가 많고, 불가피하게 모델의 성능을 저하시키게 됩니다.
엔비디아는 이러한 BERT 모델을 많은 분들이 쉽게 사용할 수 있도록 모델을 최적화하고 이와 관련된 코드들을 공개해 왔습니다. 이를 통해 동일한 조건에서 10일 이내로 학습 시간을 단축시킬 수 있으며, 분산학습까지 적용하게 되면 3시간 이내에 BERT를 학습하게 할 수 있습니다. 또한 BERT-Base 모델을 기준으로 약 2.2 ms의 지연시간으로 추론을 할 수 있어, 모델의 성능저하 없이 효과적으로 BERT 모델을 활용할 수 있습니다.
이 문서는 위와 같은 BERT 모델의 속도 향상을 위해 적용된 기술들에 대해 소개하고, 학습에서 추론에 이르는 전 과정에 대한 실습 수준의 설명을 제공합니다. 소개된 내용을 바탕으로 BERT 모델을 기반으로 한 학습과 서비스 개발을 하시면, 개발 기간 단축과 함께 서비스 응답 속도 향상 및 모델의 성능을 향상시킬 수 있습니다.
엔비디아는 이와 같이 딥러닝 성능에서 한가지 고려 요소인 속도에 대해 기여를 하고 있습니다. 엔비디아는 BERT 모델의 학습과 추론 속도 개선을 위해서 다음과 같은 기술들을 적용하였고 이를 바탕으로 전 세계 수 많은 BERT 연구자들에게 도움을 주고 있습니다. 또한 BERT 모델을 실제 제품화 과정에 적용하시면서 궁금하신 부분이나 이를 기반으로 다양한 서비스를 접목하는 데에도 도움을 드리고 있습니다.
학습 최적화 기술
- Horovod 기반의 Multi-GPU 학습: Horovod는 텐서플로우 (TensorFlow), 케라스 (Keras), 파이토치 (PyTorch), MXNet의 딥러닝 프레임워크에서 Multi-GPU를 활용한 분산학습을 지원하는 프레임워크입니다. 특히, 엔비디아의 NCCL (NVIDIA Collective Communications Library)을 사용하여 효율적인 Multi-GPU 학습 환경을 제공합니다. 엔비디아는 BERT Multi-GPU 학습을 위해 Horovod를 사용하여 분산 환경 하에서 학습 성능을 빠르게 개선하였습니다.
- AMP (Automatic Mixed Precision) 학습: 텐서 코어는Mixed Precision 기반의 GEMM (General Matrix-to-Matrix Multiplication) 연산을 가속화하는 모듈로써 Volta 아키텍처부터 지원됩니다. 따라서 학습 시 Mixed Precision 학습을 수행하게 될 경우 텐서 코어를 활용하여 학습 성능을 높일 수 있습니다. 이러한 Mixed Precision 학습을 보다 쉽고 편리하게 제공하기 위해서 엔비디아는 AMP 기법을 제공하는데, 특히 NGC (NVIDIA GPU CLOUD)에서 제공하는 텐서플로우 (TensorFlow)는 추가적인 소스 코드 변경 없이 간단한 환경 변수 설정만으로 자동적으로 그래프를 재 작성하고 Loss Scaling을 수행하여 학습 시간을 단축시켜줍니다.
- LAMB (Layer-wise Adaptive Moments based optimizer for Batch training): LAMB는 BERT 모델의 Large 배치 최적화 기법으로, LARS (Layer-wise Adaptive Rate Scaling) 기법과 Adam Optimizer를 확장한 기법입니다. 학습률 (Learning rate)을 안정적으로 높일 수 있기 때문에 학습시간을 100 배 가량 단축 시킬 수 있는 Optimizer 입니다. 엔비디아는 Gradient Pre-normalization과 Bias correction 추가한 별도의 LAMB (NVLAMB)를 적용하여 학습 속도를 더욱 가속시켰습니다.
추론 최적화 기술
- TensorRT: TensorRT는 엔비디아에서 추론하려는 딥러닝 모델을 GPU에 최적화해주는 소프트입니다. CUDA에 대한 전문적인 지식이 없어도 모델을 GPU에 최적화해주는 컴파일러와 이를 실제 서비스 환경에서 추론을 시켜주는 런타임 엔진으로 구성이 되어 있습니다. 텐서플로우 (TensorFlow) 및 ONNX 모델에 대한 최적화를 지원하기 때문에 사실상 대부분의 프레임워크를 통해 만들어진 모델을 지원하고 있습니다. 엔비디아는BERT 모델의 추론최적화 기능도 TensorRT를 통해서 제공합니다.
- TRTIS (TensorRT Inference Server): TRTIS는 학습된 딥러닝 모델을 효율적으로 서빙하기 위한 플랫폼으로써, TensorRT 뿐만 아니라 다양한 딥러닝 프레임워크의 모델을 이용한 추론을 가능하게 합니다. 또한 어플리케이션에 따라 다양해지는 추론 스케쥴링에 대한 요구사항에 대응할 수 있도록 다양한 스케쥴러를 제공하고, 멀티 모델에 대한 Multi-GPU 추론을 제공하기에 서버 레벨에서 효율화 된 서빙 플랫폼을 구축할 수 있습니다.
BERT 학습
위에서 소개한 기술들을 바탕으로 이제 BERT 모델의 학습과 추론의 성능 개선을 위한 세부 내용을 살펴보도록 하겠습니다.
BERT 모델의 학습과정은 크게 Pre-training 단계와 Fine-tuning 단계로 구분됩니다. Pre-training단계에서는 방대한 데이터 셋으로부터 언어와 문장 자체에 대한 이해도를 높이고, Fine-tuning 단계에서는 Pre-trained된 파라미터들을 다운스트림 (Downstream) 작업을 통해 특화된 작업을 처리할 수 있게 해줍니다.
BERT 학습을 하기 위한 각 단계는 크게 4 단계로 구성되어 있습니다. 학습 환경 구성, 데이터셋 다운로드 및 TFRecordSet 구성, Pre-training 단계, Fine-tuning단계로 나눌 수 있습니다. BERT 학습 과정에서 사용하는 소스코드는 엔비디아가 제공하는 DeepLearningExample깃헙 저장소의 텐서플로우 (TensorFlow) BERT 모델을 기반하고 있으며, 자세한 학습 과정은 [여기]를 참고해주시길 바랍니다.
- 학습 환경 구성
BERT 학습 환경을 위한 도커 (Docker) 이미지를 생성하고 빌드합니다. CUDA 10.1과 텐서플로우 (TensorFlow) 1.14.0 기반의 도커 (Docker) 이미지를 사용해서 빌드했습니다.
- 데이터셋 다운로드 및 TFRecordSet 구성
Pre-training을 위한 BookCorpus와 wikicorpus_en 데이터셋을 합치고 TFRecordSet으로 만드는 과정과 Fine-tuning을 위한 SQuAD, GRUE dataset을 다운로드 하는 과정을 포함합니다. 많은 시간이 소요되므로 반드시 여유시간을 가지고 실행해야 하며 깨진 링크는 무시하셔도 됩니다. data/create_datasets_from_start.sh 은 TFRecodset 생성시 BERT 모델의 파라미터인 max_seq_length와 max_predictions_per_seq 설정에 주의해 주세요. 생성된 파라미터에 따라 BERT 모델의 input이 달라지기 때문에 학습할 BERT 모델의 파라미터를 고려해서 설정해야 합니다.
- BERT Pre-training
모델 학습에 필요한 데이터셋과 TFRecordSet 구성이 끝났으면 본격적으로 학습을 진행할 수 있습니다. BERT 모델 학습은 Pre-training과 Find-tuning 단계로 나눌 수 있습니다. BERT모델은 언어 표현을 위해 Bidirectional Representations을 pre-training하게 디자인되었습니다. 엔비디아가 제공하는 스크립트는 Wikipedia와 BookCorpus 데이터셋을 기반으로 Pre-training을 진행합니다. 기본 스크립트는 Wikipedia와 BookCorpus 문장을 기반으로 언어 표현을 이해하기 때문에, 추가로 pre-training 하고 싶은 문장이 있으신 경우에는 추가하고 싶은 데이터셋을 다운로드하고 TFRecordSet을 구성한 뒤 진행해 주셔야 합니다. 그리고 엔비디아는 Pre-training을 위한 두 개의 optimizer (LAMB / Adam) 를 이용한 학습 스크립트를 제공하고 있습니다. 특히 엔비디아가 구현한 NVLAMB를 사용하면 더 빠르게 학습 목표에 도달할 수 있습니다.
- BERT Fine-tuning
Fine-tuning 단계에서는 기존의 Pe-trained BERT 모델에 하나의 최종 출력 레이어를 추가함으로써 Q&A 시스템 문제, GLUE benchmark 뿐만 아니라 많은 NLP (Natural Language Processing) 작업을 수행할 수 있습니다. 현재 예제에서는 GLUE benchmark와 Q&A 문제를 Fine-tuning 하기 위한 스크립트를 제공합니다. Fine-Tuning 단계에서는 Pre-Training 단계에서 생성된 체크포인트를 파라미터로 넣어 학습을 진행해야 하는 것이 중요합니다. 기본적으로 Fine-Tuning 단계에서는 Pre-Training에서 학습된 높은 언어의 이해도를 가지는 체크포인트를 가지고 학습을 진행함으로써 NLP 작업의 성능 향상을 기대할 수 있습니다.
- 학습 속도 성능
학습 속도 최적화를 거친 결과에 대한 성능 향상 정도를 알아보겠습니다.
Figure 3는 단일 DGX-1과 DGX-2에서의 Pre-training 단계에서의 Mixed Precision 학습 시간을 비교한 것으로, DGX-1에서는 약 하루가 소요되는 학습 시간을 DGX-2에서 약 2배 빠르게 학습 속도가 향상되었습니다.
Figure 4는 다중 노드에서 DGX-1과 DGX-2H의 Mixed Precision 학습 시간을 비교한 것입니다. 4, 16, 32개의 노드로 연결된 DGX-2H가 DGX-1보다 각각 2.8, 2.6, 2.9배의 학습시간이 향상됐습니다.
64개 DGX-2H로 구성된 노드에서의 Single Precision과 Mixed Precision 학습 시간 비교는 Mixed Precision 학습 시간이 Single Precision 학습 시간에 비해 약 2.3배 향상됐습니다. 64개의 노드에서는 Pre-training 단계에서의 학습 시간을 3시간 이내로 끝낼 수 있습니다. 이는 더 많은 GPU와 노드를 사용할 수록 학습 시간을 더 빠르게 단축 시킬 수 있을 뿐만 아니라 Mixed Precision 기술을 사용함으로써 학습 시간을 더욱 단축시킬 수 있습니다.
TensorRT를 통한 BERT 모델 추론 최적화
엔비디아 GPU에 최적화된 BERT 모델을 만들기 위해서는 먼저 TensorRT로 모델 엔진을 빌드해야 합니다. 엔비디아는 BERT 모델의 최적화 및 TensorRT의 지원을 위해 BERT 예제를 공개했습니다. Figure 6는 이런 원리에 따라 구성된 BERT Encoder의 레이어 구성을 보여주고 있습니다.
이렇게 압축한 모델은 기존의 텐서플로우 (TensorFlow) 모델을 대체하여 추론을 할 수 있으며, Figure 7과 같이 Pre-Processing과 Post-Processing 사이에서 기존의 구조를 그대로 사용하실 수 있습니다.
이렇게 TensorRT로 최적화 한 모델은 최적화 없이 CPU 또는 텐서플로우 (TensorFlow) 로 돌린 결과와 비교했을 때 Figure 8에서 보이는 것과 같이 TensorRT를 적용한 경우 응답속도가 많이 향상된 것을 확인할 수 있습니다.
TensorRT Inference Server를 활용한 Inference 서빙 플랫폼 구축
BERT 모델을 기반으로 Q&A 서비스를 하기 위해, Server/Client 구조로 서빙 환경을 구축하는 방법을 살펴보겠습니다. 우선 사용자의 요청 및 Context에 처리에 관한 처리를 하는 Pre-Processing/Post-Processing은 클라이언트로 두고, Model 서빙에 대해서는 TensorRT Inference Server에서 처리하게 합니다. Figure 9은 이러한 구조를 TensorRT Inference Server를 이용하여 구성한 예를 보여주고 있습니다.
이렇게 구성이 되면, 모델 서버는 모델의 추론 만을 관리하게 되므로 보다 효율적인 플랫폼을 구성할 수 있습니다. 또한 클라이언트를 구현하는데 있어서, 학습을 위해 구성한 코드를 재사용할 수 있기 때문에 서빙 플랫폼의 개발을 단축시킬 수 있습니다.
이렇게 서빙 환경을 구축했을 때 얻을 수 있는 장점 중 하나는 BERT TensorRT 엔진의 배치 사이즈 (Batch size)를 1로 구성했다고 하더라도, GPU의 용량에 따라 사용자의 증가 시 Scalable한 플랫폼을 만들 수 있다는 것입니다. Figure 10의 도표는 지금까지 설명한 내용대로 구성한 서버에서 클라이언트의 수를 조정하는 것 만으로도 Throughput이 늘어나는 것이 가능하다는 것을 보여줍니다.
결론
BERT는 자연어 처리 분야에서 널리 쓰이는 모델이지만 많은 학습과 추론 시간을 요구하고 있어서 연구 및 개발 단계에서 효율성이 항상 이슈가 됩니다. 하지만 엔비디아가 공개한 BERT 모델 최적화 코드를 활용하면 보다 쉽게 학습시간 단축 및 추론의 최적화, 서빙 플랫폼을 구성할 수 있습니다. 이를 실제로 해보기 위한 코드를 제공하고 있으며, 보다 자세한 학습 과정에 대한 설명은 [여기], 추론 과정에 대한 설명은 [여기] 를 참고해 주시기 바랍니다. 실제 모델을 제품화 과정에서 기술적인 도움이 필요하시거나 엔비디아와의 협업을 원하시면 언제든지 연락해 주시기 바랍니다.