# Шаг 4b — Что изменилось --- ## 1. Новая точка входа — `src/main.py` + добавлена debug-конфигурация `Main entry point` в `launch.json` **Пример запуска отладки:** ```bash python src/training/train_gtauav.py --config conf/gtauav_balanced.gin ``` ## 2. Тесты Добавлены `tests\conftest.py & test_trainer.py` ### Тест загрузки конфигураций в трейнер Файл `test_trainer.py` **Таблица конфигураций** - scr/conf/*.py конфиги - in/config_files общие common .gin-конфиги и пресеты под эксперименты --- | Пресет | backbone | baseline_mode | shared_encoder | init_gate | | ----------------------------------- | --------- | ------------- | -------------- | --------- | | `gtauav_balanced` | dinov3 | False | True | 0.7 | | `gtauav_baseline` | dinov3 | True | True | 0.7 | | `gtauav_balanced_asym` | dinov3 | False | False | 0.7 | | `gtauav_baseline_asym` | dinov3 | True | False | 0.7 | | `gtauav_text_heavy` | dinov3 | False | True | **0.3** | | `gtauav_image_heavy` | dinov3 | False | True | **0.9** | | `gtauav_balanced_stripnet` | stripnet | False | — | 0.7 | | `gtauav_balanced_stripnet_unfrozen` | stripnet | False | — | 0.7 | | `gtauav_baseline_stripnet` | stripnet | True | — | 0.7 | | `gtauav_baseline_stripnet_unfrozen` | stripnet | True | — | 0.7 | | `gtauav_balanced_sofia` | sofia_v71 | False | — | 0.7 | | `gtauav_baseline_sofia` | sofia_v71 | True | — | 0.7 | | `gtauav_balanced_sofia_v1` | sofia_v1 | False | — | 0.7 | | `gtauav_baseline_sofia_v1` | sofia_v1 | True | — | 0.7 | | `preprocess` | — | — | — | — | **Пример запуска отладки:** ```bash python -m pytest tests/test_trainer.py ``` **Лог:** ```bash =========================================== test session starts =========================================== platform linux -- Python 3.10.19, pytest-9.0.3, pluggy-1.6.0 rootdir: /home/servml/Документы/code/Yaroslav/caption-test collected 21 items tests/test_trainer.py . ✅ _SUPPORTED_BACKBONES must be a frozenset (immutable, hashable). . ✅ Exactly dinov3 and stripnet are supported in the current refactor. . ✅ ModelsConfig union mirrors _SUPPORTED_BACKBONES (dinov3 | stripnet). . Supported backbones pass _validate_backbone silently. ✅ dinov3 . ✅ stripnet . Unsupported backbones (incl. sofia) raise NotImplementedError, not ImportError. ✅ sofia_v1 . ✅ sofia_v71 . ✅ mistral_42b . ✅ empty . Trainer(...) instantiates from every real preset's loaded cfgs. ✅ gtauav_balanced . ✅ gtauav_balanced_asym . ✅ gtauav_baseline . ✅ gtauav_baseline_asym . ✅ gtauav_image_heavy . ✅ gtauav_text_heavy . ✅ gtauav_balanced_stripnet . ✅ gtauav_balanced_stripnet_unfrozen . ✅ gtauav_baseline_stripnet . ✅ gtauav_baseline_stripnet_unfrozen . ✅ All runtime fields are None / 0 / [] before .train() is called. . ✅ Trainer.train() takes only `self` — main.py calls trainer.train(). [100%] =========================================== 21 passed in 2.19s =========================================== ``` ## 3. Декомпозиция вызовов в `trainer_new.py` **Теперь вызовы выглядят такой цепочкой:** ```python def train(self) -> None: """Full pipeline: setup → build → train → evaluate → cleanup.""" self._validate_backbone() clear_vram() set_seed(self.pipeline_cfg.seed) self._setup_output_dir() self._setup_tracker() self._build_model() self._configure_gradient_checkpointing() self._log_model_summary() self._build_loss() self._build_neg_bank() self._build_data_loaders() self._build_optimizer_and_scheduler() self._restore_from_resume() self._setup_profiler() try: self._train_loop() self._final_evaluation() finally: self._cleanup() ``` **Лог:** ### Тест вызовов до блока `try: self._train_loop()` ✅ Загрузка весов ✅ Сборка пайплайна ✅ Загрузка моделей ✅ Загрузка данных ```bash 2026-05-07 09:40:53 caption_test.trainer INFO ⚙️ Validate backbone 2026-05-07 09:40:53 caption_test.trainer INFO ⚙️ Setup out dir 2026-05-07 09:40:53 caption_test.trainer INFO ⚙️ Setup tracker... 2026-05-07 09:40:53 caption_test.trackers WARNING tensorboard not installed, skipping TB tracking 2026-05-07 09:41:24 caption_test.trainer INFO ⚙️ Build loss... 2026-05-07 09:41:52 caption_test.trainer INFO Building model — with text (L1/L2/L3), shared DINOv3 WEB 2026-05-07 09:42:24 caption_test.trainer INFO ⚙️ Build DINOv3 model... 2026-05-07 09:50:48 caption_test.model INFO 🧊 Loading DINOv3 from dinov3-vitl16-pretrain-lvd1689m.pth 2026-05-07 09:50:48 caption_test.model INFO 🧊 Loading DINOv3 from dinov3-vitl16-pretrain-lvd1689m.pth 2026-05-07 09:54:48 caption_test.model INFO 🧊 DINOv3 loaded: 303,129,600 params 2026-05-07 09:54:48 caption_test.model INFO 🧊 DINOv3 loaded: 303,129,600 params 2026-05-07 09:55:03 caption_test.adapters INFO 🔧 MONA injected: 24 adapters (blocks 12-23 of 24), 3,502,080 trainable params (bottleneck=64) 2026-05-07 09:55:03 caption_test.adapters INFO 🔧 MONA injected: 24 adapters (blocks 12-23 of 24), 3,502,080 trainable params (bottleneck=64) 2026-05-07 09:55:05 caption_test.model INFO Shared encoder mode: single DINOv3 WEB for drone + satellite 2026-05-07 09:55:05 caption_test.model INFO Shared encoder mode: single DINOv3 WEB for drone + satellite 2026-05-07 09:55:38 caption_test.dgtrs INFO 📝 Loading DGTRS-CLIP text encoder from DGTRS-CLIP-ViT-L-14.pt 2026-05-07 09:55:38 caption_test.dgtrs INFO 📝 Loading DGTRS-CLIP text encoder from DGTRS-CLIP-ViT-L-14.pt 2026-05-07 09:55:39 caption_test.dgtrs INFO 📝 DGTRS text encoder loaded: 123,972,096 params, context=248 tokens 2026-05-07 09:55:39 caption_test.dgtrs INFO 📝 DGTRS text encoder loaded: 123,972,096 params, context=248 tokens 2026-05-07 10:03:01 caption_test.adapters INFO 🔧 LoRA injected: 12 blocks, rank=4, 147,456 trainable params 2026-05-07 10:03:01 caption_test.adapters INFO 🔧 LoRA injected: 12 blocks, rank=4, 147,456 trainable params 2026-05-07 10:04:01 caption_test.trainer INFO embed_dim=1024 2026-05-07 10:04:22 caption_test.trainer INFO ⚙️ Configure gradient checkpointing... 2026-05-07 10:04:42 caption_test.trainer INFO ✅ Gradient checkpointing enabled (DINOv3 + DGTRS) 2026-05-07 10:04:51 caption_test.trainer INFO trainable=7,059,458 (1.63%) total=434,161,154 2026-05-07 10:04:51 caption_test.profiler INFO torchinfo not installed, using basic parameter count 2026-05-07 10:04:51 caption_test.profiler INFO Model summary: Total parameters: 434,161,154 Trainable parameters: 7,059,458 (1.63%) [trainable] image_encoder.layer.12.mona_attn.gamma: [1024] (1,024) ... (Вывод списка параметров) ... 2026-05-07 10:05:00 caption_test.trainer INFO ⚙️ Build loss... 2026-05-07 10:06:06 caption_test.trainer INFO Loss: SymmetricInfoNCE Temperature: learnable (init=0.070) q2g=0.60 g2q=0.40 2026-05-07 10:06:07 caption_test.trainer INFO ⚙️ Build negative bank... 2026-05-07 10:06:13 caption_test.trainer INFO ⚙️ Build dataloaders... 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:13 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:19 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:19 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO ✅ Loaded 24891 pairs from meta/train_80.json 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO ✅ Loaded 24891 pairs from meta/train_80.json 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:20 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO ✅ Loaded 6252 pairs from meta/test_20.json 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO ✅ Loaded 6252 pairs from meta/test_20.json 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 🔻 Filter loaded: 10905 excluded images 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📐 Altitude index: 33708 drones (from 2 CSV) 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:22 caption_test.gtauav_dataset INFO 📚 Loading caption index from /home/servml/Документы/datasets/GTA-UAV-LR-captions 2026-05-07 10:06:24 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:24 caption_test.gtauav_dataset INFO 📚 Caption index: 39957 entries 2026-05-07 10:06:25 caption_test.gtauav_dataset INFO ✅ Loaded 24891 pairs from meta/train_80.json 2026-05-07 10:06:25 caption_test.gtauav_dataset INFO ✅ Loaded 24891 pairs from meta/train_80.json 2026-05-07 10:06:25 caption_test.trainer INFO Sampler: MutuallyExclusive — no false negatives within a batch 2026-05-07 10:06:25 caption_test.trainer INFO train=24891 test=6252 batch=8 accum=8 effective_batch=64 2026-05-07 10:06:46 caption_test.trainer INFO ⚙️ Build optimizer & scheduler... 2026-05-07 10:06:46 caption_test.trainer INFO Optimizer: AdamW LR: proj=1e-04 text=1e-05 warmup=2 epochs 2026-05-07 10:07:33 caption_test.trainer INFO ⚙️ Restore from resume... 2026-05-07 10:07:37 caption_test.trainer INFO ⚙️ Setup profiler... ``` `src/main.py`: - Читает имя пресета из `sys.argv[1]` (один позиционный аргумент) - Резолвит корень проекта через `get_proj_dir()` (поиск по маркерам `pyproject.toml`/`.git`/`in/`) - Формирует `path2cfg = f"{proj_dir}in/config_files/"` буквально по REQUIREMENTS_GIN_STYLE.md §5 - Вызывает `load_all_configs(path2cfg, preset_name)` — двухпроходная загрузка из `_common`-файлов и пресет-директории - Передаёт 6 объектов конфига в `train(...)` именованными аргументами