Тринадцать файлов существовали только на диске ПК владельца, в рабочей копии, отставшей от origin/main на 122 коммита. Их реализация и тесты давно влиты: tests/test_a42_provider_connect.py, test_a49_subagents_skills_memory.py, test_a51_hub_controls_hermes.py, test_a52_local_models_supervisor_dual.py, test_a55_account_connection.py, test_a56_context_compression.py и другие. Постановок, объясняющих, что эти тесты обязаны доказывать, в репозитории не было. Правило записано в agents/AGENTS.md: задание живёт в репозитории, а не в переписке и не в личных папках на диске. A48, A50 и A54 не переносятся: они уже есть на origin под другими именами, содержимое совпадает с точностью до перевода строки в конце файла. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
150 lines
13 KiB
Markdown
150 lines
13 KiB
Markdown
# Задание A45: три новых кандидата в локальные кодеры
|
||
|
||
## Дата поступления
|
||
2026-08-31
|
||
|
||
## База
|
||
|
||
`origin/main` (`ff303b5`).
|
||
|
||
```
|
||
git fetch origin --prune
|
||
git checkout -b antigravity/a45-moe-candidates origin/main
|
||
```
|
||
|
||
В `main` напрямую не пушить.
|
||
|
||
## Порядок исполнения
|
||
|
||
Два прохода: **Flash** исполняет замеры, **Pro** проводит аудит. Пункт **P0-5** написан для аудитора.
|
||
|
||
**Выполнять после A44.** Причина не в приоритетах, а в железе: видеокарта одна, и оба задания её занимают. A44 первым делом останавливает ручной процесс на 8081 и возвращает кодер под systemd — начинать замеры до этого значит мешать друг другу и получить искажённые тайминги.
|
||
|
||
**Файлы A44 не трогать.** `benchmarks/BENCHMARK_REPORT.md` и `benchmarks/benchmark_results.json` правит A44; здесь пишется отдельный отчёт (см. P0-4). Стенд `benchmarks/benchmark_suite.py` используется как есть, без правок.
|
||
|
||
---
|
||
|
||
## Задача
|
||
|
||
Владелец нашёл на huggingface.co новые модели и спрашивает, есть ли что-то интересное. Ревьюер отобрал три кандидата и проверил их пригодность к этому железу. Нужно измерить.
|
||
|
||
## Что проверено ревьюером — заново не выяснять
|
||
|
||
Размеры получены через API репозиториев HuggingFace, а не из карточек моделей.
|
||
|
||
| Порядок | Репозиторий | Файл | Размер |
|
||
|---|---|---|---|
|
||
| 1 | `unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF` | `Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf` | 17,28 ГиБ |
|
||
| 2 | `bartowski/Qwen2.5-Coder-32B-Instruct-GGUF` | `Qwen2.5-Coder-32B-Instruct-Q4_K_M.gguf` | 18,49 ГиБ |
|
||
| 3 | `peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF` | `Tiel-Coder-35B-A3B-UD-Q4_K_S.gguf` | 19,46 ГиБ |
|
||
|
||
Пересобирать llama.cpp не нужно:
|
||
|
||
```
|
||
сборка на сервере: build 10597, commit 95b8e33e1
|
||
libllama.so содержит: qwen3moe, qwen35moe, deepseek2, granite
|
||
```
|
||
|
||
Место: свободно 256 ГБ, три модели занимают 55 ГиБ.
|
||
|
||
## Почему именно эти три и в этом порядке
|
||
|
||
**Qwen3-Coder-30B-A3B — главная.** MoE: 30 миллиардов всего, **3 миллиарда активных**. На V100 производительность упирается в пропускную способность памяти, поэтому скорость определяется активными параметрами, а память — общими. Ожидается скорость малой модели при качестве тридцатимиллиардного кодера. Это ровно та гипотеза, ради которой A38 брала Nemotron и до замера не довела. 12,8 млн скачиваний, 933 отметки — сборка обкатанная.
|
||
|
||
По размеру садится на место нынешнего кодера: 17,28 ГиБ против 17,67 у Qwen3.8-27B, то есть под контекст остаётся столько же.
|
||
|
||
**Qwen2.5-Coder-32B — про потолок качества.** Плотная, старшая в семействе нынешнего лидера. Числилась кандидатом ещё в A40 и до замера не дошла. Скорости от неё не ждут: плотные 32B на этом железе должны идти примерно вдвое медленнее 14B. Вопрос к ней один — покупается ли за потерю скорости реальный прирост качества. 14B даёт 75% на стенде.
|
||
|
||
**Tiel-Coder-35B-A3B — третья, и только после двух первых.** Тоже MoE с тремя активными, первое место в трендах среди кодеров. Но выложена 31 августа, автор незнакомый, 145 отметок против 933 у Qwen. Не обкатана.
|
||
|
||
## Ожидания ревьюера — это не измерения
|
||
|
||
Всё, что выше сказано про ожидаемую скорость, выведено из замеренных свойств железа и **числами в отчёт не переносится**. В таблице стоят только измеренные значения.
|
||
|
||
---
|
||
|
||
## P0-1. Правило из A40 действует без изменений
|
||
|
||
**Строка в отчёте появляется только после того, как модель отработала на стенде.**
|
||
|
||
Для каждой строки обязательны:
|
||
|
||
1. **Абсолютный путь к файлу GGUF** на сервере.
|
||
2. **Размер файла в байтах** из `stat`, а не из карточки модели.
|
||
3. **Контрольная сумма** первых мегабайт или `sha256`.
|
||
4. **Сырые тайминги** из поля `timings` ответа `llama-server`, не пересчитанные вручную.
|
||
5. **Имя сборки** из `general.name` метаданных GGUF, а не из названия каталога.
|
||
|
||
Модель не скачалась, не запустилась или не влезла — **строки в таблице нет**, вместо неё раздел «не проверено» с причиной. Это полноценный результат, он принимается; выдуманные числа — нет.
|
||
|
||
## P0-2. Замер на 64К обязателен
|
||
|
||
Это главное отличие от A40 и главная причина, по которой задание вообще нужно.
|
||
|
||
1. **Мерить на 64К контекста**, а не только на 32К. Это порог отбора у Hermes: модель, не держащая 64К, в работу не идёт, и замер на 32К на вопрос владельца не отвечает.
|
||
2. Если модель на 64К не помещается или деградирует — **так и записать**, с числами.
|
||
3. **Длинный контекст у MoE под особым подозрением.** DeepSeek-Coder-V2-Lite, тоже MoE с малым числом активных, по замеру A40 на 32К проваливается до 3,35 ток/с и уходит в таймаут. Проверить целенаправленно, не повторяется ли это у Qwen3-Coder и Tiel: если повторяется, вся привлекательность MoE на этом железе иллюзорна, и это важнейший вывод задания.
|
||
4. Дополнительно снять 32К — для сопоставимости с таблицей A40.
|
||
|
||
## P0-3. Одинаковые условия
|
||
|
||
1. **Режим мышления выключен у всех**, как в A40.
|
||
2. Квантование Q4_K_M, где доступно; у Tiel его нет — взят `UD-Q4_K_S`, и это **оговорить в отчёте** отдельной строкой.
|
||
3. `--parallel 1`, посторонних запросов во время замера нет.
|
||
4. **Размер контекста указывать при каждом числе.** В A40 его забыли указать вовсе, и числа оказалось не с чем соотнести.
|
||
5. **VRAM мерить по процессу**: `nvidia-smi --query-compute-apps=pid,used_memory`, а не общую занятость карты. В A40 столбец собрал занятость вместе с соседней резидентной моделью и стал бесполезен.
|
||
|
||
## P0-4. Что измерять и куда писать
|
||
|
||
Как в A40: генерация и обработка промпта в токенах в секунду, видеопамять по процессу, время холодной загрузки, прохождение 12 задач стенда, поведение на длинном контексте.
|
||
|
||
Отчёт — **новый файл** `benchmarks/BENCHMARK_MOE_CANDIDATES.md` и отдельный файл результатов. `BENCHMARK_REPORT.md` и `benchmark_results.json` не трогать: их правит A44, и одновременная запись даст конфликт.
|
||
|
||
Вывод в одну строку на каждую модель: годится ли она заменой нынешнему кодеру и почему. **Ничего в конфигурации владельца не менять** — задание исследовательское, решение принимает он.
|
||
|
||
## P0-5. Аудит вторым проходом
|
||
|
||
В A38 выдумка прошла первый проход целиком. Здесь она — главный предмет проверки.
|
||
|
||
1. **Для каждой строки убедиться, что файл существует**: пройти `stat` по всем путям и сверить размеры с таблицей.
|
||
2. **Ни одной записи `COMPLETED` без файла** в результатах.
|
||
3. **Проверить выборочно тайминги**: повторить два-три замера и убедиться, что цифры воспроизводятся.
|
||
4. **Убедиться, что замер на 64К действительно сделан**, а не подменён замером на 32К.
|
||
5. **Проверить, что при каждом числе указан контекст**, и что VRAM снята по процессу.
|
||
6. **Убедиться, что файлы A44 не тронуты.**
|
||
7. **Побочные изменения** объяснить.
|
||
8. **Пропущенный пункт назвать пропущенным.**
|
||
|
||
---
|
||
|
||
## Ограничения
|
||
|
||
- **Выполнять после A44**: видеокарта одна.
|
||
- Служебные юниты `qwen-coder` и `qwen-compressor` после прогонов вернуть в рабочее состояние: владелец пользуется сервером ежедневно.
|
||
- Конфигурацию хаба не менять.
|
||
- Учётные данные и `~/.hermes/agy_profiles/` не трогать.
|
||
- Место на диске контролировать, раздел не забить.
|
||
- Версию `0.1.1` не поднимать, тег не создавать.
|
||
- Правило честности без исключений.
|
||
|
||
## Критерии приёмки
|
||
|
||
1. Ветка в `origin`, `git status` чист.
|
||
2. Три кандидата прогнаны либо честно объявлены недоступными с причиной.
|
||
3. Для каждой строки: путь, размер в байтах, контрольная сумма, `general.name`, сырые тайминги.
|
||
4. **Для каждой модели есть замер на 64К контекста**; где не влезло или деградировало — с числами.
|
||
5. Проверено, повторяется ли у MoE провал на длинном контексте, замеченный у DeepSeek.
|
||
6. При каждом числе указан размер контекста; VRAM снята по процессу.
|
||
7. Отклонение по квантованию у Tiel оговорено.
|
||
8. Отчёт в отдельном файле; `BENCHMARK_REPORT.md` и `benchmark_results.json` не изменены.
|
||
9. Служебные модели на портах 8081 и 8082 возвращены в рабочее состояние.
|
||
10. Конфигурация владельца не изменена.
|
||
11. `ruff check .` чисто; релизный гейт не ухудшен.
|
||
12. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`. На `origin/main` сейчас **491 passed**.
|
||
|
||
## Главное
|
||
|
||
Нынешний лидер по замерам — Qwen2.5-Coder-14B: 75% качества при 55,9 ток/с. Вопрос владельца в том, есть ли что-то заметно лучше. Qwen3-Coder-30B-A3B — самый обоснованный ответ, какой можно дать не запуская: три активных миллиарда на памяти-узком-месте должны дать скорость малой модели при качестве большой. Но ровно это же обещал DeepSeek, а на длинном контексте провалился до 3,35 ток/с. Поэтому замер на 64К здесь важнее самой таблицы скоростей.
|
||
|
||
## Порядок сдачи
|
||
Передать точный `FINAL_COMMIT_SHA`.
|