File size: 5,890 Bytes
28555c1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | """Pinned native visual components. No text backbone or full generation pipeline."""
import json,math
from pathlib import Path
import torch
from torch import nn
import torch.nn.functional as F
from accelerate import init_empty_weights
from safetensors.torch import load_file
KEY = 'unicom_vision_compression'
def linear_from(state,name):
w=state[name+'.weight'];return nn.Linear(w.shape[1],w.shape[0],bias=name+'.bias' in state)
def build(config,s):
m=nn.Module()
if KEY=='internlumina_u2_visual_io':
from native.multicodebook import MultiCodebookARHead
m.model=nn.Module();m.model.img_embeddings=nn.ModuleList([nn.Embedding(*s[f'model.img_embeddings.{i}.weight'].shape) for i in range(8)])
m.model.img_embeddings_proj=linear_from(s,'model.img_embeddings_proj')
m.lm_img_head=nn.ModuleList([linear_from(s,f'lm_img_head.{i}') for i in range(8)])
m.multi_codebook_head=MultiCodebookARHead(config['hidden_size'],8,channel_depth=6,channel_heads=8)
elif KEY=='unicom_vision_compression':
from native.siglip2 import Siglip2VisionTransformer,LightProjector
from native.compression import AttentionCompressionNet
from native.flow_interfaces import TimestepEmbedder,LinearPatchEmbed,LinearFinalLayer
m.vision_model=Siglip2VisionTransformer(config['vit']);m.vision_aligner=LightProjector(config['vit_aligner']);m.compression=AttentionCompressionNet(config['siglip_original_dim'],config['siglip_latent_dim'])
h=config['hidden_size'];c=config['siglip_latent_dim'];m.timestep_emb=TimestepEmbedder(h);m.time_embed=TimestepEmbedder(h);m.patch_embed=LinearPatchEmbed(c,h);m.final_layer=LinearFinalLayer(h,c)
elif KEY=='internvlu_vision_bridge':
from native.modeling_intern_vit import InternVisionModel
from native.configuration_intern_vit import InternVisionConfig
c=InternVisionConfig(**config['vision_config']);c.use_flash_attn=False;m.vision_model=InternVisionModel(c)
n=s['mlp1.0.weight'].shape[0];m.mlp1=nn.Sequential(nn.LayerNorm(n),linear_from(s,'mlp1.1'),nn.GELU(),linear_from(s,'mlp1.3'))
m.special_token_embedding=nn.Embedding(*s['special_token_embedding.weight'].shape)
elif KEY=='hidream_o1_vision_pixel_io':
from native.qwen3_vl_transformers import Qwen3VLVisionModel
from transformers.models.qwen3_vl.configuration_qwen3_vl import Qwen3VLVisionConfig
from native.pixel_interfaces import BottleneckPatchEmbed,FinalLayer,TimestepEmbedder
c=Qwen3VLVisionConfig(**config['vision_config']);c._attn_implementation='eager';m.model=nn.Module();m.model.visual=Qwen3VLVisionModel(c)
h=config['text_config']['hidden_size'];b=s['model.x_embedder.proj1.weight'].shape[0];m.model.x_embedder=BottleneckPatchEmbed(None,32,3,b,h);m.model.t_embedder1=TimestepEmbedder(None,h);m.model.final_layer2=FinalLayer(None,h,32,3)
elif KEY=='ming_flash_omni2_vision_io':
from native.qwen3_moe_vit import Qwen3MoeVisionTransformer,Qwen3VLMoeVisionConfig
c=Qwen3VLMoeVisionConfig(**config['vision_config']);c._attn_implementation='eager';m.vision=Qwen3MoeVisionTransformer(c)
m.linear_proj=nn.Sequential(linear_from(s,'linear_proj.0'),nn.GELU(),linear_from(s,'linear_proj.2'))
elif KEY=='lance_vision':
from native.qwen2_5_vl_vit import Qwen2_5_VisionTransformerPretrainedModel
from transformers.models.qwen2_5_vl.configuration_qwen2_5_vl import Qwen2_5_VLVisionConfig
c=Qwen2_5_VLVisionConfig(**config);c._attn_implementation='eager';m=Qwen2_5_VisionTransformerPretrainedModel(c)
else:raise ValueError(KEY)
return m
def load_model(path=None,dtype=torch.float32,device='cpu'):
root=Path(path or Path(__file__).parent);cfg=json.loads((root/'source_config.json').read_text());s=load_file(root/'model.safetensors')
with init_empty_weights():m=build(cfg,s)
m.load_state_dict(s,strict=True,assign=True)
return m.to(device=device,dtype=dtype).eval()
def embed_codes(model,codes):
"""InternLumina-U2 per-position 8-codebook input. Model vocab also contains mask IDs."""
if KEY!='internlumina_u2_visual_io':raise ValueError(KEY)
if codes.shape[-1]!=8:raise ValueError('Expected 8 codebooks in original order')
return model.model.img_embeddings_proj(torch.cat([model.model.img_embeddings[i](codes[...,i]) for i in range(8)],dim=-1))
def codebook_logits(model,hidden,teacher_codes):
"""Teacher-forced head, without the diffusion backbone. hidden: [positions,2048]."""
if KEY!='internlumina_u2_visual_io':raise ValueError(KEY)
e=torch.stack([model.model.img_embeddings[i](teacher_codes[:,i]) for i in range(7)],dim=1)
x=model.multi_codebook_head(hidden,e)
return torch.stack([model.lm_img_head[i](x[:,i]) for i in range(8)],dim=1)
def unicom_features(model,pixel_patches,spatial_shapes,attention_mask=None):
"""Return 1152-d semantic features and 64-d compressed features, with native NaFlex layout."""
if KEY!='unicom_vision_compression':raise ValueError(KEY)
y=model.vision_model(pixel_patches,attention_mask=attention_mask,spatial_shapes=spatial_shapes).last_hidden_state
return y,model.compression.compress(y)
def unicom_align(model,features):
"""Requires the checkpoint's 1216-d aligner input. No speculative feature concatenation."""
if features.shape[-1]!=model.vision_aligner.layers[0].in_features:
raise ValueError('Upstream checkpoint aligner expects 1216 features, while raw SigLIP emits 1152. Supply the correct upstream adapter input explicitly.')
return model.vision_aligner(features)
def internvlu_features(model,pixels):
if KEY!='internvlu_vision_bridge':raise ValueError(KEY)
from native.pixel_shuffle import pixel_shuffle_v2
y=model.vision_model(pixel_values=pixels,return_dict=True).last_hidden_state[:,1:]
return model.mlp1(pixel_shuffle_v2(None,y,scale_factor=0.5,patch_aspect_ratio=1.0))
def ming_features(model,patches,grid_thw):
if KEY!='ming_flash_omni2_vision_io':raise ValueError(KEY)
y=model.vision(patches,grid_thw=grid_thw)
if isinstance(y,tuple):y=y[0]
return F.normalize(model.linear_proj(y),dim=-1)
|