Transformers documentation

GPTQ

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

and get access to the augmented documentation experience

to get started

GPTQ

Проект GPT-QModel (Python-пакет gptqmodel) реализует алгоритм GPTQ — метод постобучающей квантизации, при котором каждая строка матрицы весов квантуется независимо, чтобы найти вариант весов, минимизирующий ошибку. Эти веса квантуются до int4, но во время инференса они на лету восстанавливаются до fp16. Это позволяет сократить потребление памяти в 4 раза, поскольку int4-веса деквантуются в слиянном ядре, а не в глобальной памяти GPU. Инференс также становится быстрее, так как меньшая разрядность требует меньше времени на передачу данных.

AutoGPTQ больше не поддерживается в Transformers. Вместо этого установите GPT-QModel.

Сначала установите Accelerate, Transformers и Optimum.

pip install --upgrade accelerate optimum transformers

Затем выполните команду ниже, чтобы установить GPT-QModel.

pip install gptqmodel --no-build-isolation

Создайте класс GPTQConfig и задайте количество бит для квантования, набор данных для калибровки весов при квантовании, а также токенизатор для подготовки набора данных.

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)

Вы можете передать собственный набор данных в виде списка строк, однако настоятельно рекомендуется использовать тот же набор данных, что и в статье GPTQ.

dataset = ["gptqmodel is an easy-to-use model quantization library with user-friendly apis, based on the GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)

Load a model to quantize and pass GPTQConfig to from_pretrained(). Set device_map="auto" to automatically offload the model to a CPU to help fit the model in memory, and allow the model modules to be moved between the CPU and GPU for quantization.

quantized_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m", device_map="auto", quantization_config=gptq_config)

Если память заканчивается из-за слишком большого размера набора данных (разгрузка на диск не поддерживается), попробуйте передать параметр max_memory, чтобы задать объём памяти, который будет использоваться на вашем устройстве (GPU и CPU).

quantized_model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-125m",
    device_map="auto",
    max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"},
    quantization_config=gptq_config
)

Время квантования модели с нуля зависит от вашего оборудования. Квантование модели facebook/opt-350m на бесплатном GPU в Google Colab занимает около 5 минут, тогда как квантование модели с 175 млрд параметров на NVIDIA A100 может занять около 4 часов. Перед квантованием модели рекомендуется проверить, существует ли на Hub уже GPTQ-квантованная версия этой модели.

После квантования модели можно использовать push_to_hub(), чтобы загрузить модель и токенизатор на Hub, где их легко распространять и использовать. При этом сохраняется GPTQConfig.

quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")

save_pretrained() сохраняет квантованную модель локально. Если модель была квантована с параметром device_map, перед сохранением убедитесь, что вся модель перемещена на GPU или CPU. В примере ниже модель сохраняется на CPU.

quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")

# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")

Загрузите квантованную модель с помощью from_pretrained() и установите device_map="auto", чтобы автоматически распределить модель по всем доступным GPU, что позволит загрузить её быстрее, не используя больше памяти, чем необходимо.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")

Marlin

Marlin — это CUDA-ядро GPTQ, работающее только с 4-битным квантованием, высоко оптимизированное для архитектуры NVIDIA A100 GPU (Ampere). Загрузка, деквантование и выполнение вычислений с деквантованными весами высоко параллелизованы, что обеспечивает значительное ускорение инференса по сравнению с исходным CUDA-ядром GPTQ. Marlin доступен только для квантованного инференса и не поддерживает квантование моделей.

Вывод Marlin можно активировать с помощью параметра backend в GPTQConfig.


from transformers import AutoModelForCausalLM, GPTQConfig

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=GPTQConfig(bits=4, backend="marlin"))

GPT-QModel

GPT-QModel — это активно поддерживаемый бэкенд для GPTQ в Transformers. Изначально он был выделен из AutoGPTQ, но впоследствии существенно доработан: добавлены более быстрая квантизация, меньшее потребление памяти и более точные значения по умолчанию.

GPT-QModel обеспечивает асимметричную квантизацию, которая потенциально позволяет снизить ошибки квантизации по сравнению с симметричной квантизацией. Он не является обратно совместимым с устаревшими контрольными точками AutoGPTQ, и не все ядра (Marlin) поддерживают асимметричную квантизацию.

GPT-QModel также обеспечивает более широкую поддержку новейших LLM-моделей, мультимодальных моделей (Qwen2-VL и Ovis1.6-VL), платформ (Linux, macOS, Windows 11) и аппаратных средств (AMD ROCm, Apple Silicon, CPU Intel/AMD, а также GPU Intel Datacenter Max/Arc и др.).

Ядра Marlin также обновлены для GPU A100, а другие ядра обновлены для включения автоматического выравнивания (auto-padding) для устаревших моделей и моделей с неравномерными входными/выходными размерами.

Ресурсы

Выполните квантование GPTQ с PEFT в ноутбуке, чтобы получить практический опыт.

Update on GitHub