Transformers documentation

AWQ

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

AWQ

Квантование весов с учётом активаций (AWQ) сохраняет небольшую долю весов, критически важных для производительности LLM, что позволяет сжать модель до 4 бит с минимальной потерей качества.

Существует несколько библиотек для квантования моделей с использованием алгоритма AWQ, например llm-awq, autoawq или optimum-intel. Transformers поддерживает загрузку моделей, квантованных с помощью библиотек llm-awq и autoawq. В этом руководстве показано, как загружать модели, квантованные с помощью autoawq, однако процесс аналогичен для моделей, квантованных с помощью llm-awq.

Выполните команду ниже, чтобы установить autoawq

pip install autoawq

AutoAWQ понижает версию Transformers до 4.47.1. Если вы планируете выполнять инференс с помощью AutoAWQ, возможно, вам потребуется переустановить вашу версию Transformers после установки AutoAWQ.

Чтобы определить модель, квантованную с помощью AWQ, проверьте ключ quant_method в файле config.json модели.

{
  "_name_or_path": "/workspace/process/huggingfaceh4_zephyr-7b-alpha/source",
  "architectures": [
    "MistralForCausalLM"
  ],
  ...
  ...
  ...
  "quantization_config": {
    "quant_method": "awq",
    "zero_point": true,
    "group_size": 128,
    "bits": 4,
    "version": "gemm"
  }
}

Загрузите модель, квантованную с помощью AWQ, с помощью from_pretrained(). По соображениям производительности остальные веса по умолчанию устанавливаются в формат fp16. Используйте параметр dtype, чтобы загрузить эти веса в другом формате.

Если модель загружена на CPU, используйте параметр device_map, чтобы переместить её на ускоритель.

from transformers import AutoModelForCausalLM, AutoTokenizer
from accelerate import Accelerator
import torch

device = Accelerator().device

model = AutoModelForCausalLM.from_pretrained(
  "TheBloke/zephyr-7B-alpha-AWQ",
  dtype=torch.float32,
  device_map=device
)

Используйте attn_implementation, чтобы включить FlashAttention2 и дополнительно ускорить инференс.

from transformers import AutoModelForCausalLM, AutoTokenizer
from accelerate import Accelerator

model = AutoModelForCausalLM.from_pretrained(
  "TheBloke/zephyr-7B-alpha-AWQ",
  attn_implementation="flash_attention_2",
  device_map=Accelerator().device
)

Слитные модули

Сплочённые модули обеспечивают повышенную точность и производительность. Они поддерживаются из коробки для AWQ-модулей архитектур Llama и Mistral, но вы также можете объединять AWQ-модули для неподдерживаемых архитектур.

Слиянные модули не могут использоваться в сочетании с другими методами оптимизации, такими как FlashAttention2.

поддерживаемые архитектуры
неподдерживаемые архитектуры

Создайте AwqConfig и установите параметры fuse_max_seq_len и do_fuse=True, чтобы включить слияние модулей. Параметр fuse_max_seq_len задаёт общую длину последовательности и должен учитывать длину контекста и ожидаемую длину генерации. Для надёжности установите значение с запасом.

Приведённый ниже пример объединяет модули AWQ модели TheBloke/Mistral-7B-OpenOrca-AWQ.

import torch
from transformers import AwqConfig, AutoModelForCausalLM

quantization_config = AwqConfig(
    bits=4,
    fuse_max_seq_len=512,
    do_fuse=True,
)
model = AutoModelForCausalLM.from_pretrained(
  "TheBloke/Mistral-7B-OpenOrca-AWQ",
  quantization_config=quantization_config
).to(0)

Модель TheBloke/Mistral-7B-OpenOrca-AWQ была протестирована с batch_size=1 как с объединёнными модулями, так и без них.

Необъединённый модуль
Размер батчаДлина префиллаДлина декодированияТокены префилла/сТокены/с при декодированииПамять (VRAM)
1323260.098438.45374,50 ГБ (5,68%)
164641333.6731.66044,50 ГБ (5,68%)
11281282434.0631.62724,50 ГБ (5,68%)
12562563072.2638.17314,50 ГБ (5,68%)
15125123184.7431.68194,59 ГБ (5,80%)
1102410243148.1836.80314,81 ГБ (6,07%)
1204820482927.3335.26765,73 ГБ (7,23%)
Слитный модуль
Размер батчаДлина префиллаДлина декодированияТокены префилла/сТокены/с при декодированииПамять (VRAM)
1323281.489980.25694,00 ГБ (5,05%)
164641756.1106.264,00 ГБ (5,05%)
11281282479.32105.6314,00 ГБ (5,06%)
12562561813.685.74854,01 ГБ (5,06%)
15125122848.997.7014,11 ГБ (5,19%)
1102410243044.3587.73234,41 ГБ (5,57%)
1204820482715.1189.47095,57 ГБ (7,04%)

Скорость и пропускная способность слиянных и неслиянных модулей также были протестированы с помощью библиотеки optimum-benchmark.

generate throughput per batch size
память, потребляемая в прямом проходе / размер батча
forward latency per batch size
производительность/размер пакета

ExLlamaV2

Ядра ExLlamaV2 обеспечивают более быстрое префилл и декодирование. Выполните команду ниже, чтобы установить последнюю версию autoawq с поддержкой ExLlamaV2.

pip install git+https://github.com/casper-hansen/AutoAWQ.git

Установите version="exllama" в AwqConfig, чтобы включить ядра ExLlamaV2.

ExLlamaV2 поддерживается на GPU AMD.

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, AwqConfig

quantization_config = AwqConfig(version="exllama")

model = AutoModelForCausalLM.from_pretrained(
    "TheBloke/Mistral-7B-Instruct-v0.1-AWQ",
    quantization_config=quantization_config,
    device_map="auto",
)

Ресурсы

Запустите ноутбук с демо AWQ, чтобы увидеть больше примеров квантования модели, загрузки квантованной модели на Hub и других задач.

Update on GitHub