MMPT 全局配置文件详解:以 mfmmlm.yaml 为例掌握多模态预训练管线的配置体系
2026/9/14 12:38:12 网站建设 项目流程

MMPT 全局配置文件详解:以 mfmmlm.yaml 为例掌握多模态预训练管线的配置体系

【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm

导读

本文围绕 kosmos-2/fairseq/examples/MMPT 子仓库中的配置说明文档 CONFIG.md,系统拆解 MMPT(Multimodal Pre-Training,多模态预训练工具包)的全局配置文件(Global Config)设计。你将掌握以project_dirrun_taskbase_dirtask_group为核心的配置骨架,理解"一个全局配置一键生成 pretrain / finetune / test 全流程具体配置"的流水线机制,并学会结合源码阅读如何利用includes继承与 OmegaConf 合并实现配置覆盖。读完后,你可以独立编写并运行自己的多模态预训练 + 下游微调实验配置。

一、配置系统概览:全局配置与具体配置的分层设计

MMPT 的训练管线把配置分为两层:

  1. 全局配置文件(Global Config):放在 projects 目录下,例如projects/mfmmlm.yamlprojects/retri/videoclip.yamlprojects/mtm/vlm.yaml。它描述一整条流水线:预训练跑什么、微调跑哪些下游任务、测试跑哪些评估项,以及各阶段如何覆盖基础任务模板。
  2. 具体配置文件(Concrete Config):由全局配置展开生成,保存在全局配置指定的project_dir子目录中,例如projects/retri/videoclip/youcook_videoclip.yaml。每个具体配置文件负责单个训练或评估进程,并把包括 fairseq 参数在内的所有复杂参数固化下来,保证可复现性(README.md 中明确说明 "we save all complex arguments into the concrete config file for reproducibility, including fairseq args")。

以 VideoCLIP 为例,运行:

python locallaunch.py projects/retri/videoclip.yaml --dryrun

会为 VideoCLIP 生成预训练、零样本评估、微调和测试的全部具体配置(README.md 原文:"will generate configs for all configs of pre-training, zero-shot evaluation, fine-tuning and testing, for VideoCLIP underprojects/retri/videoclip")。--dryrun只生成配置并打印将要执行的命令而不真正启动,是排查配置的利器(见 locallaunch.py 中--dryrun参数说明 "run config and prepare to submit without launch the job")。

二、全局配置骨架:逐字段拆解 mfmmlm.yaml

CONFIG.md 以 projects/mfmmlm.yaml 为例——该基线在单个 BERT 编码器上同时进行掩码帧建模(Masked Frame Model,MFM)与掩码语言建模(Masked Language Model,MLM)预训练。全局配置文件的核心字段如下:

project_dir: mfmmlm # 为该基线指定项目目录。 run_task: - how2.yaml # 运行 `projects/taskmfmmlm.yaml` 时在 how2 上做预训练。 - [vtt.yaml, vttcap.yaml, vttqa.yaml, youcook.yaml, youcookcap.yaml, crosstask.yaml, coin.yaml] # 运行微调任务。 base_dir: task # 指定每个训练任务的全局模板文件夹。 task_group: pretrain: # 预训练部分。大多数基线的差异集中在这一节。 task_list: - how2.yaml # 重新配置 `projects/task/how2.yaml` dataset: aligner: MFMMLMAligner # 为 MFMMLM 训练任务覆盖 aligner。 model: model_cls: MMFusionMFMMLM # 覆盖模型,该模型即时为 MFM 构造负样本。 loss: loss_cls: MFMMLM # 覆盖损失为 MFMMLM,将 MFM 与 MLM 组合在一起。 fairseq: # 所有 fairseq 参数都可以写在这一名称下。 dataset: batch_size: 128 finetune: # 微调部分,这里通常无需改动,因为我们想观察预训练对微调的贡献。 task_list: # 指定下游任务列表,例如把 `projects/task/vtt.yaml` 复制到 `projects/mfmmlm`。 - vtt.yaml - vttqa.yaml - youcook.yaml - youcookcap.yaml - crosstask.yaml - coin.yaml test: # 测试部分。 task_list: - test_vtt.yaml - test_vttqa.yaml - test_youcook.yaml - test_youcookcap.yaml - test_crosstask.yaml - test_crosstask_zs.yaml - test_coin.yaml

