Files
icassp2027-experiment/docs/ego4d_encoder_only.md
T

99 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ego4D:不输入 Thinker 状态的 encoder-only 对照
先做 EasyCom 时请用 [EasyCom encoder-only 命令](easycom_encoder_only.md)。
整理脚本现支持 `--dataset easycom`,默认仍为 Ego4D,本页已有命令不变。
本实验复用已经提取完的 `local_qwen_1s/<uid>.pt`,仅将选定的 Qwen 编码器向量和
有效性标志作为 anticipation MLP 的输入。**不读取全局 Thinker `.pt`,不运行 Qwen,
不重新处理视频,不使用软链接。** 原来的 `run_ego4d_local_baselines.py` 跑的是
G / G+A / G+V / G+A+V,并不是本实验的 encoder-only。
沿用原 EgoSpeak manifest 的 train/test、5Hz 行索引、十个预测 horizon、LSTR-MCE,
固定 4 epochs、无 dev set,保存并评测最后一轮,不按 test 选择 epoch。
## 1. 一次性整理输入(CPU)
必须先完成全部 manifest clips 的局部特征提取;不要用 preview 或 partial smoke 文件。
下面的默认路径就是 L20 上的 `/data1/yfzx/wangx`:
```bash
cd /data1/yfzx/wangx/Code/icassp2027-experiment
python prepare_encoder_only_features.py \
--data-root /data1/yfzx/wangx/Datasets/ego4d \
--local-feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/local_qwen_1s \
--modalities av \
--dry-run
# 校验通过后,去掉 --dry-run 写出实体文件。
python prepare_encoder_only_features.py \
--data-root /data1/yfzx/wangx/Datasets/ego4d \
--local-feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/local_qwen_1s \
--modalities av
```
默认输出为 `omni_features/encoder_only_av_1s`。换成 `--modalities audio` 或 `visual`
会分别写入 `encoder_only_audio_1s` / `encoder_only_visual_1s`。
可显式指定 `--manifest`、`--target-root`、`--output-root`。
局部输入支持平铺目录和 `train/test` 子目录,不改变 manifest 中的 split。
整理前逐条检查全部 train/test 的完整性、时间/索引、选定向量/有效性掩码、编码器配置一致性
及 target 长度,再创建新目录。整理时逐条重新校验并原子保存;不保留全数据集张量。
同名目录已存在时拒绝覆盖。中断或磁盘写入失败的目录不会有 `complete.txt`,不能拿来训练;
修复原因后用新的 `--output-root`,不要手工补写完成标记。
每个输出文件明确标记 `mode=encoder-only-av/audio/visual`、`uses_thinker_states=False`,
保存原始 times/label_indices 和编码器配置。`export_manifest.json` 记录 clip 行数、总量、
路径和输入维度;`complete.txt` 最后写出。更换 seed 只重新训练,不重复整理。
此前内联 Python 命令完整生成的文件和 `complete.txt` 也兼容下面的训练入口。
## 2. 训练和评测(单张空闲 GPU、前台运行)
```bash
CUDA_VISIBLE_DEVICES=0 \
OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 \
python run_ego4d_encoder_only.py \
--data-root /data1/yfzx/wangx/Datasets/ego4d \
--feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/encoder_only_av_1s \
--modalities av \
--seeds 0 1 2
```
可先加 `--dry-run`:只检查全部 train/test 输入和已有输出,打印命令,不训练或写结果。
默认结果为 `results/ego4d_encoder_only_1s/encoder_av_seed0` 等,checkpoint 位于
`checkpoints/ego4d_encoder_only_1s`。已有 checkpoint、训练摘要或结果目录时拒绝覆盖;
补跑时选择未完成的 seeds,或指定新的 `--checkpoint-root` / `--result-root`。
换模态时同时修改 `--feature-root` 和 `--modalities`,不能只改其中一个。
不传 `--local-feature-root`、`--layer-fusion` 或 `--dev-sessions`;原训练/推理文件无需修改。
训练超参是 batch=512、lr=7e-5、weight_decay=5e-5、warmup_epochs=1.6、
warmup_factor=0.3、dropout=0.2、transition_objective=none。
训练前仍逐条检查所有导出输入,不能仅靠完成标记绕过缺文件或模式检查。
入口结束后自动汇总,也可单独打印:
```bash
python summarize_local_baselines.py \
--root results/ego4d_encoder_only_1s --dataset ego4d
```
## 如何解释比较
以两路原生向量均为 2048D 为例,audio/visual 单模态输入各 2049D(一个有效标志),
AV 为 4098D,顺序是 `[visual, visual_valid, audio, audio_valid]`。
不做原 B1 的 trainable 256D 分支投影;仍用原 MLP 类,但输入宽度决定其隐藏层宽度,
即单模态 1024、AV 2049。因此应报告参数量,**不是相同 head 容量的 Thinker 消融**。
窗口和视觉视野也不同:这些 sidecars 是已保存的近期音频/人物局部 crop pooling,
不是把 Thinker 的相同输入 token 绕过 decoder。目录名中的 `1s` 只是默认实验命名,
真实窗口以 `config.encoder_contract.config` 为准。它回答“这些编码器 readout 本身能预测多好”,
不能单独证明 Thinker 有用或无用。严格归因仍需统一窗口、视野、pooling 与 head 容量。
5Hz 时间及 horizon 语义沿用原实验,不因重新打包而改变。
```bash
python -m unittest -q test_encoder_only_workflow
```
CPU 测试覆盖三种模态的精确输入构造、缺失/不完整/混合配置拒绝、无 Thinker 依赖、
输出防覆盖与完成标记,以及三组各 4 epochs 的真实小规模训练/推理。L20 真实数据效果需另跑。