>  기사  >  기술 주변기기  >  제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

WBOY
WBOY앞으로
2023-04-13 08:10:071503검색

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

질문: 모델 크기가 GPU 용량을 초과하는 경우 어떻게 해야 하나요?

이 기사는 Yandex School of Data Analysis에서 진행하는 "효율적인 딥 러닝 시스템" 과정에서 영감을 받았습니다.

기본 지식: 독자는 신경망의 정방향 및 역방향 전달이 어떻게 작동하는지 이미 이해하고 있다고 가정합니다. 이는 이 기사의 내용을 이해하는 데 중요합니다. 이 기사에서는 PyTorch를 프레임워크로 사용합니다.

시작해 보세요!

5억 개가 넘는 매개변수가 포함된 대형 모델(일명 gpt-2-xl)을 사용하려고 하고 GPU 리소스가 제한되어 있는 경우 이를 설치하여 GPU에서 실행하거나 모델 훈련 중에 실행할 수 없습니다. 이 기간 동안 논문에 정의된 배치 크기를 달성할 수 없으면 어떻게 해야 합니까? 어쩌면 더 가벼운 버전의 모델을 포기하고 사용하거나 훈련 배치 크기를 줄여 문서에 설명된 훈련 결과를 얻지 못할 수도 있습니다.

그러나 위의 문제를 해결하는 데 도움이 될 수 있는 몇 가지 기술이 있습니다.

15억 개의 매개변수로 GPT-2-XL 모델을 미세 조정하는 방법에 대한 몇 가지 방법을 논의해 보겠습니다.

문제의 핵심

먼저, 모델을 GPU에 로드하는데 필요한 GPU 메모리 문제의 본질을 이해합시다.

모델에 FP32(32비트 부동 소수점) 매개변수가 있다고 가정하면 이 모델은 GPU에서 학습해야 합니다(예: Adam 최적화 프로그램 실행).

계산을 통해 나온 결과는 충격적입니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

이미 12GB 메모리를 갖춘 NVIDIA GeForce RTX 3060이 있다고 가정해 보겠습니다. 첫째, 1e9 FP32 매개변수는 약 4GB의 GPU 메모리를 차지합니다.

마찬가지로 동일한 양의 메모리가 그라디언트에 예약됩니다. 따라서 아직 훈련이 시작되지 않았고 옵티마이저가 로드되지 않았기 때문에 총 8GB의 메모리가 예약되어 있으므로 옵티마이저를 로드하려면 일정량의 메모리도 필요합니다. Adam 최적화 프로그램은 각 매개변수에 대한 첫 번째 및 두 번째 백업을 저장해야 하며, 이를 위해서는 8GB의 추가 메모리가 필요합니다. 이를 계산하면 모델을 GPU에 올바르게 로드하려면 약 16GB의 GPU 메모리가 있어야 합니다. 이 예에서 GPU에는 12GB의 여유 메모리만 있습니다. 안 좋아 보이는데요?

이 문제를 해결하기 위한 몇 가지 방법이 있습니다. 다음은 관련 방법입니다.

  • 그라디언트 축적/마이크로 배치
  • 그라디언트 체크포인트;
  • 모델 병렬 훈련,
  • 파이프라인 작업
  • 텐서 병렬화
  • 혼합 정밀 훈련;
  • 메모리 오프로드
  • 최적화 8비트 양자화.
다음으로 이러한 기술에 대해 자세히 설명하겠습니다.

시작

질문: 모델이 GPU 용량보다 큰 경우 어떻게 해야 하나요?

  • 단순 모드: 배치 크기 1
  • 전문 모드: 매개변수도 조정할 수 없음

개요

모델이 그 이상인 경우 GPU 용량보다 배치 크기를 1로 설정해도 충분하지 않은데 어떻게 해야 할까요? 그래디언트 체크포인트를 설정하는 솔루션이 있습니다. 이 개념을 살펴보겠습니다. n개의 레이어를 포함하는 간단한 피드포워드 신경망의 경우 기울기 계산 다이어그램은 다음과 같습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

신경망 레이어의 활성화는 순방향에서 f로 표시된 노드에 해당합니다. 패스 중에 이러한 모든 노드는 순서대로 평가됩니다. 이러한 레이어의 활성화 및 매개변수에 해당하는 손실 기울기는 b로 표시된 노드로 표시됩니다. 역방향 전달 동안 이러한 모든 노드는 역순으로 평가됩니다. f 노드의 계산 결과는 b 노드를 계산하는 데 사용되므로 모든 f 노드는 앞으로 전달된 후 메모리에 유지됩니다. 역전파가 노드 f의 모든 종속성을 계산할 수 있을 만큼 충분히 진행된 경우에만 메모리에서 지울 수 있습니다. 이는 단순 역전파에 필요한 메모리가 신경망 레이어 수 n에 따라 선형적으로 증가함을 의미합니다.