各字段的含义与作用:

字段含义作用
project_dir项目目录名生成的各类具体配置会写入projects/<project_dir>/,运行产物写入runs/<project_dir>/(见 locallaunch.py)
run_task阶段任务列表以列表形式声明流水线的执行阶段;列表项为单个 yaml 时串行执行列表项为 yaml 数组时并行执行(如微调多个下游任务)
base_dir模板文件夹指向projects/task/,该目录存放各任务的通用模板(how2、vtt、youcook 等)
task_group任务分组下分pretrain/finetune/test三节,每节通过task_list指定要展开的任务,并可按需覆盖 dataset / model / loss / fairseq

注意一个容易误解的点:CONFIG.md 中run_task的第一个列表项标注为how2.yaml(运行预训练),而仓库中实际的 mfmmlm.yaml 与其一致;run_task的第二项数组内的任务会与task_group中各节的task_list配合,最终决定流水线的每个阶段分别跑哪些具体任务。

三、task_group 三节详解:pretrain / finetune / test

3.1 pretrain:基线差异的主战场

pretrain节是每个基线最核心、差异最大的部分。CONFIG.md 指出 "Most baselines differs in this section"(大多数基线的差异集中在此节)。通过覆盖三类组件即可定义一个全新预训练目标:

  • dataset.aligner:负责按预训练目标组织训练样本。例如 mfmmlm 基线覆盖为MFMMLMAligner,用于采样视频片段、执行 MLM/MFM 掩码等数据准备逻辑(README.md 中将 Aligner 定位为 "the core class for different baselines that prepares the training data")。
  • model.model_cls:覆盖为MMFusionMFMMLM,它会在训练过程中即时为 MFM 构造负样本("which constructs negative examples for MFM on-the-fly")。
  • loss.loss_cls:覆盖为MFMMLM,将 MFM 与 MLM 两个损失组合在一起("which combines MFM and MLM together")。

这些类的真实实现位于 mmpt/models/mmfusion.py、mmpt/losses/loss.py、mmpt/datasets/mmdataset.py 等文件,可通过 mmpt/models/init.py、mmpt/losses/init.py 的注册机制按名字查找到对应类。

仓库中的实际 mfmmlm.yaml 还在pretrain节补充了大量数据集级超参数,均可参考使用:

dataset: subsampling: 32 # 视频采样步长,会联动调整 fairseq batch_size(见下文) sampled_min_len: 10 # 采样文本片段的最小长度 sampled_max_len: 64 # 采样文本片段的最大长度 max_video_len: 32 # 视频特征序列最大长度 max_len: 96 # 文本 token 序列最大长度 aligner: MFMMLMAligner lazy_vfeat_mask: True mfm_probability: 0.15 # MFM 掩码比例 mlm_probability: 0.15 # MLM 掩码比例 mm_prob: 0.5 # 跨模态(mm)样本比例 fairseq: common: fp16: true dataset: batch_size: 256 optimization: max_epoch: 15

注意subsampling的联动效应:load_config.py 会在加载配置时执行batch_size = config.fairseq.dataset.batch_size // config.dataset.subsampling,并打印 "adjusting batch_size to ...",即视频采样步长越大,实际送入 fairseq 的 batch_size 越小。因此配置batch_size时应把subsampling考虑进去。

3.2 finetune:保持不动,让预训练效果说话

finetune节的设计哲学是"通常无需改动"("we don't need to change anything here mostly since we want to see how pretraining can contribute to finetuning")。其task_list罗列下游任务(VTT 检索、VTTQA 问答、YouCook 时序定位、YouCookCap 描述生成、CrossTask、COIN 等),这些任务文件从模板目录复制/生成到本项目目录下。仓库中 mfmmlm.yaml 的注释明确提示:"do not write any model or loss here (they are expected to be fixed in mmfusion)"——微调阶段默认复用mmfusion中固定的模型与损失结构,以公平地对比预训练带来的增益。

