>  기사  >  기술 주변기기  >  훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2023-05-07 21:16:061483검색

안녕하세요 여러분, 저는 NVIDIA GPU 컴퓨팅 전문가 팀의 Tao Li입니다. 오늘 저와 제가 개발한 대형 시각적 모델인 Swin Transformer의 모델 훈련 및 추론 최적화에 대해 공유할 기회를 갖게 되어 매우 기쁩니다. 동료 Chen Yu가 몇 가지 작업을 수행했습니다. 이러한 방법과 전략 중 일부는 다른 모델 훈련 및 추론 최적화에 사용되어 모델 처리량을 개선하고 GPU 사용 효율성을 향상하며 모델 반복 속도를 높일 수 있습니다.

Swin Transformer 모델의 학습 부분 최적화에 대해 소개하겠습니다. 추론 최적화 부분에 대한 작업은 동료들에게 자세히 소개될 예정입니다

여기 카탈로그가 있습니다. 오늘 공유하는 은(는) 크게 4개의 부분으로 나누어져 있으며, 특정 모델에 최적화되어 있으므로 먼저 Swin Transformer 모델에 대해 간략하게 소개하겠습니다. 그런 다음 프로파일링 도구인 nsight 시스템을 결합하여 훈련 과정을 분석하고 최적화하겠습니다. 추론 부분에서는 동료들이 보다 상세한 CUDA 수준 최적화를 포함하여 추론 최적화를 위한 전략과 방법을 제공합니다. 마지막으로 오늘의 최적화 내용을 요약해 드립니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

첫 번째는 Swin Transformer를 소개하는 첫 번째 부분입니다.

1. 스윈 트랜스포머 소개

모델명을 보면 트랜스포머를 기반으로 한 모델임을 알 수 있습니다. 먼저 트랜스포머에 대해 간단히 살펴보겠습니다.

기사에서 Transformer 모델이 제안된 후 자연어 처리 분야의 많은 작업에서 빛을 발했습니다.

Transformer 모델의 핵심은 소위 Attention 메커니즘, 즉 Attention 메커니즘입니다. Attention 모듈의 경우 일반적인 입력은 쿼리, 키 및 값 텐서입니다. 쿼리 및 키 기능과 소프트맥스 계산을 통해 일반적으로 어텐션 맵이라고 불리는 어텐션 결과를 얻을 수 있습니다. 어텐션 맵의 값에 따라 모델은 값에서 더 주의를 기울여야 하는 영역을 학습할 수 있습니다. 혹은 가치 중 어떤 가치가 우리의 업무에 큰 도움이 되는지 모델이 학습할 수 있다고 합니다. 이것은 가장 기본적인 단일 헤드 Attention 모델입니다.

이러한 단일 헤드 주의 모듈 수를 늘리면 공통 다중 헤드 주의 모듈을 구성할 수 있습니다. 일반적인 인코더와 디코더는 이러한 다중 헤드 주의 모듈을 기반으로 구축됩니다.

많은 모델에는 일반적으로 self-attention과 cross-attention이라는 두 가지 주의 모듈 또는 하나 이상의 모듈 스택이 포함됩니다. 예를 들어, 유명한 BERT는 여러 인코더 모듈로 구성됩니다. 널리 사용되는 확산 모델에는 일반적으로 self-attention과 cross-attention이 모두 포함됩니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

Swin Transformer 이전에는 ViT(Vision Transformer)가 먼저 Transformer를 컴퓨터 비전 분야에 적용했습니다. ViT의 모델 구조는 아래 그림의 왼쪽에 표시됩니다. ViT는 이미지를 일련의 패치로 분할합니다. 각 패치는 자연어 처리의 토큰과 유사하며 이 일련의 패치를 Transformer를 통해 인코딩합니다. 기반의 인코더를 사용하여 최종적으로 분류 등의 작업에 사용할 수 있는 기능을 얻습니다.

Swin Transformer에 와서는 전체 이미지에 주의를 기울이는 ViT와 달리 Swin Transformer는 먼저 이미지를 여러 개의 창으로 나눈 다음 내부의 패치에만 주의를 기울입니다. 창을 열면 계산량이 줄어듭니다.

창으로 인해 발생하는 경계 문제를 보완하기 위해 Swin Transformer에서는 창 이동 작업을 추가로 도입합니다. 동시에 모델이 보다 풍부한 위치 정보를 갖도록 하기 위해 상대 위치 편향도 도입되었습니다. 사실 여기서의 윈도우 주목과 윈도우 시프트는 스윈 트랜스포머에서 스윈이라는 이름의 유래이다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

