课程进度 课程大纲 已发布 34/34 课
第 0 部分——先拿到地图
第 1 部分——为什么简单目标会学会看视频
第 2 部分——把一段视频送进单编码器
第 3 部分——会读实验,才算读懂论文
第 4 部分——从官方仓库到自己的实验
第 5 部分——把表征接回世界模型路线
附录——随用随查的技术背包
借来的机器,先看说明书再插电
- 先审代码远程 Python 会执行
- 固定版本权重与代码成一对
- 排对形状[B,C,T,H,W]
- 正确归一化ImageNet mean/std
- 取表征tokens 或 [CLS]
下载包里不只有参数,还带着一段自定义装配代码。把时间轴与颜色轴放反,机器甚至可能照常运行,只是吐出形状像真的、含义却错误的结果。因此安全的起点不是立刻推理,而是读代码、钉版本、查张量。
先钉住版本,再执行代码
发布的 LeVJEPA-VideoMix-Large 是 ViT-L/16,含 303.1M 参数,在 1,806,869 个 VideoMix clips 上训练;它采用 16 帧、tubelet 1、RoPE 和 block_causal。**checkpoint(检查点)**是保存好的模型权重与配置版本。这个模型仓库需要 trust_remote_code=True,意味着下载的 Python 会在本机执行。先检查 config.json、configuration_levjepa.py 和 modeling_levjepa.py,再放进不含敏感凭据的隔离环境运行;本系列核对的是模型提交 e831a03,而不是会继续变化的 HEAD。
安全审查至少回答四问:auto_map 会导入哪两个文件?代码是否发起网络请求、读取环境变量或动态执行字符串?权重是否为 safetensors?许可证是否覆盖预定用途?第一次在线下载并审完后,可在断网容器中用相同 cache 与 local_files_only=True 重载。revision(版本标识)同时约束配置和自定义代码;单记模型名,日后就无法确认仓库内容是否已经变化。
按接口摆好视频
import torch
from transformers import AutoModel
repo = "galilai-group/LeVJEPA-VideoMix-Large"
revision = "e831a0347737fcaa660b39c57d41c109de399845"
model = AutoModel.from_pretrained(
repo, revision=revision, trust_remote_code=True
).eval()
# 示例 raw 已在 [0,1];真实视频还需一致的 resize/center crop 到 224。
raw = torch.rand(1, 3, 16, 224, 224) # [B,C,T,H,W]
mean = torch.tensor([0.485, 0.456, 0.406])[None, :, None, None, None]
std = torch.tensor([0.229, 0.224, 0.225])[None, :, None, None, None]
video = (raw - mean) / std
with torch.inference_mode():
out = model(pixel_values=video)
print(out.last_hidden_state.shape, out.pooler_output.shape)
预期输出是 torch.Size([1, 3137, 1024]) 与 torch.Size([1, 1024]):3137 = 一个 [CLS] 加 16×14×14 个 patch。发布模型处于 eval,token dropping 为 0,所以返回完整 token。它不带分类头,pooler_output 只是 [CLS] 表征,而非类别概率。ViT-L 的全 token 因果 mask 较吃内存,适合先从 batch 1 开始;若为了省内存改成 full attention,训练时的注意力拓扑也随之改变,结果需要另作协议记录。
插电前再核对三件事
可紧接着加入 assert out.last_hidden_state.shape == (1,3137,1024) 与 assert torch.isfinite(out.last_hidden_state).all()。若搬到 CUDA/MPS,模型、video、mean 和 std 必须在同一 device;先记录峰值显存,再扩大 batch。eval() 会关闭训练态 token dropping 和 dropout;发布 encoder 的 LayerNorm 本身并不像 BatchNorm 那样维护训练/评估统计。重复同一输入两次应在所用硬件的数值容差内一致。
训练约以 7.5 fps 采样,因此 16 帧约覆盖两秒。单张图片可用 image.unsqueeze(2).repeat(1,1,16,1,1) 重复成时间轴,但这只适合图像特征,不含真实运动。保持 model.config.attn_mode == "block_causal";改成 full 不会报错,却改变了训练时拓扑。发布张量是 encoder 的 EMA 评估副本,不是 EMA 教师,也不含训练 projector。
权重模型卡标为 CC BY-NC 4.0;商业用途需要另做许可证审查。加载后至少检查形状、torch.isfinite,以及同一输入重复推理的一致性。
与权重一起保存的记录
真正开始推理之前
trust_remote_code=True会执行远程代码;先审查并固定 revision。- 输入必须是 ImageNet 归一化的
[B,C,T,H,W],默认 16×224×224。 - 输出是冻结表征而非分类答案;发布权重是评估 EMA 副本。
插电测试
- 为什么输出 token 数是 3137?
- 能否把
attn_mode改成 full 后仍称为原协议推理? pooler_output是否可以直接当 ImageNet 概率?
按接口核对
1 + 16×(224/16)×(224/16)。- 不能;能运行不代表与训练拓扑一致。
- 不可以;它是 1024 维
[CLS]特征,模型没有分类头。