Accelerate documentation
모델 양자화
모델 양자화
bitsandbytes 통합
Accelerate는 bitsandbytes 양자화를 모델에 적용합니다. 이제 몇 줄의 코드로 모든 pytorch 모델을 8비트 또는 4비트로 로드할 수 있습니다.
bitsandbytes와 함께 Transformers 모델을 사용하려면 이 문서를 따라야 합니다.
bitsandbytes 양자화가 어떻게 작동하는지 자세히 알아보려면 8-bit 양자화와 4-bit 양자화에 대한 블로그 포스트를 확인해 보세요.
사전 요구 사항
다음 요구 사항을 설치해야 합니다:
bitsandbytes라이브러리 설치
pip install bitsandbytes
cuda가 아닌 디바이스의 경우, 여기의 bitsandbytes 설치 가이드를 참고할 수 있습니다.
- 소스에서 최신
accelerate설치
pip install git+https://github.com/huggingface/accelerate.git
- 예제를 실행하려면
minGPT와huggingface_hub를 설치합니다
git clone https://github.com/karpathy/minGPT.git
pip install minGPT/
pip install huggingface_hub작동 방식
먼저 모델을 초기화해야 합니다. 메모리를 절약하기 위해 컨텍스트 매니저 init_empty_weights()를 사용하여 빈 모델을 초기화할 수 있습니다.
minGPT 라이브러리의 GPT2 모델을 살펴보겠습니다.
from accelerate import init_empty_weights
from mingpt.model import GPT
model_config = GPT.get_default_config()
model_config.model_type = 'gpt2-xl'
model_config.vocab_size = 50257
model_config.block_size = 1024
with init_empty_weights():
empty_model = GPT(model_config)그 다음, 모델의 가중치 경로를 가져와야 합니다. 경로는 state_dict 파일(예: “pytorch_model.bin”)이거나 샤드된 체크포인트를 포함하는 폴더일 수 있습니다.
from huggingface_hub import snapshot_download
weights_location = snapshot_download(repo_id="marcsun13/gpt2-xl-linear-sharded")마지막으로, BnbQuantizationConfig를 사용하여 양자화 구성을 설정해야 합니다.
8-bit 양자화의 예시입니다:
from accelerate.utils import BnbQuantizationConfig
bnb_quantization_config = BnbQuantizationConfig(load_in_8bit=True, llm_int8_threshold = 6)4-bit 양자화의 예시입니다:
from accelerate.utils import BnbQuantizationConfig
bnb_quantization_config = BnbQuantizationConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4")선택한 구성으로 빈 모델을 양자화하려면 load_and_quantize_model()을 사용해야 합니다.
from accelerate.utils import load_and_quantize_model
quantized_model = load_and_quantize_model(empty_model, weights_location=weights_location, bnb_quantization_config=bnb_quantization_config)8비트 모델 저장 및 로드
accelerate의 save_model()을 사용하여 8-bit 모델을 저장할 수 있습니다.
from accelerate import Accelerator
accelerate = Accelerator()
new_weights_location = "path/to/save_directory"
accelerate.save_model(quantized_model, new_weights_location)
quantized_model_from_saved = load_and_quantize_model(empty_model, weights_location=new_weights_location, bnb_quantization_config=bnb_quantization_config, device_map = "auto")4-bit 모델 직렬화는 현재 지원되지 않습니다.
cpu 및 disk로 모듈 오프로드
GPU에 전체 모델을 저장할 공간이 부족하면 일부 모듈을 cpu/disk로 offload할 수 있습니다. 이 기능은 내부적으로 big model inference를 사용합니다. 자세한 내용은 이 문서를 참고하세요.
8-bit 양자화의 경우, 선택된 모듈은 8-bit 정밀도로 변환됩니다.
4-bit 양자화의 경우, 선택된 모듈은 사용자가 BnbQuantizationConfig에 전달한 torch_dtype로 유지됩니다. 4-bit 직렬화가 가능해지면, 이러한 오프로드된 모듈을 4-bit로 변환하는 기능을 지원할 예정입니다.
모듈을 cpu/disk로 offload하려면 커스텀 device_map만 전달하면 됩니다. offload된 모듈은 필요할 때 GPU로 dispatch됩니다. 예시는 다음과 같습니다:
device_map = {
"transformer.wte": 0,
"transformer.wpe": 0,
"transformer.drop": 0,
"transformer.h": "cpu",
"transformer.ln_f": "disk",
"lm_head": "disk",
}양자화된 모델 파인튜닝
이 모델에서 순수한 8bit 또는 4bit 학습을 수행할 수 없습니다. 그러나 매개변수 효율적 미세 조정(PEFT) 방법을 활용하여 이 모델들을 학습할 수 있으며, 예를 들어 그 위에 어댑터를 학습할 수 있습니다. 자세한 내용은 peft 라이브러리를 참고하세요.
현재 양자화된 모델 위에 어댑터를 추가할 수 없습니다. 그러나 Transformers 모델에 대한 어댑터의 공식 지원 덕분에 양자화된 모델을 파인튜닝할 수 있습니다. Transformers 모델을 파인튜닝하려면 대신 이 문서를 따르세요. 4-bit Transformers 모델을 파인튜닝하는 방법에 대한 이 데모를 확인해 보세요.
모델을 학습용으로 로드할 때 device_map을 전달할 필요가 없습니다. 모델이 자동으로 GPU에 로드됩니다. device_map=auto는 추론에만 사용해야 한다는 점에 유의하세요.
예시 데모 - Google Colab에서 GPT2 1.5b 실행
GPT2 모델에서 양자화 모델을 실행하는 Google Colab 데모를 확인해 보세요. GPT2-1.5B 모델 체크포인트는 FP32로 6GB의 메모리를 사용합니다. 양자화 후 8-bit 모듈을 사용하면 1.6GB, 4-bit 모듈을 사용하면 1.2GB의 메모리를 사용합니다.
Update on GitHub