AI 모델 및 플랫폼

대형 언어 모델의 추론 및 미세 조정에 대한 메모리 최적화

mm
Unite.AI를 Google의 선호 소스에 추가

대형 언어 모델(Large Language Models, LLMs)인 GPT-4, Bloom, LLaMA는 수십억 개의 매개변수로 확장함으로써 놀라운 능력을 달성했습니다. 그러나 이러한 거대한 모델을 추론 또는 미세 조정에 배포하는 것은 엄청난 메모리 요구로 인해 어려울 수 있습니다. 이 기술 블로그에서는 다양한 하드웨어 설정에서 LLM 추론 및 미세 조정 중 메모리 소비를估算 및 최적화하는 기술을 탐구할 것입니다.

메모리 요구 사항 이해

LLM을 로드하는 데 필요한 메모리는 주로 매개변수의 수와 매개변수를 저장하는 데 사용되는 수치 정밀도에 의해 결정됩니다. 간단한 규칙은 다음과 같습니다.

  • X십억 개의 매개변수를 가진 모델을 로드하는 데 약 4X GB의 VRAM이 32비트 부동 소수점 정밀도에서 필요합니다.
  • X십억 개의 매개변수를 가진 모델을 로드하는 데 약 2X GB의 VRAM이 16비트 부동 소수점 정밀도에서 필요합니다.

예를 들어, 175B 매개변수 GPT-3 모델을 로드하는 데 약 350GB의 VRAM이 부동 소수점 정밀도에서 필요합니다. 현재로서는 NVIDIA A100 및 H100과 같은 가장 큰 상업용 GPU도 80GB의 VRAM만 제공하므로 텐서 병렬성 및 모델 병렬성 기술이 필요합니다.

추론 중에 메모리 사용량은 모델 매개변수와 임시 활성화 텐서에 의해 지배됩니다. 추론 중 피크 메모리 사용량에 대한 높은 수준의 추정치는 모델 매개변수를 로드하는 데 필요한 메모리와 활성화에 대한 메모리의 합입니다.

추론 메모리 정량화

OctoCode 모델을 사용하여 추론에 대한 메모리 요구 사항을 정량화해 보겠습니다. 이 모델은 약 15억 개의 매개변수를 가지며 부동 소수점 형식으로 약 31GB의 크기입니다. 우리는 Transformers 라이브러리를 사용하여 모델을 로드하고 텍스트를 생성합니다.

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

<p>model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;,
torch_dtype=torch.bfloat16,
device_map=&quot;auto&quot;,
pad_token_id=0)
tokenizer = AutoTokenizer.from_pretrained(&quot;bigcode/octocoder&quot;)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)</p>

<p>prompt = &quot;질문: 바이트를 기گابايت로 변환하는 Python 함수를 작성해 주세요.\n\n답변:&quot;
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]</p>

<p>def bytes_to_gigabytes(bytes):
return bytes / 1024 / 1024 / 1024</p>

<p>bytes_to_gigabytes(torch.cuda.max_memory_allocated())

출력:

29.0260648727417

피크 GPU 메모리 사용량은 약 29GB로, 부동 소수점 형식으로 모델 매개변수를 로드하는 데 필요한 31GB의 추정치와 일치합니다.

추론 메모리 최적화 với 양자화

부동 소수점 정밀도가 일반적으로 LLM을 훈련하는 데 사용되지만, 연구자들은 모델 가중치를 더 낮은 정밀도 데이터 형식으로 양자화하면 메모리 사용량을 크게 줄일 수 있음을 발견했습니다.

OctoCode 모델의 8비트 및 4비트 양자화에서 메모리 절약을 보겠습니다.

&amp;lt;/div&amp;gt;
# 8비트 양자화
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_8bit=True,
pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())&lt;/pre&gt;
출력:
15.219234466552734
# 4비트 양자화
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_4bit=True,
low_cpu_mem_usage=True, pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())

출력:

9.543574333190918

8비트 양자화로 메모리 요구 사항이 31GB에서 15GB로 줄어들고, 4비트 양자화로 9.5GB로 더욱 줄어듭니다! 이것은 15B 매개변수 OctoCode 모델을 RTX 3090(24GB VRAM)와 같은 소비자용 GPU에서 실행할 수 있도록 합니다.

