>기술 주변기기 >일체 포함 >OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

WBOY
WBOY앞으로
2023-04-10 09:41:071158검색

OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

이 기사는 Lei Feng.com에서 복제되었습니다. 재인쇄가 필요한 경우 Lei Feng.com 공식 웹사이트로 이동하여 승인을 신청하세요.

대규모 신경망은 현재 인공지능 분야의 뜨거운 주제 중 하나입니다. 그렇다면 대형 모델을 어떻게 훈련시킬 수 있을까요?

최근 대규모 사전 학습 모델 GPT-3을 출시한 OpenAI는 GPU 기반의 메모리 절약형 병렬 학습 방법 4가지를 소개하는 블로그 게시물을 게시했습니다.

  • 데이터 병렬 — — 서로 다른 GPU에서 동일한 배치의 서로 다른 하위 집합을 실행합니다.
  • 파이프라인 병렬성 – 서로 다른 GPU에서 모델의 서로 다른 레이어를 실행합니다.
  • Tensor 병렬성 – 단일 연산의 수학을 분석합니다. GPU
  • MOE(Mixture of Experts) - 각 레이어의 작은 부분만을 통해 각 예제를 처리합니다.

OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

캡션: 3레이어 모델의 다양한 병렬 전략, 각 색상은 하나의 레이어를 나타내고 점선은 서로 다른 GPU를 구분합니다.

1 Data Parallel

"데이터 병렬 훈련"은 동일한 매개변수를 여러 GPU(종종 "작업자"라고 함)에 복사하고 각 GPU에 서로 다른 예제를 할당하여 동시에 처리하는 것을 의미합니다.

데이터 병렬성만으로는 모델이 단일 GPU 메모리에 맞아야 하지만 계산을 위해 여러 GPU를 활용하는 경우 매개변수의 여러 복사본을 저장하는 데 드는 비용이 발생합니다. 그러나 사용 사이에 일시적으로 매개변수를 CPU 메모리로 오프로드하는 등 GPU에 사용 가능한 효과적인 RAM을 늘리는 전략이 있습니다.

각 데이터 병렬 작업자가 매개변수 복사본을 업데이트할 때 각 작업자가 계속 유사한 매개변수를 갖도록 서로 조정해야 합니다. 가장 간단한 방법은 작업자 간의 "통신 차단"을 도입하는 것입니다.

1단계: 각 작업자의 기울기를 독립적으로 계산합니다.

2단계: 여러 작업자의 기울기를 평균화합니다.

3단계: 계산합니다. 각 작업자에 독립적으로 동일한 새 매개변수를 적용합니다.

2단계는 대량의 데이터(작업자 수 x 매개변수 크기에 비례)를 전송해야 하는 차단 평균으로, 이로 인해 훈련 ​​처리량이 저하될 수 있습니다. 이러한 손실을 제거할 수 있는 다양한 비동기식 동기화 방식이 있지만 학습 효율성을 희생하면서 실제로 사람들은 일반적으로 동기식 방법을 고수합니다.

2 메모리는 비례적으로 줄어듭니다.

대형 모델을 연속된 레이어 덩어리로 분할하는 것은 간단하지만 레이어의 입력과 출력 사이에 순차적인 종속성이 있으므로 이전 머신의 출력이 입력으로 사용될 때까지 기다리는 것은 순진합니다. 을 실행하면 상당한 유휴 시간이 발생할 수 있습니다. 이러한 대기 시간 블록을 "버블"이라고 하며 유휴 컴퓨터에서 완료할 수 있는 낭비된 계산입니다.

캡션: 모델이 수직으로 4개의 파티션으로 나누어진 간단한 파이프라인 병렬 설정의 그림입니다. 작업자 1은 계층 1(입력에 가장 가까운)의 모델 매개변수를 호스팅하고 작업자 4는 계층 4(출력에 가장 가까운)를 호스팅합니다. "F", "B" 및 "U"는 각각 정방향, 역방향 및 업데이트 작업을 나타냅니다. 아래 첨자는 작업을 실행할 작업자를 나타냅니다. 순차적 종속성으로 인해 한 번에 한 명의 작업자가 데이터를 처리하므로 유휴 시간이 길어지는 "거품"이 발생합니다. OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

