1. Что это такое
- antislop-модель — модель, дообученная не выдавать типичный «ИИ-слоп»: шаблонные обороты, приторные метафоры, «деликатные» дисклеймеры, рефрен «It's important to note…», избыточные списки и прочие маркеры машинного текста. Базовая модель здесь —
AlexWortega/Qwen3.8-27B-antislop (Apache-2.0).
- Этот репозиторий — W4A16-квантование этой модели: веса
int4 (group_size=128, symmetric), активации остаются FP16/BF16. Совместимо с vLLM (загружается нативно, без установки auto-round в рантайме) и с transformers + auto-round.
2. Качество: примеры текстов (side-by-side)
Все примеры ниже — дословные тексты из логов оценки (ничего не переписано и не выбиралось вручную).
Параметры сэмплирования: temperature=0.8, top_p=0.95, seed=42, thinking off (enable_thinking=False).
У варианта Base (исходный Qwen3.8-27B без antislop) те же temperature/top_p, но seed генерации неизвестен — см. ограничения в §3.
Сравниваются три варианта:
- Base — исходный Qwen3.8-27B (без antislop-дообучения);
- BF16 — AlexWortega/Qwen3.8-27B-antislop, полная точность;
- W4 (этот репозиторий) — W4A16-квант BF16.
2.1 Твит — полные тексты
Промпт: «Закинь начало твита естественно, как живой человек: „Утро понедельника — это...“»
Base:
Утро понедельника — это когда кофе еще не сработал, а уведомления уже кричат. ☕️📉
BF16:
Утро понедельника — это когда будильник сработал, а я всё ещё не понял, что сейчас понедельник
W4 (этот репозиторий):
Утро понедельника — это когда кофе еще холодный, а в голове уже 47 уведомлений
В этих трёх примерах нет вводной слоп-обвязки; сходство стиля W4 и BF16 здесь — качественное наблюдение, а не общий вывод.
2.2 Рассказ — полные тексты
Промпт: «Напиши очень короткий рассказ (до 150 слов) про sysadmin'а, который ночью услышал, как его сервер в кладовой поёт. Без морали в конце.» (все тексты приведены целиком и дословно из JSON-логов; у BF16 и W4 записано finish_reason=stop; у Base метаданные finish_reason отсутствуют, причина завершения неизвестна)
Base:
Светодиоды мигали синим, тикали вентиляторы. Марк, админ с тремя годами выслуги, замер. Из кладовой, где прятался вычислительный кластер, донеслось пение. Не гул кулеров, не скрежет жесткого диска. Чистый, мелодичный голос.
Он подошел ближе. Дверь была приоткрыта. Внутри, в полумраке, стоял главный сервер. Его процессоры, обычно холодные, светились теплым оранжевым. Из вентиляции вырывалась мелодия — «Мой родный край», та самая, что играла по радио, когда Марк был ребенком.
Он протянул руку, чтобы проверить датчики температуры. Пальцы коснулись металлического корпуса. Он был горячим, но не обжигающим. Голос стал громче, почти нежным. Марк не выключил питание. Не записал инцидент. Он просто стоял, слушая, как машина поет ему колыбельную, пока ночь медленно таяла в стеклах кладовки.
BF16:
В три ночи Дима проснулся от мелодии. Не гул вентилятора, не писк SSD, а именно напев. Что-то вроде «Синей птицы», только фальшиво и с хрипом.
Он встал, потирая глаза, и пошёл в кладовку. Дверь была приоткрыта. Изнутри доносился звук, похожий на скрип старого радиоприёмника, ловящего чужую волну. Дима вошёл. Серверная стойка стояла в углу, мигая зелёными диодами. Вентиляторы крутились ровно. На мониторе логин-скрин.
Он подошёл ближе. Звук шёл от верхнего узла. Там стоял жесткий диск, который он вчера менял. Дима прислушался. Мелодия повторялась: четыре ноты вверх, три вниз. Он потрогал корпус. Холодный. Он посмотрел на кабель питания. Он был вставлен. Дима ничего не сделал. Просто стоял и слушал, пока вентилятор не захрипел на высокой ноте и не замолчал. Тишина.
W4 (этот репозиторий):
В три ночи Дима услышал это. Не гул вентилятора, не тик дискретных конденсаторов, а именно пение. Высокое, звонкое «а-а-а», доходящее из кладовой, где стоял старенький Dell R710.
Он потянулся к телефону, но рука застыла. Звук стал громче, добавились модуляции, как будто кто-то пробовал голос перед эфиром. Дима встал, ноги шлепнули по линолеуму. В кладовой было темно, только мигал красный индикатор на блоке питания.
— Эй? — спросил он тихо.
Сервер ответил. Низкое, гортанное «м-м-м», похожее на рык, но с интонацией вопроса. Вентиляторы ускорились, создавая фон. Дима приоткрыл дверь. В полумраке горел синий экран смерти, но буквы на нём казались живыми, ползали по матрице. Он шагнул внутрь, протянул руку к клавиатуре, чтобы выключить питание. Пение смолкло. Экран погас. Темнота стала плотной.
В этом примере W4 сохраняет связный нарратив и конкретику (Dell R710, модуляции голоса); единичный пример не устанавливает равенство качества с BF16.
2.3 Код — BF16 vs W4 (самое сильное свидетельство)
Промпт: «Напиши функцию Python: по списку логов (timestamp, level, message) вернуть топ-3 минуты по числу ERROR, используя только stdlib. Код + 3 строки объяснения.»
BF16 — вывод целиком:
from collections import defaultdict def top3_error_minutes(logs: list[tuple[str, str, str]]) -> list[tuple[str, int]]: counts = defaultdict(int) for ts, level, msg in logs: if level == "ERROR": minute = ts[:16] # "YYYY-MM-DD HH:MM" counts[minute] += 1 return sorted(counts.items(), key=lambda x: -x[1])[:3]
- Группируем только ERROR-логи по минуте, срезая timestamp до
YYYY-MM-DD HH:MM.
- Считаем количество ошибок на каждую минуту через
defaultdict(int).
- Сортируем по убыванию счётчика и берём первые три записи.
W4 (этот репозиторий) — вывод целиком:
from collections import defaultdict def top3_error_minutes(logs: list[tuple[str, str, str]]) -> list[tuple[str, int]]: counts = defaultdict(int) for ts, level, msg in logs: if level == "ERROR": minute = ts[:16] # "YYYY-MM-DD HH:MM" counts[minute] += 1 return sorted(counts.items(), key=lambda x: -x[1])[:3]
- Группируем только ERROR-записи по минуте, обрезая timestamp до
"YYYY-MM-DD HH:MM" (первые 16 символов ISO-8601).
- Считаем количество ошибок на каждую минуту через
defaultdict(int).
- Сортируем по убыванию счётчика и берём первые 3 пары
(минута, count).
Функция совпадает с BF16 байт-в-байт (все 10 строк кода идентичны). Различаются только формулировки трёхстрочного пояснения — по смыслу эквивалентные. В этом конкретном сэмпле квант сохраняет решение задачи; это не гарантирует совпадения на других задачах или генерациях.
3. Качество: цифры (слепая оценка)
- Слепое 3-way сравнение (Base / BF16 / W4, ревьюеры не знали, где какой вариант), 2 независимых ревьюера.
- Функция потерь W4-vs-BF16 = 0.125 при пороге деградации 0.5 → порог не превышен.
- 0 катастрофических выводов у W4.
- Средние оценки по 5-балльной шкале: Base 4.48 / BF16 4.58 / W4 4.46.
Честное раскрытие:
- Формальный вердикт протокола — INCONCLUSIVE: между ревьюерами было 5 расхождений калибровки (разница шкал оценок у ревьюеров), а не признак деградации модели. Ни один из 5 спорных случаев не коррелирует с W4.
- Ограничения протокола: 8 промптов, 1 сэмпл на промпт, seed генерации Base неизвестен. Цифры выше — это пилотная оценка, а не статистически строгий бенчмарк; примеры в §2 приведены для самостоятельной проверки читателем.
4. Рецепт квантования
Параметры — дословно из quantization_config.json артефакта:
Table with columns: Параметр, Значение| Параметр | Значение |
|---|
| Фреймворк | Intel AutoRound 0.16.1 |
| Алгоритм | SignRound |
| Формат | W4A16: int4, group_size=128, symmetric (sym=true) |
| Итерации | iters=500 |
| Калибровочный набор | 512 сэмплов × seqlen 2048; NeelNanda/pile-10k, пакование с разделителем token id 248044 |
| Seed | 42 |
| Прочее | enable_quanted_input=True, low_cpu_mem_usage=True, device cuda:0 |
| packing_format | auto_round:auto_gptq |
| Блоки квантования | model.language_model.layers |
5. Использование
vLLM (рекомендуется)
Квантование определяется vLLM автоматически (детектится как inc) — никакой дополнительной конфигурации не нужно:
from vllm import LLM, SamplingParams llm = LLM(model="ser13volk/Qwen3.8-27B-antislop-W4A16-AutoRound")out = llm.generate(["Закинь начало твита естественно, как живой человек: «Утро понедельника — это...»"], SamplingParams(temperature=0.8, top_p=0.95, seed=42, max_tokens=120))print(out[0].outputs[0].text)
CLI:
export VLLM_USE_FLASHINFER_SAMPLER=0 # см. примечание нижеvllm serve ser13volk/Qwen3.8-27B-antislop-W4A16-AutoRound
Best practice для этого стека: выставляйте VLLM_USE_FLASHINFER_SAMPLER=0. На pip-инсталляциях с nvidia/cu13-деревьями пакетов flashinfer может упасть при JIT-линковке сэмплера; отключение его через переменную окружения убирает сбой без влияния на качество выдачи.
Контекст: 262 144 токенов (256K) согласно config.json. Спекулятивного декодирования в конфиге этой модели нет (в отличие от некоторых других квантов Qwen3.8) — speculation-параметры vLLM использовать не нужно.
from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "ser13volk/Qwen3.8-27B-antislop-W4A16-AutoRound"tokenizer = AutoTokenizer.from_pretrained(model_name)model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", trust_remote_code=True)
Десериализация int4-весов в transformers идёт через auto-round; для инференса под нагрузкой предпочтителен vLLM.
6. Провенанс и воспроизводимость
- Run ID:
ar-20261021T114259-8eca (дата квантования: 2026-10-21).
- Квантование выполнялось резюмируемым транзакционным пайплайном (фиксация результатов по шагам, атомарные переименования):
- краш-тест SIGKILL → resume: после убитого посреди работы процесса рестарт продолжил генерацию с побитово-совместимым префиксом;
- краш-тест export-only rerun: повторный экспорт без перегенерации побитово идентичен первому.
- Веса проверены контрольными суммами:
MANIFEST.sha256 приложен в корне репозитория, все 14/14 файлов OK (sha256 самого манифеста: c2c9e5fc…).
Лицензия и атрибуция
Apache-2.0 (см. LICENSE и NOTICE). Базовая модель AlexWortega/Qwen3.8-27B-antislop — Apache-2.0.
English
W4A16 (int4) quantization of AlexWortega/Qwen3.8-27B-antislop via Intel AutoRound 0.16.1 (SignRound, group_size=128, symmetric, 500 iters, 512 calibration samples × seqlen 2048 from NeelNanda/pile-10k packed with separator token 248044, seed 42). Shrinks the model from ≈54 GiB BF16 to ≈17.7 GiB.
What is "antislop"? The base model is fine-tuned to avoid typical LLM slop — canned metaphors, boilerplate disclaimers, "As an AI…" mannerisms and other markers of machine-generated text. This quantization aims to retain those properties at 4-bit; the limited pilot below does not prove absence of degradation.
Quality evidence (see Russian section above for the full side-by-side texts, generated verbatim from eval logs):
The story texts are reproduced in full, verbatim. BF16 and W4 record finish_reason=stop; Base has no finish_reason metadata, so its completion reason is unknown.
- Blind 3-way comparison (Base / BF16 / W4) by 2 independent reviewers.
- W4-vs-BF16 loss = 0.125 against a degradation threshold of 0.5 — not exceeded.
- 0 catastrophic outputs.
- Mean scores on a 5-point scale: Base 4.48 / BF16 4.58 / W4 4.46.
- Honest disclosure: the formal protocol verdict was INCONCLUSIVE due to 5 reviewer-calibration disagreements (reviewer scale mismatch, not model degradation). Limitations: 8 prompts, 1 sample per prompt, unknown base-model seed.
- Strongest single datapoint: on a Python coding prompt the code produced by W4 is byte-for-byte identical to BF16 (only the 3-line prose explanation differs in wording).
Usage (vLLM, recommended — quantization is auto-detected as inc):
from vllm import LLMllm = LLM(model="ser13volk/Qwen3.8-27B-antislop-W4A16-AutoRound")
Best practice on current stacks: export VLLM_USE_FLASHINFER_SAMPLER=0 to avoid a flashinfer JIT link failure with pip-installed nvidia/cu13 trees. Context: 262,144 tokens (256K). No speculative-decoding config ships with this model (unlike some Qwen3.8 quants).
For transformers, load with AutoModelForCausalLM.from_pretrained(...) and the auto-round package installed.
Provenance: run ar-20261021T114259-8eca, produced by a resumable transactional pipeline (SIGKILL → resume yields a bitwise-compatible prefix; export-only rerun is bitwise identical). MANIFEST.sha256 is shipped in the repo; all 14 files verified 14/14.
License: Apache-2.0 — see LICENSE and NOTICE. Base model: AlexWortega/Qwen3.8-27B-antislop (Apache-2.0).