Swin Transformer의 네트워크 구조는 일반적인 네트워크 구조가 ResNet과 같은 전통적인 CNN과 매우 유사합니다.

전체 네트워크 구조가 여러 단계로 나누어져 있고 여러 단계 중간에 해당 다운샘플링 프로세스가 있는 것을 볼 수 있습니다. 각 단계의 해상도는 다르며 해상도 피라미드를 형성하며 각 단계의 계산 복잡성도 점차 감소합니다.

그런 다음 각 단계에는 여러 개의 변압기 블록이 있습니다. 각 변압기 블록에는 위에서 언급한 창문 주의 모듈이 사용됩니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음으로 특정 작업의 관점에서 Swin Transformer를 분해해 보겠습니다.

보시다시피 트랜스포머 블록은 세 부분으로 구성됩니다. 첫 번째 부분은 윈도우 관련 연산인 윈도우 이동/파티션/역방향이고, 두 번째 부분은 주의 계산, 세 번째 부분은 FFN입니다. 계산, Attention 및 FFN 부분은 여러 작업으로 더 세분화될 수 있으며, 마지막으로 전체 모델을 수십 개의 작업 조합으로 세분화할 수 있습니다.

이러한 운영자 부문은 성능 분석을 수행하고 성능 병목 현상을 찾아내고 가속 최적화를 수행하는 데 매우 중요합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

위는 첫 번째 부분에 대한 소개입니다. 다음으로 우리가 훈련에서 수행한 최적화 작업 중 일부를 소개하겠습니다. 특히 프로파일링 도구, 즉 nsight 시스템을 결합하여 전반적인 훈련 프로세스를 분석하고 최적화합니다.

2. Swin Transformer 교육 최적화

대형 모델 교육에는 일반적으로 멀티 카드 및 멀티 노드 컴퓨팅 리소스가 사용됩니다. Swin Transformer의 경우 카드 간 통신의 오버헤드가 상대적으로 적을 것이라는 점을 발견했으며, 전체 속도는 거의 선형적으로 증가하므로 여기서는 단일 GPU에서의 컴퓨팅 병목 현상을 우선적으로 분석합니다. 최적화.

nsight 시스템은 시스템 수준의 성능 분석 도구입니다. 이 도구를 통해 모델의 각 모듈에 대한 GPU 사용량, 성능 병목 현상 발생 여부, 데이터 대기 등의 최적화 여부를 쉽게 확인할 수 있습니다. 공간은 CPU와 GPU 간의 로드를 합리적으로 계획하는 데 도움이 됩니다.

nsight 시스템은 CUDA 및 cublas, cudnn, tensorRT 등과 같은 일부 GPU 컴퓨팅 라이브러리에서 호출되는 커널 기능의 호출 및 실행 상태를 캡처할 수 있으며 사용자가 일부 마커를 추가하여 범위를 계산할 수 있습니다. 마커의 작동에 해당합니다.

아래 그림은 표준 모델 최적화 프로세스를 보여줍니다. 모델을 프로파일링하고 성능 분석 보고서를 받아 성능 최적화 지점을 찾은 다음 목표 성능 튜닝을 수행합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음은 nsight 시스템의 인터페이스입니다. 여기서는 커널 실행인 커널 함수의 실행을 명확하게 볼 수 있습니다. 특정 커널 기능의 경우 전체 프로세스의 시간 비율과 GPU 유휴 여부 및 기타 정보를 확인할 수 있습니다. nvtx 태그를 추가한 후 모델이 전진 및 후진하는 데 걸리는 시간을 확인할 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

앞부분에서 확대하면 각 SwinTransformer 블록의 계산에 필요한 특정 시간도 명확하게 볼 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

먼저 nsight 시스템 성능 분석 도구를 통해 전체 기준의 성능을 살펴보겠습니다. 아래 그림은 FP32 기준의 GPU 활용도가 매우 높고, 가장 높은 비율을 보여줍니다. 그 중 행렬 곱셈 커널이 있습니다.

행렬 곱셈의 최적화 방법 중 하나는 가속을 위해 텐서 코어를 최대한 활용하는 것입니다.

