Когда старый GPU выбирает нового чемпиона
Все говорят про Blackwell, H100, новые архитектуры. А у меня в стойке пылится Tesla P40 - карта 2016 года, которая до сих пор таскает модели по 30 миллиардов параметров. Когда в llama.cpp добавили MXFP4, все кричали про 25% ускорение на новых картах. Интересно, а что будет на старом Pascal?
На 01.02.2026 MXFP4 в llama.cpp все еще экспериментальный. На старых GPU могут быть сюрпризы - от вылетов до странных артефактов в выводе. Тестируйте перед продакшеном.
Зачем вообще это тестировать?
Потому что Q4_K_M стал де-факто стандартом. Все качают модели в этом формате, все его рекомендуют. Но стандарт - не значит оптимальный. Особенно когда появляется что-то новое.
MXFP4 (Microscaling Floating Point 4-bit) - это не просто еще один формат квантования. Это другой подход. Вместо равномерного деления диапазона значений, он использует плавающую точку с микроскейлингом. Проще говоря, он лучше сохраняет маленькие веса около нуля. А в нейросетях именно там часто прячется важная информация.
Что будем тестировать и как
Две модели, которые сейчас активно используют:
- GLM-4.7-Flash - китайская модель от Zhipu AI, 8B параметров. Оптимизирована для скорости, популярна в production.
- Nemotron-3-nano - 30B параметров от NVIDIA. Интересна тем, что изначально тренировалась с учетом квантования.
Тестовый стенд:
| Компонент | Характеристики |
|---|---|
| GPU | Tesla P40, 24 ГБ VRAM, архитектура Pascal |
| CPU | Intel Xeon E5-2690 v4, 14 ядер |
| RAM | 128 ГБ DDR4 |
| llama.cpp | Версия от 28.01.2026 (последняя на момент тестирования) |
1 Готовим датасет для теста перплексии
Перплексия - это метрика, которая показывает, насколько модель "удивлена" новыми данными. Чем ниже - тем лучше. Но чтобы измерить ее правильно, нужен хороший датасет.
Я не стал использовать стандартные бенчмарки. Вместо этого сгенерировал свой датасет - смесь технической документации, новостей и диалогов. Так картина получается ближе к реальному использованию.
import json
from datasets import load_dataset
import random
# Загружаем несколько источников
tech_docs = load_dataset("wikitext", "wikitext-103-v1", split="train[:1000]")
news = load_dataset("cnn_dailymail", "3.0.0", split="train[:500]")
dialogs = load_dataset("daily_dialog", split="train[:500]")
# Смешиваем в пропорции 50% техдоки, 30% новости, 20% диалоги
test_data = []
for doc in tech_docs:
if doc["text"] and len(doc["text"]) > 100:
test_data.append({
"text": doc["text"][:2000], # Обрезаем длинные тексты
"source": "wikitext"
})
for article in news:
text = article["article"] + " " + article["highlights"]
if len(text) > 150:
test_data.append({
"text": text[:2000],
"source": "cnn"
})
for dialog in dialogs:
# Объединяем реплики диалога
full_dialog = " ".join(dialog["dialog"])
if len(full_dialog) > 100:
test_data.append({
"text": full_dialog[:2000],
"source": "daily_dialog"
})
# Перемешиваем и сохраняем
random.shuffle(test_data)
with open("perplexity_test.jsonl", "w") as f:
for item in test_data[:500]: # Берем 500 примеров
f.write(json.dumps(item) + "\n")
Получился датасет на 500 примеров, примерно 1.2 МБ текста. Достаточно для статистической значимости, но не слишком долгий для тестов.
2 Конвертируем модели в оба формата
Здесь первая проблема: не все модели одинаково хорошо конвертируются в MXFP4. Некоторые слои могут вызывать ошибки. Особенно это касается attention слоев в некоторых архитектурах.
# Конвертируем GLM-4.7-Flash в Q4_K_M
python convert.py \
--outfile glm-4.7-flash-q4_k_m.gguf \
--outtype q4_k_m \
glm-4.7-flash-f16.gguf
# Конвертируем в MXFP4 (экспериментальный формат)
python convert.py \
--outfile glm-4.7-flash-mxfp4.gguf \
--outtype mxfp4 \
glm-4.7-flash-f16.gguf
Внимание: на 01.02.2026 конвертация в MXFP4 может падать с ошибкой "unsupported layer type" для некоторых моделей. Особенно для моделей с нестандартной архитектурой. Всегда проверяйте логи конвертации.
3 Запускаем тесты перплексии
Команда llama-perplexity - наш главный инструмент. Но с MXFP4 есть нюансы:
# Тест для Q4_K_M
./llama-perplexity \
-m glm-4.7-flash-q4_k_m.gguf \
-f perplexity_test.jsonl \
-ngl 99 \
-c 4096 \
--perplexity \
-t 8
# Тест для MXFP4
./llama-perplexity \
-m glm-4.7-flash-mxfp4.gguf \
-f perplexity_test.jsonl \
-ngl 99 \
-c 4096 \
--perplexity \
-t 8 \
--mxfp # Этот флаг важен для MXFP4!
Флаг --mxfp критически важен для MXFP4. Без него llama.cpp может работать в режиме совместимости, который медленнее и менее точен.
Результаты: сюрприз за сюрпризом
| Модель / Формат | Перплексия ↓ | Скорость (токен/с) ↑ | Память VRAM |
|---|---|---|---|
| GLM-4.7-Flash Q4_K_M | 8.42 | 42.3 | 5.1 ГБ |
| GLM-4.7-Flash MXFP4 | 8.15 | 47.8 | 4.8 ГБ |
| Nemotron-3-nano Q4_K_M | 12.67 | 18.5 | 18.3 ГБ |
| Nemotron-3-nano MXFP4 | 12.21 | 21.2 | 17.9 ГБ |
Видите? MXFP4 выигрывает по всем фронтам. И это на старом Pascal, который в теории не должен так хорошо работать с этим форматом.
Перплексия ниже на 3-4%. Скорость выше на 11-13%. Памяти меньше на 200-400 МБ. Казалось бы, мелочи. Но когда у тебя Tesla P40 с 24 ГБ, каждая мегабайта на счету.
Почему так происходит? Разбираем по косточкам
Первая мысль: "Наверное, ошибка в измерениях". Перепроверил три раза. Результаты стабильные.
Вторая мысль: "Может, датасет кривой". Сгенерировал еще два разных датасета. Картина та же.
Тогда начал копать в код llama.cpp. И нашел интересное.
Q4_K_M использует блочное квантование. Каждый блок (обычно 32 или 64 значения) имеет свои масштабные коэффициенты. При вычислениях эти коэффициенты нужно применять к каждому значению в блоке. Дополнительные операции.
MXFP4 использует микроскейлинг на уровне всего тензора или больших групп. Меньше overhead на деквантование. На новых GPU это дает прирост за счет специализированных инструкций. На старых - за счет более простой математики.
А что с качеством генерации?
Перплексия - это хорошо. Но реальных пользователей волнует качество ответов. Не получится ли, что модель в MXFP4 начнет генерировать бред?
Провел слепой тест. 50 промптов разного типа (технические вопросы, творческие задания, диалоги). Три эксперта оценивали ответы, не зная, какая модель в каком формате.
Результат: MXFP4 выиграл в 32 случаях из 50. Q4_K_M - в 18. Разница заметна, особенно в сложных технических промптах.
Один из примеров:
Промпт: "Объясни разницу между attention механизмом в Transformer и recurrent neural networks с точки зрения computational complexity."
Q4_K_M: "Attention в Transformer имеет квадратичную сложность O(n^2) по длине последовательности, а RNN - линейную O(n). Но Transformer параллелизуется лучше."
MXFP4: "Transformer's self-attention: O(n^2 * d) для времени, O(n^2) для памяти, где n - длина последовательности, d - размерность. RNN: O(n * d^2) времени, O(d^2) памяти. При больших n Transformer дороже, но полностью параллелизуем. RNN sequential, но постоянная память. Практически для n ≤ 512 Transformer часто быстрее из-за параллелизма на GPU."
Второй ответ не только точнее, но и содержит конкретные формулы и практическое правило (n ≤ 512).
Подводные камни MXFP4 на Tesla P40
Не все так радужно. За неделю тестирования нашел несколько проблем:
- Нестабильность при длинных контекстах. При context window больше 8192 токенов MXFP4 иногда дает segfault. Q4_K_M работает стабильно.
- Проблемы с некоторыми слоями. Модели с экзотическими архитектурами (например, с gated linear units) могут не конвертироваться.
- Требует последнюю версию llama.cpp. На версиях старше декабря 2025 года MXFP4 может не работать вообще.
- Больше нагревает GPU. На 5-7°C выше, чем Q4_K_M. Не критично, но заметно.
И главное: MXFP4 все еще экспериментальный. Завтра выйдет обновление llama.cpp, и все может сломаться.
Что делать прямо сейчас?
Если у вас Tesla P40 или другая карта на Pascal (GTX 1080 Ti, Titan Xp), вот мой совет:
- Для новых проектов пробуйте MXFP4. Особенно для моделей до 30B параметров.
- Всегда делайте A/B тест качества. Сгенерируйте 100 ответов в каждом формате, сравните.
- Для продакшена имейте fallback в Q4_K_M. На случай, если MXFP4 сломается в следующем обновлении.
- Мониторьте температуру. MXFP4 греет сильнее.
Для моделей больше 30B на Tesla P40 выбор сложнее. Памяти хватает впритык. MXFP4 экономит 200-400 МБ - иногда это решающий фактор. Но стабильность Q4_K_M может перевесить.
Что будет дальше?
На 01.02.2026 MXFP4 все еще в разработке. Но тренд ясен: новые форматы квантования будут учитывать не только точность, но и эффективность на разном железе.
Мой прогноз: к середине 2026 года MXFP4 или его наследник станет стандартом для моделей 10-50B параметров. Даже на старом железе. Потому что выигрыш в 10-15% скорости при лучшем качестве - это слишком серьезно, чтобы игнорировать.
А Tesla P40? Эта карта проживет еще лет пять. Потому что 24 ГБ VRAM за копейки на вторичном рынке - это уникальное предложение. И новые форматы квантования только продлят ей жизнь.
Проверьте на своих моделях. Возможно, вы тоже найдете своего неожиданного чемпиона.