Views
No views yet
[!IMPORTANT] Transformers Version Compatibility:
- ✅
transformers==4.57.3(Recommended): Works withAutoModel.from_pretrained()- ⚠️
transformers>=5.0.0: Not currently supported. We are actively working on a fix.
Note on Inputs: While the model is pre-trained with the configurations below, it supports dynamic native resolution and arbitrary frame counts during inference:
- Pre-training Image Base: 448×448
- Pre-training Video Base: 224×224 (256 tokens/frame)
- Inference: Supports variable resolutions and frame lengths.
1from transformers import AutoModel, AutoImageProcessor
2from PIL import Image
3import torch
4
5# Load model and preprocessor
6model = AutoModel.from_pretrained(
7 "lmms-lab-encoder/onevision-encoder-large-lang",
8 trust_remote_code=True,
9 attn_implementation="flash_attention_2"
10).to("cuda").eval()
11
12preprocessor = AutoImageProcessor.from_pretrained(
13 "lmms-lab-encoder/onevision-encoder-large-lang",
14 trust_remote_code=True
15)
16
17# Image inference: [B, C, H, W]
18image = Image.open("path/to/your/image.jpg") # Replace with your image path
19pixel_values = preprocessor(images=image, return_tensors="pt")["pixel_values"].to("cuda")
20with torch.no_grad():
21 outputs = model(pixel_values)
22 # outputs.last_hidden_state: [B, num_patches, hidden_size]
23 # outputs.pooler_output: [B, hidden_size]
24
25# Video inference: [B, C, T, H, W] with patch_positions
26num_frames, target_frames = 16, 64
27patch_size = 14
28# Load video frames and preprocess each frame (replace with your video frame paths)
29frames = [Image.open(f"path/to/frame_{i}.jpg") for i in range(num_frames)]
30video_pixel_values = preprocessor(images=frames, return_tensors="pt")["pixel_values"]
31# Reshape from [T, C, H, W] to [B, C, T, H, W]
32video = video_pixel_values.unsqueeze(0).permute(0, 2, 1, 3, 4).to("cuda")
33
34# Build patch_positions for temporal sampling: [B, num_frames * frame_tokens, 3]
35frame_pos = torch.linspace(0, target_frames - 1, num_frames).long().cuda() # [T]
36grid_h, grid_w = video.shape[-2] // patch_size, video.shape[-1] // patch_size # patch grid
37frame_tokens = grid_h * grid_w
38
39t_positions = frame_pos[:, None].repeat(1, frame_tokens).reshape(-1) # [T * frame_tokens]
40h_positions = torch.arange(grid_h, device="cuda").repeat_interleave(grid_w)
41h_positions = h_positions.repeat(num_frames) # [T * frame_tokens]
42w_positions = torch.arange(grid_w, device="cuda").repeat(grid_h)
43w_positions = w_positions.repeat(num_frames) # [T * frame_tokens]
44
45patch_positions = torch.stack([t_positions, h_positions, w_positions], dim=-1).unsqueeze(0)
46
47with torch.no_grad():
48 outputs = model(video, patch_positions=patch_positions)| Property | Value |
|---|---|
| Model Type | LLM-Aligned Vision Transformer (ViT) |
| Architecture | HEVC-Style / Codec-Like Vision Transformer |
| Input Paradigm | Codec-Style (Sparse Patch / Dense Frame) |
| Resolution Strategy | True Native Resolution (Dynamic, No Tiling) |
| Temporal Context | Arbitrary Frame Count (Variable Length Support) |
| Hidden Size | 1024 |
| Intermediate Size | 4096 |
| Number of Layers | 24 |
| Number of Attention Heads | 16 |
| Patch Size | 14 |
| Positional Encoding | 3D RoPE (4:6:6 split for T:H:W) |
| Normalization | Layer Normalization |
| Activation Function | GELU |
| License | Apache 2.0 |
1@inproceedings{LLaVA-OneVision-2,
2 title={LLaVA-OneVision-2},
3 author={llava-onevision contributors},
4 booktitle={arXiv},
5 year={2026}
6}
7
8@article{tang2026onevisionencoder,
9 title={OneVision-Encoder: Codec-Aligned Sparsity as a Foundational Principle for Multimodal Intelligence},
10 author={Tang, Feilong and An, Xiang and Yan, Yunyao and Xie, Yin and Qin, Bin and Yang, Kaicheng and Shen, Yifei and Zhang, Yuanhan and Li, Chunyuan and Feng, Shikun and Chen, Changrui and Tan, Huajie and Hu, Ming and Zhang, Manyuan and Li, Bo and Feng, Ziyong and Liu, Ziwei and Ge, Zongyuan and Deng, Jiankang},
11 journal={arXiv preprint arXiv:2602.08683},
12 year={2026}
13}