# Ego4D:不输入 Thinker 状态的 encoder-only 对照 本实验复用已经提取完的 `local_qwen_1s/.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 真实数据效果需另跑。