Репозиторий для хакатонного решения по устойчивому поиску ближайших голосовых соседей в искажённом аудио. Каркас сразу заточен под uv, Docker, эксперименты в отдельных ветках и воспроизводимый CLI.
mainдля стабильных состояний,devдля интеграции,exp/*для отдельных экспериментов.- GPU-first Docker на Ubuntu 20.04 с Python 3.13.
- единый Python-корень
source/для всего кода; - YAML-конфиги в
configs/; - журнал экспериментов в
experiments/README.md; - базовый CLI:
traininfervalidate-submission
.
├── README.md
├── pyproject.toml
├── uv.lock
├── Dockerfile
├── compose.yaml
├── configs/
├── data/
│ ├── organizers/
│ ├── external/
│ ├── processed/
│ └── cache/
├── experiments/
│ ├── README.md
│ └── templates/
├── source/
├── tests/
└── outputs/
Требования:
- установлен
uv; - доступен Python 3.13 через
uv; - Git и Docker поставлены локально.
Установка:
uv sync --all-groups
uv run pre-commit installПроверка:
uv run python -m source.cli --help
uv run pytestСборка:
docker compose buildЗапуск dev-контейнера:
docker compose run --rm appОбраз:
- базируется на Ubuntu 20.04;
- ориентирован на GPU-сценарий;
- ставит Python 3.13 через
uv.
В git не коммитятся:
- конкурсные аудиофайлы;
- внешние датасеты;
- кэши и препроцессинг;
- веса моделей и чекпойнты;
submission.csv.
Назначение каталогов:
data/organizers/— исходные данные от организаторов и их manifests;data/external/— внешние открытые датасеты, manifests и заметки по лицензиям;data/processed/— промежуточные данные, препроцессинг, шардирование;data/cache/— временные кэши даталоадеров и пайплайнов;outputs/— предсказания, логи, служебные результаты запуска.
Подробности по раскладке данных лежат в README внутри этих папок.
Рекомендуемая логика:
configs/data/— расположение данных и manifests;configs/train/— параметры обучения;configs/infer/— параметры инференса и формата submission.
В стартовом шаблоне поле submission.path_column выставлено в auto: CLI возьмёт имя колонки пути из входного manifest-файла, чтобы не конфликтовать с шаблоном организаторов.
Обучение:
uv run python -m source.cli train --config configs/train/baseline.yamlИнференс:
uv run python -m source.cli infer \
--config configs/infer/baseline.yaml \
--input-dir data/organizers \
--input-csv data/organizers/test_public.csv \
--output outputs/submission.csvПроверка submission:
uv run python -m source.cli validate-submission --submission outputs/submission.csvСейчас infer реализован как smoke-ready заглушка: он создаёт корректный по структуре submission.csv, чтобы можно было отладить репозиторий, CI и формат вывода до интеграции настоящей модели.
Целевой поток:
main <- dev <- exp/*
Правила:
- прямой push в
mainзапрещён; - основная разработка идёт в
dev; - каждый эксперимент открывается из
devв веткеexp/YYYYMMDD-short-name; - удачные эксперименты вливаются в
dev; - только стабильное состояние попадает из
devвmain.
Пример жизненного цикла:
git switch dev
git pull --ff-only
git switch -c exp/20260411-baseline-retrievalДля каждого эксперимента нужно:
- создать папку
experiments/EXP-YYYYMMDD-short-name/; - заполнить
README.mdс гипотезой, конфигами и метриками; - обновить журнал в
experiments/README.md.
Через GitHub UI для веток main и dev:
Require a pull request before merging;- запрет прямого push;
- запрет
force push; - обязательный зелёный CI для merge в
main.
Журнал и правила ведения экспериментов:
Следующий слой разработки:
- подключить реальный speaker embedding backend;
- реализовать train/infer pipeline поверх конфигов;
- добавить retrieval и локальную валидацию на Precision@K;
- завести первые
exp/*ветки под baseline-модель и аугментации.