Transformers documentation
AWQ
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) |
|---|---|---|---|---|---|
| 1 | 32 | 32 | 60.0984 | 38.4537 | 4,50 ГБ (5,68%) |
| 1 | 64 | 64 | 1333.67 | 31.6604 | 4,50 ГБ (5,68%) |
| 1 | 128 | 128 | 2434.06 | 31.6272 | 4,50 ГБ (5,68%) |
| 1 | 256 | 256 | 3072.26 | 38.1731 | 4,50 ГБ (5,68%) |
| 1 | 512 | 512 | 3184.74 | 31.6819 | 4,59 ГБ (5,80%) |
| 1 | 1024 | 1024 | 3148.18 | 36.8031 | 4,81 ГБ (6,07%) |
| 1 | 2048 | 2048 | 2927.33 | 35.2676 | 5,73 ГБ (7,23%) |
| Размер батча | Длина префилла | Длина декодирования | Токены префилла/с | Токены/с при декодировании | Память (VRAM) |
|---|---|---|---|---|---|
| 1 | 32 | 32 | 81.4899 | 80.2569 | 4,00 ГБ (5,05%) |
| 1 | 64 | 64 | 1756.1 | 106.26 | 4,00 ГБ (5,05%) |
| 1 | 128 | 128 | 2479.32 | 105.631 | 4,00 ГБ (5,06%) |
| 1 | 256 | 256 | 1813.6 | 85.7485 | 4,01 ГБ (5,06%) |
| 1 | 512 | 512 | 2848.9 | 97.701 | 4,11 ГБ (5,19%) |
| 1 | 1024 | 1024 | 3044.35 | 87.7323 | 4,41 ГБ (5,57%) |
| 1 | 2048 | 2048 | 2715.11 | 89.4709 | 5,57 ГБ (7,04%) |
Скорость и пропускная способность слиянных и неслиянных модулей также были протестированы с помощью библиотеки optimum-benchmark.
Для архитектур, не поддерживающих объединённые модули, создайте AwqConfig и задайте собственное сопоставление для объединения в modules_to_fuse, чтобы определить, какие модули необходимо объединить.
Приведённый ниже пример объединяет модули AWQ модели TheBloke/Yi-34B-AWQ.
import torch
from transformers import AwqConfig, AutoModelForCausalLM
quantization_config = AwqConfig(
bits=4,
fuse_max_seq_len=512,
modules_to_fuse={
"attention": ["q_proj", "k_proj", "v_proj", "o_proj"],
"layernorm": ["ln1", "ln2", "norm"],
"mlp": ["gate_proj", "up_proj", "down_proj"],
"use_alibi": False,
"num_attention_heads": 56,
"num_key_value_heads": 8,
"hidden_size": 7168
}
)
model = AutoModelForCausalLM.from_pretrained(
"TheBloke/Yi-34B-AWQ",
quantization_config=quantization_config
).to(0)Параметр modules_to_fuse должен включать следующие ключи.
"attention": имена слоев внимания, которые необходимо объединить в следующем порядке: проекция query, проекция key, проекция value и проекция output. Если вы не хотите объединять эти слои, передайте пустой список."layernorm": имена всех слоёв LayerNorm, которые вы хотите заменить на собственный слиянный (fused) LayerNorm. Если вы не хотите сливать эти слои, передайте пустой список."mlp": имена слоёв MLP, которые вы хотите объединить в один слой MLP, в следующем порядке: (gate (dense, layer, post-attention) / up / down)."use_alibi": если ваша модель использует позиционное встраивание ALiBi."num_attention_heads": количество головок внимания."num_key_value_heads": количество ключевых и value-голов, используемых для реализации Grouped Query Attention (GQA).значение параметра attention num_key_value_heads=num_attention_headsМногоголовное внимание num_key_value_heads=1Multi-Query Attention num_key_value_heads=...Grouped Query Attention "hidden_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