NVIDIA의 GPU에는 쿠다 코어, 텐서 코어와 같은 하드웨어 리소스가 있다는 것을 알고 있습니다. 텐서 코어는 행렬 곱셈을 가속화하기 위해 특별히 설계된 모듈입니다. tf32 텐서 코어를 직접 사용하거나 fp16 텐서 코어를 혼합 정밀도로 사용하는 것을 고려할 수 있습니다. fp16을 사용한 텐서 코어의 행렬 곱셈 처리량은 tf32의 처리량보다 높으며 순수 fp32의 행렬 곱셈도 높은 가속 효과를 갖는다는 것을 알아야 합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

여기에서는 혼합 정밀 솔루션을 채택합니다. torch.cuda.amp의 혼합 정밀도 모드를 사용하면 처리량을 1.63배 향상시킬 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

프로파일링 결과에서도 원래 가장 높은 비율을 차지했던 행렬 곱셈이 최적화되어 전체 타임라인에서 차지하는 비율이 11.9%로 낮아진 것을 확인할 수 있습니다. 지금까지 상대적으로 비율이 높은 커널은 요소별 커널입니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

요소별 커널의 경우 먼저 요소별 커널이 어디에 사용되는지 이해해야 합니다.

요소별 커널, 더 일반적인 언롤링된 요소별 커널 및 벡터화된 요소별 커널입니다. 그중 언롤링된 요소별 커널은 일부 편향된 컨볼루션 또는 선형 레이어뿐만 아니라 메모리의 데이터 연속성을 보장하는 일부 연산에서도 널리 발견됩니다.

벡터화된 요소별 커널은 ReLU와 같은 일부 활성화 함수 계산에 자주 나타납니다. 여기서 많은 수의 요소별 커널을 줄이려는 경우 일반적인 접근 방식은 연산자 융합을 수행하는 것입니다. 예를 들어 행렬 곱셈에서 요소별 연산을 행렬 곱셈의 연산자와 융합하여 시간 오버헤드의 이 부분을 줄일 수 있습니다. ㅋㅋㅋ 이는 커널 사이에 간격을 발생시키고 GPU를 유휴 상태로 만들 수 있습니다. 두 개의 cuda 커널을 하나의 cuda 커널로 병합하면 한편으로는 하나의 실행을 절약하는 동시에 간격 생성을 피할 수 있습니다.

또 다른 이점은 전역 메모리 액세스가 매우 오래 걸리고 두 개의 독립적인 cuda 커널 사이의 결과 전송에 전역 메모리가 필요하기 때문에 전역 메모리 액세스가 줄어든다는 것입니다. 결과를 레지스터나 공유 메모리로 전송할 수 있습니다. 따라서 하나의 전역 메모리 쓰기 및 읽기를 방지하고 성능을 향상시킵니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

연산자 융합의 첫 번째 단계는 기성 Apex 라이브러리를 사용하여 Layernorm과 Adam의 연산을 융합하는 것입니다. 간단한 명령어 교체를 통해 융합된 Layernorm을 활성화할 수 있음을 알 수 있습니다. 정점과 융합된 Adam을 사용하여 속도가 1.63x에서 2.11x로 증가했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

프로플링 로그에서도 연산자 융합 후 이 타임라인에서 요소별 커널의 비율이 크게 줄어들었고 행렬 곱셈이 다시 한번 시간의 가장 큰 비율을 차지하는 커널이 된 것을 볼 수 있습니다. .

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

기존 Apex 라이브러리를 활용하는 것 외에도 수동 융합 연산자도 개발했습니다.

타임라인을 관찰하고 모델을 이해함으로써 우리는 Swin Transformer에 창 분할/이동/병합 등과 같은 고유한 창 관련 작업이 있음을 발견했습니다. 여기서 창 이동을 위해서는 두 개의 커널을 호출해야 하며, 요소별 커널은 이동이 완료된 후 호출됩니다. 또한, 주의 모듈 이전에 이러한 작업을 수행해야 하는 경우 나중에 해당 반대 작업이 수행됩니다. 여기서 윈도우 시프트만으로 호출되는 Roll_cuda_kernel은 전체 타임라인의 4.6%를 차지합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

방금 언급한 작업은 실제로는 데이터를 분할하는 것입니다. 즉, 해당 데이터가 창으로 분할됩니다. 해당 원본 코드는 아래 그림과 같습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