데이터 병렬성 아이디어를 재사용하여 각 작업자가 한 번에 데이터 요소의 하위 집합만 처리하도록 함으로써 시간 거품 생성 비용을 줄일 수 있으며, 이를 통해 새로운 계산과 대기 시간을 교묘하게 겹치게 할 수 있습니다. 핵심 아이디어는 배치를 여러 개의 마이크로 배치로 분할함으로써 각 마이크로 배치가 비례적으로 더 빠르게 처리되고 다음 마이크로 배치가 사용 가능해지면 각 작업자가 작업을 시작하여 파이프라인 구현 속도를 높이는 것입니다. 마이크로배치가 충분하면 작업자는 단계의 시작과 끝에서 최소한의 "거품"으로 대부분의 시간을 활용할 수 있습니다. 그라데이션은 마이크로배치 전체에 걸쳐 평균화되며 매개변수는 모든 마이크로배치가 완료된 후에만 업데이트됩니다.

모델로 분할된 작업자 수를 종종 "파이프라인 깊이"라고 합니다.

순방향 패스 중에 작업자는 레이어 블록의 출력("활성화"라고 함)만 다음 작업자에게 보냅니다. 역방향 패스 중에는 이러한 활성화의 그라데이션만 이전 작업자 직원에게 보냅니다. 이러한 채널을 배열하는 방법과 마이크로 배치 전체에 걸쳐 그라데이션을 집계하는 방법에는 넓은 설계 공간이 있습니다. 예를 들어, GPipe 방법은 각 작업자 프로세스가 연속적으로 앞으로 및 뒤로 전달되도록 한 다음 마지막에 여러 마이크로 배치의 그라데이션을 동기식으로 집계하는 반면 PipeDream은 각 작업자가 앞으로 및 뒤로 전달을 교대로 처리하도록 배열합니다.

OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법

캡션: 배치당 4개의 마이크로 배치를 사용하는 GPipe 및 PipeDream 파이프라인 구성표 비교. 마이크로 배치 1-8은 두 개의 연속 데이터 배치에 해당합니다. 그림의 "숫자"는 어떤 마이크로 배치가 작동되는지를 나타내고 아래 첨자는 작업자 ID를 표시합니다. PipeDream은 오래된 매개변수를 사용하여 일부 계산을 수행함으로써 더 큰 효율성을 달성합니다.

3 Tensor Parallel

파이프라인 병렬 처리는 모델을 레이어별로 "수직으로" 분할하고, 레이어 내에서 특정 작업을 "수평으로" 분할할 수도 있는데, 이를 종종 텐서 훈련이라고 합니다.

많은 최신 모델(예: Transformer)의 경우 계산 병목 현상으로 인해 활성화 배치 행렬에 큰 가중치 행렬이 곱해집니다. 행렬 곱셈은 행과 열 쌍 사이의 내적으로 생각할 수 있습니다. 내적은 서로 다른 GPU에서 독립적으로 계산될 수 있으며, 내적의 각 부분은 서로 다른 GPU에서 계산되어 결과가 합산될 수 있습니다. 전략에 관계없이 가중치 행렬을 균등한 크기의 "샤드"로 분할하고, 각 샤드를 다른 GPU에 호스팅하고, 결과를 결합하기 위해 전달하기 전에 해당 샤드를 사용하여 전체 행렬 제품의 관련 부분을 계산할 수 있습니다.

한 가지 예는 Transformer의 self-attention 및 MLP 레이어 내에서 행렬 곱셈을 병렬화하는 Megatron-LM입니다. PTD-P는 텐서, 데이터 및 파이프라인 병렬성을 사용하며, 파이프라인 스케줄링은 네트워크 통신 증가를 희생하면서 버블 손실을 줄이기 위해 각 장치에 여러 개별 레이어를 할당합니다.