下游任务模板示例见 projects/task/vtt.yaml:它继承了projects/task/ft.yaml,并指定MSRVTTMetaProcessorMSRVTTTextProcessorDSAligner等数据组件,模型为MMFusionJoint、损失为T2VContraLossdup: 20表示对训练数据的重复倍数。需要在新数据集上做微调时,仿照该文件在 projects/task 下新增模板,并在全局配置的finetune.task_list中登记即可。

3.3 test:训练后评估与零样本测试

test节的task_list与 finetune 一一对应,并额外包含零样本(zero-shot,文件名带_zs)测试项,如test_crosstask_zs.yaml。零样本评估正是 VideoCLIP 这类对比学习模型的亮点——预训练后不做任何微调,直接在下游任务上评测迁移能力(README.md:"VideoCLIP is a contrastive learning model for zero-shot transfer to retrieval/classification/sequence labeling style tasks")。

四、配置的继承与覆盖:includes 与 OmegaConf 合并

4.1 全局配置之间的继承

与 CONFIG.md 讲解的 mfmmlm.yaml 不同,VideoCLIP 与 VLM 的全局配置使用了includes字段实现多级堆叠(stacking):

# projects/retri/videoclip.yaml includes: projects/retri/videoretri.yaml project_dir: retri/videoclip task_group: pretrain: model: model_cls: MMFusionSeparate video_encoder_cls: MMBertForEncoder text_encoder_cls: BertModel num_hidden_video_layers: 6
# projects/mtm/vlm.yaml includes: projects/mtm/mmfusionmtm.yaml project_dir: mtm/vlm task_group: pretrain: dataset: sampled_min_len: 8 loss: loss_cls: MTM

recursive_config(load_config.py)递归加载includes指向的基配置,再通过OmegaConf.merge(base_config, config)让当前文件覆盖基配置,且"允许任意深度的堆叠"("allows for stacking of configs in any depth")。例如projects/retri/videoretri.yaml本身又includes: projects/mfmmlm.yaml,从而形成 mfmmlm → videoretri → videoclip 的三级继承链。因此,自定义新基线时优先复用includes继承已有配置,只覆盖差异字段,这是保持配置体系整洁的关键实践。

4.2 全局配置展开为具体配置:_overwrite_task 的合并逻辑

全局配置生成具体配置的核心逻辑在 locallaunch.py 的Pipeline._overwrite_task方法中:

  1. 遍历task_group的每一节(pretrain / finetune / test);
  2. 弹出该节的task_list(不会写进最终配置);
  3. task_list中的每个任务文件,从base_dirprojects/task/)递归加载其模板;
  4. 用该节剩余字段(dataset / model / loss / fairseq 覆盖项)执行OmegaConf.merge(config, overwrite_config)
  5. 通过overwrite_dir把模板中的runs/task/...等基础运行目录替换为本项目的runs/<project_dir>/...
  6. 将合并结果保存为projects/<project_dir>/<task_file>

Pipeline.__init__(locallaunch.py)还负责解析run_task:普通字符串任务串行入列,yaml 数组则作为并行阶段(stage)。最终main函数(locallaunch.py)为每个阶段创建JobLauncher并提交。

五、fairseq 参数注入与 jobtype 执行模式

5.1 fairseq 参数统一收纳

所有 fairseq 命令行参数都可以统一写在具体配置的fairseq字段下(CONFIG.md:"all fairseq args can be expecified under this name"),按 fairseq 的分组结构组织,如:

fairseq: common: tensorboard_logdir: run log_interval: 1000 dataset: num_workers: 4 optimization: lr: [ 0.00005 ] clip_norm: 2.0 optimizer: adam adam_betas: (0.9, 0.98) lr_scheduler: polynomial_decay total_num_update: 1000000 warmup_updates: 1000 weight_decay: 0.0 ddp_backend: no_c10d

以上即模板 projects/task/default.yaml 中默认的优化配置,包括学习率 5e-5、polynomial_decay 调度、1000 步 warmup、2.0 梯度裁剪、权重衰减 0.0 等,供各任务继承。

