Views
No views yet
| File path | Size |
|---|---|
| model.safetensors | 4.3MB |
1import torch
2from transformers import AutoModelForCausalLM, AutoProcessor, AutoModelForMultimodalLM
3
4model_id = "tiny-random/gemma-4-assistant"
5target_model_id = "tiny-random/gemma-4-moe"
6
7processor = AutoProcessor.from_pretrained(target_model_id)
8target_model = AutoModelForMultimodalLM.from_pretrained(
9 target_model_id,
10 dtype=torch.bfloat16,
11 device_map="auto",
12)
13assistant_model = AutoModelForCausalLM.from_pretrained(
14 model_id,
15 dtype=torch.bfloat16,
16 device_map="auto",
17)
18messages = [
19 {
20 "role": "user",
21 "content": [
22 {
23 "type": "image",
24 "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG",
25 },
26 {"type": "text", "text": "What is shown in this image?"},
27 ],
28 },
29 {
30 "role": "assistant",
31 "content": [{"type": "text", "text": "Dummy response for image"}],
32 },
33 {
34 "role": "user",
35 "content": [
36 {
37 "type": "video",
38 "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4",
39 },
40 {"type": "text", "text": "Describe this video."},
41 ],
42 },
43]
44inputs = processor.apply_chat_template(
45 messages,
46 tokenize=True,
47 return_dict=True,
48 return_tensors="pt",
49 add_generation_prompt=True,
50).to(target_model.device)
51input_len = inputs["input_ids"].shape[-1]
52print("input_len:", input_len)
53outputs = target_model.generate(
54 **inputs,
55 assistant_model=assistant_model,
56 max_new_tokens=32,
57)
58response = processor.decode(outputs[0], skip_special_tokens=False)
59response = response.replace("<|image|>", "I")
60response = response.replace("<|video|>", "V")
61print(response)1import json
2from pathlib import Path
3
4import torch
5from huggingface_hub import file_exists, hf_hub_download
6
7from transformers import (
8 AutoConfig,
9 AutoModelForCausalLM,
10 AutoProcessor,
11 AutoTokenizer,
12 Gemma4AssistantForCausalLM,
13 Gemma4ForConditionalGeneration,
14 GenerationConfig,
15 set_seed,
16)
17
18source_model_id = "google/gemma-4-31B-it-assistant"
19save_folder = "/tmp/tiny-random/gemma-4-assistant"
20
21processor = AutoProcessor.from_pretrained(source_model_id)
22processor.save_pretrained(save_folder)
23
24with open(
25 hf_hub_download(source_model_id, filename="config.json", repo_type="model"),
26 "r",
27 encoding="utf-8",
28) as f:
29 config_json = json.load(f)
30
31config_json["backbone_hidden_size"] = 8
32config_json["text_config"].update(
33 {
34 "global_head_dim": 64,
35 "head_dim": 32,
36 "hidden_size": 8,
37 "intermediate_size": 64,
38 "layer_types": [
39 "sliding_attention",
40 "sliding_attention",
41 "sliding_attention",
42 "full_attention",
43 ],
44 "moe_intermediate_size": 32,
45 "num_attention_heads": 8,
46 "num_hidden_layers": 4,
47 "num_key_value_heads": 4,
48 }
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)
59
60torch.set_default_dtype(torch.bfloat16)
61model = Gemma4AssistantForCausalLM(config)
62torch.set_default_dtype(torch.float32)
63if file_exists(filename="generation_config.json", repo_id=source_model_id, repo_type="model"):
64 model.generation_config = GenerationConfig.from_pretrained(
65 source_model_id,
66 trust_remote_code=True,
67 )
68set_seed(42)
69model = model.cpu()
70all_numels = sum(p.numel() for p in model.parameters())
71with torch.no_grad():
72 for name, p in sorted(model.named_parameters()):
73 torch.nn.init.normal_(p, 0, 0.2)
74 print(name, p.shape, f"{p.numel() / all_numels * 100: .4f}%")
75model.save_pretrained(save_folder)1Gemma4AssistantForCausalLM(
2 (model): Gemma4TextModel(
3 (embed_tokens): Gemma4TextScaledWordEmbedding(262144, 8, padding_idx=0)
4 (layers): ModuleList(
5 (0-2): 3 x Gemma4TextDecoderLayer(
6 (self_attn): Gemma4TextAttention(
7 (q_proj): Linear(in_features=8, out_features=256, bias=False)
8 (q_norm): Gemma4RMSNorm()
9 (o_proj): Linear(in_features=256, out_features=8, bias=False)
10 )
11 (mlp): Gemma4TextMLP(
12 (gate_proj): Linear(in_features=8, out_features=64, bias=False)
13 (up_proj): Linear(in_features=8, out_features=64, bias=False)
14 (down_proj): Linear(in_features=64, out_features=8, bias=False)
15 (act_fn): GELUTanh()
16 )
17 (input_layernorm): Gemma4RMSNorm()
18 (post_attention_layernorm): Gemma4RMSNorm()
19 (pre_feedforward_layernorm): Gemma4RMSNorm()
20 (post_feedforward_layernorm): Gemma4RMSNorm()
21 )
22 (3): Gemma4TextDecoderLayer(
23 (self_attn): Gemma4TextAttention(
24 (q_proj): Linear(in_features=8, out_features=512, bias=False)
25 (q_norm): Gemma4RMSNorm()
26 (o_proj): Linear(in_features=512, out_features=8, bias=False)
27 )
28 (mlp): Gemma4TextMLP(
29 (gate_proj): Linear(in_features=8, out_features=64, bias=False)
30 (up_proj): Linear(in_features=8, out_features=64, bias=False)
31 (down_proj): Linear(in_features=64, out_features=8, bias=False)
32 (act_fn): GELUTanh()
33 )
34 (input_layernorm): Gemma4RMSNorm()
35 (post_attention_layernorm): Gemma4RMSNorm()
36 (pre_feedforward_layernorm): Gemma4RMSNorm()
37 (post_feedforward_layernorm): Gemma4RMSNorm()
38 )
39 )
40 (norm): Gemma4RMSNorm()
41 (rotary_emb): Gemma4TextRotaryEmbedding()
42 )
43 (lm_head): Linear(in_features=8, out_features=262144, bias=False)
44 (pre_projection): Linear(in_features=16, out_features=8, bias=False)
45 (post_projection): Linear(in_features=8, out_features=8, bias=False)
46)