Что внутри
Table | |
|---|
| Схема | W4A16_ASYM (asymmetric, zero-point) |
| Group size | 128 |
| Стратегия | group, type: int, num_bits: 4 |
| Формат | compressed-tensors / pack-quantized |
| Активации | BF16 (weight-only) |
| Калибровка | HuggingFaceH4/ultrachat_200k, 256 сэмплов × 2048 токенов, через chat template |
| Размер | 19 GB (было 52 GB в BF16) |
Что квантовано, а что осталось в BF16
Qwen3.8-27B — гибрид: 64 слоя по схеме 16 × (3 × Gated DeltaNet → 1 × Gated Attention),
плюс vision-башня и MTP-голова.
В INT4:
- Gated Attention (слои 3, 7, …, 63):
q_proj, k_proj, v_proj, o_proj
- FFN всех 64 слоёв:
gate_proj, up_proj, down_proj
- Gated DeltaNet (остальные 48 слоёв):
in_proj_qkv, in_proj_z, out_proj
Остались в BF16:
lm_head и эмбеддинги
- вся vision-башня (
model.visual.*) — квантование визуального энкодера бьёт по качеству
распознавания сильнее, чем экономит память
linear_attn.in_proj_a / in_proj_b — чувствительные гейты SSM-ветки
- вся MTP-голова (
mtp.*) — чтобы не ломать спекулятивный декодинг
Про MTP. transformers не инстанцирует MTP-голову для qwen3_5, поэтому
llm-compressor её не видит и не сохраняет — наивный квант теряет MTP целиком.
Здесь тензоры mtp.* скопированы из исходного BF16-чекпоинта в готовый результат,
зарегистрированы в model.safetensors.index.json и внесены в
quantization_config.ignore. Спекулятивный декодинг сохранён.
Про AWQ-mappings. У гибридной архитектуры нет общего для всех слоёв набора проекций,
поэтому дефолтные маппинги AWQ не резолвятся. В recipe.yaml лежат кастомные: отдельный
маппинг для input_layernorm full-attention слоёв и отдельный — для DeltaNet-слоёв,
где в balance_layers обязаны быть все потребители выхода нормы, включая
неквантуемые in_proj_a / in_proj_b, иначе сглаживание ломает математику.
Использование (vLLM)
vllm serve Ar4ikov/Qwen3.8-27B-Uncensored-AWQ-W4A16-ASYM \
--max-model-len 262144 \
--tensor-parallel-size 2
from transformers import AutoModelForImageTextToText, AutoProcessor
model = AutoModelForImageTextToText.from_pretrained(
"Ar4ikov/Qwen3.8-27B-Uncensored-AWQ-W4A16-ASYM", dtype="auto", device_map="auto"
)
processor = AutoProcessor.from_pretrained("Ar4ikov/Qwen3.8-27B-Uncensored-AWQ-W4A16-ASYM")
transformers при загрузке распаковывает веса обратно в BF16, так что экономии VRAM
здесь не будет. Реальная экономия видна только в рантаймах с нативными INT4-ядрами
(vLLM, SGLang): ожидаемо ≈ размер файла + KV-кэш.
Параметры сэмплирования
Наследуются от базовой модели:
- Thinking mode:
temperature=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0
- Non-thinking:
temperature=0.7, top_p=0.80, top_k=20, min_p=0.0, presence_penalty=1.5
Поддерживается reasoning_effort (low / medium / xhigh), контекст 262 144 токена нативно.
Воспроизводимость
В репозитории лежит recipe.yaml, сгенерированный llm-compressor. Ключевая часть:
from llmcompressor.modifiers.awq import AWQModifier
recipe = [AWQModifier(
targets=["Linear"],
scheme="W4A16_ASYM",
ignore=[
"re:.*lm_head",
r"re:model\.visual\..*",
r"re:.*\.linear_attn\.in_proj_a",
r"re:.*\.linear_attn\.in_proj_b",
r"re:mtp\..*",
],
mappings=MAPPINGS,
)]
Оговорки
- Квантовано 400 Linear-слоёв (64×3 MLP + 16×4 full-attention + 48×3 DeltaNet);
400 тензоров
weight_packed (I32-упаковка INT4) с weight_scale и weight_zero_point.
- Квант не проходил бенчмарк-валидацию — проверена только связность генерации.
Для продакшена прогоните свои эвалы.
- Vision-часть не квантовалась, поэтому качество на изображениях должно быть близко
к исходной модели; деградация ожидается прежде всего в текстовой части.
- Базовая модель — uncensored-файнтюн; квантование не добавляет и не снимает никаких
ограничений, поведение наследуется от
orcarouter/Qwen3.8-27B-Uncensored.