22.04.11 tensorRT에 쓰이는 개념들 - 빨간글씨 꼭 읽어보기

2022. 4. 12. 13:27인턴/Quantization

tensorRT란 딥러닝 모델을 최적화하여 NVIDIA GPU 상에서 추론속도를 수배~수십배 향상시켜주는 모델 최적화 엔진.

(보통 conda, pyenv 등과 같은 가상환경에서는 사용하지 않고 Docker나 쌩 로컬환경에 설치하게 된다.)

tensorRT는 Optimizer와 Runtim Engine으로 구성되어 있다. Optimizer란 NIVIDIA GPU 연산에 적합한 최적화 기법으로 딥러닝 모델을 최적화해주는 알고리즘? 기법? 이라고 생각하면 된다. Runtime Engine이란 다양한 GPU에서 모델 연산을 수행하는 것이다. 대부분의 딥러닝 프레임워크에서 학습된 모델을 지원하게 된다.

 

tensorRT의 장점

- C++과 python을 API 레벨에서 지원하므로 CUDA를 잘 모르는 딥러닝개발자들도 쉽게 사용할 수 있게끔 되어있다.

- latency 및 throuput을 쉽게 향상시킨다. 왜냐하면 GPU가 지원하는 활용가능한 최적의 연산 지원을 자동으로 사용할 수 있게끔 Runtime Binary를 빌드해주기 때문이다.

- 다양한 layer 및 연산에 대해 customization할 수 있는 방법론을 제공한다. 여기서 다양한이라는 것은 잘 알려진 conv layer, ReLU가 아니더라도 여러 타 layer들까지 포함하는 것이다.

 

딥러닝 가속화 기법 4가지

- Quantization 및 Precision Calibration

- Graph Optimization

- Kernel Auto tuning

- Dynamic Tensor Memory 및 Multi-Stream execution

 

https://opac.tistory.com/6

 

TensorRT란?

안녕하세요! 오늘은 NVIDIA의 TensorRT에 대해 알아보려고 합니다. TensorRT란, NVIDIA사에서 개발한 딥러닝 연산 최적화 엔진입니다. 기존 딥러닝 프레임워크(PyTorch, TensorFlow, Caffe 등)가 네트워크를 구성

opac.tistory.com

tensorRT 참고 블로그

https://eehoeskrap.tistory.com/414

 

[TensorRT] NVIDIA TensorRT 개념, 설치방법, 사용하기

1. TensorRT 란? 2. TensorRT 설치하기 3. 여러 프레임워크에서 TensorRT 사용하기 1. TensorRT 란? TensorRT는 학습된 딥러닝 모델을 최적화하여 NVIDIA GPU 상에서의 추론 속도를 수배 ~ 수십배 까지 향상시켜..

eehoeskrap.tistory.com

tensorRT를 공부하며 헷갈렸던 개념들에 대해 공부하는 포스팅을 작성하도록 하겠다.

 

어쩌구의 Runtime 

- 어쩌구를 사용하기 위한 모든 내용을 담고 있는 컨테이너

https://serzhul.io/JavaScript/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84%EA%B3%BC-%EB%9F%B0%ED%83%80%EC%9E%84/

 

자바스크립트 엔진과 런타임

자바스크립트 엔진이란 무엇인가? 자바스크립트 코드를 실행하는 프로그램을 의미한다. Ex) : 구글 크롬 혹은 Node.JS…

serzhul.io

Framework

- 응용프로그램을 개발하기 위한 여러 라이브러리, 모델 등을 효율적으로 사용할 수 있도록 하나로 묶어 놓은 일종의 패키지. 딥러닝 프레임워크는 이렇게 이미 검증된 수많은 라이브러리와 사전 학습까지 완료된 딥러닝 알고리즘을 제공해주어 개발자가 빠르게 사용할 수 있도록 해주는 것이다. 따라서 개발자는 중복 기능을 구현할 필요가 없고 핵심 알고리즘 개발에만 집중할 수 있다.

Engine

