初始化项目,由ModelHub XC社区提供模型
Model: Erland/mini-glm-moe Source: Original Platform
This commit is contained in:
36
.gitattributes
vendored
Normal file
36
.gitattributes
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.arrow filter=lfs diff=lfs merge=lfs -text
|
||||
*.bin filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
||||
*.ftz filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.h5 filter=lfs diff=lfs merge=lfs -text
|
||||
*.joblib filter=lfs diff=lfs merge=lfs -text
|
||||
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
||||
*.model filter=lfs diff=lfs merge=lfs -text
|
||||
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
||||
*.npy filter=lfs diff=lfs merge=lfs -text
|
||||
*.npz filter=lfs diff=lfs merge=lfs -text
|
||||
*.onnx filter=lfs diff=lfs merge=lfs -text
|
||||
*.ot filter=lfs diff=lfs merge=lfs -text
|
||||
*.parquet filter=lfs diff=lfs merge=lfs -text
|
||||
*.pb filter=lfs diff=lfs merge=lfs -text
|
||||
*.pickle filter=lfs diff=lfs merge=lfs -text
|
||||
*.pkl filter=lfs diff=lfs merge=lfs -text
|
||||
*.pt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pth filter=lfs diff=lfs merge=lfs -text
|
||||
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
||||
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tflite filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.wasm filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
||||
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
||||
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
||||
88
README.md
Normal file
88
README.md
Normal file
@@ -0,0 +1,88 @@
|
||||
---
|
||||
license: apache-2.0
|
||||
tags:
|
||||
- moe
|
||||
- glm
|
||||
- prime-rl
|
||||
- testing
|
||||
---
|
||||
|
||||
# Mini GLM-4 MoE (0.5B)
|
||||
|
||||
A small [GLM-4 MoE](https://huggingface.co/THUDM/GLM-4-100B-A10B) model (543M parameters) for testing and development. Uses the same `Glm4MoeForCausalLM` architecture as the full GLM-4-100B-A10B but with reduced dimensions.
|
||||
|
||||
This model is designed for testing MoE training pipelines in [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) without needing large pretrained checkpoints. It is small enough to run on a single GPU while exercising the same code paths as production models.
|
||||
|
||||
## Architecture
|
||||
|
||||
| Parameter | Value |
|
||||
|---|---|
|
||||
| Parameters | 543M |
|
||||
| Hidden size | 1024 |
|
||||
| Layers | 24 |
|
||||
| Attention heads | 16 (4 KV heads) |
|
||||
| Routed experts | 8 |
|
||||
| Experts per token | 4 |
|
||||
| Shared experts | 1 |
|
||||
| MoE intermediate size | 256 |
|
||||
| Dense intermediate size | 2048 |
|
||||
| Dense layers (first-k) | 1 |
|
||||
| Vocab size | 151,552 |
|
||||
| Partial rotary factor | 0.5 |
|
||||
| Model type | `glm4_moe` |
|
||||
|
||||
The architecture mirrors [THUDM/GLM-4-100B-A10B](https://huggingface.co/THUDM/GLM-4-100B-A10B): the first layer is a dense MLP, and all subsequent layers use Mixture-of-Experts with a shared expert. Attention uses Grouped Query Attention (GQA) with partial rotary embeddings.
|
||||
|
||||
## How this model was created
|
||||
|
||||
**Step 1: Random initialization.** A `Glm4MoeConfig` was instantiated with the small dimensions above and the HuggingFace `Glm4MoeForCausalLM` model was initialized with random weights. The tokenizer was copied from [THUDM/GLM-4-9B-0414](https://huggingface.co/THUDM/GLM-4-9B-0414).
|
||||
|
||||
**Step 2: Roundtrip verification.** Before training, we verified that the HuggingFace and [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) custom implementations produce identical outputs on the same weights (max logits diff < 0.01), and that `convert_to_hf` / `convert_to_prime` state dict conversions are lossless.
|
||||
|
||||
**Step 3: SFT warmup.** The model was fine-tuned for 200 steps on [PrimeIntellect/Reverse-Text-SFT](https://huggingface.co/datasets/PrimeIntellect/Reverse-Text-SFT) using prime-rl's custom MoE implementation with the following config:
|
||||
|
||||
```toml
|
||||
max_steps = 200
|
||||
|
||||
[model]
|
||||
impl = "custom"
|
||||
attn = "sdpa"
|
||||
|
||||
[data]
|
||||
name = "PrimeIntellect/Reverse-Text-SFT"
|
||||
batch_size = 4
|
||||
seq_len = 1024
|
||||
|
||||
[optim]
|
||||
lr = 1e-4
|
||||
```
|
||||
|
||||
Loss went from ~12 (random init) to ~2.5 after 200 steps. The model is not intended to be useful for generation -- the SFT warmup gives it a non-trivial learned distribution so that KL divergence and other RL metrics are meaningful during testing.
|
||||
|
||||
**Step 4: Post-training verification.** After SFT, we re-verified the HF <-> PrimeRL roundtrip on the trained checkpoint to confirm that checkpoint saving (which goes through `convert_to_hf`) produced valid weights.
|
||||
|
||||
## Reproduction
|
||||
|
||||
The scripts used to create this model live in the [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) repository under `scripts/mini_moe/`:
|
||||
|
||||
```bash
|
||||
# Step 1: Create random-init model
|
||||
uv run python scripts/mini_moe/create.py --arch glm4_moe --output-dir ./mini-glm-moe
|
||||
|
||||
# Step 2: Verify HF <-> PrimeRL roundtrip
|
||||
uv run python scripts/mini_moe/verify.py --arch glm4_moe --model-dir ./mini-glm-moe
|
||||
|
||||
# Step 3: SFT warmup + verify + push
|
||||
uv run python scripts/mini_moe/sft_warmup.py --arch glm4_moe --model-dir ./mini-glm-moe --sft-steps 200 --push-to-hub samsja/mini-glm-moe
|
||||
```
|
||||
|
||||
To add a new architecture, add a preset to `scripts/mini_moe/presets.py`.
|
||||
|
||||
## Intended use
|
||||
|
||||
- Testing MoE training pipelines (SFT, RL) in prime-rl
|
||||
- Validating state dict conversion between HuggingFace and prime-rl formats
|
||||
- Integration tests that need a real MoE model but cannot afford large checkpoints
|
||||
- Checking RL metrics (KL divergence, reward signals) on a small scale
|
||||
|
||||
This model is **not** intended for inference or any downstream task.
|
||||
41
chat_template.jinja
Normal file
41
chat_template.jinja
Normal file
@@ -0,0 +1,41 @@
|
||||
[gMASK]<sop>
|
||||
{%- if tools -%}
|
||||
<|system|>
|
||||
# 可用工具
|
||||
{% for tool in tools %}
|
||||
{%- set function = tool.function if tool.get("function") else tool %}
|
||||
|
||||
## {{ function.name }}
|
||||
|
||||
{{ function | tojson(indent=4, ensure_ascii=False) }}
|
||||
在调用上述函数时,请使用 Json 格式表示调用的参数。
|
||||
{%- endfor %}
|
||||
{%- endif -%}
|
||||
|
||||
{%- for msg in messages %}
|
||||
{%- if msg.role == 'system' %}
|
||||
<|system|>
|
||||
{{ msg.content }}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
|
||||
{%- for message in messages if message.role != 'system' %}
|
||||
{%- set role = message['role'] %}
|
||||
{%- set content = message['content'] %}
|
||||
{%- set meta = message.get("metadata", "") %}
|
||||
|
||||
{%- if role == 'user' %}
|
||||
<|user|>
|
||||
{{ content }}
|
||||
{%- elif role == 'assistant' and not meta %}
|
||||
<|assistant|>
|
||||
{{ content }}
|
||||
{%- elif role == 'assistant' and meta %}
|
||||
<|assistant|>{{ meta }}
|
||||
{{ content }}
|
||||
{%- elif role == 'observation' %}
|
||||
<|observation|>
|
||||
{{ content }}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{% if add_generation_prompt %}<|assistant|>{% endif %}
|
||||
43
config.json
Normal file
43
config.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"architectures": [
|
||||
"Glm4MoeForCausalLM"
|
||||
],
|
||||
"attention_bias": true,
|
||||
"attention_dropout": 0.0,
|
||||
"dtype": "float32",
|
||||
"eos_token_id": [
|
||||
151329,
|
||||
151336,
|
||||
151338
|
||||
],
|
||||
"first_k_dense_replace": 1,
|
||||
"hidden_act": "silu",
|
||||
"hidden_size": 1024,
|
||||
"initializer_range": 0.02,
|
||||
"intermediate_size": 2048,
|
||||
"max_position_embeddings": 131072,
|
||||
"model_type": "glm4_moe",
|
||||
"moe_intermediate_size": 256,
|
||||
"n_group": 1,
|
||||
"n_routed_experts": 8,
|
||||
"n_shared_experts": 1,
|
||||
"norm_topk_prob": true,
|
||||
"num_attention_heads": 16,
|
||||
"num_experts_per_tok": 4,
|
||||
"num_hidden_layers": 24,
|
||||
"num_key_value_heads": 4,
|
||||
"pad_token_id": 151329,
|
||||
"partial_rotary_factor": 0.5,
|
||||
"rms_norm_eps": 1e-05,
|
||||
"rope_scaling": null,
|
||||
"rope_theta": 1000000,
|
||||
"routed_scaling_factor": 1.0,
|
||||
"tie_word_embeddings": false,
|
||||
"topk_group": 1,
|
||||
"transformers_version": "4.57.6",
|
||||
"use_cache": false,
|
||||
"use_grouped_mm": true,
|
||||
"use_qk_norm": false,
|
||||
"vocab_size": 151552,
|
||||
"head_dim": 64
|
||||
}
|
||||
11
generation_config.json
Normal file
11
generation_config.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"_from_model_config": true,
|
||||
"eos_token_id": [
|
||||
151329,
|
||||
151336,
|
||||
151338
|
||||
],
|
||||
"pad_token_id": 151329,
|
||||
"transformers_version": "4.57.6",
|
||||
"use_cache": false
|
||||
}
|
||||
3
model.safetensors
Normal file
3
model.safetensors
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fe548a8bcc13d70ea473a1647770c69acf698dd045c2581ca2907c0cdd03faac
|
||||
size 1085409024
|
||||
26
special_tokens_map.json
Normal file
26
special_tokens_map.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"additional_special_tokens": [
|
||||
"<|endoftext|>",
|
||||
"[MASK]",
|
||||
"[gMASK]",
|
||||
"[sMASK]",
|
||||
"<sop>",
|
||||
"<eop>",
|
||||
"<|system|>",
|
||||
"<|user|>",
|
||||
"<|assistant|>",
|
||||
"<|observation|>",
|
||||
"<|begin_of_image|>",
|
||||
"<|end_of_image|>",
|
||||
"<|begin_of_video|>",
|
||||
"<|end_of_video|>"
|
||||
],
|
||||
"eos_token": {
|
||||
"content": "<|user|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false
|
||||
},
|
||||
"pad_token": "<|user|>"
|
||||
}
|
||||
3
tokenizer.json
Normal file
3
tokenizer.json
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:76ebeac0d8bd7879ead7b43c16b44981f277e47225de2bd7de9ae1a6cc664a8c
|
||||
size 19966496
|
||||
145
tokenizer_config.json
Normal file
145
tokenizer_config.json
Normal file
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"added_tokens_decoder": {
|
||||
"151329": {
|
||||
"content": "<|endoftext|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151330": {
|
||||
"content": "[MASK]",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151331": {
|
||||
"content": "[gMASK]",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151332": {
|
||||
"content": "[sMASK]",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151333": {
|
||||
"content": "<sop>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151334": {
|
||||
"content": "<eop>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151335": {
|
||||
"content": "<|system|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151336": {
|
||||
"content": "<|user|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151337": {
|
||||
"content": "<|assistant|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151338": {
|
||||
"content": "<|observation|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151339": {
|
||||
"content": "<|begin_of_image|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151340": {
|
||||
"content": "<|end_of_image|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151341": {
|
||||
"content": "<|begin_of_video|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
},
|
||||
"151342": {
|
||||
"content": "<|end_of_video|>",
|
||||
"lstrip": false,
|
||||
"normalized": false,
|
||||
"rstrip": false,
|
||||
"single_word": false,
|
||||
"special": true
|
||||
}
|
||||
},
|
||||
"additional_special_tokens": [
|
||||
"<|endoftext|>",
|
||||
"[MASK]",
|
||||
"[gMASK]",
|
||||
"[sMASK]",
|
||||
"<sop>",
|
||||
"<eop>",
|
||||
"<|system|>",
|
||||
"<|user|>",
|
||||
"<|assistant|>",
|
||||
"<|observation|>",
|
||||
"<|begin_of_image|>",
|
||||
"<|end_of_image|>",
|
||||
"<|begin_of_video|>",
|
||||
"<|end_of_video|>"
|
||||
],
|
||||
"clean_up_tokenization_spaces": false,
|
||||
"do_lower_case": false,
|
||||
"eos_token": "<|user|>",
|
||||
"extra_special_tokens": {},
|
||||
"model_input_names": [
|
||||
"input_ids",
|
||||
"attention_mask"
|
||||
],
|
||||
"model_max_length": 128000,
|
||||
"pad_token": "<|user|>",
|
||||
"padding_side": "left",
|
||||
"remove_space": false,
|
||||
"tokenizer_class": "PreTrainedTokenizerFast"
|
||||
}
|
||||
Reference in New Issue
Block a user