Add frozen Thinker sparse head-only control
This commit is contained in:
73
README.md
73
README.md
@@ -1021,6 +1021,79 @@ process uses its `LOCAL_RANK`. DDP intentionally rejects
|
||||
`--online-current-tail`; the online producer-consumer path remains a separate
|
||||
benchmark.
|
||||
|
||||
### Frozen-Thinker sparse head-only control
|
||||
|
||||
To determine whether the regression comes from transition-sparse sampling or
|
||||
from updating the Thinker representation, rerun the same sparse-anchor
|
||||
training with `--freeze-thinker`. This still forwards every reconstructed
|
||||
8-second sequence through the original Thinker, but runs that forward under
|
||||
`no_grad` and updates only the turn head initialized from the frozen 8-second
|
||||
checkpoint. It does not create an adapter directory.
|
||||
|
||||
For a schedule-matched comparison with a one-epoch LoRA run at global batch
|
||||
16, use the same cache directories, head learning rate, warmup, seed, and
|
||||
approximately `ceil(num_examples / 16)` updates:
|
||||
|
||||
```bash
|
||||
CUDA_VISIBLE_DEVICES=0,1,2,3 \
|
||||
OMP_NUM_THREADS=2 \
|
||||
MKL_NUM_THREADS=2 \
|
||||
OPENBLAS_NUM_THREADS=2 \
|
||||
PYTORCH_ALLOC_CONF=expandable_segments:True \
|
||||
torchrun --standalone --nproc_per_node=4 train_omni_turn_lora.py \
|
||||
--model-id /data1/yfzx/wangx/Models/Qwen2.5-Omni-3B \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_7 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_11 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_10 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_6 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_9 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_4 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_8 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_5 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_sparse_8s/Session_12 \
|
||||
--freeze-thinker \
|
||||
--head-checkpoint checkpoints/easycom_open_stream_2fps_8s_head_seed0.pth \
|
||||
--output-dir checkpoints/easycom_sparse_head_only_from_frozen_8s_ddp4_epoch1 \
|
||||
--max-steps 3390 \
|
||||
--batch-size 2 \
|
||||
--gradient-accumulation-steps 2 \
|
||||
--num-workers 0 \
|
||||
--block-cache-size 32 \
|
||||
--head-learning-rate 1e-4 \
|
||||
--warmup-steps 500 \
|
||||
--dtype bfloat16 \
|
||||
--flash-attention-2 \
|
||||
--log-every 20
|
||||
```
|
||||
|
||||
Evaluate the resulting head on the same dense test caches without an adapter:
|
||||
|
||||
```bash
|
||||
CUDA_VISIBLE_DEVICES=0,1,2 \
|
||||
OMP_NUM_THREADS=1 \
|
||||
MKL_NUM_THREADS=1 \
|
||||
OPENBLAS_NUM_THREADS=1 \
|
||||
PYTORCH_ALLOC_CONF=expandable_segments:True \
|
||||
TORCH_NCCL_ASYNC_ERROR_HANDLING=1 \
|
||||
torchrun --standalone --nproc_per_node=3 eval_omni_turn_lora.py \
|
||||
--model-id /data1/yfzx/wangx/Models/Qwen2.5-Omni-3B \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_dense_8s/Session_3 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_dense_8s/Session_2 \
|
||||
--cache-dir /data1/yfzx/wangx/Datasets/easycom/omni_lora_cache_dense_8s/Session_1 \
|
||||
--head-checkpoint checkpoints/easycom_sparse_head_only_from_frozen_8s_ddp4_epoch1/turn_head.pt \
|
||||
--output-dir results/easycom_sparse_head_only_dense_eval_epoch1 \
|
||||
--batch-size 2 \
|
||||
--block-cache-size 32 \
|
||||
--dtype bfloat16 \
|
||||
--flash-attention-2 \
|
||||
--ddp-timeout-minutes 60
|
||||
```
|
||||
|
||||
If this head-only control also falls well below the frozen `58.16` dense-cache
|
||||
control, sparse sampling/head optimization is sufficient to explain the
|
||||
regression. If it stays near `58.16` while LoRA falls, the main failure is
|
||||
Thinker representation drift.
|
||||
|
||||
To continue from a completed run, pass both its `adapter/` directory through
|
||||
`--adapter-checkpoint` and its `turn_head.pt` through `--head-checkpoint` while
|
||||
writing to a new output directory. This is weights-only continuation: the
|
||||
|
||||
Reference in New Issue
Block a user