그러나 4비트와 같은 더 공격적인 양자화는 때때로 8비트 또는 부동 소수점 정밀도와 비교하여 정확도 손실을 유발할 수 있습니다. 메모리 절약과 정확도 사이의 트레이드오프가 있으며, 사용자는 자신의 사용 사례에 대해 평가해야 합니다.

양자화는 메모리 사용량을 크게 줄일 수 있는 강력한 기술입니다. 이것은 클라우드 인스턴스, 에지 디바이스 또는甚至 모바일 폰과 같은 자원 제한된 환경에서 LLM을 배포할 수 있도록 합니다.

미세 조정에 대한 메모리 추정

양자화는 주로 효율적인 추론에 사용되지만, 텐서 병렬성 및 모델 병렬성과 같은 기술은 대형 언어 모델의 미세 조정 중 메모리 요구 사항을 관리하는 데 중요합니다.

미세 조정 중 피크 메모리 사용량은 일반적으로 추론보다 3-4배 더 높습니다. 이는 다음과 같은 추가 메모리 요구 사항으로 인해 발생합니다.

  • 기울기
  • 옵티마이저 상태
  • 역전파를 위해 전방 패스에서 저장된 활성화

보수적인 추정치는 미세 조정 중 X십억 개의 매개변수를 가진 LLM에 대해 약 4 * (2X) = 8X GB의 VRAM이 부동 소수점 정밀도에서 필요하다는 것입니다.

예를 들어, 7B 매개변수 LLaMA 모델을 미세 조정하는 데 약 7 * 8 = 56GB의 VRAM이 부동 소수점 정밀도에서 필요합니다. 이것은 현재 GPU의 메모리 용량을 초과하므로 분산 미세 조정 기술이 필요합니다.

분산 미세 조정 기술

GPU 메모리 제약을 극복하기 위해 대형 모델에 대한 여러 분산 미세 조정 방법이 제안되었습니다.

  1. 데이터 병렬성: 데이터 병렬성 접근 방식은 여러 GPU에 걸쳐 전체 모델을 복제하고 훈련 데이터 배치를 분할 및 분산합니다. 이것은 훈련 시간을 GPU 수와 선형적으로 줄입니다. 그러나 각 GPU의 피크 메모리 요구 사항을 줄이지는 않습니다.
  2. ZeRO Stage 3: 데이터 병렬성의 고급 형태로, 모델 매개변수, 기울기 및 옵티마이저 상태를 GPU에 분할합니다. 이것은 각 GPU에서 필요한 분할 데이터만 유지함으로써 메모리를 절약합니다.
  3. 텐서 병렬성: 모델을 복제하는 대신 텐서 병렬성은 모델 매개변수를 행 또는 열로 분할하여 GPU에 분산합니다. 각 GPU는 매개변수, 기울기 및 옵티마이저 상태의 분할 집합을 작동합니다. 이것은 상당한 메모리 절약을 제공합니다.
  4. 파이프라인 병렬성: 이 기술은 모델 레이어를 다른 GPU/작업자에 분할합니다. 각 장치는 레이어의 하위 집합을 실행하고 활성화는 작업자 사이에서 전달됩니다. 이것은 피크 메모리를 줄이지만 통신 오버헤드를 증가시킵니다.

이러한 분산 방법에 대한 메모리 사용량을 추정하는 것은 매개변수, 기울기, 활성화 및 옵티마이저 상태의 분산이 기술에 따라 다르기 때문에 비트리입니다. 또한 트랜스포머 본문과 언어 모델 헤드와 같은 다른 구성 요소는 다른 메모리 할당 동작을 나타낼 수 있습니다.

LLMem 솔루션

연구자들은 최근에 LLMem을 제안했습니다. 이는 분산 미세 조정 방법을 여러 GPU에 적용할 때 LLM에 대한 GPU 메모리 사용량을 정확하게 추정하는 솔루션입니다.

미리 훈련된 LLM에 대한 GPU 메모리 사용량 추정

미리 훈련된 LLM에 대한 GPU 메모리 사용량 추정

LLMem은 계산 전에 매개변수를 재조합하는 것과 같은 요인(ZeRO Stage 3), 텐서 병렬성의 역방향 패스에서 출력 수집 및 트랜스포머 본문과 언어 모델 헤드에 대한 다른 메모리 할당 전략을 고려합니다.

