prismer
多专家协作的视觉语言模型,用预训练专有模型融合中间表征,实现 captioning/VQA 等多任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
多专家协作的视觉语言模型,用预训练专有模型融合中间表征,实现 captioning/VQA 等多任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象你要解决一道复杂的几何证明题,身边坐着一位博学的数学教授和一位画图精准的建筑师——你是让教授硬着头外语义建模,还是让建筑师勉强补全逻辑推理?传统的视觉语言模型(VLM)正是这样一位勉强的「全能选手」:用单一模型试图同时完成图像描述、视觉问答、目标检测、深度估计等十余种任务,结果往往是每个任务都「会一点」但都不精通。
NVlabs(英伟达研究院)于 2023 年发表的论文 Prismer: A Vision-Language Model with Multi-Task Experts 正是对这一困境的系统性回应:与其训练一个通用模型,不如让一个「调度中心」指挥多个经过预训练的专家模型,各自在擅长的领域输出中间表征,再由统一解码器融合生成最终答案。
视觉语言模型的发展经历了几个阶段。早期的 CLIP(OpenAI, 2021)证明了图文联合预训练的威力,但它是纯编码器架构,无法直接生成文本描述。随后 Flamingo(DeepMind, 2022)引入了 Perceiver Resampler 和门控注意力层,在少样本学习上表现优异,但其视觉编码器仍是单一主干。
Prismer 的核心洞察来自多任务学习的经典难题:任务干扰(task interference)——让一个神经网络同时学习语义分割和深度估计,两者的梯度方向可能相互冲突。Prismer 团队选择了一条更务实的路线:利用已有的、针对特定任务预训练好的「专家模型」(depth estimation、edge detection、semantic segmentation 等),而非让主模型从零学习这些能力。
项目由英伟达研究院 Shikun Tang 等人主导,代码于 2023 年初开源,迅速获得了学术界和工业界的关注,成为多模态视觉语言模型领域的重要参考架构。
Prismer 的架构可以用「流水线工人与翻译官」的比喻来理解。整条管道分为三个阶段:
阶段一:专家特征提取(Expert Feature Extraction)
输入一张图片后,系统同时调用 6 个预训练专家模型,各自输出特定类型的中间表征(Expert Outputs):
| 专家模型 | 输出类型 | 预训练权重来源 |
|---|---|---|
| DPT(Depth) | 深度图 | MiDaS v3 |
| LEF(Edge) | 边缘图 | 自训练 |
| DPT(Normal) | 表面法线图 | MiDaS v3 |
| Mask2Former(Seg) | 语义分割图 | COCO/ADE20K |
| DETR(Obj Detection) | 目标边界框+类别 | COCO |
| PaddleOCR(OCR) | 文本检测结果 | 自有数据集 |
这些专家模型并非从头训练,而是直接复用已有的高质量预训练权重,大幅降低了训练成本。
阶段二:视觉编码器融合(Multi-Expert ViT Encoder)
所有专家输出与原始 RGB 图像一起,被送入一个统一的多任务 Vision Transformer(ViT)。这里的关键设计是:ViT 对每种输入类型有独立的通道配额(channels),例如 RGB 占 3 通道、depth 占 1 通道、segmentation 占 64 通道。Transformer 的注意力机制在所有 token 之间自由交互,让文本解码器在后续阶段能够「按需查询」任意专家的输出。
阶段三:Roberta 解码器生成(Roberta Decoder)
融合后的视觉特征通过 Cross-Attention 注入到 RoBERTa 解码器,用户可以输入文本提示(caption / question),模型输出对应的文本响应。
PrismerZ 是另一个重要变体——它使用专家数量为 0(纯 RGB 输入),作为 Prismer 的对照组,用于量化「专家协作」带来的具体增益。实验表明,在 COCO Captioning 任务上,PrismerZ-Large 的 CIDEr 得分为 131.3,而同等规模的 Prismer-Large 达到 140.6,提升约 7%;在 VQA 任务上提升更为显著。
预训练数据:使用了 4 个大规模图文数据集的组合:
训练框架:高度集成 HuggingFace accelerate 工具包,支持单机多卡和多机多卡分布式训练。配置通过 accelerate config 交互式生成。预训练使用 32 batch size(对应 4×8 节点 1024 有效 batch size),共 20 个 epoch,学习率 3e-4(Large 模型用 1e-4)。
微调任务:项目提供了 4 个下游任务的微调脚本:
train_caption.py — 图像描述生成(COCO Captioning)train_classification.py — 图像分类(ImageNet 零样本)train_pretrain.py — 预训练train_vqa.py — 视觉问答(VQA v2.0)冻结策略:支持三种渐进式解冻模式(freeze_lang / freeze_vision / freeze_lang_vision),允许研究者逐步解冻模型不同部分以平衡性能和训练效率。
项目的 requirements.txt 揭示了它的核心依赖生态:
torch~=2.0.0 # PyTorch 2.0
transformers~=4.26.1 # HuggingFace Transformers(RobertaTokenizer 等)
accelerate~=0.15.0 # 分布式训练加速
timm~=0.6.12 # ViT 图像编码器
einops~=0.4.1 # 张量重塑
git+detectron2 # Mask2Former 等分割/检测模型(FacebookResearch)
git+CLIP # OpenAI CLIP(特征对比)
pycocoevalcap # CIDEr/BLEU 等 captioning 评估指标
ruamel.yaml # YAML 配置文件解析
gradio~=3.24.1 # Web 交互界面(demo.py)
值得注意的是,detectron2 和 CLIP 是通过 git+ 直接从 GitHub 安装(而非 PyPI),这意味着部署时需要 Git 且网络能访问 GitHub——这也是「无 Dockerfile」的部署复杂度的来源之一。
官方 HuggingFace Space 演示:提供了 Gradio 构建的 Web 界面,支持在线体验图像描述生成,用户可上传图片并获得文本描述。但该演示仅供体验,实际推理需要加载完整的预训练 checkpoint(通过 download_checkpoints.py 脚本下载)。
方式一:在线演示(零配置)
通过 HuggingFace Space 直接体验:https://huggingface.co/spaces/lorenmt/prismer
无需安装任何依赖,直接上传图片即可获得 Prismer 生成的描述文本。这是体验该模型最快的方式,适合快速了解模型能力边界。
方式二:推理脚本(轻量测试)
克隆仓库后,下载预训练权重,运行 demo.py:
python demo.py --exp_name=base # 使用 base 版本模型
该脚本会自动调用 6 个专家模型生成中间表征,再由 PrismerCaption 模型生成描述。推理需要 16GB+ 显存的 GPU,单张图片处理时间约 5-10 秒(取决于专家模型数量)。
方式三:训练/微调(完整研究)
需要先准备数据集(CC3M、COCO、VG 等),配置 accelerate(单机或多机),运行对应训练脚本:
accelerate config # 交互式配置
accelerate launch train_caption.py --config configs/caption.yaml
完整训练需要多卡 GPU 集群,单卡训练几乎不可行。
方式四:API 集成(工程落地)
作为 PyTorch 模型,可以集成到生产流程中:
from model.prismer_caption import PrismerCaption
import ruamel_yaml as yaml
config = yaml.load(open('configs/caption.yaml', 'r'), Loader=yaml.Loader)['demo']
model = PrismerCaption(config)
model.load_state_dict(torch.load('pytorch_model.bin'))
# 进行推理...
计算开销:每张图片需要运行 6 个专家模型(总计约 2-3B 参数),推理成本远超单一模型。在边缘设备上几乎无法实时运行。
专家模型质量依赖:整体性能上限受限于各专家模型的质量。如果某个专家(如 OCR 检测)在特定领域效果差,Prismer 的最终输出也会受影响。
无开源预训练权重:论文公布了模型架构和训练代码,但未直接发布完整的预训练 checkpoint(需通过脚本下载,且下载链接依赖第三方托管),这对复现实验带来一定障碍。
PrismerZ 的启示:PrismerZ(无专家)仍能达到接近 Prismer 的效果,说明在某些任务上「专家协作」的边际收益有限。模型选择应基于具体任务需求,而非盲目追求架构复杂度。
Prismer 论文发表后,「专家协作」的设计思路对后续研究产生了显著影响:
从增长数据看,该项目 GitHub Star 在 2023 年快速攀升,目前稳定在 1300+(按采集时数据),虽然绝对数量不高,但考虑到这是英伟达研究院的学术代码(而非商业产品),在学术影响力方面表现突出。