이 작업 부분이 실제로는 인덱스 매핑일 뿐이라는 사실을 발견하여 이 부분에 대한 융합 연산자를 개발했습니다. 개발 과정에서 우리는 CUDA 프로그래밍에 대한 관련 지식을 습득하고 연산자의 순방향 계산 및 역방향 계산을 위한 관련 코드를 작성해야 합니다.

Pytorch에 사용자 정의 연산자를 도입하는 방법, 공식 튜토리얼이 제공됩니다. 튜토리얼을 따라 CUDA 코드를 작성할 수 있고, 컴파일 후 원본 모델을 모듈로 도입할 수 있습니다. 맞춤형 핵융합 연산자를 도입하면 속도를 2.19배까지 더 높일 수 있음을 알 수 있다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음으로 보여드릴 것은 MHA 부분의 퓨전 작업입니다.

Mha 부품은 변압기 모델의 대형 모듈이므로 최적화를 통해 더 큰 가속 효과를 얻을 수 있는 경우가 많습니다. 그림에서 알 수 있듯이 연산자 융합이 수행되기 전 mha 부분의 연산 비율은 37.69%로 많은 요소별 커널이 포함되어 있다. 관련 작업을 더 빠른 속도로 별도의 커널로 융합할 수 있다면 속도 향상은 더욱 향상될 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

Swin Transformer의 경우 쿼리 외에도 키와 값, 마스크와 바이어스가 모두 텐서 형식으로 전달되며 여러 원본 커널을 통합할 수 있는 fMHA와 같은 모듈을 개발했습니다. fMHA 모듈과 관련된 계산으로 판단하면 이 모듈은 Swin Transformer에서 발생하는 일부 모양을 크게 개선했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

모델에 fMHA 모듈을 사용한 후 가속 비율을 2.85배 더 높일 수 있습니다. 위는 단일 카드에서 달성한 훈련 가속 효과입니다. 단일 머신에서 8개의 카드를 사용한 훈련 상황을 살펴보겠습니다. 위의 최적화를 통해 훈련 처리량을 1612에서 3733으로 늘릴 수 있습니다. 2.32배의 가속도를 달성했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

훈련 최적화를 위해 가속 비율이 최대한 높기를 바랍니다. 이에 따라 가속 후 성능도 가속 전 성능과 일치할 수 있기를 바랍니다.

위의 여러 가속 솔루션을 중첩한 후 모델의 수렴이 원래 기준과 일치하는 것을 확인할 수 있습니다. 최적화 전후 모델의 수렴 및 정확도는 Swin-Tiny, Swin-에서 일치합니다. 기본 및 모두 Swin-Large에서 입증되었습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

훈련 부분과 관련하여 CUDA 그래프, 멀티 스트림 등을 포함한 일부 다른 가속 전략은 다른 측면에서 Swin Transformer의 성능을 더욱 향상시킬 수 있으며 현재 혼합 정밀도의 사용을 소개합니다. 솔루션은 순수한 fp16 솔루션(예: apex O2 모드)을 사용하여 Swin Transformer 공식 저장소에서 채택한 전략으로 더 빠른 가속을 달성할 수 있습니다.

Swin은 통신 요구 사항이 높지 않지만 다중 노드 대형 모델 교육의 경우 원래 분산 교육과 비교하여 통신 오버헤드를 숨기는 합리적인 전략을 사용하면 다중 카드 교육에서 더 나은 결과를 얻을 수 있습니다. 이득.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음으로 동료들에게 추론에 있어서 우리의 가속 솔루션과 효과를 소개해달라고 부탁하고 싶습니다.

3. Swin Transformer Inference Optimization

안녕하세요 여러분, 저는 NVIDIA GPU 컴퓨팅 전문가 팀의 Chen Yu입니다. 다음으로는, Tao Li입니다. 추론의 가속을 소개하겠습니다.

훈련과 마찬가지로 추론 가속화는 운영자 융합 솔루션과 떼려야 뗄 수 없습니다. 그러나 훈련에 비해 추론의 연산자 융합은 더 나은 유연성을 가지며 이는 주로 다음 두 가지 점에 반영됩니다.

  • 추론의 연산자 융합은 역방향을 고려할 필요가 없으므로 커널 개발 프로세스에 그라디언트를 계산하는 데 필요한 중간 결과를 저장하는 것을 고려해야 합니다.
  • 추론 프로세스를 통해 한 번의 계산만 필요하고 재사용할 수 있는 일부 작업을 계산하고, 미리 계산하고, 결과를 유지할 수 있습니다. 중복 계산을 피하기 위해 매번 직접 호출합니다.

