[NVIDIA AI Conference 정리] Tensorcore를 이용한 딥러닝 학습 가속을 쉽게 하는 방법

3 minute read

본 글은 2019년 7월 2일 NVIDIA AI Conference 행사 중 한재근 과장님께서 'Tensor Core를 이용한 딥러닝 학습 가속을 쉽게 하는 방법 (Getting more DL Training Acceleration using Tensor Cores and AMP)'이라는 제목으로 진행하신 강연을 정리한 글입니다. 원본 내용과 차이가 있을 수 있사오니 행사 공식 슬라이드를 참고하시기 바랍니다.

행사 발표자료

  • Tensor Core에 대한 설명

    ▲ Volta, Turing 아키텍쳐에서 사용 가능하며 각 FP16 엘리먼트에 대해 연산한 후 FP32로 합치는 식으로 작동.
    • 단정밀도를 사용하므로 파라미터 사이즈가 줄어들어 메모리 사용량이 줄어듬. 즉 두 배의 데이터를 처리할 수 있게 됨.
    • 모델의 퍼포먼스를 높이기 위해 FP16을 사용하면 FP32 대비 x8의 연산처리량(throughput), x2의 메모리 처리량, 1/2의 메모리 사용량 효과를 볼 수 있음.
  • Mixed Precision Training이란?

    ▲ MP는 연산속도와 정확도(accuracy) 사이의 트레이트오프 밸런스를 맞추기 위한 방법
    • FP16(16 bit floating point)은 speed, scale을 위해 사용하고 task-specific accuracy 유지를 위해 FP32를 섞어 쓰는 것.
    • Full precision과 비교해서 손해를 보지 않는 정도로 최대한 FP16을 쓰되 hyperparameter는 건드리지 않게끔 해야 함.
    • 기존에는 MP training(Mixed precision training)을 하면 acc가 망가지는것이 아닌가에 대한 걱정이 있었으나 그렇지는 않은 모양.
    • TF에서 MP를 사용했더니 3배의 속도 향상이 있었지만 사용하기 어려워 NVIDIA에서 Tensorcore에 AMP(Automatic Mixed Precision)을 추가.
    • 모델 구성에 따라 Tensorcore를 사용하는 비중이 높아질수록 훈련 성능이 올라가며, acc면에서도 학습이 잘 되는 것을 확인 가능.
  • Mixed Precision is General Purpose

    ▲ MP를 적용 가능한 다양한 태스크 목록
    • NVIDIA 깃헙에 MP를 적용한 많은 예제 코드들이 올라와 있음.
    ▲ 모델을 새로 짜지 않고 기술적으로 몇 부분만 고쳤음에도 같은 acc를 보인다.
  • MP Technical guide

    ▲ MP를 적용하기 위한 세 가지 방법
    ▲ 반정밀도로 떨어뜨리되 합치는 부분에서 단정밀도로 돌려 놓아야 함.
    • 특정 연산(GEMMs, Convolution 등등)은 TensorCore의 도움을 받되 뒷단의 Softmax나 loss 연산 부분은 acc 유지에 중요한 역할을 하므로 FP32 유지 필수.
    • weight는 single precision(단정밀도)을 유지하지만 back-propagation은 half-precision으로 수행
    • single과 half를 섞어 쓰기 때문에 mixed precision training이라고 부름.
  • Concept of AMP

    • Mixed Precision 적용을 더 편하게 수행할 수 있도록 도와주는 것이 AMP(Automated Mixed Precision)
    • single->half로 바꾸는 부분이라던지 앞의 입력이 single/half인지 판단하는 부분을 자동으로 해 줌.
    • 반정밀도로 떨어뜨리면 gradient가 vanishing할 수 있으므로 loss scaling도 자동으로 해준다(와우…). 단 loss scaling 수치는 hyperparameter이므로 테스트해보고 결정할것.
    • Automatic casting : 웬만한 상용 프레임워크(TF, MXNET, Pytorch)들은 Tensor 연산에 대한 expressions가 잘 정의되어 있어 TensorCore를 적용하기 편함.
    • 기존에는 네트워크마다 Tensorcore를 적용해보고 적용이 어려우면 사용하지 못했는데 이제는 안정적인 사용이 가능
    • Master weight를 single precision으로 유지하는 것이 핵심으로, acc 유지에 매우 중요한 역할.
    • 단순히 precision을 다운하면 FP16 이 표현 가능한 범위의 한계로 인해 loss scale 표현에 문제가 생기고, 이로 인해 weight나 gradient가 0으로 바뀔 수 있음.
    • 따라서 weight는 어쩔 수 없이 single precision으로 유지해야 함. 그래서 shift연산을 해서 값을 올려줌
    • precision마다 최대 크기가 다르기 때문에, 즉 FP16의 최대값이 FP32대비 작기 때문에 shift연산 시 오버플로우를 조심해야 한다. (그러나 이마저도 자동으로 해 줌)
  • Getting started on AMP

    ▲ 코드 두어줄 정도 추가하면 쓸 수 있도록 업데이트를 했다고 함. (Keras는 아직 개발중)
    ▲ Tensorflow에서 AMP 사용하기
    ▲ (좌) 파이토치에서 AMP를 사용해 트레이닝하는 예제,
    (우) 파이토치에서 Optimization level 설정하는 방법 및 장단점 소개
    ▲ MXNET에서 AMP를 사용하는 예제 코드
  • Performance guide of AMP

    • GPU 하드웨어 특성상 32개의 연산을 묶어서 처리하며, 그래서 8의 배수로 맞춰 주면 가장 최적의 성능이 나온다고 함.
    • VGG같이 사이즈가 3x3이라 애매할 경우는 패딩을 넣어서 돌림(8배수로 바꿔 넣으면 성능이 좋게 나오는 것을 확인 가능)
    • 반정밀도를 사용하면 배치 사이즈를 두 배로 늘릴 수 있음.
    • 텐서코어를 잘 사용하고 있는지 확인할 수 있는 방법 :
    • Tensorcore를 이용해 BERT모델 돌려보기 :
    ▲ (좌 - BERT FP32) 맨 왼쪽 패널에서 GPU kernel에 로드된 API list를 확인 가능, 빨간 글자 부분에서 실행 시간도 확인 가능.
    (우 -B ERT FP16) 맨 왼쪽 패널에서 Tensor cores API가 커널에 로드된 것을 확인 가능하며 실행 시간이 2.1배 빨라짐을 확인 가능.
  • Additional Resources

    ▲ 다양한 모델들에 AMP를 적용한 예제 코드들을 제공.
    ▲ TF, Pytorch, MXNet에서 Tensorcore 활성화하기
    ▲ GTC Session recordings 2019에 디버깅하는 부분까지 포함해 알려준다고 함.
  • 세션 요약

Leave a comment