MiniMax-AI/VTP-Large-f16d64
模型介绍文件和版本Pull Requests讨论分析
下载使用量0
Logo

面向生成任务的视觉分词器可扩展预训练研究

Jingfeng Yao1, Yuda Song2, Yucong Zhou2, Xinggang Wang1,*

1华中科技大学 2深脑科技(MiniMax)
*通讯作者:xgwang@hust.edu.cn

研究工作仍在进行中。

MiniMax Hailuo HUSTVL HuggingFace GitHub arXiv

Abstract Figure

新闻动态

  • [2025年12月16日] 我们发布了技术报告 [technical report] 和预训练权重 [pretrained weights]。

核心发现

通过融合对比学习、自监督学习和重构学习,我们从零开始训练了多个视觉分词器。本研究旨在揭示理解、生成与重构之间新的可扩展性关联。

  • 在DiT训练中保持相同计算量,VTP的规模提升有助于实现更优生成效果。

  • 传统自编码器无法针对扩散生成模型进行规模扩展。

  • 理解能力是提升学习可扩展性的关键驱动力。

  • 在涉及表示学习时,可观察到参数、数据和训练的可扩展性。

Overview Figure

获取检查点

检查点
VTP-S-f16d64
VTP-B-f16d64
VTP-L-f16d64

权重即将发布。

🚀 点击此处快速开始
pip install -r requirements.txt
import torch
from PIL import Image
from torchvision import transforms

from vtp.models.vtp_hf import VTPConfig, VTPModel
from vtp.tokenizers import get_tokenizer

model = VTPModel.from_pretrained("/path/to/MiniMaxAI/VTP-Large-f16d64")
model.eval()

# print model parameters
def count_params(m): return sum(p.numel() for p in m.parameters()) / 1e6
print(f"Vision Encoder: {count_params(model.trunk):.1f}M")
print(f"Pixel Decoder:  {count_params(model.pixel_decoder):.1f}M")
print(f"Text Encoder:   {count_params(model.text_transformer):.1f}M")

preprocess = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
image = preprocess(Image.open("figures/dog.png")).unsqueeze(0)

# ---------------------------------------------------------------------------------------
# use it as auto-encoder; rFID=0.36
# ---------------------------------------------------------------------------------------
denormalize = transforms.Normalize(
    mean=[-0.485/0.229, -0.456/0.224, -0.406/0.225],
    std=[1/0.229, 1/0.224, 1/0.225]
)
with torch.no_grad(), torch.autocast("cuda"):
    latents = model.get_reconstruction_latents(image)  # encode
    recon = model.get_latents_decoded_images(latents)  # decode
recon_image = denormalize(recon[0]).clamp(0, 1).permute(1, 2, 0).cpu().numpy()
Image.fromarray((recon_image * 255).astype("uint8")).save("output/reconstructed.png")


# ---------------------------------------------------------------------------------------
# use it as clip; zero-shot 78.2
# ---------------------------------------------------------------------------------------
tokenizer = get_tokenizer('ViT-B-32', context_length=model.config.text_context_length)
text = tokenizer(["a diagram", "a dog", "a cat", "a person"])
with torch.no_grad(), torch.autocast("cuda"):
    image_features = model.get_clip_image_feature(image, normalize=True)
    text_features = model.get_clip_text_feature(text, normalize=True)
    text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print("Label probs:", [f"{p:.4f}" for p in text_probs[0].tolist()])

# ---------------------------------------------------------------------------------------
# use it as ssl feature extractor; linear probing 85.7
# ---------------------------------------------------------------------------------------
with torch.no_grad(), torch.autocast("cuda"):
    # get last layer features (cls token + patch tokens)
    features = model.get_last_layer_feature(image)
    cls_token = features['cls_token']      # (B, 1024)
    patch_tokens = features['patch_tokens']  # (B, 256, 1024) for 256x256 image

    # or get intermediate layer features for linear probing
    intermediate = model.get_intermediate_layers_feature(
        image, n=4, return_class_token=True
    )  # returns 4 x (patch_tokens, cls_token), each cls_token is (B, 1024)
    for i in range(1, 5):
        print('Last %d layers:' % i)
        print('Patch tokens shape:', intermediate[-i][0].shape)
        print('Cls token shape:', intermediate[-i][1].shape)

