Colibri: запуск GLM-5.2 (744B MoE) на потребительском ПК (Colibri)
Colibri — это лёгкий, высокопроизводительный движок для запуска гигантской модели смеси экспертов GLM-5.2 (744 миллиарда параметров) на обычном домашнем компьютере с примерно 25 ГБ оперативной памяти. Написано на чистом C без внешних зависимостей, с интеллектуальной потоковой передачей экспертов с диска. Это решение доказывает, что граница между облачными вычислениями и персональными машинами стирается.
Обзор и концепция
Colibri решает задачу, которая казалась невозможной: запуск 744-миллиардной параметрической модели смеси экспертов на потребительском оборудовании. Ключевая идея проста, но элегантна: модель GLM-5.2 активирует только ~40 миллиардов параметров на каждый токен, и только ~11 гигабайт из них меняются от токена к токену (маршрутизированные эксперты).
Архитектура решения строится на трёхуровневой иерархии памяти: плотная часть (внимание, общие эксперты, эмбеддинги — ~17B параметров) остаётся резидентной в оперативной памяти в формате int4 (~9,9 ГБ); 21 504 маршрутизированных эксперта (75 слоёв MoE × 256 экспертов + голова MTP, ~19 МБ каждый в int4) живут на диске (~370 ГБ) и потоком загружаются по требованию с кэшем LRU для каждого слоя, опциональным закреплённым горячим хранилищем и кэшем страниц ОС в качестве бесплатного L2 уровня.
Движок — это один файл C (`c/glm.c`, ~2400 строк) плюс небольшие заголовки. Нет BLAS, нет Python во время выполнения, нет GPU (хотя есть опциональный слой CUDA для закреплённых экспертов). Результат: 744-миллиардная модель, которая думает на вашем домашнем ноутбуке.
Основные возможности
Архитектурные особенности
Colibri реализует полнофункциональный форвардный проход GLM-5.2 с точностью на уровне токена, что было валидировано против трансформеров оракула (teacher-forcing 32/32, жадный поиск 20/20 на маленькой случайной модели с реальной архитектурой):
- MLA внимание (q/kv-LoRA, чередующееся частичное RoPE) с компрессированным KV-кэшем: 576 float'ов/токен вместо 32 768 (57× меньше — GLM-5.2 имеет 64 головы и без GQA)
- DeepSeek-V3-стиль сигмоид-маршрутизатор (noaux_tc, routed_scaling_factor), общий эксперт, первые 3 плотные слои
- Собственное спекулятивное декодирование MTP — голова многотокенного предсказания GLM-5.2 (слой 78) черновик токенов, которые главная модель проверяет в одном пакетном форварде. Голова должна быть int8: при int4 черновике принятие схлопывается на 0–4%, а спекуляция не включается; при int8 это 39–59% принятия, **2,2–2,8 токена/форвард** (сообщается сообществом). Без потерь в точной арифметике, но не байт-идентично не-спекулятивному жадному поиску в практике
- Грамматика-форсированные спекулятивные черновики (`GRAMMAR=file.gbnf`) — на constrained-output нагрузках (JSON/NDJSON, function calling, структурированная экстракция) грамматика сама является третьим источником черновиков: везде, где она допускает ровно один легальный байт (скобки, кавычки, названия ключей, тела enum), этот форсированный span токенизируется и инъектируется как предпринятые черновики с ~1.0 приёмкой
Оптимизация производительности
- Целочисленные точечные ядра (Q8_0-стиль int8 активаций, AVX2 `maddubs`): int8 matmuls на 1,4–2,5× быстрее (119 GFLOP/s измерено), int4 на 1,8× в батче — маршрутизация по форме выбирается путём измерения
- Поглощение весов MLA (трюк DeepSeek) для декода: нет реконструкции k/v для каждого токена — запрос поглощает `kv_b`, контекст проецируется после внимания
- Асинхронный опережающий заход экспертов: пока один блок экспертов умножается, ядро уже читает следующий (`WILLNEED`)
- Ядра квантизации: int8 / упакованный int4 / упакованный int2, шкалы для каждого ряда, AVX2, dequant-on-use
- DSA разреженное внимание — молниеносный индексатор GLM-5.2, верный ссылочному `glm_moe_dsa` моделированию: выбор топ-2048 каузального ключа для каждого слоя (полные/общие слои индексатора), автоопределяемый из весов `out-idx-*`
Управление памятью и кэшированием
- Персистентность KV-кэша — разговоры переоткрываются в тёплом состоянии между перезагрузками движка: режим обслуживания добавляет сжатый MLA KV к `.coli_kv` после каждого поворота (~182 КБ/токен, крахо-безопасный) и возобновляет его при запуске с нулевым re-prefill
- Опережающий просмотр маршрутизатора (`PILOT=1`, экспериментальный) — маршрутизация экспертов следующего слоя на 71,6% предсказуема из состояния после внимания текущего слоя; выделенный поток I/O предварительно загружает эти эксперты во время вычисления текущего слоя
- Batch-union MoE: в prefill (и верификации MTP) каждый уникальный эксперт батша читается один раз и применяется ко всем позициям, которые на него маршрутизируют
- Безопасность RAM: кэш экспертов автоматически определяется из `MemAvailable` при запуске — честная проекция пика (рабочий набор, KV, MTP ряд, буферы реконструкции)
Дополнительные возможности
- Байт-уровневый BPE токенизатор на C (GPT-2-стиль с регексом для Unicode-свойств, 320k мерж)
- Истинная выборка — температура + nucleus, значения по умолчанию настроены для int4-реальности (0,7 / 0,90; официальная 1,0 / 0,95 образцы квантизационный шум из хвоста)
- Автоматическое расширение кэша экспертов (с 2026-07-10): движок теперь *повышает* лимит LRU для заполнения бюджета RAM вместо только его снижения
- Обучаемый кэш: движок записывает, какие эксперты на самом деле маршрутизирует ваша нагрузка (`.coli_usage` рядом с моделью, обновляется каждый поворот) и при запуске автоматически закрепляет самые горячие в запасной RAM. Colibri буквально становится быстрее, чем больше вы его используете
- Адаптация живой иерархии (`--repin N`, опт-ин): на безопасных границах поворотов карта тепла сессии с затуханием заменяет холодные закреплённые эксперты более горячими потоковыми. Замена загружает эксперта с диска в существующий слот RAM; слоты, поддерживаемые GPU, сразу же обновляют бюджет того же слоя VRAM
Установка и настройка
Быстрый старт на Linux/WSL2
Установка состоит из нескольких простых шагов:
cd c
./setup.sh # проверяет gcc/OpenMP, собирает, self-tests
# ОДНА команда делает всё на стороне модели: загружает GLM-5.2-FP8 shard за shard
# (никогда не нужны полные 756 ГБ одновременно), конвертирует в контейнер int4, затем
# конвертирует голову MTP для спекулятивного декодирования. Возобновляется в любой точке.
# Конверсия (только) нужен python с: pip install torch safetensors huggingface_hub numpy
./coli convert --model /nvme/glm52_i4 # ~400 ГБ свободно на настоящем ext4/NVMe пути
# chat — бюджет RAM, кэш экспертов и MTP автоматически определяются:
COLI_MODEL=/nvme/glm52_i4 ./coli chat
Планирование хранилища
Перед загрузкой модели проверьте планируемую иерархию хранилища:
COLI_MODEL=/nvme/glm52_i4 ./coli plan
COLI_MODEL=/nvme/glm52_i4 ./coli plan --gpu 0,1 --ram 128 --vram 48 --json
# применить ограниченный план к обычному бегуну
COLI_MODEL=/nvme/glm52_i4 ./coli chat --auto-tier
`coli plan` читает только заголовки safetensors и сообщает точный размер плотной/экспертной части модели, резерв RAM во время выполнения, безопасный лимит кэша экспертов и ограниченный горячий слой VRAM. Его версионированный JSON-вывод предназначен для совместного использования CLI, сервером API, веб-интерфейсом и оболочкой рабочего стола; он не выделяет тензоры модели и не запускает вывод.
Проверка готовности
Перед загрузкой модели `coli doctor` выполняет check только для чтения и объясняет, является ли выбранное размещение Disk/RAM/VRAM запускаемым:
COLI_MODEL=/nvme/glm52_i4 ./coli doctor
COLI_MODEL=/nvme/glm52_i4 ./coli doctor --gpu 0 --ram 128 --json
Doctor валидирует директорию модели, конфиг, токенизатор, заголовки safetensors, исполняемый файл движка, доступную RAM, запрашиваемые устройства NVIDIA, связь CUDA и тот же бюджет размещения, используемый `coli plan`. Он никогда не запускает `glm`, не читает нагрузки тензоров, не импортирует фреймворк модели и не создаёт контекст CUDA. Версионированный JSON-отчёт использует стабильные ID проверок для автоматизации. Предупреждения сохраняют статус выхода 0; отсутствующие требования или небезопасная проекция RAM возвращают 1, а недействительные значения CLI возвращают 2.
Получение модели
Предварительно конвертированная модель GLM-5.2 int4 для colibri доступна на Hugging Face — используйте версию с голове MTP int8 (клон matey-0):
https://huggingface.co/mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp
⚠️ Голова MTP должна быть int8. Оригинальное зеркало ([jlnsrk/GLM-5.2-colibri-int4](https://huggingface.co/jlnsrk/GLM-5.2-colibri-int4)) поставляет int4 голову MTP, которая даёт 0% приёмки черновика — спекуляция молча никогда не включается и вы теряете ~2× MTP рычаг. Это самый частый доклад «почему MTP застрял на 0%?». Голова int8 даёт измеренный 39–59% приёмки. Клон matey-0 выше — это оригинальная модель int4 с тремя файлами `out-mtp-*` уже поменянными на int8 — загрузите эту и готово.
Проверьте, что у вас есть: `ls -l <model>/out-mtp-*`
- int8 (правильно): `3527131672 / 5366238584 / 1065950496`
- int4 (0% приёмки): `1765523544 / 2686077736 / 536747200` — если вы видите эти, замените только эти три файла из зеркала int8
Windows 11 (нативно, без WSL)
Colibri собирается и работает нативно на Windows 11 x86-64 с MinGW-w64. Портирование добавляет слой совместимости `_WIN32` в `c/compat.h`, который отображает POSIX I/O в Windows API (pread → ReadFile+OVERLAPPED, posix_fadvise no-op, выравниванное выделение, MoveFileEx переименование, GlobalMemoryStatusEx определение RAM). Все различия платформы остаются в `compat.h`; источник движка неизменён.
Toolchain: GCC через [winlibs](https://winlibs.com/) или MSYS2 MinGW-w64. Тестировано с GCC 16.1.0 (x86_64-ucrt-posix-seh).
# Установка toolchain один раз (выберите один):
scoop install mingw-winlibs # портативный, не нужна оболочка
# или: pacman -S mingw-w64-x86_64-gcc make # через MSYS2
# Сборка (из директории c/):
make glm.exe # GLM-5.2 engine (статический, без DLL зависимостей)
make olmoe.exe # OLMoE engine (те же shims)
make iobench.exe # бенчмарк диск I/O
make test-c # запустить C тесты
make test-python # запустить Python тесты (требует python)
# Проверка (маленькая модель, 2,4 МБ):
pip install torch transformers safetensors huggingface_hub
python tools/make_glm_oracle.py # генерирует маленький оракул
SNAP=./glm_tiny TF=1 ./glm.exe 64 16 16 # ожидай "32/32 positions"
# Запуск с реальной моделью:
SNAP=D:\glm52_i4 ./glm.exe 64 4 16 # batch вывод
python coli chat --model D:\glm52_i4 # интерактивный чат
python coli serve --model D:\glm52_i4 # OpenAI-совместимый API
Статус: Фаза 1 завершена (собирается, правильно, статически связано). O_DIRECT (Фаза 2), GPU через `LoadLibrary` на `coli_cuda.dll` (Фазы G0–G2) и полная валидация модели — отдельные потоки работы. Смотрите `PORT_WINDOWS_PLAN.md` для полного плана.
Использование
Интерактивный чат
$ ./coli chat
🐦 colibrì v1.0 — GLM-5.2 · 744B MoE · int4 · streaming CPU
✓ ready in 32s · resident 9.9 GB
› ciao!
◆ Ciao! 😊 Come posso aiutarti oggi?
Интерактивный чат позволяет вам общаться с моделью естественным образом. Команды:
- `:reset` — очистить историю разговора
- `:more` — продолжить усечённый ответ
- Обычный текст — отправить сообщение
Управление параметрами
Полезные флаги и переменные окружения:
- `--temp T` — температура выборки токенов (по умолчанию 0,7 + nucleus 0,90 — настроено для int4; 0 = жадный поиск)
- `--topp 0.7` — адаптивный top-p для экспертов (30–40% меньше диска)
- `--ngen N` — максимум токенов на ответ
- `--ram BYTES` — бюджет оперативной памяти
- `--vram BYTES` — бюджет VRAM GPU (если доступно)
- `--repin N` — адаптировать RAM/VRAM горячие эксперты каждые N излучаемых токенов
- `AUTOPIN=0` — отключить обучаемый кэш
- `THINK=1` — включить блок рассуждений GLM-5.2
- `DRAFT=n` — глубина черновика MTP (спекулятивное декодирование)
- `GRAMMAR=g.gbnf` — грамматика-форсированные черновики для constrained JSON/NDJSON вывода
- `GRAMMAR_DRAFT=n` — лимит форсированного span для каждого форварда (по умолчанию 24)
- `TF=1` — teacher-forcing валидация
- `PILOT=1` — маршрутизатор опережающего диск-prefetch (экспериментальный)
- `CAP_RAISE=0` — не автоматически растить кэш экспертов
- `KVSAVE=0` — отключить персистентность KV-кэша
Специализированные команды
Пакетный вывод (без интерактива):
COLI_MODEL=/nvme/glm52_i4 ./coli run "Объясни принцип MoE" --ngen 256
Бенчмарки качества:
cd c
pip install tokenizers datasets # дополнительно к deps конверсии
./coli bench # hellaswag, arc_challenge, mmlu — по 40 вопросов
./coli bench hellaswag --limit 200 # один таск, больше вопросов
./coli bench mmlu arc_challenge --ram 100 # выберите tasks, установите бюджет RAM
Печатает точность для каждого task (log-likelihood scoring, EleutherAI-harness стиль).
I/O бенчмарк диска:
gcc -O2 -fopenmp iobench.c -o iobench
./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 0 # буферизированный, 8 потоков
./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 1 # O_DIRECT (обход кэша)
Измеряет VRAM образом, как движок его использует (параллельные 19 МБ случайного чтения).
Производительность и бенчмарки
Честные цифры (WSL2, 12 cores, 25 GB RAM, NVMe через VHDX)
| Метрика | Значение |
|---|---|
| Модель на диске (int4 контейнер) | ~370 ГБ |
| Резидентная RAM (плотная, int4) | 9,9 ГБ |
| Время загрузки | ~30 сек |
| Пик RSS во время чата | ~20 ГБ (автолимит) |
| Стоимость холодного декода | ~11 ГБ дисковых читаний/токен (75 слоёв × 8 экспертов) |
| Потолок диска (диск этого dev box) | ~1 ГБ/сек → ~0,05–0,1 tok/s холодный |
| MTP спекуляция (int8 голова) | 2,2–2,8 tok/форвард (измерено сообществом) |
Это не быстро. Это 744-миллиардная frontier-class модель, отвечающая правильно на машине, которая стоит меньше, чем один вентилятор H100. Тёплый кэш, закреплённые горячие эксперты и MTP значительно снижают задержку полезного ответа; физика диска делает остальное.
Заметка об SSD
Холодные старты сильно нагружают случайные чтения (~11 ГБ/токен), но чтения не носят значительного износа SSD — потоковая передача colibri только для чтения. Настоящие проблемы при интенсивном использовании: (1) трафик swap, если система кончает RAM (записи износят диск — держите разумный бюджет `--ram`; autoBudget colibri разработан чтобы оставаться чистым от swap), (2) устойчивая термика: часы на полной работе цикла чтения будут нагревать дешёвые диски. Контролируйте температуру и здоровье диска.
Предсказания для лучших машин
Colibri была построена на намеренно скромном оборудовании (12 cores, 25 GB RAM, более старый DRAM-less NVMe). Каждое из этих ограничений — это ручка, которую ваша машина может повернуть:
| Машина | Ожидается |
|---|---|
| Этот dev box (WSL2 VHDX, ~1 GB/s, 25 GB RAM) | ~0,05–0,1 tok/s холодный — доказанный baseline |
| Нативный Linux, PCIe4 NVMe (~3–5 GB/s random), 32 GB | ~0,5–1 tok/s |
| PCIe5 NVMe или 2×NVMe RAID0 (~8–12 GB/s), 64 GB (PIN ~40 GB горячих экспертов) | ~2–4 tok/s |
| 128–256 GB RAM, 12 cores (горячие эксперты кэшированы) | ~2–4 tok/s — matmul-bound: ~80 GFLOP/token vs ~250 GFLOP/s AVX2 ядер |
| Тот же RAM + 24–32 cores, или AVX-512/VNNI ядра | ~5–15 tok/s — интерактивный; работа ядра — умножитель |
Это оценки, не измерения — если вы запускаете colibri на серьёзном оборудовании, пожалуйста откройте issue с вашими цифрами: реальные datapoints от лучших машин — это ровно то, что этому проекту нужно дальше.
Бенчмарки сообщества (измеренные)
Реальные числа от реальных машин, стоковая сборка (`setup.sh`, gcc 13), жадный декоде, `--ngen 32`, MTP активен:
| Машина | Диск (iobench, 19 MB × 64, 8 threads) | Конфиг | Измерено |
|---|---|---|---|
| Intel Core Ultra 7 270K Plus (24 потока) · WSL2 · 24 GB RAM · NVMe VHDX | 1,96 GB/s буферизированный · 2,74 GB/s O_DIRECT | default | 0,07 tok/s · expert hit 3–4% · RSS 14,1 GB |
| 〃 | 〃 | `--topp 0.7` | 0,11 tok/s · expert hit 11% · RSS 14,7 GB |
| Apple M5 Max (18 cores) · macOS · 128 GB unified · internal SSD | ~4 GB/s холодный | default, MTP выключен | 1,06 tok/s · expert hit 23% · RSS 21,8 GB |
| Apple M5 Max · macOS · 128 GB unified · 2 TB SSD · Metal backend | не измеримо | Metal on · `--ram 96` · 39,7 GB warm pin · MTP выключен | 1,83 tok/s · expert hit 66% · warmed 1,11 → 1,83 за раннее |
| Mac Mini M4 Pro · macOS · 48 GB unified · Metal backend | 6,59 GB/s F_NOCACHE (свежий shard) | Metal on · `--ram 38` | 0,30 tok/s (vs 0,18 CPU-only) — entry Apple Silicon с третью RAM бьёт 32-core 9950X |
| Epyc 9654 ES · Linux · 4x16GB DDR5-4800-rdimm · Samsung PCIe Gen3 x4 NVME SSD | — | `MTP=1 DIRECT=1` | 0,31 tok/s · expert hit 35% · RSS 21,52 GB |
| Ryzen AI 9 HX 370 (Framework 13) · Arch Linux · 128 GB · WD SN850X | — | int8 MTP head · `--cap 32` · 46,7 GB auto-learned PIN | 0,37 tok/s · expert hit 66% · MTP acceptance 52% (2,59 tok/fw) · RSS 105 GB |
| Ryzen 9 9950X (32 потока) · Linux · 123 GB · Crucial P3 QLC Gen3 | 1,51 GB/s буферизированный | default, 2 runs from cold | 0,10 tok/s · hit 53% · профиль 66% диск |
| 〃 машина, модель переехала на Samsung 9100 PRO PCIe 5.0 | 8,81 GB/s O_DIRECT | 〃 (история использования сохранена) | 0,28 tok/s · hit 57% · профиль флипс: 32% диск / 57% matmul |
| Ryzen AI Max+ 395 (Framework Desktop) · Ubuntu · 128 GB LPDDR5x · Intel Optane 905p PCIe 3.0 | 3,27 GB/s буферизированный | int8 MTP head · fresh history (pure LRU, auto-raised cap 65) | 0,16 tok/s · hit 57% · профиль 49% диск / 47% matmul |
| 〃 пять запусков позже — learned pin 47,6 GB | 〃 | `--temp 0.7 --topp 0.7` | 0,40 tok/s · hit 71% · fastest non-Apple datapoint |
| Ryzen 7 9800X3D (16T) · WSL2 · 70 GB RAM · Samsung 9100 PRO PCIe 5.0 · RTX 5090 | 10,51 GB/s O_DIRECT | MTP выключен · learned pin 24 GB · hit 54% · OMP hot-team on | 0,41 tok/s · disk-bound (36,5 s диск vs 24,0 s matmul) · CUDA expert tier ≈ 0% (AVX-512 CPU соответствует 5090) |
| EPYC 7443 (24C/48T, Zen3 AVX2) · Linux · 430 GB RAM · NVMe RAID-Z1 via TrueNAS VM | ~1 GB/s (VM overhead) | 77,5 GB pin · cap auto-raised to 194/layer · MTP выключен | 1,00 tok/s · hit 98% · диск исключен → RAM-bandwidth + matmul bound |
| Intel i5-12600K (10C/16T, AVX2) · native Windows 11, no WSL · 32 GB · MinGW GCC 16.1 | буферизированный (no O_DIRECT на MinGW) | int8 MTP head · cold, small-RAM (cap ~2/layer) | 0,08 tok/s · hit 3,7% · MTP 57% acceptance — первый native-Windows datapoint |
Выводы: С 24 ГБ RAM движок автолимит кэш экспертов до 2 слотов/слой, поэтому декод остаётся холодным даже на диске в 2–2,7× быстрее baseline — на маленьких-RAM машинах лимит RAM, не диск, является связывающим ограничением, ровно как таблица предсказывает; `--topp 0.7` один купил чистый 1,6× конец-конец ускорение. M5 Max datapoint ложится прямо на вторую строку таблицы: ~1 tok/s 744B модели на ноутбук SSD — и его 14 ГБ/s диск сдвигает бутылочное горло обратно к бюджету RAM и ядрам. Framework 13 ряды — это кэш-тезис доказан конец-конец на одной машине: 0,29 → 0,37 tok/s (hit 28% → 66%, спекуляция наконец включается на 52% приёмке) просто дав кэшу его RAM — int8 MTP head + больший cap + learned pin. Cap часть теперь автоматический (cap auto-raise, 2026-07-10). Пара 9950X — это чистейший бутылочное горло эксперимент — та же машина, та же история, только диск поменян: ×5,8 пропускная способность диска купила ×2,9 токенов, и профиль флипнулся с 66% диска на 57% matmul.
Бенчмарк качества — помощь нужна
Первое измерение ([#108](https://github.com/JustVugg/colibri/issues/108)): контейнер int4 набрал 62,5% средней точности на hellaswag/arc/mmlu (0-shot log-likelihood, n=40) — ниже 85–95% опубликованного для full-precision GLM-5.2, но разрыв ещё не является результатом квантизации. Два факта сбивают: (1) 0-shot log-likelihood MC scoring плохо обслуживает рассуждающую модель вроде GLM-5.2 (она никогда не получает думать), поэтому большой разрыв ожидается даже на fp16; (2) n=40 это ±14pp. Решающий эксперимент — A/B fp16-vs-int4 OLMoE под этой же шлейкой (достаточно маленькая для запуска обоих точности) — этот delta является стоимостью квантизации с протоколом scoring аннулировано. До его запуска, 62,5% — это datapoint, не вердикт.
OpenAI-совместимый API
Запуск сервера
`coli serve` держит один процесс модели загруженным и раскрывает text-only OpenAI-совместимый HTTP API. Шлюз использует только стандартную Python библиотеку; вывод всё ещё работает в том же dependency-free C движке.
cd c
COLI_MODEL=/nvme/glm52_i4 COLI_API_KEY=local-secret ./coli serve \
--host 127.0.0.1 --port 8000 --model-id glm-5.2-colibri
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Authorization: Bearer local-secret' \
-H 'Content-Type: application/json' \
-d '{
"model": "glm-5.2-colibri",
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}'
Поддерживаемые endpoints
Реализованные endpoints: `GET /v1/models`, `GET /v1/models/{model}`, `POST /v1/chat/completions`, и legacy `POST /v1/completions`. Запросы chat и completion поддерживают JSON ответы, SSE streaming, usage counts, `max_tokens`/`max_completion_tokens`, `temperature` и `top_p`. Расширение `enable_thinking: true` включает блок рассуждений GLM-5.2; стандартное поле `reasoning_effort` также включает его если не установлено на `none`.
Очередь запросов
Первая версия намеренно только-текст и обслуживает одно поколение за раз: 744B модель остаётся в одном персистентном процессе, поэтому одновременные HTTP запросы стоят в очереди вместо загрузки дублирующихся копий модели. Tools, вход image/audio, custom stop sequences, log probabilities и token penalties возвращают явную ошибку скорее чем молчаливо игнорируются. Адрес привязки по умолчанию localhost; установите `COLI_API_KEY` перед обнажением сервера за машину.
Доступ браузера от dev сервера Vite и Tauri local origins включен по умолчанию. Повторите `--cors-origin https://your-ui.example` чтобы разрешить другой точный origin, или используйте `--cors-origin '*'` только на доверенной локальной сети.
Движок владеет одним изменяемым KV контекстом, поэтому HTTP поколение использует ограниченную FIFO очередь допуска вместо притворства что работают unsafe параллельные последовательности. Конфигурируйте с `--max-queue N` (default 8) и `--queue-timeout SECONDS` (default 300), или переменные окружения `COLI_MAX_QUEUE` / `COLI_QUEUE_TIMEOUT`. Насыщенные и вышедшие по времени запросы получают OpenAI-shaped HTTP 429 ошибки перед потоком заголовков. `GET /health` раскрывает счётчики active/queued/completed/rejected, и успешные ответы поколения включают `x-colibri-queue-wait-ms`.
Изолированные KV контексты
`coli serve --kv-slots N` выделяет до 16 независимых контекстов последовательности. Запросы выбирают один с опциональным integer полем `cache_slot`; обычные OpenAI клиенты опускают это и держат оригинальное слот 0 поведение.
{
"model": "glm-5.2-colibri",
"messages": [{"role": "user", "content": "Continue this conversation"}],
"cache_slot": 1
}
Каждый slot владеет историей токенов, сжатой памятью MLA/DSA KV, окном MTP и файлом persist crash-safe (`.coli_kv`, `.coli_kv.1`, ...). Движок всё ещё выполняет одну последовательность за раз; это устанавливает явное KV владение без притворства что threaded HTTP — это continuous batching. RAM допуск считает каждый конфигурированный slot. Начните с небольшого значения: при context из 4096 токенов по умолчанию, каждый slot стоит сотни МБ.
GPU бэкенды (CUDA, Metal)
Экспериментальный Metal backend (Apple Silicon)
На Apple Silicon профиль декода matmul-bound, и unified memory удаляет PCIe копию налога что держит потоковые эксперты CUDA на CPU — так colibri имеет opt-in Metal backend что запускает routed-expert SwiGLU (batched, zero-copy от RAM slabs), fused decode attention (полный MLA слой в одной command buffer, S≤4) и prefill's large GEMMs на GPU. Token-exact vs CPU path.
cd c
make glm METAL=1 # macOS только; Xcode не требуется (shader компилируется во время runtime)
make metal-test # standalone kernel/attention correctness vs CPU reference
COLI_METAL=1 COLI_MODEL=/path/glm52_i4 ./coli chat --ram 96
Измеренно на M4 Max (128 GB, тёплый кэш, MTP on): CPU 0.30 → Metal 0.42 tok/s (~1.4×). Ключевые точки дизайна: Metal's ~5 ms submit latency делает per-matmul dispatch потерей — всё batched в несколько command buffers на слой, и работа резидентных экспертов GPU submitted перед missed экспертами disk reads так I/O и compute перекрываются. `COLI_METAL_GEMM_MIN` тюнит prefill GEMM row threshold (default 16). Streaming, cache, MTP, DSA и persistence форматы неизменены; каждый GPU path falls back к CPU per-block на любую fault. Numerics — dequant→f32-MAC (same как CUDA tier); greedy выходы byte-identical к CPU движку.
Экспериментальный resident CUDA backend
Colibri включает opt-in CUDA backend для model-resident tensors. Потоковые эксперты намеренно остаются на оригинальном CPU path пока: копирование эксперта с NVMe на GPU на каждое использование только заменил бы диск бутылочное горло на PCIe бутылочное горло. Resident квантизированные тензоры uploaded лениво один раз и переиспользуются.
cd c
make cuda-test CUDA=1 # q8/q4/q2/f32 kernel correctness
make CUDA=1
# optional dense-path эксперимент (горячие эксперты конфигурируются ниже)
COLI_CUDA=1 COLI_GPU=0 CUDA_DENSE=1 SNAP=/nvme/glm52_i4 ./glm 64 4 4
Требования: Linux, NVIDIA driver и CUDA Toolkit под `/usr/local/cuda` (override с `CUDA_HOME=/path/to/cuda`). `CUDA_ARCH=native` собирает для GPU текущей машины; установите explicit архитектуру при cross-compile. Запрос CUDA с CPU-only двоичным файлом, invalid устройством или недоступным runtime fail'ит при запуске вместо молчания fallback'а.
CUDA конфигурация эксперта
Нормальное `make` сборка и runtime поведение неизменены. CUDA defaults к expert-only accelerator. `CUDA_DENSE=1` дополнительно распределяет resident dense/attention projection тензоры round-robin через выбранные устройства; их projected footprint зарезервирован перед expert tier размещением. На шести RTX 5090 с 150 GB expert tier, warmed two-request/64-token GLM-5.2 run улучшился с 1.650 к 2.157 aggregate tok/s (+30.8%) сохраняя полный expert tier. Рассматривайте это как opt-in до projected dense set и 2 GB per-device runtime reserve подходит target GPU.
Measured `PIN` профиль может promote его hottest эксперты в persistent VRAM tier пока держит остаток в RAM:
STATS=stats.txt SNAP=/nvme/glm52_i4 ./glm 64 4 4 # собирают routing frequencies сначала
COLI_CUDA=1 COLI_GPU=0 CUDA_EXPERT_GB=16 \
PIN=stats.txt PIN_GB=160 SNAP=/nvme/glm52_i4 ./glm 64 4 4
# multi-GPU expert tier, 150 GB total budget через six 32 GB devices
COLI_CUDA=1 COLI_GPUS=0,1,2,3,4,5 CUDA_EXPERT_GB=150 \
CUDA_DENSE=1 PIN=stats.txt PIN_GB=300 RAM_GB=226 \
SNAP=/nvme/glm52_i4 ./glm 64 4 4
Выбранные эксперты uploaded во время startup, так failures вместимость occur перед inference и лог reports их exact tensor footprint. Бюджет clamped против free VRAM после резервирования projected dense resident set и 2 GB runtime headroom per выбранное device. С `COLI_GPUS`, `CUDA_EXPERT_GB` — total бюджет через device set; эксперты assigned целиком к least-loaded device что может их hold. Multi-GPU runs также default к `PIN_FILL=1`: measured hot set placed сначала, потом unused VRAM filled с zero-heat экспертами. `CUDA_RELEASE_HOST=1` (multi-GPU default) releases RAM copy после успешного upload и reloads из диска только если CUDA позже fail'ит. Установите любую переменную к `0` чтобы восстановить conservative поведение.
Лучшие бенчмарки на серьёзном оборудовании
На шести RTX 5090 32 GB cards с GLM-5.2 int4, 150 GB hot-first tier sustained 0.94 token/s через varied 64-token prompt (87.8% expert hit rate) и reached 1.64 token/s на warmed short prompt (99.3% hit rate). Та же вместимость filled без routing heat managed только 0.29 token/s, так quality profile важнее чем raw VRAM вместимость. Эти — single-run инженерные измерения, не portable performance гарантия.
Текущие ограничения: устройства используют independent контексты и synchronous host-staged activation копии—нет P2P/NCCL dependency ещё. Independent эксперт группы execute concurrently через devices, но single эксперт not sharded. Ядра — correctness-first custom ядра вместо cuBLAS/Tensor Core ядер.
Продвинутые возможности
Политика ресурсов
`coli plan` reports планируемый hot (VRAM), warm (RAM) и cold backing (диск) tiers, причину для каждого размещения и expected bottleneck. Default `--policy quality` и `--policy balanced` modes preserve checkpoint квантизацию и router решения если `--topk` или `--topp` passed; те explicit lossy overrides печатают warning и proceed.
coli plan --model /models/glm52_i4 --policy quality
coli run --auto-tier --policy quality "Объясни MoE offloading"
# Explicit research-only router редукция:
coli run --policy experimental-fast --topk 4 "Benchmark prompt"
Обучаемый кэш и live адаптация
Кэш учится автоматически: движок записывает какие эксперты ваша нагрузка на самом деле маршрутизирует (`.coli_usage` рядом с моделью, обновляется каждый поворот) и при startup автоматически pins hottest в spare RAM. Colibri буквально становится быстрее чем больше вы его используете.
Live tier адаптация (`--repin N`, opt-in): на safe turn boundaries, decaying session heat map заменяет cold pinned экспертов с hotter streamed. Замена loads эксперта с диска в existing RAM slot; GPU-backed slots сразу refresh тот же VRAM tier бюджет. 25% hysteresis и four-swap limit prevent tier thrashing. Persistent `.coli_usage` остаётся long-term signal и is not decayed.
Grammar-forced спекулятивные черновики
На constrained-output нагрузках (JSON/NDJSON, function calling, структурированная экстракция), грамматика форсирует legal spans:
COLI_MODEL=/nvme/glm52_i4 GRAMMAR=constraints.gbnf ./coli chat
Везде где грамматика допускает ровно один legal байт (скобки, кавычки, key названия, enum bodies), этот форсированный span tokenized и injected как pre-accepted черновики с ~1.0 приёмкой — no draft head lookup, и это engages даже с int4 MTP head. Это никогда не constrains sampling: forced spans verified в той же batch-union forward как любой draft, так wrong или out-of-sync грамматика не может change output — worst case это rejected черновики.
Router-lookahead prefetch
Экспериментальный режим: GLM-5.2's expert маршрутизация measurably предсказуема ahead of time — применяя layer L+1's router к layer L's post-attention state recalls 71.6% true top-8 (vs 41.3% для «same experts как last token»). `PILOT=1` использует это для issue next-layer expert readahead из dedicated I/O thread пока current layer computes.
COLI_MODEL=/nvme/glm52_i4 PILOT=1 ./coli chat
Разговоры переоткрываются в тёплом состоянии
Начиная с 2026-07-10, `coli chat` persists compressed MLA KV-cache к диску после каждого поворота (~182 KB/токен, incremental append, crash-safe). Close чат, переоткройте завтра — модель still помнит whole разговор и zero re-prefill happens: validated byte-identical к uninterrupted сессии. `:reset` очищает это, `KVSAVE=0` disables.
Batch I/O оптимизация
Cold expert reads используют deferred pipeline: resident RAM/VRAM эксперты execute пока missing эксперты loaded в bounded background I/O pool, потом cold results join перед layer завершением. `IO_THREADS=n` overrides default восемь loader потоков когда foreground работа exists. Profiling reports оба disk service time и smaller foreground-visible wait time так overlap explicit вместо credited как unexplained speedup.
Часто задаваемые вопросы
Какой минимальный объём оперативной памяти мне нужен?
Официально — 25 ГБ (это то, на чём разрабатывалось). На практике минимум ~16 ГБ из-за плотной части (~9,9 ГБ) плюс рабочий набор и буферы реконструкции. С 24 ГБ движок автоматически ограничивает кэш экспертов до 2 слотов/слой, что означает холодное декодирование даже на быстром диске. Больше RAM = больше кэшированных экспертов = быстрее ответы. 32+ ГБ даст вам заметное улучшение.
Нужен ли мне GPU?
Нет. Colibri работает чистым C на CPU, никакой GPU не требуется. Опциональные CUDA и Metal бэкенды улучшают производительность, но система работает без них. На Apple Silicon Metal даёт ~1,4× ускорение, CUDA на NVIDIA даёт от 0 до ~30% в зависимости от вашего CPUs, но это улучшения, не требования.
Почему MTP спекуляция не работает (0% приёмки)?
Это наиболее частая проблема. Голова MTP должна быть int8. Если вы загрузили модель с int4 голове MTP (оригинальное зеркало), приёмка упадёт на 0–4% и спекуляция молча не включится. Загрузите версию с int8 голове (matey-0 клон) или замените три файла `out-mtp-*` на версию int8. При int8 голове вы получите 39–59% приёмки и реальное 2,2–2,8 токена/форвард спекуляции.
Какая скорость я получу на своём оборудовании?
Это зависит от трёх факторов: (1) пропускная способность диска — cold reads стоят ~11 ГБ/токен, так 1 ГБ/s диск → ~0,1 tok/s; (2) объём RAM — больше RAM = больше горячих экспертов в кэше = выше hit rate = быше; (3) скорость CPU matmul — после прогрева кэша вы потолок на вычислениях, а не на диске. Используйте таблицу предсказаний в разделе производительности как отправную точку. Реальные измерения на вашем оборудовании? Откройте issue на GitHub!
Как я могу улучшить скорость после запуска?
Несколько стратегий: (1) Дайте кэшу время прогреться — несколько прогонов позволят обучаемому кэшу выучить самые горячие эксперты; (2) используйте `--topp 0.7` — это уменьшает разнообразие маршрутизации и повышает hit rate кэша, часто на 1,6× без потери качества; (3) увеличьте `--ram` если у вас есть запас, позволяя больше экспертов остаться в памяти; (4) закрепите горячие эксперты используя `--repin N` с learned history.
Безопасен ли контейнер int4 для качества?
Первое измерение показало 62,5% точности на hellaswag/arc/mmlu (0-shot log-likelihood). Это ниже full-precision, но это может быть артефактом протокола scoring (log-likelihood MC плохо обслуживает рассуждающие модели). Решающий эксперимент — A/B fp16 vs int4 на OLMoE (меньше, можно запустить оба). До тех пор это datapoint, не вердикт. Сообщества давайте знать если вы запускаете полный бенчмарк!
Полезные ссылки и ресурсы
Загрузить модель GLM-5.2
Предварительно конвертированная модель int4 с int8 голове MTP:
Hugging Face: mateogrgic/GLM-5.2-colibri-int4-with-int8-mtpАльтернативное зеркало
Оригинальное зеркало (содержит int4 голову MTP — замените перед использованием):
Hugging Face: jlnsrk/GLM-5.2-colibri-int4Ключевые Issue и обсуждения
- #8: MTP спекуляция (39-59% приёмки с int8 голове)
- #12: Автоматическое расширение кэша экспертов для больших RAM машин
- #48: Grammar-forced спекулятивные черновики
- #100: Byte-неидентичность и специальные обсуждения MTP
- #101: Бенчмарки на 7-core Ryzen 9800X3D с RTX 5090
- #102: Общие вопросы MTP
- #103: Metal backend на M5 Max с 1024-token run
- #104: 430 GB EPYC benchmarks с RAID NVMe
- #107: Mac Mini M4 Pro Metal backend
- #108: Первые бенчмарки качества (hellaswag/arc/mmlu)
- #113: Первый native Windows 11 datapoint (MinGW)
