AI 모델 및 플랫폼
대형 언어 모델의 추론 및 미세 조정에 대한 메모리 최적화
대형 언어 모델(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("bigcode/octocoder", torch_dtype=torch.bfloat16, device_map="auto", pad_token_id=0) tokenizer = AutoTokenizer.from_pretrained("bigcode/octocoder") pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)</p> <p>prompt = "질문: 바이트를 기گابايت로 변환하는 Python 함수를 작성해 주세요.\n\n답변:" result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][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비트 양자화에서 메모리 절약을 보겠습니다.
&lt;/div&gt; # 8비트 양자화 model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_8bit=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())</pre>
출력:
15.219234466552734# 4비트 양자화 model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_4bit=True, low_cpu_mem_usage=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())
출력:
9.5435743331909188비트 양자화로 메모리 요구 사항이 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 메모리 제약을 극복하기 위해 대형 모델에 대한 여러 분산 미세 조정 방법이 제안되었습니다.
- 데이터 병렬성: 데이터 병렬성 접근 방식은 여러 GPU에 걸쳐 전체 모델을 복제하고 훈련 데이터 배치를 분할 및 분산합니다. 이것은 훈련 시간을 GPU 수와 선형적으로 줄입니다. 그러나 각 GPU의 피크 메모리 요구 사항을 줄이지는 않습니다.
- ZeRO Stage 3: 데이터 병렬성의 고급 형태로, 모델 매개변수, 기울기 및 옵티마이저 상태를 GPU에 분할합니다. 이것은 각 GPU에서 필요한 분할 데이터만 유지함으로써 메모리를 절약합니다.
- 텐서 병렬성: 모델을 복제하는 대신 텐서 병렬성은 모델 매개변수를 행 또는 열로 분할하여 GPU에 분산합니다. 각 GPU는 매개변수, 기울기 및 옵티마이저 상태의 분할 집합을 작동합니다. 이것은 상당한 메모리 절약을 제공합니다.
- 파이프라인 병렬성: 이 기술은 모델 레이어를 다른 GPU/작업자에 분할합니다. 각 장치는 레이어의 하위 집합을 실행하고 활성화는 작업자 사이에서 전달됩니다. 이것은 피크 메모리를 줄이지만 통신 오버헤드를 증가시킵니다.
이러한 분산 방법에 대한 메모리 사용량을 추정하는 것은 매개변수, 기울기, 활성화 및 옵티마이저 상태의 분산이 기술에 따라 다르기 때문에 비트리입니다. 또한 트랜스포머 본문과 언어 모델 헤드와 같은 다른 구성 요소는 다른 메모리 할당 동작을 나타낼 수 있습니다.
LLMem 솔루션
연구자들은 최근에 LLMem을 제안했습니다. 이는 분산 미세 조정 방법을 여러 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%를 달성합니다.