추론 측면에서는 다양한 연산자 융합을 수행할 수 있습니다. 다음은 Transformer 모델에서 사용하는 몇 가지 일반적인 연산자 융합 패턴과 관련 패턴을 구현하는 데 필요한 도구입니다.

우선 행렬 곱셈과 컨볼루션을 중심으로 회전하는 연산자 융합이 많기 때문에 별도로 나열합니다. 행렬 곱셈과 관련된 융합의 경우 cublas, cutlass 및 cudnn의 세 가지 라이브러리를 사용하는 것을 고려할 수 있습니다. 컨볼루션에서는 cudnn 또는 cutlass를 사용할 수 있습니다. 따라서 행렬 곱셈의 연산자 융합을 위해 Transformer 모델에서는 이를 gemm + 바이어스, gemm + 바이어스 + 활성화 함수 등과 같은 gemm + 요소별 연산으로 요약합니다. 이러한 유형의 연산자 융합의 경우 직접 호출을 고려할 수 있습니다. 이를 달성하기 위해 큐블라 또는 커틀라스가 필요합니다.

게다가 gemm 이후의 op 연산이 layernorm, transpose 등과 같이 더 복잡하다면 gemm과 Bias를 분리한 다음 Bias를 다음 Op에 통합하여 cublas는 간단한 행렬 곱셈을 구현하는 데 사용됩니다. 물론, 이 바이어스를 다음 연산과 통합하는 패턴은 일반적으로 이를 구현하기 위해 cuda 커널을 직접 작성해야 합니다.

마지막으로, layernorm + Shift + Window Partition과 같이 Cuda 커널을 직접 작성하여 융합해야 하는 특정 작업도 있습니다.

운영자 융합을 위해서는 cuda 커널을 보다 능숙하게 설계해야 하기 때문에 일반적으로 nsight 시스템 성능 분석 도구를 통해 전체 파이프라인을 분석하고 성능과 작업 부하 균형을 달성하기 위해 핫스팟 모듈에 대한 운영자 융합 최적화에 우선순위를 두는 것이 좋습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

그래서 많은 연산자 융합 최적화 중에서 우리는 소개할 가속 효과가 분명한 두 연산자를 선택했습니다.

첫 번째는 mha 부분의 연산자 융합입니다. 추론할 때마다 조회를 수행하지 않도록 위치 편향 조회 작업을 전처리 부분으로 진행합니다.

그런 다음 배치 gemm, Softmax 및 배치 gemm을 독립적인 fMHA 커널에 통합하는 동시에 전치 관련 작업을 fMHA 커널 I/O 작업에 통합하고 특정 데이터 읽기 및 쓰기 패턴을 통해 이를 방지합니다. . 명시적인 조옮김 작업.

융합 후 이 부분은 10배 가속도를 달성했고, 종단 간 가속도도 1.58배를 달성한 것을 볼 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

또 소개해드리고 싶은 연산자 융합은 QKV gemm + Bias 융합입니다.

gemm과 Bias의 융합은 매우 일반적인 융합 방법입니다. 여기서 앞서 언급한 fMHA 커널과 협력하려면 가중치와 Bias를 미리 포맷해야 합니다.

여기서 이 연산자 융합을 소개하기로 선택한 이유는 바로 이 고급 변환이 앞서 언급한 것처럼 추론에서 연산자 융합의 유연성을 반영하고 모델에 대해 추론할 수 있기 때문입니다. 더 나은 작업자 융합 패턴을 달성하고 더 나은 가속 효과를 달성하기 위해 정확도에 영향을 미치지 않습니다.

마지막으로 QKV gemm+bias 통합을 통해 1.1배의 엔드 투 엔드 가속을 더욱 달성할 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음 최적화 방법은 행렬 곱셈 패딩입니다.

Swin Transformer의 계산에서 때때로 이상한 주 차원이 있는 행렬 곱셈이 발생합니다. 이때 행렬 곱셈 커널이 벡터화된 읽기 및 쓰기를 수행하는 것이 도움이 되지 않아 커널의 작동 효율성이 낮아집니다. 연산에 포함된 행렬의 주요 차원을 패딩하여 8의 배수가 되도록 고려할 수 있는 경우, 행렬 곱셈 커널은 정렬=8로 벡터화된 읽기를 수행하고 한 번에 8개의 요소를 읽고 쓸 수 있습니다. . 성능을 향상시키기 위해 작성합니다.

