| # Implementation notes |
|
|
| ## Coding priorities |
|
|
| 1. Do not break the baseline. |
| 2. Add config flags for every new behavior. |
| 3. Keep temporal memory modules isolated from detector-specific code. |
| 4. Use small commits/patches. |
| 5. Add shape assertions early. |
|
|
| ## Suggested file organization |
|
|
| Use the repository's existing module conventions. If no better location exists, create: |
|
|
| ```text |
| projects/mmdet3d_plugin/models/temporal_memory/ |
| __init__.py |
| controller.py |
| detector_adapters.py |
| memory_packet.py |
| updaters.py |
| pe_handler.py |
| distillation.py |
| schedulers.py |
| ``` |
|
|
| Detector-specific adapters can live in: |
|
|
| ```text |
| projects/mmdet3d_plugin/models/temporal_memory/adapters/ |
| repdetr3d_adapter.py |
| streampetr_adapter.py |
| ``` |
|
|
| ## Config flags |
|
|
| Add flags like: |
|
|
| ```python |
| temporal_memory = dict( |
| enabled=False, |
| detector_adapter="repdetr3d", |
| keyframe_interval=3, |
| updater="gated_residual", |
| partial_layer="middle", |
| memory_is_pre_pe=True, |
| pe_mode="separate_recompute", |
| use_ego_conditioning=True, |
| use_distillation=True, |
| distill_weight=1.0, |
| train_with_teacher=True, |
| inference_teacher_forbidden=True, |
| ) |
| ``` |
|
|
| ## Debug flags |
|
|
| ```python |
| tm_debug_shapes=True |
| tm_debug_latency=True |
| tm_debug_compare_full_path=False |
| tm_assert_no_teacher_in_inference=True |
| ``` |
|
|
| ## Feature extraction |
|
|
| For EVA-style ViTs, implement intermediate feature collection carefully: |
|
|
| - Avoid storing every block output by default. |
| - Collect only requested layers. |
| - Use hooks only if they are robust under distributed training and checkpointing. |
| - Prefer explicit forward options if the backbone supports them. |
|
|
| ## Memory cache |
|
|
| The memory cache should reset on: |
|
|
| - new scene |
| - sequence discontinuity |
| - missing previous frame |
| - large timestamp gap |
| - explicit batch boundary |
|
|
| The cache key should include scene/sample identity when batch size > 1. |
|
|
| ## Batch handling |
|
|
| Do not assume batch size 1 unless the config requires it. If batch sequences are interleaved, memory must be keyed per sequence. |
|
|
| Simpler first implementation may assert: |
|
|
| ```python |
| assert batch_size == 1 |
| ``` |
|
|
| but this must be clearly documented. |
|
|
| ## Latency measurement |
|
|
| Use CUDA synchronization around measured regions: |
|
|
| ```python |
| torch.cuda.synchronize() |
| start = time.perf_counter() |
| ... |
| torch.cuda.synchronize() |
| elapsed = time.perf_counter() - start |
| ``` |
|
|
| Report: |
|
|
| - full backbone time |
| - partial backbone time |
| - updater time |
| - detector head time |
| - total per-frame time |
|
|
| ## Reproducibility |
|
|
| Log: |
|
|
| - config path |
| - checkpoint path |
| - git commit |
| - keyframe interval |
| - updater type |
| - partial layer |
| - PE mode |
| - distillation weight |
| - whether backbone/head were frozen |
|
|
| ## Common failure modes |
|
|
| ### Shape mismatch |
|
|
| Fix using adapter conversions, not ad-hoc reshapes in the updater. |
|
|
| ### Stale PE |
|
|
| If outputs degrade badly on non-keyframes, verify whether memory includes PE. Try pre-PE memory and recomputed PE. |
|
|
| ### No speedup |
|
|
| Profile updater and partial feature extraction. Cross-attention may be too expensive. |
|
|
| ### Distillation improves but detection does not |
|
|
| The distilled feature may match globally but lose object-critical detail. Add foreground-weighted feature distillation only after the simple loss is tested. |
|
|
| ### Training collapse |
|
|
| Reduce update magnitude: |
|
|
| ```text |
| M_t = M_{t-1} + alpha * sigmoid(gate) * residual |
| ``` |
|
|
| Initialize `alpha` small, e.g. 0.1. |
|
|