- TensorRT란, NVIDIA사에서 개발한 딥러닝 연산 최적화 엔진입니다. 기존 딥러닝 프레임워크(PyTorch, TensorFlow, Caffe 등)가 네트워크를 구성하고 이를 모델로 만들었다면, TensorRT는 이러한 모델을 자체적인 여러가지 최적화 과정을 거쳐 NVIDIA의 GPU, DLA등에 효율적으로 싣는 역할을 합니다. 또한 최적화 과정을 거쳐 만들어낸 '엔진'을 binary 형태로 저장(blob의 형태로 저장합니다)하고 사용할때 마다 '엔진'을 deserialize하여 사용합니다.

API

- API는 식당의 점원과 같은 역할을 한다. API는 손님(프로그램)이 주문할 수 있게 메뉴(명령 목록)를 정리하고, 주문(명령)을 받으면 요리사(응용프로그램)와 상호작용하여 요청된 메뉴(명령에 대한 값)를 전달한다.

 

CUDA

- Computed Unified Device Architecture의 줄임말로 그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다

많은 양의 연산을 동시에 처리하기 위해 개발되었다. ( 기존의 컴퓨터 연산은 CPU를 사용하고, RAM에 의존하여 연산을 진행하였다. C를 이용한 연산은 대부분 Single-Core(human brain)을 이용하고, Multi Processing, Multi Threading 등을 이용해 CPU가 보유한 코어 갯수만큼의 Multi Core를 이용하여 연산을 할 수 있다. 일반적으로 딥러닝에서 사용하는 특히 pytorch나 tensorflow에서, data loader부분에서 core 갯수를 주고 데이터를 loading하는 부분이 여기에 속함.

이에 반해 GPU는 Core 갯수가 많다. CPU는 8~16개인데 GPU는 몇천개 이상이다. (전교 10등 vs 전교 100등 애들 100명) 즉 이를 이용한 Many-Core dependent 연산을 진행하고, Video RAM에 있는 데이터를 연산한다.

실제로 사용할 때 재귀연산 (recursive, 자기 자신을 재 참조하는 연산) 을 사용하는 함수는 '직렬' 연산을 해야한다.

하지만 그 경우가 아니라면 병렬 연산을 해주는 것이 훨씬 효과적이다. )

 

- CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다.

- CUDA 플랫폼은 컴퓨터 커널의 실행을 위해 GPU의 가상 명령 집합과 병렬 연산 요소들을 직접 접근할 수 있는 소프트웨어 계층이다

 

최신 드라이버는 모두 필요한 쿠다 콤포넌트를 담고 있다. 쿠다는 모든 엔비디아 GPU (G8X 시리즈 이후)를 지원하며 이 대상에는 지포스, 쿼드로, 테슬라 제품군이 포함된다. 엔비디아는 지포스 8 시리즈를 위해 개발된 프로그램들이 수정 없이 모든 미래의 엔비디아 비디오 카드에서 실행될 것이라고 선언하였다.

 

- CUDA를 통해 개발자들은 쿠다 GPU 안 병렬 계산 요소 고유의 명령어 집합과 메모리에 접근할 수 있다. CUDA를 사용하여 최신 엔비디아 GPU를 효과적으로 개방적으로 사용할 수 있다. 그러나 CPU와는 달리 GPU는 병렬 다수 코어 구조를 가지고 있고, 각 코어는 수천 스레드를 동시에 실행시킬 수 있다. 응용 프로그램이 수행하는 작업(계산)이 이러한 병렬처리연산에 적합할 경우, GPU를 이용함으로써 커다란 성능 향상을 기대할 수 있다.

 

- CUDA의 이점