아래 표에서 볼 수 있듯이 n을 49에서 56으로 채운 후 행렬 곱셈의 대기 시간이 60.54us에서 40.38us로 감소하여 1.5배 속도 향상을 달성했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음 최적화 방법은 half2 또는 char4와 같은 데이터 유형을 사용하는 것입니다.

다음 코드는 half2 최적화의 예입니다. 이는 편향과 잔차를 추가하는 간단한 연산자 융합 연산을 구현합니다. half2 데이터 유형을 사용하면 half 데이터 클래스에 비해 대기 시간은 20.96us에서 10.78us로 1.94배 가속되었습니다.

half2 데이터 유형을 사용하면 일반적인 이점은 무엇입니까? 세 가지 주요 포인트가 있습니다:

첫 번째 이점은 벡터화된 읽기 및 쓰기를 통해 아래 그림의 오른쪽에 표시된 것처럼 메모리의 대역폭 활용 효율성을 향상하고 메모리 액세스 명령 수를 줄일 수 있다는 것입니다. half2를 사용하면 메모리 액세스 명령이 절반으로 줄어들고 메모리의 SOL도 크게 향상됩니다.

두 번째 이점은 half2의 독점적인 높은 처리량 수학 명령과 결합되어 커널의 대기 시간이 단축된다는 것입니다. 줄일 수 있습니다. 이 두 가지 사항이 모두 이 샘플 프로그램에 반영되었습니다.

세 번째 이점은 감소 관련 커널을 개발할 때 half2 데이터 유형을 사용하면 하나의 cuda 스레드가 동시에 두 요소를 처리한다는 것입니다. 유휴 스레드 수를 효과적으로 줄이면 스레드 동기화 대기 시간도 줄일 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음 최적화 방법은 레지스터 배열을 영리하게 사용하는 것입니다.

layernorm 또는 Softmax와 같은 Transformer 모델의 공통 연산자를 최적화할 때 커널에서 동일한 입력 데이터를 여러 번 사용해야 하는 경우가 많습니다. 따라서 매번 전역 메모리에서 읽는 대신 배열을 등록할 수 있습니다. 전역 메모리의 반복 읽기를 방지하기 위해 데이터를 캐시하는 데 사용됩니다.

레지스터는 각 쿠다 스레드마다 배타적이므로 커널을 설계할 때 각 쿠다 스레드가 캐시해야 하는 요소 수를 미리 설정하여 해당 크기의 레지스터 배열을 열어야 하며, 그리고 각 cuda 스레드를 담당하는 요소를 할당할 때 아래 그림의 오른쪽 상단에 표시된 것처럼 결합된 액세스를 달성할 수 있는지 확인해야 합니다. 8개의 스레드가 있으면 스레드 0이 요소 0을 처리할 수 있습니다. 4개 스레드 예, 스레드 번호 0은 요소 번호 0과 번호 4 등을 처리합니다.

일반적으로 템플릿 매개변수를 통해 각 CUDA 스레드의 레지스터 배열 크기를 제어하려면 템플릿 함수를 사용하는 것이 좋습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?


또한, 레지스터 배열을 사용할 때 첨자가 상수인지 확인해야 합니다. 루프 변수가 첨자로 사용되는 경우 루프 확장이 수행될 수 있는지 확인해야 합니다. , 컴파일러가 변환하는 것을 피하기 위해 아래 그림과 같이 데이터는 대기 시간이 긴 로컬 메모리에 배치됩니다. ncu 보고서를 통해 볼 수 있는 루프 조건에 제한을 추가하여 로컬 메모리의 사용을 피합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

마지막으로 소개하고 싶은 최적화 방법은 INT8 양자화입니다.

INT8 양자화는 추론 가속을 위한 매우 중요한 가속 방법입니다. Transformer 기반 모델의 경우 INT8 양자화는 더 나은 성능을 제공하면서 메모리 소비를 줄일 수 있습니다.

Swin의 경우 적절한 PTQ 또는 QAT 양자화 체계를 결합하면 양자화 정확도를 보장하면서 우수한 가속을 달성할 수 있습니다. 일반적으로 우리는 주로 행렬 곱셈 또는 컨벌루션을 양자화하기 위해 int8 양자화를 수행합니다. 예를 들어 int8 행렬 곱셈에서는 먼저 원래 FP32 또는 FP16 입력과 가중치를 INT8로 양자화한 다음 INT8 행렬 곱셈을 수행하고 INT32 데이터에 누적합니다. -여기서 역양자화 작업을 수행하고 FP32 또는 FP16의 결과를 얻습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