这些参数在提交阶段被LocalJob.submit(localjob.py)逐项展开为--key value的命令行参数;fp16reset_optimizer等布尔开关会被特殊处理为纯 flag 参数(见 localjob.py)。同时 load_config.py 也提供了overwrite_fairseq=True时把配置直接写回 argparse 命名空间的能力。此外,非测试模式下若未指定fairseq.checkpoint.save_dir会直接抛错(load_config.py),并会把展开后的完整配置以config.yaml形式保存到save_dir下,保证实验可复现。

5.2 jobtype 决定执行形态

任务以什么方式运行由--jobtype决定,预置类型在 localjob.py 的CMD_CONFIG中定义:

jobtype命令用途
local_singlefairseq-train <yaml> --user-dir mmpt --task mmtask --arch mmarch --criterion mmloss单卡训练(默认)
local_small同上 +--distributed-world-size 2双卡训练
local_big同上 +--distributed-world-size 88 卡训练(论文实验规模)
local_predictpython mmpt_cli/predict.py <yaml>推理 / 评估

locallaunch.py会把 yaml 中的task_type(如sweep_big)映射为 jobtype(取_前缀,即big对应local_big,见 locallaunch.py);也可用--jobtype强制指定。完整用法:

# 零样本评估(VideoCLIP 在 youcook 上) python locallaunch.py projects/retri/videoclip/test_youcook_zs.yaml --jobtype local_predict # 微调:先用 --dryrun 检查命令,去掉后真正运行 python locallaunch.py projects/retri/videoclip/youcook_videoclip.yaml --jobtype local_single --dryrun # 微调后测试 python locallaunch.py projects/retri/videoclip/test_youcook_videoclip.yaml --jobtype local_predict # 预训练 python locallaunch.py projects/retri/videoclip/how2.yaml --jobtype local_single --dryrun

其中fairseq-train ... --user-dir mmpt表明 MMPT 是作为 fairseq 的--user-dir扩展接入的(README.md:"This repo is a--user-dirof fairseq with fairseq wrapper"),mmpt/tasksmmpt/datasetsmmpt/modelsmmpt/losses分别提供FairseqMMTTaskFairseqDatasetFairseqModelFairseqCriterion四个 fairseq 适配层。

六、动手实践:从零搭建一个自定义基线

结合 CONFIG.md 与上述源码机制,搭建新基线的推荐步骤如下:

  1. 确定预训练目标与组件:决定 aligner / model / loss 三个组件;若已有可复用实现,直接在 mmpt 各子模块的__init__.py中确认其注册名。
  2. 编写全局配置:以projects/mfmmlm.yaml为蓝本,填写project_dirrun_taskbase_dirtask_group四大部分;或使用includes继承projects/retri/videoclip.yamlprojects/mtm/vlm.yaml这类已有配置只做增量覆盖。
  3. 确认下游任务模板:检查 projects/task 下是否有目标数据集模板(how2 / vtt / vttqa / youcook / youcookcap / crosstask / coin 均已内置,另有_videoclip变体),没有则参照 vtt.yaml 新建,并补齐对应数据路径(数据集准备详见 DATASET.md)。
  4. 展开并检查配置python locallaunch.py projects/<你的配置>.yaml --dryrun,检查生成的projects/<project_dir>/下各具体配置与将要执行的命令是否符合预期。
  5. 运行与评估:按上文 jobtype 选择单卡/多卡训练,预训练与微调的详细操作步骤分别见 pretraining.md 与 endtask.md。

七、小结

MMPT 的配置体系以全局配置为"总调度",通过task_group三节组织预训练 / 微调 / 测试三个阶段,借助includes与 OmegaConf 合并实现任意深度的配置继承与覆盖,最后经 locallaunch.py 展开为可复现的具体配置并由 fairseq 执行。理解 CONFIG.md 中的project_dirrun_taskbase_dirtask_group四个核心字段,再对照 mfmmlm.yaml、videoclip.yaml、vlm.yaml 三个真实案例,即可快速搭建属于自己的多模态预训练实验,这正是本工具包"generic performance-tuned components"设计理念的落地之处。

【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询