Accelerate documentation

모델 양자화

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

모델 양자화

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