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 brings bitsandbytes quantization to your model. You can now load any pytorch model in 8-bit or 4-bit with a few lines of code.

Если вы хотите использовать модели Transformers с bitsandbytes, следуйте этой документации.

Чтобы узнать больше о том, как работает квантование bitsandbytes, ознакомьтесь с блогами об 8-битном квантовании и 4-битном квантовании.

Предварительные требования

Вам потребуется установить следующие зависимости:

  • Установите библиотеку 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().

Возьмём модель GPT2 из библиотеки minGPT.

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-битного квантования:

from accelerate.utils import BnbQuantizationConfig
bnb_quantization_config = BnbQuantizationConfig(load_in_8bit=True, llm_int8_threshold = 6)

Вот пример 4-битного квантования:

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-битной модели

Вы можете сохранить вашу 8-битную модель с помощью accelerate, используя save_model().

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-битном формате в настоящее время не поддерживается.

Перенос модулей на cpu и диск

Вы можете выгружать некоторые модули на CPU/диск, если на ваших GPU недостаточно места для хранения всей модели. Под капотом для этого используется big model inference. Подробности — в этой документации.

Для 8-битного квантования выбранные модули будут преобразованы в 8-битную точность.

Для 4-битного квантования выбранные модули будут храниться в torch_dtype, переданном пользователем в BnbQuantizationConfig. Мы добавим поддержку преобразования этих выгруженных модулей в 4-битный формат, когда станет возможным 4-битное сериализация.

Достаточно передать пользовательский device_map, чтобы выгружать модули на cpu/disk. Модули, выгруженные на cpu/disk, будут автоматически перемещаться на GPU по мере необходимости. Пример:

device_map = {
    "transformer.wte": 0,
    "transformer.wpe": 0,
    "transformer.drop": 0,
    "transformer.h": "cpu",
    "transformer.ln_f": "disk",
    "lm_head": "disk",
}

Доработка квантованной модели

Выполнить обучение этих моделей в чистом 8-битном или 4-битном режиме невозможно. Однако вы можете обучать эти модели, используя методы эффективной дообучения (PEFT), например, обучая адаптеры поверх них. Подробности смотрите в библиотеке peft.

В настоящее время вы не можете добавлять адаптеры поверх любой квантованной модели. Однако благодаря официальной поддержке адаптеров в моделях Transformers вы можете выполнять дообучение квантованных моделей. Если вы хотите дообучить модель Transformers, следуйте этой документации. Посмотрите эту демонстрацию о том, как дообучить 4-битную модель Transformers.

Обратите внимание, что при загрузке модели для обучения не нужно передавать device_map. Модель будет автоматически загружена на ваш GPU. Пожалуйста, имейте в виду, что device_map=auto следует использовать только для инференса.

Пример демонстрации — запуск GPT2 1.5b на Google Colab

Ознакомьтесь с демо в Google Colab для запуска квантованных моделей на модели GPT2. Чекпоинт модели GPT2-1.5B в формате FP32 занимает 6 ГБ памяти. После квантования он занимает 1,6 ГБ с 8-битными модулями и 1,2 ГБ с 4-битными модулями.

Update on GitHub