Views
No views yet
1import numpy as np
2import torch
3import transformers
4from PIL import Image
5from transformers import (
6 AutoModel,
7 AutoModelForCausalLM,
8 AutoProcessor,
9 AutoTokenizer,
10 Qwen3VLMoeForConditionalGeneration,
11)
12
13model_id = "tiny-random/qwen3-vl-moe"
14model = Qwen3VLMoeForConditionalGeneration.from_pretrained(
15 model_id, dtype=torch.bfloat16, device_map="cuda",
16 # attn_implementation="flash_attention_2",
17)
18processor = AutoProcessor.from_pretrained(model_id)
19messages = [
20 {
21 "role": "user",
22 "content": [
23 {
24 "type": "image",
25 "image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",
26 },
27 {"type": "text", "text": "Describe this image."},
28 ],
29 }
30]
31
32# Preparation for inference
33inputs = processor.apply_chat_template(
34 messages,
35 tokenize=True,
36 add_generation_prompt=True,
37 return_dict=True,
38 return_tensors="pt"
39).to(model.device)
40
41# Inference: Generation of the output
42generated_ids = model.generate(**inputs, max_new_tokens=32)
43generated_ids_trimmed = [
44 out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
45]
46output_text = processor.batch_decode(
47 generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
48)
49print(output_text)1import json
2from pathlib import Path
3
4import accelerate
5import torch
6from huggingface_hub import file_exists, hf_hub_download
7from transformers import (
8 AutoConfig,
9 AutoModelForCausalLM,
10 AutoProcessor,
11 GenerationConfig,
12 Qwen3VLMoeForConditionalGeneration,
13 set_seed,
14)
15
16source_model_id = "Qwen/Qwen3-VL-235B-A22B-Instruct"
17save_folder = "/tmp/tiny-random/qwen3-vl-moe"
18
19processor = AutoProcessor.from_pretrained(source_model_id, trust_remote_code=True)
20processor.save_pretrained(save_folder)
21
22with open(hf_hub_download(source_model_id, filename='config.json', repo_type='model'), 'r', encoding='utf-8') as f:
23 config_json = json.load(f)
24
25config_json['text_config'].update({
26 'head_dim': 32,
27 'hidden_size': 8,
28 'intermediate_size': 64,
29 'moe_intermediate_size': 64,
30 'num_hidden_layers': 2,
31 'num_attention_heads': 8,
32 'num_key_value_heads': 4,
33 'num_experts': 16,
34 # 'decoder_sparse_step': 2,
35})
36config_json['text_config']['rope_scaling']['mrope_section'] = [8, 4, 4]
37config_json['vision_config'].update(
38 {
39 'hidden_size': 64,
40 'intermediate_size': 64,
41 'num_heads': 2,
42 'out_hidden_size': 8,
43 'depth': 6,
44 'deepstack_visual_indexes': [1, 3, 5],
45 }
46)
47with open(f"{save_folder}/config.json", "w", encoding='utf-8') as f:
48 json.dump(config_json, f, indent=2)
49
50config = AutoConfig.from_pretrained(
51 save_folder,
52 trust_remote_code=True,
53)
54print(config)
55torch.set_default_dtype(torch.bfloat16)
56model = Qwen3VLMoeForConditionalGeneration(config)
57torch.set_default_dtype(torch.float32)
58if file_exists(filename="generation_config.json", repo_id=source_model_id, repo_type='model'):
59 model.generation_config = GenerationConfig.from_pretrained(
60 source_model_id, trust_remote_code=True,
61 )
62 model.generation_config.do_sample = True
63 print(model.generation_config)
64model = model.cpu()
65with torch.no_grad():
66 for name, p in sorted(model.named_parameters()):
67 torch.nn.init.normal_(p, 0, 0.1)
68 print(name, p.shape)
69model.save_pretrained(save_folder)1Qwen3VLMoeForConditionalGeneration(
2 (model): Qwen3VLMoeModel(
3 (visual): Qwen3VLMoeVisionModel(
4 (patch_embed): Qwen3VLMoeVisionPatchEmbed(
5 (proj): Conv3d(3, 64, kernel_size=(2, 16, 16), stride=(2, 16, 16))
6 )
7 (pos_embed): Embedding(2304, 64)
8 (rotary_pos_emb): Qwen3VLMoeVisionRotaryEmbedding()
9 (blocks): ModuleList(
10 (0-5): 6 x Qwen3VLMoeVisionBlock(
11 (norm1): LayerNorm((64,), eps=1e-06, elementwise_affine=True)
12 (norm2): LayerNorm((64,), eps=1e-06, elementwise_affine=True)
13 (attn): Qwen3VLMoeVisionAttention(
14 (qkv): Linear(in_features=64, out_features=192, bias=True)
15 (proj): Linear(in_features=64, out_features=64, bias=True)
16 )
17 (mlp): Qwen3VLMoeVisionMLP(
18 (linear_fc1): Linear(in_features=64, out_features=64, bias=True)
19 (linear_fc2): Linear(in_features=64, out_features=64, bias=True)
20 (act_fn): PytorchGELUTanh()
21 )
22 )
23 )
24 (merger): Qwen3VLMoeVisionPatchMerger(
25 (norm): LayerNorm((64,), eps=1e-06, elementwise_affine=True)
26 (linear_fc1): Linear(in_features=256, out_features=256, bias=True)
27 (act_fn): GELU(approximate='none')
28 (linear_fc2): Linear(in_features=256, out_features=8, bias=True)
29 )
30 (deepstack_merger_list): ModuleList(
31 (0-2): 3 x Qwen3VLMoeVisionPatchMerger(
32 (norm): LayerNorm((256,), eps=1e-06, elementwise_affine=True)
33 (linear_fc1): Linear(in_features=256, out_features=256, bias=True)
34 (act_fn): GELU(approximate='none')
35 (linear_fc2): Linear(in_features=256, out_features=8, bias=True)
36 )
37 )
38 )
39 (language_model): Qwen3VLMoeTextModel(
40 (embed_tokens): Embedding(151936, 8)
41 (layers): ModuleList(
42 (0-1): 2 x Qwen3VLMoeTextDecoderLayer(
43 (self_attn): Qwen3VLMoeTextAttention(
44 (q_proj): Linear(in_features=8, out_features=256, bias=False)
45 (k_proj): Linear(in_features=8, out_features=128, bias=False)
46 (v_proj): Linear(in_features=8, out_features=128, bias=False)
47 (o_proj): Linear(in_features=256, out_features=8, bias=False)
48 (q_norm): Qwen3VLMoeTextRMSNorm((32,), eps=1e-06)
49 (k_norm): Qwen3VLMoeTextRMSNorm((32,), eps=1e-06)
50 )
51 (mlp): Qwen3VLMoeTextSparseMoeBlock(
52 (gate): Qwen3VLMoeTextRouter(in_features=8, out_features=16, bias=False)
53 (experts): Qwen3VLMoeTextExperts(
54 (act_fn): SiLU()
55 )
56 )
57 (input_layernorm): Qwen3VLMoeTextRMSNorm((8,), eps=1e-06)
58 (post_attention_layernorm): Qwen3VLMoeTextRMSNorm((8,), eps=1e-06)
59 )
60 )
61 (norm): Qwen3VLMoeTextRMSNorm((8,), eps=1e-06)
62 (rotary_emb): Qwen3VLMoeTextRotaryEmbedding()
63 )
64 )
65 (lm_head): Linear(in_features=8, out_features=151936, bias=False)
66)