Accelerate documentation
Квантование моделей
Квантование моделей
Интеграция с 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