INT8 행렬 곱셈을 호출하는 더 일반적인 도구는 cublasLt입니다. 더 나은 성능을 얻으려면 cublasLt API의 일부 기능을 심층적으로 이해해야 합니다.

cublasLt int8 행렬 곱셈의 경우 두 가지 출력 유형이 제공됩니다. 이는 아래 그림의 왼쪽과 같이 INT32로 출력되거나 아래 그림의 오른쪽과 같이 INT8로 출력됩니다. , 그림의 파란색 상자에 표시된 것처럼 cublasLt의 계산 작업입니다.

INT32 출력과 비교할 때 INT8 출력에는 한 쌍의 역양자화 및 양자화 작업이 있어 일반적으로 정확도가 더 떨어지지만 INT8 출력으로 인해 글로벌 메모리로 쓸 때, 데이터 출력량이 INT32에 비해 3/4로 적고 성능도 좋아지므로 정확도와 성능 사이에는 트레이드오프가 있습니다.

그래서 Swin Transformer의 경우 QAT와 함께 INT8 출력 솔루션을 채택했기 때문에 좋은 가속도 비율 달성을 전제로 INT8로 출력하면 정확도가 보장된다는 사실을 발견했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?


또한 cublasLt의 INT8 행렬 곱셈과 관련하여 cublasLt는 두 가지 레이아웃, 즉 좀 더 복잡한 형식을 포함하는 하나의 IMMA 특정 레이아웃을 지원해야 합니다. 게다가 이 레이아웃은 NT-gemm만 지원하고, 다른 하나는 TN-gemm을 지원하는 기존의 열 우선 레이아웃입니다.

일반적으로 말하면, 열 우선 레이아웃을 사용하는 것이 전체 파이프라인 코드 개발에 더 도움이 될 것입니다. 왜냐하면 IMMA 관련 레이아웃을 사용하는 경우 이 레이아웃과 호환되기 위해 많은 추가 작업이 필요할 수 있기 때문입니다. 업스트림 및 다운스트림도 커널이 이 특수 레이아웃과 호환되어야 합니다. 그러나 IMMA 특정 레이아웃은 일부 크기의 행렬 곱셈에서 더 나은 성능을 가질 수 있으므로 int8 추론을 구축하려는 경우 성능과 개발 용이성을 더 잘 이해하기 위해 먼저 몇 가지 벤치마크를 수행하는 것이 좋습니다. .

FasterTransformer에서는 IMMA 전용 레이아웃을 사용합니다. 다음으로 IMMA 관련 레이아웃을 예로 들어 cublasLt int8 행렬 곱셈의 기본 구성 프로세스와 일부 개발 기술을 간략하게 소개합니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

cublasLt int8 행렬 곱셈의 기본 구성 과정은 5단계로 나눌 수 있습니다.

  • 먼저 핸들과 곱셈 설명자를 만들어야 합니다.
  • 다음으로 각 행렬에 대한 행렬 설명자를 만듭니다.
  • 일반적으로 우리의 입력은 일반 레이아웃이므로 다음 작업을 수행해야 합니다. 기존 레이아웃 행렬에서 레이아웃을 변환하여
  • int8 행렬 곱셈을 수행한 후 다운스트림 곱셈 계산에 이 결과를 계속 사용하는 것을 고려할 수 있습니다. 일반 레이아웃으로 변환하는 오버헤드
  • 마지막 행렬 곱셈의 결과만 출력을 위해 일반 레이아웃으로 변환해야 합니다.

위에서는 IMMA별 레이아웃에 따른 구축 과정을 소개했는데, 제약이 많다는 것을 알 수 있습니다. 성능에 대한 이러한 제한의 영향을 피하기 위해 우리는 Faster Transformer에서 다음 기술을 채택했습니다.

  • 우선, IMMA 특정 레이아웃에는 매트릭스에 대한 특정 크기 요구 사항이 있습니다. 추론 과정에서 추가 공간 할당이 필요함 연산을 위해 IMMA별 레이아웃 크기에 맞는 버퍼를 미리 할당하겠습니다
  • 그런 다음 가중치를 한 번 처리하고 재사용할 수 있으므로, 추론 과정에서 가중치가 반복적으로 변경되는 것을 방지하기 위해 가중치에 대한 레이아웃 변환(곱셈의 B 행렬과 동일)을 미리 수행합니다.
  • 세 번째 팁은 A와 C가 특별한 레이아웃 변환을 거쳐야 한다는 것입니다. , 우리는 이 부분의 오버헤드를 숨기기 위해 업스트림 또는 다운스트림 작업과의 연산자 융합을 수행할 것입니다. int8 행렬 곱셈에도 필요합니다. 또한 지연 시간을 숨기기 위해 연산자 융합을 사용할 것입니다.
