【免费下载链接】VideoChat-Flash-Qwen2_5-7B-1M_res224
VideoChat-Flash-Qwen2_5-7B-1M_res224 是一款面向长视频理解的开源多模态大模型,它由UMT-L(umt-large,约 300M 参数的视觉塔)+ Qwen2.5-7B-1M 组成,每帧仅用16 个视觉 token,即可支持约 5 万帧输入。这篇文章带你从源码层面拆解 UMT-L 的视觉处理流水线:视频如何被切成 tubelet、时序位置编码如何生成、以及 24 层 Transformer 如何把 784 个 token 压成 16 个——这也是它能"看"进 1M 上下文的关键。🎬
一、UMT-L 架构速览:300M 视频 Transformer 有多大?
UMT-L 是一个标准的 ViT 变体,核心超参定义在 build_vit 与 config.json 中:
| 参数 | 取值 | 含义 |
|---|---|---|
| image_size | 224 | 每帧输入分辨率(res224 变体) |
| patch_size | 16 | 空间切块大小,224÷16 = 14×14 =196 patch/帧 |
| embed_dim | 1024 | 视觉 token 维度 |
| encoder_depth | 24 | Transformer 层数 |
| num_heads | 16 | 多头注意力头数 |
| mm_local_num_frames | 4 | 一次送入视觉塔的局部帧数 |
| tubelet_size | 1 | 时间维不合并,逐帧编码 |
| mm_vision_select_layer | -2 | 取倒数第 2 层特征 |
💡 一次前向的输入是4 帧 × 196 patch = 784 个视觉 token,这是 UMT-L 的"最小工作单元"。
二、第一步:视频切 tubelet(PatchEmbed)
视频进入 Transformer 前,先被 PatchEmbed 用一个Conv3d切成小块:
- 卷积核为
(tubelet_size, 16, 16)=(1, 16, 16); tubelet_size=1意味着时间维度不做合并,每一帧独立切成 14×14 个 16×16 patch;- 卷积的 stride 与 kernel 相同,是"非重叠切块",输出经
flatten(2).transpose(1,2)展平成 token 序列[B, T×14×14, 1024]。
与用
tubelet_size=2把相邻 2 帧合并成一管不同,UMT-L 选择逐帧切块 + 后续显式时序编码,让时间信息更"干净"地由位置编码负责。
三、核心看点:时序编码如何生成?
UMT-L 没有可学习的绝对位置嵌入,而是使用sinusoid(正弦/余弦)位置编码,定义在 get_sinusoid_encoding_table:
位置角 = pos / 10000^(2i/d),偶数维取 sin,奇数维取 cos它有两个关键设计:
1. 时间维可以"插值"到任意帧数 ⏱️
预训练时 UMT-L 只见过 4 帧,但推理时视觉塔按mm_local_num_frames=4分组,位置编码却需要覆盖mm_pos_num_frames=8的帧数(见 config.json)。此时函数会自动执行"帧数插值":
- 按 checkpoint 帧数 T 生成标准 sin-cos 表;
- 把序列 reshape 成
[B, H, W, C, T],转置成[BHW, C, T]; - 用
F.interpolate(..., mode='linear')沿时间维线性插值到目标帧数new_T; - 再 reshape 回
[B, T×H×W, C]加到 patch embedding 上。
这套机制让 4 帧预训练的视觉塔能无缝适配任意推理帧数,是 UMT-L "时序可泛化"的核心。
2. 空间维也可以"插值"(高分辨率场景)
当输入分辨率不是 224 时,会走 get_sinusoid_encoding_table2:先对空间 14×14 网格做bicubic 插值,再对时间维做 linear 插值,一次完成"空间 + 时序"两个方向的适配。
3. 视频与单图使用不同的位置编码
在 forward_features 中:
- 视频模式:加完整的时空 sin-cos 编码
pos_embed; - 单图模式(
T==1,见 UMTVisionTower.forward):改用img_pos_embed,即只含空间网格的位置编码。
两种编码在初始化时分别生成,避免了"1 帧视频"与"单张图片"的语义混淆。
四、第二步:24 层 Transformer 编码
位置编码叠加后,token 序列进入 24 层 Block,每层结构为:
x = x + Attn(LN(x)) x = x + MLP(LN(x))其中 Attention 优先使用FlashAttention-2(flash_attn_qkvpacked_func)加速多帧 token 的全局注意力——4 帧共 784 个 token 互相"看见",正是模型捕捉帧间运动与时序关系的地方。
最后取倒数第 2 层(mm_vision_select_layer=-2)的输出,再过一层 LayerNorm(with_ln=True),得到每个 patch 的视觉特征,形状还原为[B, T, 196, 1024]。
五、关键魔法:784 个 token 如何变成 16 个?
视觉塔输出的特征还"太胖"——5 万帧 × 196 patch 将产生近千万 token。VideoChat-Flash 的答案在投影器 ToMe16_mlp_hd64:
- ToMe 二分软匹配:bipartite_soft_matching 把 token 分成奇偶两组,按相似度得分找出最"像"的 r 对,用加权平均(
merge_wavg)把它们合并,不损失重要语义地减少 token; - 多轮迭代:merge_tokens 循环压缩,直到 4 帧的 784 个 token 被压到
16 × 4 = 64个,即每帧只剩 16 个 token; - MLP 对齐:两层 MLP(1024 → 3584)把维度对齐到 Qwen2.5-7B 的 hidden_size,送入语言模型。
🧮 算一笔账:每帧 16 token → 5 万帧 ≈ 80 万视觉 token,加上文本恰好落在 Yarn 扩展后的1M 上下文内。这正是"16 tokens per frame"设计的由来。
六、快速上手与文件导读 📖
想本地体验,官方用法(详见 README.md):
pip install transformers==4.40.1 pip install av imageio decord opencv-pythonmodel = AutoModel.from_pretrained('OpenGVLab/VideoChat-Flash-Qwen2_5-7B-1M_res224', trust_remote_code=True).to(torch.bfloat16).cuda() output, history = model.chat(video_path="your_video.mp4", tokenizer=tokenizer, user_prompt="Describe this video in detail.", return_history=True, max_num_frames=512)核心文件导读:
| 文件 | 作用 |
|---|---|
| vision_tower_builder.py | UMT-L 视觉塔:PatchEmbed、sin-cos 时序编码、24 层 ViT |
| mm_projector_builder.py | ToMe token 合并 + MLP 投影器 |
| modeling_videochat_flash.py | 视频分 4 帧一组编码、压缩后填入语言模型的主流程 |
| config.json | 视觉塔 / 投影器 / LLM 压缩等全部配置 |
| mm_utils.py | 帧采样与分辨率处理工具 |
总结
UMT-L 的时序编码原理可以浓缩为四句话:
- 切块:Conv3d 按
(1,16,16)逐帧切 patch,时间维交给位置编码; - 编码:sin-cos 编码沿时间维线性插值,让 4 帧预训练泛化到任意帧数;
- 编码后:24 层 ViT(FlashAttention-2 加速)在全局注意力中建模帧间时序;
- 压缩:ToMe 软匹配把每帧 196 token 压到 16,撑起 5 万帧 / 1M 上下文。
理解了这条"tubelet → 时序编码 → ViT → ToMe 压缩"流水线,你就掌握了 VideoChat-Flash 长视频建模的视觉基石。
【免费下载链接】VideoChat-Flash-Qwen2_5-7B-1M_res224
相关推荐
MochiWeb高级特性解析:多部分表单、Cookie处理和头部操作
MochiWeb高级特性解析:多部分表单、Cookie处理和头部操作 MochiWeb是一款轻量级的Erlang HTTP服务器库,专为构建高性能Web应用而设
CANN稀疏注意力共享KV元数据算子
SparseAttnSharedkvMetadata 产品支持情况 | 产品 | 是否支持 | | | : : | |<term Ascend 950PR/As
算子库人工智能大模型深度学习CANNAscend突破视觉限制:Vision Transformer位置编码创新解析
突破视觉限制:Vision Transformer位置编码创新解析 视觉Transformer(Vision Transformer,ViT)已成为计算机视觉领
人工智能深度学习计算机视觉
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考