다음은 이러한 노드의 계산 순서입니다. 보라색 음영 원은 주어진 시간에 메모리에 저장해야 하는 노드를 나타냅니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

Gradient Checkpoint

위에서 설명한 간단한 역전파는 계산상 최적입니다. 즉, 각 노드를 한 번만 계산합니다. 그러나 노드를 다시 계산하면 많은 메모리를 절약할 수 있습니다. 예를 들어 각 노드를 간단히 다시 계산할 수 있습니다. 실행 순서와 사용되는 메모리는 아래 그림과 같습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

이 전략은 메모리 측면에서 최적입니다. 그러나 노드 계산 수는 이전 배율 인수 n과 비교하여 n²배로 배율 조정됩니다. 각 n 노드는 순차적으로 n배로 다시 계산됩니다. 계산 속도가 느리기 때문에 이 방법은 딥러닝에 적합하지 않습니다.

메모리와 계산 사이의 균형을 유지하려면 노드를 너무 자주 재계산하지 않도록 하는 전략을 제안해야 합니다. 여기서 사용되는 전략은 신경망 활성화의 하위 집합을 체크포인트 노드로 표시하는 것입니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

이 예에서는 sqrt(n)번째 노드를 체크포인트로 표시하도록 선택합니다. 이렇게 하면 체크포인트 노드 수와 체크포인트 사이의 노드 수가 sqrt(n) 사이가 됩니다. 즉, 필요한 메모리 양도 n의 순서로 확장됩니다. 이 전략에 필요한 추가 계산은 네트워크를 통한 단일 전달에 필요한 계산과 동일합니다.

루틴:

그라디언트 체크포인트의 세부 사항을 배운 후 PyTorch에서 이 개념을 적용하는 방법을 살펴보겠습니다. 별로 어렵지 않을 것 같습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

그라디언트 축적/마이크로 배치

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

Overview

딥 러닝 모델은 점점 커지고 있으며 이러한 대규모 신경망을 GPU 메모리에 맞추기가 어렵습니다. 따라서 훈련 중에 더 작은 배치 크기를 선택해야 하며, 이로 인해 수렴 속도가 느려지고 정확도가 낮아질 수 있습니다.

그라디언트 축적이란 무엇인가요?

신경망을 훈련할 때 데이터는 일반적으로 배치로 나뉘며 신경망은 실제 목표에 대한 손실을 계산하는 데 사용되는 배치 레이블을 예측합니다. 다음으로, 역방향 전달을 수행하여 기울기를 계산하고 모델 가중치를 업데이트합니다. 경사 누적은 훈련 과정의 마지막 단계를 수정합니다. 다음 미니 배치를 계속하기 전에 각 미니 배치에 대한 네트워크 가중치를 업데이트하는 대신 경사 값을 저장하고 이전에 저장된 경사에 새 경사를 추가합니다. 가중치는 모델이 여러 미니 배치를 처리한 후에만 업데이트됩니다. 그라데이션 누적은 더 큰 배치 크기를 시뮬레이션합니다. 작은 배치에서 64개의 이미지를 사용하려는 경우 배치 크기가 8을 초과하면 "CUDA 메모리 오류..."가 보고됩니다. 이 경우 8개의 이미지 배치를 사용하고 모델이 64/8 = 8개의 배치를 처리한 후 가중치를 한 번 업데이트할 수 있습니다. 이 8개 배치 각각에서 그래디언트를 누적하면 결과는 (거의) 동일하며 훈련을 수행할 수 있습니다!

루틴:

경사 누적이 없는 표준 훈련 루프는 일반적으로 다음과 같습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

PyTorch에서는 경사 누적을 쉽게 수행할 수 있습니다. Accumulation_steps를 사용하여 모델이 미니 배치 처리를 완료한 후 최적화를 수행할 수 있습니다. Accumulation_steps는 손실 함수의 특성에 따라 실행 손실을 나누는 데에도 사용할 수 있습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

정말 아름답죠? loss.backward()가 호출될 때 기울기가 계산되고, Optimizer.zero_grad()가 호출될 때 PyTorch가 중지될 때까지 PyTorch에 의해 누적됩니다.

중요

일부 네트워크 아키텍처는 BatchNorm과 같은 전용 배치 작업을 사용하며 동일한 배치 크기를 사용하는 경우 결과가 약간 다를 수 있습니다.

혼합 정밀 훈련

개요

혼합 정밀 훈련은 FP32 매개변수의 일부 또는 전체를 FP16, TF16(부동 포인트 텐서) 또는 BF16(부동 소수점 바이트).

주요 장점

혼합 정밀 교육의 주요 장점은 다음과 같습니다.

  • 메모리 사용량 감소; ance 가속도(더 높은 계산 속도) 기술적 강점 또는 통신 사용량 감소)
  • 더 빠른 계산을 위해 전용 하드웨어를 사용하세요.
  • 현재 저는 첫 번째 이점인 메모리 사용량 감소에만 관심이 있습니다. PyTorch 모델을 사용하여 이를 달성하는 방법을 살펴보겠습니다.