다음은 Faster Transformer에서 사용하는 INT8 프로세스의 개략도입니다. 모든 행렬 곱셈이 int8 데이터 유형이 되고 해당 양자화가 각 int8 앞뒤에 삽입되는 것을 볼 수 있습니다. 행렬 곱셈 및 역양자화 노드, 바이어스 추가, 잔차 추가 또는 레이어 표준과 같은 작업의 경우 원래 FP32 또는 FP16 데이터 유형을 그대로 유지합니다. 물론 해당 I/O는 더 나은 I/O를 가질 수 있습니다. FP16이나 FP32보다 성능이 좋습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

여기에 표시된 것은 Swin Transformer int8 양자화의 정확도입니다. QAT를 통해 정확도 손실이 5천분의 1 이내임을 확인할 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

PTQ 열에서 Swin-Large의 포인트 하락이 더 심각하다는 것을 알 수 있습니다. 일반적으로 심각한 포인트 하락 문제에 대응하여 양자화 정확도를 향상시키기 위해 일부 양자화 노드를 줄이는 것을 고려할 수 있습니다. 물론 이로 인해 가속 효과가 약화될 수 있습니다.

FT에서는 FC2 및 PatchMerge에서 int 8 행렬 곱셈의 int8 출력 이전에 역양자화 및 양자화 노드를 비활성화하여 양자화 정확도를 더욱 향상시킬 수 있습니다(즉, int32 출력 사용). 이 최적화 작업에서 swin-large의 PTQ 정확도도 크게 향상되었음을 알 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

다음은 추론 측면에서 얻은 가속 효과입니다. GPU T4, A10, A100의 다양한 모델에서 pytorch FP16과의 성능을 비교했습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

아래 그림의 왼쪽은 최적화와 pytorch의 지연 시간 비교를 보여주고, 오른쪽 그림은 최적화 후 FP16과 pytorch의 가속 비율, INT8 최적화와 FP16 최적화의 가속 비율을 보여줍니다. 최적화를 통해 FP16 정확도 측면에서 pytorch에 비해 2.82x~7.34x의 가속도를 달성할 수 있으며, INT8 양자화와 결합하여 이를 기반으로 1.2x~1.5x의 가속도를 더욱 달성할 수 있음을 알 수 있습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

4. Swin Transformer 최적화 요약

마지막으로 이번 공유에서는 nsight 시스템 성능 분석 도구를 통해 성능 병목 현상을 찾아내고 타겟을 정하는 방법을 소개했습니다. 성능 병목 현상은 1. 혼합 정밀도 훈련/낮은 정밀도 추론, 2. 연산자 융합, 3. Cuda 커널 최적화 기술(예: 행렬 제로 패딩, 벡터화된 읽기 및 쓰기, 영리한 사용)을 포함한 일련의 훈련 추론 가속화 기술을 소개합니다. 레지스터 배열 등, 4. 계산 프로세스를 개선하기 위해 추론 최적화에 일부 전처리가 사용되었으며, 멀티 스트림 및 Cuda 그래프의 일부 애플리케이션도 도입했습니다.

위의 최적화와 결합하여 Swin-Large 모델을 예로 사용하여 단일 카드의 경우 2.85x, 8카드 모델의 경우 2.32x의 가속 비율을 달성했습니다. 예를 들어 Swin-tiny 모델에서는 FP16 정밀도에서 2.82x~7.34x의 가속 비율이 달성되었으며 INT8 양자화와 결합되어 1.2x~1.5x의 추가 가속 비율이 달성되었습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

위의 대규모 시각적 모델 훈련 및 추론을 위한 가속 방법은 Baidu Baige AI 이기종 컴퓨팅 플랫폼의 AIAK 가속 기능에 구현되었습니다.

훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?

위 내용은 훈련과 추론을 가속화하기 위해 대규모 시각적 모델을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제