Views
No views yet
1# Multi-token prediction is supported
2model_id=tiny-random/glm-4-moe-lite
3vllm serve $model_id \
4 --tensor-parallel-size 2 \
5 --speculative-config.method mtp \
6 --speculative-config.num_speculative_tokens 1 \
7 --tool-call-parser glm47 \
8 --reasoning-parser glm45 \
9 --enable-auto-tool-choice1# Multi-token prediction is supported
2model_id=tiny-random/glm-4-moe-lite
3python3 -m sglang.launch_server --model-path $model_id --tp-size 2 \
4 --tool-call-parser glm47 \
5 --reasoning-parser glm45 \
6 --speculative-algorithm EAGLE \
7 --speculative-num-steps 3 \
8 --speculative-eagle-topk 1 \
9 --speculative-num-draft-tokens 41import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4# Load model and tokenizer
5model_id = "tiny-random/glm-4-moe-lite"
6messages = [{"role": "user", "content": "hello"}]
7tokenizer = AutoTokenizer.from_pretrained(model_id)
8inputs = tokenizer.apply_chat_template(
9 messages,
10 tokenize=True,
11 add_generation_prompt=True,
12 return_dict=True,
13 return_tensors="pt",
14)
15model = AutoModelForCausalLM.from_pretrained(
16 pretrained_model_name_or_path=model_id,
17 torch_dtype=torch.bfloat16,
18 device_map="cuda",
19)
20inputs = inputs.to(model.device)
21generated_ids = model.generate(
22 **inputs, max_new_tokens=32, do_sample=False)
23output_text = tokenizer.decode(
24 generated_ids[0][inputs.input_ids.shape[1]:])
25print(output_text)1import json
2from copy import deepcopy
3from pathlib import Path
4
5import accelerate
6import torch
7import torch.nn as nn
8from huggingface_hub import file_exists, hf_hub_download
9from transformers import (
10 AutoConfig,
11 AutoModelForCausalLM,
12 AutoProcessor,
13 GenerationConfig,
14 set_seed,
15)
16
17source_model_id = "zai-org/GLM-4.7-Flash"
18save_folder = "/tmp/tiny-random/glm-4-moe-lite"
19
20processor = AutoProcessor.from_pretrained(
21 source_model_id, trust_remote_code=True)
22processor.save_pretrained(save_folder)
23
24with open(hf_hub_download(source_model_id, filename='config.json', repo_type='model'), 'r', encoding='utf-8') as f:
25 config_json = json.load(f)
26config_json.update({
27 'kv_lora_rank': 384,
28 'num_key_value_heads': 1,
29 'q_lora_rank': 32,
30 'qk_nope_head_dim': 64,
31 'qk_rope_head_dim': 192,
32 'v_head_dim': 64,
33 'num_key_value_heads': 4,
34 'num_attention_heads': 4,
35})
36config_json['hidden_size'] = 8
37config_json['intermediate_size'] = 32
38config_json['moe_intermediate_size'] = 32
39config_json['num_hidden_layers'] = 2
40config_json['tie_word_embeddings'] = False
41config_json['use_cache'] = True
42with open(f"{save_folder}/config.json", "w", encoding='utf-8') as f:
43 json.dump(config_json, f, indent=2)
44
45config = AutoConfig.from_pretrained(
46 save_folder,
47 trust_remote_code=True,
48)
49print(config)
50torch.set_default_dtype(torch.bfloat16)
51model = AutoModelForCausalLM.from_config(config)
52torch.set_default_dtype(torch.float32)
53if file_exists(filename="generation_config.json", repo_id=source_model_id, repo_type='model'):
54 model.generation_config = GenerationConfig.from_pretrained(
55 source_model_id, trust_remote_code=True,
56 )
57 model.generation_config.do_sample = True
58 print(model.generation_config)
59model = model.cpu()
60set_seed(42)
61with torch.no_grad():
62 for name, p in sorted(model.named_parameters()):
63 torch.nn.init.normal_(p, 0, 0.1)
64 print(name, p.shape)
65# MTP
66set_seed(42)
67model.model.layers.append(nn.ModuleDict(dict(
68 embed_tokens=deepcopy(model.model.embed_tokens),
69 shared_head=nn.ModuleDict(dict(
70 norm=nn.RMSNorm(config.hidden_size),
71 head=deepcopy(model.model.embed_tokens),
72 )),
73 eh_proj=nn.Linear(config.hidden_size * 2,
74 config.hidden_size, bias=False),
75 enorm=nn.RMSNorm(config.hidden_size),
76 hnorm=nn.RMSNorm(config.hidden_size),
77 input_layernorm=nn.RMSNorm(config.hidden_size),
78 post_attention_layernorm=nn.RMSNorm(config.hidden_size),
79 self_attn=deepcopy(model.model.layers[1].self_attn),
80 mlp=deepcopy(model.model.layers[1].mlp),
81)))
82for i in range(1, len(model.model.layers)):
83 model.model.layers[i].mlp.gate.e_score_correction_bias = torch.rand_like(
84 model.model.layers[i].mlp.gate.e_score_correction_bias).float()
85model.save_pretrained(save_folder)
86print(model)1Glm4MoeLiteForCausalLM(
2 (model): Glm4MoeLiteModel(
3 (embed_tokens): Embedding(154880, 8, padding_idx=154820)
4 (layers): ModuleList(
5 (0): Glm4MoeLiteDecoderLayer(
6 (self_attn): Glm4MoeLiteAttention(
7 (q_a_proj): Linear(in_features=8, out_features=32, bias=False)
8 (q_a_layernorm): Glm4MoeLiteRMSNorm((32,), eps=1e-06)
9 (q_b_proj): Linear(in_features=32, out_features=1024, bias=False)
10 (kv_a_proj_with_mqa): Linear(in_features=8, out_features=576, bias=False)
11 (kv_a_layernorm): Glm4MoeLiteRMSNorm((384,), eps=1e-06)
12 (kv_b_proj): Linear(in_features=384, out_features=512, bias=False)
13 (o_proj): Linear(in_features=256, out_features=8, bias=False)
14 )
15 (mlp): Glm4MoeLiteMLP(
16 (gate_proj): Linear(in_features=8, out_features=32, bias=False)
17 (up_proj): Linear(in_features=8, out_features=32, bias=False)
18 (down_proj): Linear(in_features=32, out_features=8, bias=False)
19 (act_fn): SiLUActivation()
20 )
21 (input_layernorm): Glm4MoeLiteRMSNorm((8,), eps=1e-05)
22 (post_attention_layernorm): Glm4MoeLiteRMSNorm((8,), eps=1e-05)
23 )
24 (1): Glm4MoeLiteDecoderLayer(
25 (self_attn): Glm4MoeLiteAttention(
26 (q_a_proj): Linear(in_features=8, out_features=32, bias=False)
27 (q_a_layernorm): Glm4MoeLiteRMSNorm((32,), eps=1e-06)
28 (q_b_proj): Linear(in_features=32, out_features=1024, bias=False)
29 (kv_a_proj_with_mqa): Linear(in_features=8, out_features=576, bias=False)
30 (kv_a_layernorm): Glm4MoeLiteRMSNorm((384,), eps=1e-06)
31 (kv_b_proj): Linear(in_features=384, out_features=512, bias=False)
32 (o_proj): Linear(in_features=256, out_features=8, bias=False)
33 )
34 (mlp): Glm4MoeLiteMoE(
35 (experts): Glm4MoeLiteNaiveMoe(
36 (act_fn): SiLUActivation()
37 )
38 (gate): Glm4MoeLiteTopkRouter()
39 (shared_experts): Glm4MoeLiteMLP(
40 (gate_proj): Linear(in_features=8, out_features=32, bias=False)
41 (up_proj): Linear(in_features=8, out_features=32, bias=False)
42 (down_proj): Linear(in_features=32, out_features=8, bias=False)
43 (act_fn): SiLUActivation()
44 )
45 )
46 (input_layernorm): Glm4MoeLiteRMSNorm((8,), eps=1e-05)
47 (post_attention_layernorm): Glm4MoeLiteRMSNorm((8,), eps=1e-05)
48 )
49 (2): ModuleDict(
50 (embed_tokens): Embedding(154880, 8, padding_idx=154820)
51 (shared_head): ModuleDict(
52 (norm): RMSNorm((8,), eps=None, elementwise_affine=True)
53 (head): Embedding(154880, 8, padding_idx=154820)
54 )
55 (eh_proj): Linear(in_features=16, out_features=8, bias=False)
56 (enorm): RMSNorm((8,), eps=None, elementwise_affine=True)
57 (hnorm): RMSNorm((8,), eps=None, elementwise_affine=True)
58 (input_layernorm): RMSNorm((8,), eps=None, elementwise_affine=True)
59 (post_attention_layernorm): RMSNorm((8,), eps=None, elementwise_affine=True)
60 (self_attn): Glm4MoeLiteAttention(
61 (q_a_proj): Linear(in_features=8, out_features=32, bias=False)
62 (q_a_layernorm): Glm4MoeLiteRMSNorm((32,), eps=1e-06)
63 (q_b_proj): Linear(in_features=32, out_features=1024, bias=False)
64 (kv_a_proj_with_mqa): Linear(in_features=8, out_features=576, bias=False)
65 (kv_a_layernorm): Glm4MoeLiteRMSNorm((384,), eps=1e-06)
66 (kv_b_proj): Linear(in_features=384, out_features=512, bias=False)
67 (o_proj): Linear(in_features=256, out_features=8, bias=False)
68 )
69 (mlp): Glm4MoeLiteMoE(
70 (experts): Glm4MoeLiteNaiveMoe(
71 (act_fn): SiLUActivation()
72 )
73 (gate): Glm4MoeLiteTopkRouter()
74 (shared_experts): Glm4MoeLiteMLP(
75 (gate_proj): Linear(in_features=8, out_features=32, bias=False)
76 (up_proj): Linear(in_features=8, out_features=32, bias=False)
77 (down_proj): Linear(in_features=32, out_features=8, bias=False)
78 (act_fn): SiLUActivation()
79 )
80 )
81 )
82 )
83 (norm): Glm4MoeLiteRMSNorm((8,), eps=1e-05)
84 (rotary_emb): Glm4MoeLiteRotaryEmbedding()
85 )
86 (lm_head): Linear(in_features=8, out_features=154880, bias=False)
87)