루틴:

결과적으로 .half() 작업을 완료한 후 모델이 2배 작아졌습니다. 모델을 다른 형식(예: BF16, TF16)으로 변환한 후의 스케일링 손실은 후속 기사에서 논의됩니다. Softmax와 같은 일부 작업은 FP16에서 완료할 수 없습니다. PyTorch는 torch.autocast를 사용하여 이러한 특별한 경우를 처리할 수 있습니다.

8비트 최적화 프로그램

모델 크기를 늘리는 것은 더 나은 성능을 얻는 효과적인 방법입니다. 그러나 대규모 모델을 교육하려면 모델, 기울기 및 최적화 상태(예: Adam의 지수 평활합 및 이전 기울기의 제곱합)를 저장해야 하며, 모두 제한된 양의 사용 가능한 메모리에 저장됩니다.

32비트 최적화 프로그램을 8비트 최적화 프로그램으로 다운그레이드하여 값 범위를 2³²에서 2⁸=256으로 줄이면 최적화 프로그램이 예약하는 메모리 양에 큰 영향을 미칩니다.

연구원들은 새로운 8비트 Adam 최적화 프로그램을 제안했습니다. 논문의 저자는 "원래 메모리의 일부로 32비트 성능을 유지합니다."라고 말했습니다.

8비트 최적화에는 세 가지 구성 요소가 있습니다. (1) 이상값을 격리하고 오류를 모든 비트에 균등하게 분배하는 블록 수준 양자화(2) 작은 값과 큰 값을 높은 값으로 양자화하는 동적 양자화 정확도 값 (3) 단어 임베딩 최적화 모델의 안정성을 향상시키기 위한 안정적인 임베딩 레이어.

이러한 구성 요소를 사용하면 8비트 상태를 사용하여 직접 최적화를 수행할 수 있습니다. 8비트 최적화 프로그램 상태를 32비트로 양자화하고 업데이트를 수행한 다음 저장을 위해 상태를 8비트로 양자화합니다. 8비트에서 32비트로의 변환은 양자화 및 역양자화를 수행하기 위해 GPU 메모리에 대한 느린 복사나 추가 임시 메모리가 필요 없이 레지스터에서 요소별로 수행됩니다. GPU의 경우 이는 8비트 최적화 프로그램이 일반 32비트 최적화 프로그램보다 빠르다는 것을 의미합니다.

8비트 Adam을 사용한 후 고무적인 결과를 살펴보겠습니다.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

GPU 메모리를 약 8.5GB 절약할 수 있음을 알 수 있습니다. , 정말 멋져요!

사용성을 이해한 후 Python으로 구현하는 방법을 살펴보겠습니다.

Facebook에서 제공하는 Bitsandbytes 패키지는 CUDA 사용자 정의 함수에 대한 경량 래퍼로, 8비트 Adam 사용을 구현하는 데 사용할 수 있는 8비트 최적화 프로그램 및 양자화 함수를 캡슐화합니다.

루틴:

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

위에서 언급했듯이 양자화 최적화 프로그램의 사용은 매우 간단하고 결과가 좋습니다.

위의 모든 방법을 결합하여 GPU에서 GPT-2-XL을 미세 조정하세요.

마지막으로 위의 방법을 익힌 후 이러한 방법을 사용하여 실제 문제를 해결하고 15억 개의 매개변수로 GPT-2-XL 모델을 미세 조정하세요. 분명히 12GB RAM을 갖춘 NVIDIA GeForce RTX 3060 GPU에 로드할 방법은 없습니다. 사용할 수 있는 모든 방법을 나열하세요.

  • Gradient 체크포인트
  • 비결을 설정했습니다. 동일한 모델의 두 샘플을 사용합니다. 먼저 .half를 사용하여 GPU에 로드하고 이름을 gpu_model로 지정합니다. CPU, 이름을 cpu_model로 지정하고, gpu_model의 그래디언트를 cpu_model에 로드하고,optimizer.step()을 실행하고, 업데이트된 매개변수를 gpu_model에 로드합니다.
  • batch_size=64, minibatch_size=4를 사용하세요. 그래디언트 축적, 손실은 축적 단계에 따라 조정되어야 합니다.
  • 8비트 Adam 최적화 프로그램.

위의 방법을 모두 사용하고 코드를 확인하세요.

제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법

위의 방법을 모두 사용한 후 16GB GPT-2-XL 모델의 미세 조정이 구현되었습니다. GPU!

결론

이 블로그에서는 위에서 언급한 것처럼 다양한 어려운 작업에 적합한 효율적인 메모리 사용의 핵심 개념이 제공되었습니다. 다른 개념은 후속 기사에서 논의될 것입니다. 시간을 내어 이 기사를 읽어주셔서 정말 감사합니다!

위 내용은 제한된 GPU 리소스로 매우 큰 모델을 미세 조정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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