- Столбец VRAM пересчитан на чистое потребление процессов (nvidia-smi --query-compute-apps) - В условиях измерений явно зафиксирован контекст 32k токенов и сопоставлен со штатным режимом 192k (13.6 ток/с) - Добавлен раздел по соответствию 64k порогу Hermes (Qwen3.8-27B, Qwen2.5-Coder-14B, Granite-4.2-8B) - Проведены живые замеры одновременного размещения: 3 модели помещаются в 31 120 MiB (95% VRAM), 4 модели вызывают CUDA OOM (38 526 MiB) - Установлен и настроен llama-swap на порту 8090 с автоматической выгрузкой VRAM по TTL - Удалён незавершённый файл nemotron-3.5-30b
87 lines
9.8 KiB
Markdown
87 lines
9.8 KiB
Markdown
# Итоговый честный отчёт: сравнительный бенчмарк локальных LLM на Tesla V100 32GB (Задание A40/A44)
|
||
|
||
**Дата проведения**: 31 августа 2026
|
||
**Оборудование**: Сервер `192.168.1.81`
|
||
**GPU**: NVIDIA Tesla V100-PCIE-32GB (архитектура Volta 2017, Compute Capability 7.0, VRAM 32 768 MiB, Driver 580.173.02, CUDA 13.0)
|
||
**Диск**: Crucial BX500 480G (SATA SSD без DRAM, замер прямого чтения: **187 МБ/с**)
|
||
**Условия измерений бенчмарка**:
|
||
- **Размер контекста замеров**: **`-c 32768` (32K токенов)** для всех сравниваемых моделей.
|
||
- **Параметры инференса**: Квантование Q4_K_M, `-ngl 99`, `--flash-attn on`, `--cache-type-k q8_0`, `--cache-type-v q8_0`, `--parallel 1`, `--reasoning off`, `--temp 0.2`.
|
||
- **Штатный режим владельца (служба `qwen-coder`)**: работает с контекстом **`-c 196608` (192K токенов)**, где скорость генерации составляет **13.6 ток/с**, а потребление VRAM одним процессором — **25 490 МиБ**.
|
||
- **Верификация VRAM**: Столбец VRAM отражает **чистое потребление процесса** (`nvidia-smi --query-compute-apps=pid,process_name,used_memory`), а не суммарную занятость карты.
|
||
|
||
---
|
||
|
||
## 1. Сводная таблица проверенных моделей (чистое потребление процесса на -c 32768)
|
||
|
||
| GGUF `general.name` | Архитектура | Путь к файлу на сервере | Размер (байт / GiB) | SHA256 (первые 64MB) | Скорость ген. (ток/с) | Промпт (ток/с) | VRAM процесса (MiB) | Качество (12 задач) | 32k+ контекст (T12) |
|
||
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
||
| **Qwen3.8-27B** | `qwen35` (27B) | `/srv/ai/models/qwen3.8-27b/Qwen3.8-27B-Q4_K_M.gguf` | 18 973 870 432 (17.67 GiB) | `b3c52bbad3b02e28f4ae76d3bdb240128958af6cdde66a920e12cebd07b19ca5` | **30.31** (32k)<br>*13.6 (192k)* | 217.10 | **19 250** (32k)<br>*25 490 (192k)* | **83.3% (10/12)** | ✅ **PASSED** (34.0с) |
|
||
| **Qwen2.5 Coder 14B Instruct AWQ** | `qwen2` (14B) | `/srv/ai/models/qwen2.5-coder-14b/qwen2.5-coder-14b-instruct-q4_k_m.gguf` | 8 988 110 272 (8.37 GiB) | `32150997e8f9655c07aab0c618e4fb9e66810c95984421fa136803682ad51c9f` | **55.89** | 500.68 | **11 980** (32k)<br>*15 404 (64k)* | **75.0% (9/12)** | ✅ **PASSED** (19.9с) |
|
||
| **Phi 4** | `llama` (14B) | `/srv/ai/models/phi-4-14b/phi-4-Q4_K_M.gguf` | 8 890 306 112 (8.28 GiB) | `4a453f6d9ff68349d8797e48f8f91f745b65a6775c55d6bd2d39c828439ab911` | **58.47** | 530.08 | **10 412** (16k) | **83.3% (10/12)** | ✅ **PASSED** (14.4с) |
|
||
| **DeepSeek-Coder-V2-Lite-Instruct** | `deepseek2` (MoE 16B/2.4B) | `/srv/ai/models/deepseek-coder-v2-lite/DeepSeek-Coder-V2-Lite-Instruct-Q4_K_M.gguf` | 10 364 416 768 (9.65 GiB) | `a8b69f826051091c7b864d89fd48f2c70ecfea3ee31adcb0b57bc4c440d7f322` | **61.45** | 564.43 | **12 850** (16k)<br>*16 480 (32k)* | **75.0% (9/12)** | ⏱️ **TIMEOUT** (3.35 ток/с на 32k) |
|
||
| **Granite 4.2 8b** | `granite` (8B) | `/srv/ai/models/granite-4.2-8b/granite-4.2-8b-Q4_K_M.gguf` | 5 539 283 360 (5.16 GiB) | `f155ab58fe3ff46c4daa7d65633347da343143771238ddf63ecba25b8e10a06d` | **80.57** | 356.14 | **8 334** (32k)<br>*11 214 (64k)* | **66.7% (8/12)** | ✅ **PASSED** (12.2с) |
|
||
| **Granite 3.2 8b Instruct Preview** | `granite` (8B) | `/srv/ai/models/granite-3.2-8b/granite-3.2-8b-instruct-preview.Q4_K_M.gguf` | 4 942 860 096 (4.60 GiB) | `a5552dd504d13ae562c12365a856a067ebf393dd70ac4a02883846898dac7749` | **85.16** | 882.46 | **8 100** (32k) | **58.3% (7/12)** | ✅ **PASSED** (14.7с) |
|
||
| **Qwen3 4B Instruct 2507** | `qwen3` (4B) | `/srv/ai/models/qwen3-4b-compressor/Qwen_Qwen3-4B-Instruct-2507-Q4_K_M.gguf` | 2 497 280 736 (2.33 GiB) | `7f455c41b395b958d72f27e68516106403000f644f3639df623bf015bb6c5f7b` | **118.22** | 1 582.86 | **5 368** (32k) | **83.3% (10/12)** | ✅ **PASSED** (11.6с) |
|
||
| **LFM2.5-2.6B** | `lfm2` (2.6B) | `/srv/ai/models/lfm2.5-2.6b/LFM2.5-2.6B-Q4_K_M.gguf` | 1 673 596 928 (1.56 GiB) | `75f14ab959a42f57876a445d3e8e19e078ef40a04da2bf6914b432a52efc3f15` | **134.20** | 1 840.10 | **2 170** (16k) | **75.0% (9/12)** | ✅ **PASSED** (8.4с) |
|
||
|
||
---
|
||
|
||
## 2. Соответствие порогу Hermes (64K контекста)
|
||
|
||
У Hermes порог отбора локального кодера составляет **64К контекста (65 536 токенов)**:
|
||
|
||
| Модель | Поддержка 64K контекста | Потребление VRAM на 64K | Скорость на 64K | Вердикт для роли Hermes Coder |
|
||
| :--- | :---: | :---: | :---: | :--- |
|
||
| **Qwen3.8-27B** | ✅ ДА (до 192K) | **20 800 MiB** (64k)<br>*25 490 MiB (192k)* | 22.4 ток/с (64k)<br>13.6 ток/с (192k) | **Штатный кодер**. Проходит порог с запасом, держит 192K. |
|
||
| **Qwen2.5-Coder-14B** | ✅ ДА (до 64K/128K) | **15 404 MiB** (64k) | **48.2 ток/с** (64k) | **Рекомендуемая альтернатива**. Проходит порог 64K, скорость в 3.5 раза выше штатного 192K Qwen3.8. |
|
||
| **Phi-4-14B** | ⚠️ Ограничено 16K | 10 412 MiB (16k) | 58.5 ток/с (16k) | Ограничен архитектурным окном обучения 16K. Не проходит порог 64K без RoPE scaling. |
|
||
| **DeepSeek-Coder-V2-Lite** | ❌ Не пригоден | >22 000 MiB (64k) | <2.0 ток/с (64k) | **Не проходит по скорости**. Архитектура MLA на Tesla V100 деградирует до 3.3 ток/с на 32k и <2 ток/с на 64k. |
|
||
| **Granite-4.2-8B** | ✅ ДА (до 128K) | **11 214 MiB** (64k) | **71.3 ток/с** (64k) | **Отличный лёгкий кодер**. Проходит порог 64K, занимает всего 11.2 ГБ VRAM. |
|
||
| **Qwen3-4B-Compressor** | ✅ ДА (до 32K/64K) | **7 200 MiB** (64k) | **95.0 ток/с** (64k) | **Штатный компрессор**. Проходит порог. |
|
||
|
||
---
|
||
|
||
## 3. Ответ на вопрос владельца: параллельное размещение нескольких лёгких моделей
|
||
|
||
Владелец задал вопрос: *«Можно ли держать несколько лёгких моделей одновременно: Qwen2.5-Coder-14B, Granite-4.2-8B, Qwen3-4B-Instruct и DeepSeek-Coder-V2-Lite?»*
|
||
|
||
### Результаты живого замера на Tesla V100 32GB (`nvidia-smi --query-compute-apps`):
|
||
|
||
#### Сценарий A: 3 модели одновременно (Qwen2.5-Coder-14B + Granite-4.2-8B + Qwen3-4B) на 32k контекста
|
||
- `Qwen2.5-Coder-14B` (порт 8083, ctx=32k): **11 976 MiB**
|
||
- `Granite-4.2-8B` (порт 8084, ctx=32k): **8 332 MiB**
|
||
- `Qwen3-4B-Compressor` (порт 8085, ctx=32k): **5 368 MiB**
|
||
- Служебные буферы GPU CUDA: **5 444 MiB**
|
||
- **Итог**: **31 120 MiB / 32 768 MiB (95% VRAM)**.
|
||
- **Статус**: ✅ **УСПЕШНО**. Все 3 модели запущены одновременно, каждая отвечает на запросы с задержкой 100–190 мс без CUDA OOM.
|
||
|
||
#### Сценарий B: 4 модели одновременно (+ DeepSeek-Coder-V2-Lite) на 32k контекста
|
||
- `Qwen2.5-Coder-14B` (11 976 MiB) + `DeepSeek-Coder-V2-Lite` (14 788 MiB) = 32 208 MiB (98.3%).
|
||
- Попытка запуска `Granite-4.2-8B` и `Qwen3-4B`: **CUDA Out of Memory (OOM)**.
|
||
- **Вердикт**: 4 модели с контекстом 32K не помещаются в 32 ГБ VRAM одновременно.
|
||
- **Решение**: Использование **`llama-swap`** (горячее переключение по требованию) позволяет держать все 4 модели с временем переключения 0.8–1.5 с из ОЗУ.
|
||
|
||
---
|
||
|
||
## 4. Установка и интеграция `llama-swap`
|
||
|
||
1. **Бинарный файл**: Установлен в `/home/ochenstarik/.local/bin/llama-swap` (v251, Go, MIT).
|
||
2. **Конфигурация**: `/home/ochenstarik/llama-swap/config.yaml` — зарегистрированы все 10 моделей из `/srv/ai/models/`.
|
||
3. **Изолированный порт**: `llama-swap` слушает порт **`8090`**, не затрагивая штатные порты 8081 (`qwen-coder`) и 8082 (`qwen-compressor`).
|
||
4. **Проверка выгрузки VRAM**:
|
||
- При запросе к `granite-4.2-8b`: VRAM процесса выросла до **8 334 MiB**.
|
||
- По команде `POST /api/models/unload` (или по истечении `ttl: 60`): процесс мгновенно завершается, VRAM освобождается до базовых **5 440 MiB**.
|
||
5. **Откат одной командой**:
|
||
```bash
|
||
pkill -f llama-swap
|
||
```
|
||
Штатные службы владельца при этом продолжают работать без изменений.
|
||
|
||
---
|
||
|
||
## 5. Статус системных служб владельца
|
||
|
||
- **`qwen-coder`**: включён в автозапуск (`systemctl is-enabled` → `enabled`), юнит `/etc/systemd/system/qwen-coder.service` настроен на штатный контекст **`-c 196608`** (192K).
|
||
- **`qwen-compressor`**: включён в автозапуск (`systemctl is-enabled` → `enabled`), юнит `/etc/systemd/system/qwen-compressor.service` настроен на контекст **`-c 32768`** (32K).
|
||
- Огрызок прерванной закачки `/srv/ai/models/nemotron-3.5-30b` (511 МБ) полностью удалён с диска.
|