Views
No views yet
| File path | Size |
|---|---|
| model.safetensors | 7.2MB |
1import torch
2from transformers import MiniCPMV4_6ForConditionalGeneration, AutoProcessor
3
4model_id = "yujiepan/minicpm-v-4.6-tiny-random"
5model = MiniCPMV4_6ForConditionalGeneration.from_pretrained(
6 model_id,
7 trust_remote_code=True,
8 attn_implementation='sdpa',
9 dtype=torch.bfloat16,
10)
11model = model.eval().cuda()
12processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
13
14messages = [
15 {
16 "role": "user",
17 "content": [
18 {"type": "video", "url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/football.mp4"},
19 {"type": "text", "text": "Describe this video in detail. Follow the timeline and focus on on-screen text, interface changes, main actions, and scene changes."},
20 ],
21 },
22 {
23 "role": "assistant",
24 "content": [{"type": "text", "text": "Dummy response for video"}],
25 },
26 {
27 "role": "user",
28 "content": [
29 {"type": "image", "url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/refract.png"},
30 {"type": "text", "text": "What causes this phenomenon?"},
31 ],
32 },
33]
34
35downsample_mode = "16x" # Using `downsample_mode="4x"` for Finer Detail
36inputs = processor.apply_chat_template(
37 messages, tokenize=True, add_generation_prompt=True,
38 return_dict=True, return_tensors="pt",
39 downsample_mode=downsample_mode,
40 max_num_frames=128,
41 stack_frames=1,
42 max_slice_nums=1,
43 use_image_id=False,
44).to(model.device)
45
46generated_ids = model.generate(**inputs, downsample_mode=downsample_mode, max_new_tokens=32)[0]
47output_text = processor.decode(generated_ids, skip_special_tokens=False, clean_up_tokenization_spaces=False)
48print(output_text.replace('<|video_pad|>', 'V').replace('<|image_pad|>', 'I'))1import json
2from pathlib import Path
3
4import torch
5from huggingface_hub import hf_hub_download
6from transformers import (
7 AutoConfig,
8 AutoModel,
9 AutoProcessor,
10 AutoTokenizer,
11 GenerationConfig,
12 set_seed,
13)
14
15source_model_id = "openbmb/MiniCPM-V-4.6"
16save_folder = "/tmp/yujiepan/minicpm-v-46-tiny-random"
17
18processor = AutoProcessor.from_pretrained(source_model_id, trust_remote_code=True)
19processor.save_pretrained(save_folder)
20
21with open(hf_hub_download(source_model_id, filename='config.json', repo_type='model'), 'r', encoding='utf-8') as f:
22 config_json: dict = json.load(f)
23
24text_config = config_json["text_config"]
25text_config.update({
26 "head_dim": 32,
27 "hidden_size": 8,
28 "intermediate_size": 64,
29 "layer_types": [
30 "linear_attention",
31 "linear_attention",
32 "linear_attention",
33 "full_attention",
34 ],
35 "linear_key_head_dim": 32,
36 "linear_num_key_heads": 4,
37 "linear_num_value_heads": 4,
38 "linear_value_head_dim": 32,
39 "num_attention_heads": 8,
40 "num_hidden_layers": 4,
41 "num_key_value_heads": 2,
42})
43vision_config = config_json["vision_config"]
44vision_config.update({
45 "hidden_size": 128,
46 "intermediate_size": 128,
47 "num_attention_heads": 4,
48 "num_hidden_layers": 2,
49})
50
51with open(f"{save_folder}/config.json", "w", encoding='utf-8') as f:
52 json.dump(config_json, f, indent=2)
53
54config = AutoConfig.from_pretrained(
55 save_folder,
56 trust_remote_code=True,
57)
58print(config)
59torch.set_default_dtype(torch.bfloat16)
60model = AutoModel.from_config(config, trust_remote_code=True)
61torch.set_default_dtype(torch.float32)
62model.generation_config = GenerationConfig.from_pretrained(
63 source_model_id, trust_remote_code=True,
64)
65set_seed(42)
66num_params = sum(p.numel() for p in model.parameters())
67with torch.no_grad():
68 for name, p in sorted(model.named_parameters()):
69 torch.nn.init.normal_(p, 0, 0.2)
70 print(name, p.shape, p.dtype, p.device, f'{p.numel() / num_params * 100: .2f}%')
71model.save_pretrained(save_folder)
72for f in Path(save_folder).glob('*.py'):
73 f.unlink()1MiniCPMV4_6Model(
2 (vision_tower): MiniCPMV4_6VisionModel(
3 (embeddings): MiniCPMV4_6VisionEmbeddings(
4 (patch_embedding): Conv2d(3, 128, kernel_size=(14, 14), stride=(14, 14), padding=valid)
5 (position_embedding): Embedding(4900, 128)
6 )
7 (encoder): MiniCPMV4_6VisionEncoder(
8 (layers): ModuleList(
9 (0-1): 2 x MiniCPMV4_6VisionEncoderLayer(
10 (layer_norm1): LayerNorm((128,), eps=1e-06, elementwise_affine=True)
11 (self_attn): MiniCPMV4_6VisionAttention(
12 (k_proj): Linear(in_features=128, out_features=128, bias=True)
13 (v_proj): Linear(in_features=128, out_features=128, bias=True)
14 (q_proj): Linear(in_features=128, out_features=128, bias=True)
15 (out_proj): Linear(in_features=128, out_features=128, bias=True)
16 )
17 (layer_norm2): LayerNorm((128,), eps=1e-06, elementwise_affine=True)
18 (mlp): MiniCPMV4_6VisionMLP(
19 (activation_fn): GELUTanh()
20 (fc1): Linear(in_features=128, out_features=128, bias=True)
21 (fc2): Linear(in_features=128, out_features=128, bias=True)
22 )
23 )
24 )
25 )
26 (post_layernorm): LayerNorm((128,), eps=1e-06, elementwise_affine=True)
27 (vit_merger): MiniCPMV4_6ViTWindowAttentionMerger(
28 (self_attn): MiniCPMV4_6VisionAttention(
29 (k_proj): Linear(in_features=128, out_features=128, bias=True)
30 (v_proj): Linear(in_features=128, out_features=128, bias=True)
31 (q_proj): Linear(in_features=128, out_features=128, bias=True)
32 (out_proj): Linear(in_features=128, out_features=128, bias=True)
33 )
34 (layer_norm1): LayerNorm((128,), eps=1e-06, elementwise_affine=True)
35 (pre_norm): LayerNorm((512,), eps=1e-06, elementwise_affine=True)
36 (linear_1): Linear(in_features=512, out_features=512, bias=True)
37 (act): GELUTanh()
38 (linear_2): Linear(in_features=512, out_features=128, bias=True)
39 )
40 )
41 (language_model): Qwen3_5TextModel(
42 (embed_tokens): Embedding(248094, 8)
43 (layers): ModuleList(
44 (0-2): 3 x Qwen3_5DecoderLayer(
45 (linear_attn): Qwen3_5GatedDeltaNet(
46 (act): SiLUActivation()
47 (conv1d): Conv1d(384, 384, kernel_size=(4,), stride=(1,), padding=(3,), groups=384, bias=False)
48 (norm): Qwen3_5RMSNormGated()
49 (out_proj): Linear(in_features=128, out_features=8, bias=False)
50 (in_proj_qkv): Linear(in_features=8, out_features=384, bias=False)
51 (in_proj_z): Linear(in_features=8, out_features=128, bias=False)
52 (in_proj_b): Linear(in_features=8, out_features=4, bias=False)
53 (in_proj_a): Linear(in_features=8, out_features=4, bias=False)
54 )
55 (mlp): Qwen3_5MLP(
56 (gate_proj): Linear(in_features=8, out_features=64, bias=False)
57 (up_proj): Linear(in_features=8, out_features=64, bias=False)
58 (down_proj): Linear(in_features=64, out_features=8, bias=False)
59 (act_fn): SiLUActivation()
60 )
61 (input_layernorm): Qwen3_5RMSNorm((8,), eps=1e-06)
62 (post_attention_layernorm): Qwen3_5RMSNorm((8,), eps=1e-06)
63 )
64 (3): Qwen3_5DecoderLayer(
65 (self_attn): Qwen3_5Attention(
66 (q_proj): Linear(in_features=8, out_features=512, bias=False)
67 (k_proj): Linear(in_features=8, out_features=64, bias=False)
68 (v_proj): Linear(in_features=8, out_features=64, bias=False)
69 (o_proj): Linear(in_features=256, out_features=8, bias=False)
70 (q_norm): Qwen3_5RMSNorm((32,), eps=1e-06)
71 (k_norm): Qwen3_5RMSNorm((32,), eps=1e-06)
72 )
73 (mlp): Qwen3_5MLP(
74 (gate_proj): Linear(in_features=8, out_features=64, bias=False)
75 (up_proj): Linear(in_features=8, out_features=64, bias=False)
76 (down_proj): Linear(in_features=64, out_features=8, bias=False)
77 (act_fn): SiLUActivation()
78 )
79 (input_layernorm): Qwen3_5RMSNorm((8,), eps=1e-06)
80 (post_attention_layernorm): Qwen3_5RMSNorm((8,), eps=1e-06)
81 )
82 )
83 (norm): Qwen3_5RMSNorm((8,), eps=1e-06)
84 (rotary_emb): Qwen3_5TextRotaryEmbedding()
85 )
86 (merger): MiniCPMV4_6Merger(
87 (mlp): ModuleList(
88 (0): MiniCPMV4_6DownsampleMLP(
89 (pre_norm): LayerNorm((512,), eps=1e-06, elementwise_affine=True)
90 (linear_1): Linear(in_features=512, out_features=512, bias=True)
91 (act): GELU(approximate='none')
92 (linear_2): Linear(in_features=512, out_features=8, bias=True)
93 )
94 )
95 )
96)