때때로 네트워크 입력은 교차 통신에 비해 높은 수준의 병렬 컴퓨팅을 통해 여러 차원에 걸쳐 병렬화될 수 있습니다. 시퀀스 병렬 처리는 입력 시퀀스를 시간에 따라 여러 하위 예제로 나누어 더 세분화된 예제에서 계산을 계속할 수 있도록 하여 이에 비례하여 최대 메모리 소비를 줄이는 아이디어입니다.

4

예제 접근 방식은 여러 가중치 세트를 갖는 것이며, 네트워크는 게이팅 메커니즘을 통해 추론 시 사용할 가중치 세트를 선택할 수 있으므로 계산 비용을 늘리지 않고도 더 많은 매개변수를 사용할 수 있습니다. 각 가중치 세트를 "전문가"라고 하며, 네트워크가 각 전문가에게 특수한 계산 및 기술을 할당하는 방법을 학습하기를 바랍니다. 전문가마다 서로 다른 GPU를 호스팅할 수 있어 모델에 사용되는 GPU 수를 확장하는 명확한 방법을 제공합니다.

캡션: 게이트 네트워크는 n명의 전문가 중 2명만 선택합니다.

GShard는 MoE Transformer의 매개변수를 6,000억 개의 매개변수로 확장합니다. 여기서 MoE 레이어만 여러 TPU 장치에 분할되고 다른 레이어는 완전히 복제됩니다. Switch Transformer는 입력을 단일 전문가에게 전달하여 모델 크기를 더 높은 희소성을 갖춘 수조 개의 매개변수로 확장합니다.

5 기타 메모리 절약 설계

점점 더 큰 신경망을 더 다루기 쉽게 훈련할 수 있는 다른 계산 전략이 많이 있습니다. 예:

그라디언트를 계산하려면 원래 활성화를 저장해야 하며 이는 많은 장치 RAM을 소비합니다. 체크포인트(활성화 재계산이라고도 함)는 활성화의 하위 집합을 저장하고 역방향 전달 중에 중간 활성화를 제 시간에 다시 계산하여 최대 한 번의 추가 전체 정방향 전달 비용으로 상당한 메모리를 절약합니다. 또한 저장 비용은 상대적으로 높지만 계산 비용은 낮은 활성화의 하위 집합을 확인하는 재계산을 선택적으로 활성화하여 계산 및 메모리 비용을 지속적으로 절충할 수 있습니다.

혼합 정밀도 훈련은 낮은 정밀도 숫자(가장 일반적으로 FP16)를 사용하여 모델을 훈련합니다. 최신 가속기는 더 낮은 정밀도 숫자를 사용하여 더 높은 FLOP 수를 달성할 수 있으며 장치 RAM도 절약할 수 있습니다. 적절한 주의를 기울이면 결과 모델은 사실상 정확도 손실 없이 생성될 수 있습니다.

오프로딩은 사용하지 않는 데이터를 일시적으로 CPU 또는 다른 장치 간에 오프로드하고 필요할 때 다시 읽는 것입니다. 순진한 구현은 학습 속도를 크게 저하시키지만, 정교한 구현은 데이터를 미리 가져오므로 기기가 기다릴 필요가 없습니다. 이 아이디어의 구현 중 하나는 사용 가능한 모든 하드웨어에 걸쳐 매개변수, 기울기 및 최적화 상태를 분할하고 필요에 따라 구체화하는 ZeRO입니다.

Memory Efficient Optimizers는 Adafactor와 같은 최적화 프로그램이 유지 관리하는 실행 상태의 메모리 공간을 줄이기 위해 제안되었습니다.

압축은 중간 결과를 네트워크에 저장하는 데에도 사용할 수 있습니다. 예를 들어, Gist는 역방향 패스를 위해 저장된 활성화를 압축합니다. DALL-E는 동기화하기 전에 그라디언트를 압축합니다.

위 내용은 OpenAI: 대규모 신경망 훈련을 위한 4가지 기본 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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