docker / build (push) Failing after 39s
- Docker: Dockerfile (CPU), compose с FlareSolverr, настройка через DUB_* переменные, токен доступа к /predict, tools/pack_models.py, workflow Gitea Actions, docs/docker.md - Модель грузится офлайн (config.json рядом с весами); общий код вынесен в src/spans.py, сервису не нужны sklearn/matplotlib/pandas - Обучение: профили tiny2/base/large/modern, запуски в models/runs, реестр и честное сравнение на одной тестовой выборке (src/runs.py), пункт меню «Модели» - Датасет: язык и аудио-параметры дорожек, 18+ по строкам «Аудио», ручные метки по ссылкам, переиндексация сохранённого HTML, параллельная сборка, сбалансированная выборка - Тексты страниц (data/pages) больше не хранятся в git Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
105 lines
7.0 KiB
Markdown
105 lines
7.0 KiB
Markdown
# Обучение на Windows с GPU (RTX 5070 Ti)
|
||
|
||
## Почему cu128
|
||
|
||
RTX 5070 Ti — архитектура Blackwell (compute capability `sm_120`). Колёса
|
||
PyTorch с PyPI для Windows по умолчанию CPU-only, а старые CUDA-сборки не
|
||
знают sm_120. Нужны колёса с индекса cu128 (torch >= 2.7; проверено на
|
||
torch 2.11.0+cu128).
|
||
|
||
## Установка (один раз)
|
||
|
||
```bat
|
||
cd C:\Users\shats\Dev\DUB-AI
|
||
python -m venv .venv
|
||
.venv\Scripts\python -m pip install --upgrade pip
|
||
|
||
:: torch с GPU-поддержкой (Blackwell)
|
||
.venv\Scripts\python -m pip install torch --index-url https://download.pytorch.org/whl/cu128
|
||
|
||
:: остальное
|
||
.venv\Scripts\python -m pip install -r requirements.txt
|
||
```
|
||
|
||
Проверка (ожидаемый вывод — `True` и имя карты):
|
||
|
||
```bat
|
||
.venv\Scripts\python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
|
||
:: True NVIDIA GeForce RTX 5070 Ti
|
||
```
|
||
|
||
## Обучение
|
||
|
||
```bat
|
||
.venv\Scripts\python -m src.prepare_data :: данные -> data/processed
|
||
.venv\Scripts\python -m src.train :: обе модели: 5-fold CV + финальные
|
||
.venv\Scripts\python -m src.train --models base :: только ruBert-base
|
||
.venv\Scripts\python -m src.train --epochs-override 5 --folds 3 :: быстрый прогон
|
||
```
|
||
|
||
Время на RTX 5070 Ti (3742 строки, max_len=128): rubert-tiny2 — ~2 мин
|
||
полный цикл; ruBert-base — ~7 мин. Автоматически: bf16 autocast на
|
||
CUDA, GroupKFold-сплиты, ранний stopping (patience 3), метрики и графики в
|
||
`reports/`, чекпоинты в `models/`, лучшая модель — `models/best`.
|
||
|
||
Гиперпараметры — в `MODEL_CONFIGS` (src/train.py): tiny2 — lr 1e-4, batch
|
||
64, до 20 эпох; base — lr 3e-5, batch 32, до 10 эпох; AdamW, weight_decay
|
||
0.01, linear warmup 10%, grad clip 1.0, seed 42.
|
||
|
||
## Выбор основы и сравнение моделей (меню, пункты 2 и 7)
|
||
|
||
`python tools/collect.py` → «2 Переобучить»: после вопроса «сегментатор + основные модели» предлагается
|
||
список основ. Каждая обучается отдельным запуском в `models/runs/<время>_<профиль>/` (`python -m src.train
|
||
--runs`), **`models/best`, `reports/final_*` и `summary.md` при этом не меняются**.
|
||
|
||
| профиль | основа | замечания |
|
||
|---|---|---|
|
||
| `tiny2` | rubert-tiny2, 30M | самая быстрая, подходит для ONNX/CPU |
|
||
| `base` | ruBert-base, 178M | текущий рабочий выбор |
|
||
| `large` | ruBert-large, 427M | помещается в 16 ГБ (bf16, batch 16); обучение ~3× дольше base, инференс на CPU медленнее |
|
||
| `modern` | RuModernBERT-base, 149M | новая архитектура; ONNX-экспорт проекта (`token_type_ids`) её не принимает |
|
||
|
||
Кросс-валидация (5 прогонов) на итоговую модель не влияет, нужна только для оценки устойчивости; без неё
|
||
обучение примерно в 6 раз короче. Флаги CLI: `--folds 0`, `--lr`, `--batch`, `--epochs-override`, `--tag`.
|
||
|
||
Пункт «7 Модели» (и конец пункта 2) сравнивает **все** модели (`models/best`, запуски, `best_backup_*`,
|
||
`models/tiny2`) на **одной и той же текущей тестовой выборке**: каждая оценивается заново, в своём входном
|
||
формате (без «[RUS AC3 …]» для моделей, обученных без аудио-контекста). Цифры кэшируются в
|
||
`<модель>/eval.json` под отпечатком выборки. Таблица показывает joint exact с 95% интервалом и парное
|
||
сравнение с `models/best`: сколько строк новая модель починила и сколько сломала, значима ли разница
|
||
(знаковый критерий). Разница в пределах шума так и помечается. Звёздочка у модели означает, что она обучена
|
||
на другом разбиении и часть текущих тестовых строк могла видеть — её цифры завышены. Выбранная модель
|
||
копируется в `models/best` (прежняя уходит в `models/best_backup_*`, откат — тем же пунктом); перед заменой
|
||
выводятся предупреждения (другая основа нужна в кэше Hugging Face на машине сервиса, вес, ONNX).
|
||
Запуски и архивные копии можно удалять из того же меню (каждая 0.1–1.4 ГБ).
|
||
|
||
## Переобучение на свежем датасете
|
||
|
||
Сборщик (`deepseek-harness/default-workspace/dataset.py`) дописывает
|
||
`labels.csv`. Когда появится новый снимок:
|
||
|
||
```bat
|
||
copy /Y <путь>\labels.csv data\labels.csv
|
||
.venv\Scripts\python -m src.prepare_data
|
||
.venv\Scripts\python -m src.train
|
||
```
|
||
|
||
## Troubleshooting
|
||
|
||
| Симптом | Причина | Решение |
|
||
|---|---|---|
|
||
| `torch.cuda.is_available()` = False | установлен CPU-torch | переустановить с `--index-url .../whl/cu128` |
|
||
| `CUDA error: no kernel image is available` | колёса без sm_120 (старый cu126 и т.п.) | то же — нужны именно cu128 |
|
||
| `CUDA driver version is insufficient` | старый драйвер NVIDIA | обновить драйвер (нужен 5xx+) |
|
||
| Память GPU занята другими приложениями (WDDM) | Windows держит ~4 ГБ VRAM под систему | batch уже мал (32-64 на коротких seq хватает); при нехватке уменьшить `batch` в MODEL_CONFIGS |
|
||
| Хочется обучить без GPU | — | `base` медленно, но `tiny2` обучаема на CPU за десятки минут: тот же запуск, torch можно ставить CPU-версией |
|
||
|
||
## Что сохраняется после обучения
|
||
|
||
* `models/<имя>/model.pt` — веса; `dub_config.json` — конфигурация;
|
||
`label_maps.json` — классы; файлы токенизатора; `train_config.json` —
|
||
гиперпараметры и финальные метрики.
|
||
* `models/best/` — копия лучшей модели (используется инференсом по умолчанию).
|
||
* `reports/summary.md` — таблица сравнения; `final_<имя>.json` — метрики;
|
||
`history_<имя>.png` — кривые; `confusion_<имя>.png` — матрица ошибок.
|