쿠다가 그래픽 API를 사용하는 전통적인 범용 GPU에 비해 가지는 몇가지 장점은 다음과 같다.

  • 흩뿌린 읽기 - 코드가 메모리의 임의 위치에서 데이터를 읽을 수 있다.
  • 공유 메모리 - 쿠다는 고속 공유 메모리 지역 (16 또는 48KB 크기) 을 드러내어 스레드 간에 나눌 수 있게 해 준다. 이는 사용자 관리 캐시로 사용될 수 있는데, 텍스처 룩업을 이용하는 경우 보다 더 빠른 대역폭이 가능해진다.
  • 디바이스 상의 읽기, 쓰기가 호스트보다 더 빠르다.
  • 정수와 비트 단위 연산을 충분히 지원한다. 정수 텍스처 룩업이 포함된다.

https://ko.wikipedia.org/wiki/CUDA

 

CUDA - 위키백과, 우리 모두의 백과사전

CUDA 처리 흐름의 예 1. 메인 메모리를 GPU 메모리로 복사 2. CPU가 GPU에 프로세스를 지시함 3. GPU가 각 코어에 병렬 수행 4. GPU 메모리로부터의 결과물을 메인 메모리에 복사 CUDA("Compute Unified Device Arch

ko.wikipedia.org

https://hiuaa.tistory.com/5

 

CUDA (쿠다) 란, 왜 사용하는 것인가.

CUDA (Computed Unified Device Architecture) 는 NVIDIA 사에서 개발한 GPU (Graphic Processing Unit)개발 툴이다. (설치방법 링크) CUDA C 라는 언어를 사용하고 C++/C 등에 넣어 사용할 수 있다. (이 블로그에..

hiuaa.tistory.com

 

Runtime Binary

-

Latency

- 지연시간, 하나의 작업을 처리하는 데 걸리는 시간

Throuput

- 처리량, 초당 처리하는 작업의 개수

 

PLUSTER - NVIDIA에서 딥러닝 성능을 측정할 때 보는 7가지

  • 프로그래머빌리티(Programmability)
  • 지연도(Latency)
  • 정확도(Accuracy)
  • 모델의 크기(Size of Model)
  • 처리능력(Throughput)
  • 에너지 효율(Energy Efficiency)
  • 학습 속도(Rate of Learning)

PLUSTER_논문.pdf
0.37MB

Network Compression

- 별도 포스팅에서 다루기

정말 잘 소개된 글

https://blog.est.ai/2020/03/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EC%95%95%EC%B6%95-%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC-bert-%EC%95%95%EC%B6%95/

 

딥러닝 모델 압축 방법론과 BERT 압축

딥러닝(Deep Learning)은 뛰어난 성능과 높은 모델의 확장성(Scalability)으로 인해 많은 주목을 받았고, 요즘 산업계에서도 활발하게 적용되고 있습니다. 하지만 모델의 높은 확장성은 또 다른 문제를

blog.est.ai

딥러닝 모델은 그 크기가 클 수록 성능이 향상되는 경향을 보이고 있어왔다. 컴퓨터비전 모델의 경우는 거대한 이미지 데이터셋을 이용해 미리 학습시키고, 이를 특정 응용 분야에 맞춰 새로 학습(미세조정 또는 전이학습)하는 방식으로 거대한 모델을 감당했다. 그러나 자연어처리분야의 경우는 순차데이터를 다루는 RNN을 사용하는데, 데이터가 길 수록 Gradient Vanishing 문제1 & 다음 입력 데이터 처리를 위해 이전 데이터가 필요하기 때문에 병렬화가 어렵다는 문제2가 발생한다. 따라서 RNN 모델이 가진 한계로 인해 자연어처리에서는 컴퓨터비전만큼 모델을 거대화하기 어렵다. 

 

컴퓨터비전에서는 ImageNet에서 분류학습을 한 모델이 다른 분야에서도 필요한 특징을 잘 추출한 반면, 자연어 처리는 ImageNet만큼 거대한 데이터셋과 다른 분야에서 특징을 잘 뽑아내기 위한 사전학습방법이 잘 알려져 있지 않아, 이미 학습된 모델이 다른 분야에 활용되기 어려웠다ㅏ. 자연어 처리 분야에서 사전 학습은 거대한 말뭉치(Corpus)에서 단어 임베딩을 학습하여 재사용하는 정도에 그쳤다.

그러나 2018년에 BERT(Bidirectional Encoder Representations from Transformers)가 발표되며 자연어 처리분야에서도 이처럼 거대한 모델이 속속 등장하기 시작하였다. BERT는 Transformer 기반의 모델로, ㅏ연어처리에서도 컴퓨터비전과 마찬가지로 거대한 모델의 사전학습-재학습이 가능해졌고, 성능도 다양한 문제에서 좋았다.

 

그래서 BERT는 현재 NLP 연구의 주류가 되었으며, 현재 NLP 연구는 거대한 모델을 만들고, 많은 데이터를 이용해 모델을 사전학습한 후 응용분야에 맞춰 재학습하는 접근 방식을 취하고 있다. 

 

아무튼 이렇게 딥러닝 모델이 점점 커지는 추세에 따라, 4가지 문제점이 발생함.

1. Memory Limitation : BERT의 파생 모델들의 사이즈가 점점 커지면서 하나의 GPU에서 큰 모델을 학습하는 것이 점점 어려워지고 있다. 또한 자연어 처리 분야에서 큰 배치사이즈가 학습에 효과적이라는 의견이 나오면서, 사전학습에 사용되는 배치크기가 점점 커지는 추세를 보이고 있고, 배치사이즈의 증가는 메모리에 큰 부담이 되고 있다.

 

2. Training/Inference Speed : 학습에 필요한 Gradient 는 모델의 크기에 비례하기 때문에 분산 학습을 통해 학습속도를 올리더라도, 모델이 커짐에 따라 학습에 보다 많은 시간이 소요된다. 학습은 1번만 진행하므로 시간이 오래걸려도 괜찮을 수 있지만, 추론시간또한 늘어나므로 문제이다.

 

3. Worse Performance : 위같은 문제점을 해결하기 위해 분산학습을 진행한다. 데이터 병렬화 , 모델 병렬화와 같은 방식으로 여러 개의 GPU를 사용한 학습으로 문제를 해결하려 했으나, 분산 학습으로 모델을 학습시켜도 여전히 문제는 남는다. 같은 데이터에서 단순히 모델만을 키운다고 성능이 계속 증가하지는 않기 때문이다. 

지나치게 큰 모델은 과적합 하기 쉽고,11

이를 막기 위해선 더 많은 데이터를 사용하거나 정규화를 도입하여 해결해야 한다.12,13

 

4. 실질적으로 GPU를 많이 쓰기 어려울 수 있다. : 분산 학습을 한다고 하더라도 모델이 커짐에 따라 많은 GPU를 준비해야 하는 것은 비용적으로 작은회사/연구실/대학원 등 부담이 될 수 있다. 또한 모바일,자동차 같은 환경에서는 휴대성,전력소모로 인해 GPU 사용에 제한을 받는다. 이런 실용적인 문제가 있음.

-> 그래서? Model Compression이 나온 것이다.

 

Model Compression의 6가지 접근 방법 (by Gordan)

1. Pruning 가지치기 : 학습 후 불필요한 부분을 제거하는 방식으로, 가중치의 크기에 기반한 제거, 어텐션 헤드 제거, 레이어 제거 등 여러 방법 사용. (layer dropout)

 

2. Weight Factorization 가중치 분해 : 가중치 행렬을 분해하여 두 개의 작은 행렬곱으로 근사하는 방법. 이 방법은 행렬이 낮은 랭크(RANK)를 가지도록 하는 제약조건이 도입됐다. 가중치 분해는 토큰 임베딩 / feed-forward / self-attention layer의 파라미터에 적용할 수 있다.

 

3. Weight Sharing 가중치 공유 : 모델의 일부 가중치들을 다른 파라미터와 공유하는 방식. 예를 들어 ALBERT는 BERT의 self-attention layer와 같은 가중치 행렬들을 사용하고 있다. (BERT보다 가볍고 처리속도가 높아짐)

4. Knowledge Distillation 지식 증류 : 미리 잘 학습된 큰 네트워크(Teacher Network)로부터 실제로 사용하고자 하는 작은 네트워크(Student Network)를 학습시키는 방법이다. 훨씬 작은 Transformer 모델을 pre-training / downstream-data에 대해 기본부터 학습시킨다. 원래대로라면 학습이 잘 안 되나, fully sized model의 값을 soft label로 사용하면 최적화가 더 잘 이루어진다. 몇몇 방법들은 추론 시간을 더 빠르게 하기 위해 BERT를 다른 형태의 모델(ex LSTM) 으로 증류하기도 한다. 

 

5. Quantization 양자화 : 부동 소수점 값을 잘라내서 더 적은 비트만을 사용하는 방식. 양자화된 값은 학습 과정 중에 배울 수도 있고, 학습 후에 양자화될 수도 있다.

 

6. Pretrain vs Downstrame : 일부 방법은 BERT를 특정 downstream task에만 맞게 압축하지만, BERT를 task와 무관하게 압축하는 방법들도 있다.

 

진짜 좋은 블로그 AI PlUS

https://89douner.tistory.com/245

 

3. Network Compression 기술

Q1. 딥러닝 관점에서 왜 Network Compression 기술들이 필요한지? Memory Limitation 가끔씩 성능을 높이기 위해 굉장히 큰 딥러닝 모델을 사용하는 경우가 있습니다. 이런 경우 멀티GPU 또는 분산시스템 기

89douner.tistory.com

Network Optimization

- 네트워크 최적화란 네트워크 성능을 모니터링하고 향상시키는 데 사용되는 도구, 기술 및 모범 사례를 말한다.

최적화 프로세스는 먼저 네트워크 성능 메트릭을 측정하고 문제를 식별하면서 시작된다. (네트워크 성능 모니터링에는 트래픽, 대역폭, 지터 및 대기시간 측정 = traffic, bandwidth, jitter, and latency 이 포함됨) -> 이건 딥러닝으로서의 네트워크 최적화가 아니라 통신이나 웹에서의 네트워크 최적화인 것 같음.

-> 딥러닝에서의 네트워크 최적화란 그저 딥러닝 모델을 최적화 하는 여러 기법 / 또는 Optimizer들을 말하는 것 같음.

https://magazine.hankyung.com/business/article/202101061704b

 

AI 사이언티스트의 숙명 ‘튜닝’… 학습 모델 최적화에 수작업 필수

AI 사이언티스트의 숙명 ‘튜닝’… 학습 모델 최적화에 수작업 필수, 김민주 기자, AI테크

magazine.hankyung.com

인공지능(AI) 사이언티스트의 길을 걷다 보면 누구나 튜닝(tuning)의 장벽과 마주하게 된다. 튜닝은 현재 실험의 결과 양상을 보고 문제점을 진단하고 AI 모델을 조금 더 나은 방향으로 만들기 위해 실험을 개선하는 것을 말한다. 여기에는 아키텍처를 변경하거나 하이퍼파라미터를 조절하거나 하는 등의 역할이 포함된다. 하지만 어떤 현상이 나타났을 때 어떤 조치를 취해야 효과적인지에 대한 매뉴얼이 딱 정해져 있는 것은 아니고 있다고 하더라도 현장의 다양한 태스크에 꼭 들어맞지는 않는다. 왜 이런 결과가 나왔는지 해석하는 것도 사람의 몫이기 때문에 우리는 문제의 원인을 유추하고 이에 기대 현상을 개선하기 위한 방법을 찾아야 한다. 따라서 실험을 진행하는 사람의 탄탄한 이론 배경과 함께 경험과 노하우까지 풍부해야만 불필요한 실험의 반복 횟수를 줄일 수 있다.

 

튜닝해야 할 대상은 너무나 다양하다. 딥 러닝 모델로 한정짓는다고 하더라도 FNN·CNN·RNN·트랜스포머 등등 어떤 계열의 모델 구조를 이용하는 게 좋을까. 인공 신경망의 층수는? 한 층에 들어갈 인공 뉴런의 수, convolution 필터 사이즈와 필터 수는? 얼마나 성큼성큼 학습시키는 것이 좋을까(learning rate)? 한 번에 학습할 데이터의 수는 어느 정도가 적당할까(mini-batch size)? 몇 번이나 반복해서 보여줘야 적당할까(epoch)? 어떤 최적화 기법을 쓰고(optimizer), 손실 함수는 어떤 것을 쓰는 게 효과적이며(cost function) 활성화 함수는 무엇이 좋을까?

-> 모델 학습을 위해 사람들이 결정해줘야 하는 것이 한 두가지가 아님. 그래서 요새는 Auto ML이라는 기계가 스스로 진화한다는 모델도 나오고 있다고 한다.

 

Quantization

- 모바일이나 임베디드 환경에서는 딥러닝 모델을 사용한 추론이 어려움. (일반 PC와 달리 메모리,성능,저장공간에 제한이 있기 때문. Jetson Nano에서 했던 거 생각하기..) -> 모델을 가볍게 만드는 경량화 연구가 진행되고 있다.

경량화 연구

1. 모델을 구성하는 알고리즘 자체를 효율적인 구조로 설계 - 모델 구조 변경, 효율적인 합성곱 필터 기술, 경량 모델 자동 탐색 기술

2. 기존 모델의 파라미터들을 줄이거나 압축하는 연구 - 가중치 가지치기, 양자화, 이진화

 

양자화

- NN 모델 내부는 대부분 weight와 activation output으로 구성되어 있다. 또한 weight와 activation output은 모델의 정확도를 높이기 위해 FP32로 표현되고 있다.

32 bit floating point는 이렇게 생겼다.

하지만 리소스가 제한된 환경에서 모든 weight와 activation output을 32 bit floating point로 표현한 모델은 추론에 사용하기 어렵다. 따라서 양자화를 진행함. -> 별도 포스팅에서 다루기

 

https://wooono.tistory.com/405

 

[DL] 양자화(Quantization)란?

들어가기 앞서, 모바일이나 임베디드 환경에서, 딥러닝 모델을 사용한 추론은 어렵습니다. 일반 PC 와 달리, 메모리, 성능, 저장공간 등의 제한이 있기 때문입니다. 따라서, 딥러닝에서는 모델 경

wooono.tistory.com

 

Calibration

-  weight와 intermediate tensor들의 정보 손실의 최소화 하기 위해 Quantization에 추가로 적용(INT 8 처럼 모델의 정확도에 영향을 줄 수 있을정도로 정밀도를 낮추는 경우). 미세 조정 같은 느낌.

https://velog.io/@jooh95/%EB%94%A5%EB%9F%AC%EB%8B%9D-Quantization%EC%96%91%EC%9E%90%ED%99%94-%EC%A0%95%EB%A6%AC

 

딥러닝 Quantization(양자화) 정리

모델의 파라미터를 lower bit로 표현함으로서 계산과 메모리 access 속도를 높이는 경량화 기법보통 32비트 부동소수점 연산을 8비트 정수로 변환하는 방식 사용 \- pytorch, tensorflow의 default data type = fp

velog.io

Primitive 연산 형태 그래프 노드 / Compound 연산 형태 그래프 노드

-

그래프란? 노드,엣지,아크 로 이루어진 자료구조

https://codedragon.tistory.com/9306

 

그래프 이론 - 노드(node), 에지(edge), 아크(arc)

그래프 이론 ·        노드(node) ·        에지(edge) ·        아크(arc) 노드(node) 수학자들은 정점(vertex)이라고 부릅니다. 노드는 무엇이든 표시할 수 있습니다. 그래서 노드는 날..

codedragon.tistory.com

root node, leaf node, size, depth, height, degree 에 대한 블로그

https://heytech.tistory.com/66

Primitive Graph(원시그래프) - 연결된 그래프 G는 각 꼭짓점 쌍 u와 v G에 대해 u와 v를 연결하는 길이 k의 워크가 있는 양의 정수 k가 존재하는 그래프를 primitive하다고 한다.

모든 (유한) 그래프는 어떤 원시 그래프에서 유도된 하위 그래프이다.

https://cameroncounts.wordpress.com/2013/01/11/primitive-graphs/

 

Primitive graphs

A primitive graph is one whose automorphism group acts primitively on the vertices: that is, the group is transitive on the vertices, and there is no non-trivial equivalence relation which it prese…

cameroncounts.wordpress.com

Compound Graph(복합그래프?) - 노드 간의 인접 관계와 포함 관계를 모두 가진 그래프.

 

Layer fusion / Tensor fusion

- fusion = 각각의 기능을 수행하는 layer를 하나로 합침. 

Layer fusion : a model compression technique that discovers which weights to combine and then fuses weights of similar fully-connected, convolutional and attention layers. Layer fusion can significantly
reduce the number of layers of the original network with little additional computation overhead, while maintaining competitive performance.

레이어 퓨전 : 어떤 가중치를 합칠지 발견한 다음 비슷한 FC, Conv, Attention layer의 가중치를 융합하는 모델 압축 기술이다.

Tensor Fusion works by attempting to combine all the tensors that are ready to be reduced at given moment of time into one reduction operation. The algorithm of Tensor Fusion is as follows:

  1. Determine which tensors are ready to be reduced. Select first few tensors that fit in HOROVOD_FUSION_THRESHOLD bytes and have the same data type.
  2. Allocate fusion buffer of size HOROVOD_FUSION_THRESHOLD if it was not allocated before. Default fusion buffer size is 128 MB.
  3. Copy data of selected tensors into the fusion buffer.
  4. Execute the allreduce operation on the fusion buffer.
  5. Copy data from the fusion buffer into the output tensors.
  6. Repeat until there are no more tensors to reduce in this cycle.

텐서 퓨전 : 감소될 준비가 된 모든 텐서를 하나의 감소 연산으로 결합하려고 시도함으로써 작동한다.

텐서 퓨전 과정(horovod 프레임워크 설명)

1. 줄일 준비가 된 텐서를 결정합니다. HOROVOD_FUSION_THRESHOLD 바이트에 적합하고 데이터 유형이 동일한 처음 몇 개의 텐서를 선택합니다.

2. 이전에 할당되지 않은 경우 HOROVOD_FUSION_THRESHOLD 크기의 퓨전 버퍼를 할당합니다. 기본 퓨전 버퍼 크기는 128MB입니다.

3. 선택한 텐서의 데이터를 퓨전 버퍼에 복사합니다.

4. 퓨전 버퍼에서 allreduce 작업을 실행합니다.

5. 퓨전 버퍼의 데이터를 출력 텐서로 복사합니다.

6. 이 사이클에서 더 이상 줄일 텐서가 없을 때까지 반복합니다.

https://horovod.readthedocs.io/en/stable/tensor-fusion_include.html

 

Tensor Fusion — Horovod documentation

Tensor Fusion One of the unique things about Horovod is its ability to interleave communication and computation coupled with the ability to batch small allreduce operations, which results in improved performance. We call this batching feature Tensor Fusion

horovod.readthedocs.io

 

Cuda (Engine)

-  parallel computing platform and programming model that enables dramatic increases in computing performance by harnessing the power of the graphics processing unit (GPU). 

= GPU(그래픽 처리 장치)의 성능을 활용하여 컴퓨팅 성능을 극적으로 향상시킬 수 있는 병렬 컴퓨팅 플랫폼 및 프로그래밍 모델 -> cuda에 대한 설명인듯.

https://developer.nvidia.com/cuda-faq

 

CUDA FAQ

Sections General Questions Hardware and Architecture Programming Questions General Questions Q: What is CUDA? CUDA® is a parallel computing platform and programming model that enables dramatic increases in computing performance by harnessing the power of

developer.nvidia.com

Serialized tensorRT Engine

- Serialize : 나중에 재사용을 위해 저장하기 위한 포맷으로 바꾸는 것.

- Deserialize : Inference 할 때 Serialize 했던 것을 다시 해제하는 것.

https://seobway.tistory.com/entry/TensorRT-2-Serializing-Deserializing-tensorrt-engine-tensorRT-723

 

[TensorRT] 2. Serializing & Deserializing tensorrt engine (tensorRT 7.2.3)

개인적으로 읽고 쓰는 공부용 리뷰입니다. 틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다. [TensorRT] 1. Build tensorrt engine (tensorRT 7.2.3) Serializie는 나중에 재사용.

seobway.tistory.com

Dynamic Tensor Memory

- Minimizes memory footprint and re-uses memory for tensors efficiently

메모리 설치 공간을 최소화하고 텐서의 메모리를 효율적으로 재사용

Multi Stream Execution

- Scalable design to process multiple input streams in parallel

여러 입력 스트림을 병렬로 처리할 수 있는 확장 가능한 설계

TensorRT_사용법.pdf
3.70MB

 

참고 <Dynamic Tensor Rematerialization>

체크포인팅은 메모리로부터 중간 활성화를 자유롭게 하고 필요에 따라 재계산함으로써 제한된 메모리 예산 하에서 딥 러닝 모델을 훈련할 수 있게 한다. 현재의 체크포인트 기술은 이러한 재계산을 오프라인으로 정적 계산 그래프를 가정한다. 우리는 간단한 온라인 알고리듬이 다음을 체크포인트하기 위한 욕심 많은 온라인 알고리듬인 동적 텐서 재물질화(DTR)를 도입하여 비교 가능한 성능을 달성할 수 있음을 보여준다.

 

Checkpointing is one technique that enables training with
models and batches that exceed on device memory without modifying the model’s design. It is achieved by freeing some activations from memory and recomputing them on demand. Adapted from techniques in automatic differentiation (Baydin et al., 2015; Griewank & Walther, 2000; Siskind &
Pearlmutter, 2018), checkpointing in the DL context exploits the fact that intermediate activations for backpropagation dominate memory usage during training(Sohoni et al., 2019) but can be easily recomputed by replaying parts of the forward pass.

 

최첨단 딥 러닝(DL) 모델이 계속 성장함에 따라 장치 내 메모리의 제약 내에서 이를 훈련하는 것이 점점 더 어려워진다. 새로운 모델의 메모리 요구는 메모리 제한 장치(예: 특수 가속기, 저전력)에 대한 훈련을 방해한다.
임베디드 기기 또는 구형 GPU)를 사용하고 메모리 집약적인 아키텍처와 훈련 기술을 탐색하는 연구자의 능력을 제한한다. 체크포인팅은 다음과 같은 방식으로 교육을 가능하게 하는 기술 중 하나입니다.
모델 설계를 수정하지 않고 장치 내 메모리를 초과하는 모델 및 배치. 메모리로부터 일부 활성화를 해제하고 필요에 따라 다시 계산함으로써 달성된다. 자동 미분화 기술에서 채택(Baydin et al., 2015; Greywank & Walther, 2000; Siskind &)
Pearlmutter, 2018), DL 컨텍스트에서의 체크 포인팅은 후방 전파를 위한 중간 활성화가 훈련 중 메모리 사용을 지배하지만(Sohoni 등, 2019) 전진 패스의 일부를 재생하여 쉽게 재계산할 수 있다는 사실을 이용한다. 현재 DL 체크포인트 기술(Chen 등, 2016, Jain 등, 2020, Kumar 등, 2019, Gruslyset 등, 2016)은 오프라인에서 재계산할 활성화를 정적으로 계획하여 모델 분석의 초기 단계가 필요하다. 본 논문에서는 DL 체크포인팅에 정적 계획이 불필요함을 보여준다. 임의의 DL 모델을 휴리스틱하게 체크포인트하기 위한 탐욕스러운 온라인 알고리듬인 동적 텐서 재물질화(DTR)를 제시한다.