실험 결과에 따르면 LLMem은 단일 GPU에서 LLM에 대한 피크 GPU 메모리 사용량을 1.6%의 오차율로 추정할 수 있으며, 이는 평균 오차율이 42.6%인 상태-of-the-art DNNMem을 초과합니다. 여러 GPU에서 10억 개 이상의 매개변수를 가진 LLM에 분산 미세 조정 방법을 적용할 때 LLMem은 평균 오차율 3.0%를 달성합니다.

메모리 요구 사항을 사전에 정확하게 추정함으로써 LLMem은 사용자가 메모리 부족 문제를 피하고 훈련 시간을 최소화하는 가장 효율적인 분산 미세 조정 구성으로 선택할 수 있도록 도와줍니다.

새로운 기술

양자화, 텐서 병렬성 및 모델 병렬성이 확립된 기술인 반면, 연구자들은 효율적인 LLM 훈련 및 배포의 경계를 확장하기 위해 새로운 방법을 계속 탐구하고 있습니다.

  1. LoRA 및 QLoRA: 이러한 기술은 미세 조정을 위해 대규모 매개변수 집합을 직접 업데이트하는 대신 더 작은 잔차 어댑터 모듈을 훈련하여 미리 훈련된 LLM을 새로운 지식으로 업데이트합니다. 이것은 모델의 성능을 유지하면서 상당한 메모리 절약을 제공합니다.
  2. FlashAttention: 셀프 어텐션 메커니즘은 트랜스포머 모델에서 메모리 및 컴퓨팅 병목 현상입니다. FlashAttention은 표준 어텐션을 선형 복잡도로 근사하여 입력 시퀀스 길이에 대한 메모리 요구 사항을 2차에서 선형으로 줄입니다.
  3. 전문가 混合: 이 접근 방식은 각 입력 데이터 샘플을 전문가 모델의 하위 집합으로 라우팅하여 전체 모델을 통해 처리하는 대신 동적 희소성을 달성하여 샘플당 일부 전문가만 활성화하여 메모리를 절약합니다.
  4. 역 모델 수술: 연구자들은 모델의 중요하지 않은 구성 요소를 제거하여 메모리/속도와 정확도 사이의 트레이드오프를 거래하는 모델 압축을 탐구했습니다.
  5. 오프로딩: 마지막으로, 매개변수, 옵티마이저 상태 또는 활성화를 CPU RAM 또는 디스크로 오프로딩하는 기술은 대규모 모델에 대한 제한된 GPU 메모리를 보완할 수 있습니다.

이러한 최신 기술은 효율적인 LLM 훈련 및 배포를 민주화하기 위해 집중된 연구 생태계를 보여줍니다.

결론

대형 언어 모델의 메모리 요구 사항은 현실 세계 응용 프로그램에서 이러한 모델을广泛하게 채택하는 데重大한 도전을 제기합니다. 메모리 추정 기술을 이해하고 양자화, 분산 훈련 전략 및 새로운 혁신을 활용함으로써 우리는 자원 제한된 장치에서 LLM 배포를 최적화할 수 있습니다.

LLMem과 같은 도구는 메모리 추정을 통해 사용자가 메모리 부족 문제를 피하고 훈련 시간을 최소화하는 가장 효율적인 분산 미세 조정 구성으로 선택할 수 있도록 도와줍니다. 하드웨어가 발전하고 연구가 진행됨에 따라 우리는 더 효율적인 LLM 훈련 및 추론을 기대할 수 있으며, 이는 자연어 처리 및 인공 지능의 발전에 힘을 실어줄 것입니다.

모델 용량, 정확도 및 자원 사용 사이의 적절한 균형을 찾는 것이 대형 언어 모델의 전체 잠재력을 다양한 도메인 및 사용 사례에서 실현하는 데 중요할 것입니다. 메모리 최적화 기술을 채택함으로써 우리는 상태-of-the-art 언어 AI가 접근 가능, 확장 가능 및 지속 가능한 미래로 나아갑니다.

지난 5년 동안私は Machine Learning과 Deep Learning의 매혹적인 세계에 몰두해 왔습니다.私の熱情と専門知識は私を50以上의多様한 소프트웨어 엔지니어링 프로젝트에 기여하게 했으며, 특히 AI/ML에 중점을 두었습니다.私の継続的な 호기심은 또한私를自然어 처리로 끌어들였습니다.私は이 분야를さらに 탐구하기를熱望합니다.