性能表现

模型理解能力重构能力生成能力
零样本准确率线性探测rFIDLightningDiT-XL 80轮训练
无配置 FID-50K
OpenCLIP74.0---
CLIP75.5---
SigLIP80.5---
MAE-85.9--
DINOv2-86.7--
UniTok70.8-0.41-
VILA-U73.3-1.80-
VA-VAE-f16d32--0.284.29
VA-VAE-f16d64--0.15-
RAE-f16d768-84.50.574.28
VTP-S-f16d64 (我们的模型)66.777.50.985.46
VTP-B-f16d64 (我们的模型)73.281.00.743.88
VTP-L-f16d64 (我们的模型)78.285.70.362.81

引言

视觉编码器(如变分自编码器,VAEs)中潜在空间的质量对于现代生成模型至关重要。然而,标准的基于重建的训练范式所产生的潜在空间偏向于低级信息,这导致了一个根本性缺陷:更高的像素级精度并不一定带来更高质量的生成结果。 这意味着,在视觉编码器预训练上投入大量计算资源,并不能很好地转化为生成性能的提升。

我们将此问题定义为**“预训练缩放难题”,并提出需要进行必要的转变:为了有效地支持生成任务,潜在空间必须能够简洁地表示高级语义。 我们提出了视觉编码器预训练框架VTP**(Visual Tokenizer Pre-training),这是一个统一的视觉编码器预训练框架,开创性地联合优化了图像-文本对比损失、自监督损失和重建损失。我们的大规模研究揭示了两个主要发现:(1)理解能力是生成能力的关键驱动因素;(2)更优的缩放特性,即生成性能会随着分配给视觉编码器预训练的计算资源、参数和数据的增加而有效提升。经过大规模预训练后,我们的编码器展现出极具竞争力的性能指标(78.2的零样本准确率,0.36的rFID),并且在生成任务上的收敛速度比先进的蒸馏方法快3倍。更重要的是,它具有出色的缩放能力:在不修改标准DiT训练规格的情况下,仅通过在VTP预训练中投入更多FLOPS,下游生成任务的FID指标就实现了65.8%的提升,而传统自编码器在仅使用1/10 FLOPS时就早早陷入停滞。

Overview Figure

评估

安装

conda create -n vtp python=3.10
conda activate vtp
git submodule update --init --recursive
pip install -r requirements.txt

零样本分类

修改 scripts/test_zero_shot_hf.sh 中相应的路径。运行:

bash scripts/test_zero_shot_hf.sh 

线性探测分类

修改 scripts/test_linear_probing_hf.sh 中的相应路径。运行:

bash scripts/test_linear_probing_hf.sh

ImageNet 重构

修改 scripts/test_reconstruction_hf.sh 中的相应路径。运行:

bash scripts/test_reconstruction_hf.sh

ImageNet 生成

我们使用 LightningDiT 代码来评估我们的生成性能。

特征提取:

bash generation/scripts/extract_features_vtp.sh generation/configs/train_vtp_l_dit_xl.yaml

LightningDiT 训练:

bash generation/scripts/train_lightningdit_vtp.sh generation/configs/train_vtp_l_dit_xl.yaml

LightningDiT 采样:

bash generation/scripts/inference_lightningdit_vtp.sh generation/configs/train_vtp_l_dit_xl.yaml

致谢

我们的预训练代码基于OpenCLIP和DINOv2构建。我们最终的模型变体采用了DINOv3架构。

我们使用LightningDiT进行生成评估。

感谢他们提供的优秀代码。

引用

@article{vtp,
  title={Towards Scalable Pre-training of Visual Tokenizers for Generation},
  author={Yao, Jingfeng and Song, Yuda and Zhou, Yucong and Wang, Xinggang},
  journal={arXiv preprint arXiv:2512.13687},
  year={2025}
}

联系我们

请通过 model@minimax.io 与我们联系。