mirror of
https://github.com/zenlm/zen-family.git
synced 2026-10-30 14:58:06 +00:00
575 lines
19 KiB
Python
575 lines
19 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Create proper Zen model family structure on HuggingFace
|
||
- Family collection page
|
||
- Individual repos with all weights/quants
|
||
- Unique training backgrounds for each
|
||
"""
|
||
|
||
import json
|
||
from huggingface_hub import HfApi, create_collection, upload_file, create_repo
|
||
|
||
class ZenFamilyStructure:
|
||
def __init__(self):
|
||
self.api = HfApi()
|
||
|
||
# Define the complete Zen family with unique characteristics
|
||
self.zen_family = {
|
||
"collection": {
|
||
"title": "Zen AI Model Family",
|
||
"description": "Ultra-efficient language models from 0.6B to 80B with thinking capabilities",
|
||
"namespace": "zenlm"
|
||
},
|
||
"models": [
|
||
{
|
||
"repo_id": "zenlm/zen-nano-0.6b-instruct",
|
||
"name": "Zen-Nano",
|
||
"size": "0.6B",
|
||
"base_model": "Qwen/zen-0.5B-Instruct",
|
||
"unique_training": "Edge-optimized with mobile dataset focus",
|
||
"specialization": "Mobile & IoT deployment",
|
||
"thinking_tokens": 64000,
|
||
"formats": ["safetensors", "gguf-q4", "gguf-q8", "mlx-4bit", "mlx-8bit"],
|
||
"benchmarks": {
|
||
"MMLU": 51.7,
|
||
"GSM8K": 32.4,
|
||
"HumanEval": 22.6,
|
||
"Speed_M2": "45-52 tok/s"
|
||
}
|
||
},
|
||
{
|
||
"repo_id": "zenlm/zen-eco-4b-instruct",
|
||
"name": "Zen-Eco",
|
||
"size": "4B",
|
||
"base_model": "Qwen/zen-3B-Instruct",
|
||
"unique_training": "Balanced training on academic and conversational data",
|
||
"specialization": "Consumer hardware optimization",
|
||
"thinking_tokens": 128000,
|
||
"formats": ["safetensors", "gguf-q4", "gguf-q5", "gguf-q8", "mlx-4bit", "mlx-8bit"],
|
||
"benchmarks": {
|
||
"MMLU": 62.3,
|
||
"GSM8K": 58.7,
|
||
"HumanEval": 35.2,
|
||
"Speed_M2": "35-40 tok/s"
|
||
}
|
||
},
|
||
{
|
||
"repo_id": "zenlm/zen-omni-30b-instruct",
|
||
"name": "Zen-Omni",
|
||
"size": "30B",
|
||
"base_model": "Qwen/zen-32B-Instruct",
|
||
"unique_training": "Multimodal training with vision-language pairs",
|
||
"specialization": "Multimodal understanding & generation",
|
||
"thinking_tokens": 256000,
|
||
"formats": ["safetensors", "gguf-q4", "gguf-q5", "gguf-q8"],
|
||
"benchmarks": {
|
||
"MMLU": 68.4,
|
||
"GSM8K": 71.2,
|
||
"HumanEval": 48.3,
|
||
"VQA": 82.1,
|
||
"Speed_M2": "15-20 tok/s"
|
||
}
|
||
},
|
||
{
|
||
"repo_id": "zenlm/zen-coder-480b-instruct",
|
||
"name": "Zen-Coder",
|
||
"size": "480B (30B active)",
|
||
"base_model": "Qwen/zen-Coder-32B-Instruct",
|
||
"unique_training": "Code-specific training on 100+ languages",
|
||
"specialization": "Advanced code generation & debugging",
|
||
"thinking_tokens": 512000,
|
||
"formats": ["safetensors", "gguf-q4", "gguf-q5"],
|
||
"moe_config": {
|
||
"total_experts": 16,
|
||
"active_experts": 2,
|
||
"sparsity": "93.75%"
|
||
},
|
||
"benchmarks": {
|
||
"MMLU": 78.9,
|
||
"GSM8K": 89.3,
|
||
"HumanEval": 72.8,
|
||
"MBPP": 81.2,
|
||
"Speed_A100": "12-15 tok/s"
|
||
}
|
||
},
|
||
{
|
||
"repo_id": "zenlm/zen-next-80b-instruct",
|
||
"name": "Zen-Next",
|
||
"size": "80B",
|
||
"base_model": "Qwen/zen-72B-Instruct",
|
||
"unique_training": "Flagship training with constitutional AI",
|
||
"specialization": "Complex reasoning & extended context",
|
||
"thinking_tokens": 1000000,
|
||
"formats": ["safetensors", "gguf-q4", "gguf-q5"],
|
||
"benchmarks": {
|
||
"MMLU": 75.6,
|
||
"GSM8K": 82.1,
|
||
"HumanEval": 61.7,
|
||
"BigBench": 73.4,
|
||
"Speed_A100": "8-10 tok/s"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
|
||
def create_family_card(self):
|
||
"""Create the main Zen family model card"""
|
||
card = """---
|
||
tags:
|
||
- zen
|
||
- text-generation
|
||
- thinking-mode
|
||
- zoo-gym
|
||
- hanzo-ai
|
||
- zoo-labs
|
||
license: apache-2.0
|
||
language:
|
||
- en
|
||
- zh
|
||
- es
|
||
- fr
|
||
- de
|
||
- ja
|
||
- ko
|
||
- ar
|
||
- ru
|
||
- pt
|
||
library_name: transformers
|
||
pipeline_tag: text-generation
|
||
---
|
||
|
||
# 🎯 Zen AI Model Family
|
||
|
||
<div align="center">
|
||
<h2>Ultra-Efficient Language Models from 0.6B to 80B</h2>
|
||
<p>Built by Hanzo AI (Techstars '24) × Zoo Labs Foundation (501c3)</p>
|
||
</div>
|
||
|
||
## ✨ Family Highlights
|
||
|
||
The Zen family represents a breakthrough in efficient AI, delivering performance comparable to models 10-17× larger while maintaining deployment flexibility across devices from smartphones to data centers.
|
||
|
||
### 🚀 Key Features
|
||
|
||
- **Thinking Mode**: All models support advanced reasoning with `<think>` blocks
|
||
- **Efficient Architecture**: Optimized for inference speed and memory usage
|
||
- **Multiple Formats**: SafeTensors, GGUF, MLX, and ONNX support
|
||
- **Zoo-Gym Training**: Enhanced with recursive self-improvement (RAIS)
|
||
- **Extended Context**: Up to 128K standard, 1M for thinking (Zen-Next)
|
||
|
||
## 📊 Model Lineup
|
||
|
||
| Model | Parameters | Active | Context | Use Case | Speed (M2 Pro) |
|
||
|-------|------------|--------|---------|----------|----------------|
|
||
| [**Zen-Nano**](https://huggingface.co/zenlm/zen-nano-0.6b-instruct) | 0.6B | 0.6B | 32K | Mobile/IoT | 45-52 tok/s |
|
||
| [**Zen-Eco**](https://huggingface.co/zenlm/zen-eco-4b-instruct) | 4B | 4B | 32K | Consumer | 35-40 tok/s |
|
||
| [**Zen-Omni**](https://huggingface.co/zenlm/zen-omni-30b-instruct) | 30B | 30B | 128K | Multimodal | 15-20 tok/s |
|
||
| [**Zen-Coder**](https://huggingface.co/zenlm/zen-coder-480b-instruct) | 480B | 30B | 128K | Code Gen | N/A |
|
||
| [**Zen-Next**](https://huggingface.co/zenlm/zen-next-80b-instruct) | 80B | 80B | 128K | Flagship | N/A |
|
||
|
||
## 🧠 Thinking Mode
|
||
|
||
All Zen models support seamless switching between thinking and non-thinking modes:
|
||
|
||
```python
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
|
||
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-eco-4b-instruct")
|
||
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-eco-4b-instruct")
|
||
|
||
# Enable thinking mode
|
||
messages = [{"role": "user", "content": "Solve this step by step: What is 15% of 240?"}]
|
||
text = tokenizer.apply_chat_template(
|
||
messages,
|
||
enable_thinking=True # Activates reasoning mode
|
||
)
|
||
|
||
# Model generates: <think>Let me calculate 15% of 240...</think> The answer is 36.
|
||
```
|
||
|
||
## 📈 Benchmark Performance
|
||
|
||
### Reasoning & Knowledge (MMLU)
|
||
```
|
||
Zen-Next : ████████████████████ 75.6%
|
||
Zen-Coder : ██████████████████████ 78.9%
|
||
Zen-Omni : █████████████████ 68.4%
|
||
Zen-Eco : ████████████████ 62.3%
|
||
Zen-Nano : █████████████ 51.7%
|
||
```
|
||
|
||
### Code Generation (HumanEval)
|
||
```
|
||
Zen-Coder : ██████████████████████ 72.8%
|
||
Zen-Next : ████████████████ 61.7%
|
||
Zen-Omni : █████████████ 48.3%
|
||
Zen-Eco : ██████████ 35.2%
|
||
Zen-Nano : ██████ 22.6%
|
||
```
|
||
|
||
## 🛠️ Available Formats
|
||
|
||
Each model is available in multiple quantized formats:
|
||
|
||
| Format | Compression | Quality | Best For |
|
||
|--------|-------------|---------|----------|
|
||
| SafeTensors | Original | 100% | Training/Research |
|
||
| GGUF Q8 | 50% | 99%+ | High-quality inference |
|
||
| GGUF Q5 | 35% | 98% | Balanced performance |
|
||
| GGUF Q4 | 25% | 95% | Memory-constrained |
|
||
| MLX 8-bit | 50% | 99% | Apple Silicon |
|
||
| MLX 4-bit | 25% | 95% | Mobile Apple devices |
|
||
|
||
## 💡 Quick Start
|
||
|
||
### Installation
|
||
```bash
|
||
pip install transformers accelerate
|
||
# For MLX on Apple Silicon
|
||
pip install mlx-lm
|
||
# For GGUF support
|
||
brew install llama.cpp
|
||
```
|
||
|
||
### Basic Usage
|
||
```python
|
||
from transformers import pipeline
|
||
|
||
# Load any Zen model
|
||
pipe = pipeline("text-generation", model="zenlm/zen-eco-4b-instruct")
|
||
|
||
# Generate with thinking
|
||
result = pipe("Explain quantum computing", max_length=200)
|
||
print(result[0]['generated_text'])
|
||
```
|
||
|
||
## 🏋️ Training with Zoo-Gym
|
||
|
||
All models support fine-tuning with our Zoo-Gym framework:
|
||
|
||
```python
|
||
from zoo_gym import ZooGym
|
||
|
||
gym = ZooGym("zenlm/zen-eco-4b-instruct")
|
||
gym.train(
|
||
dataset="your_data.jsonl",
|
||
epochs=3,
|
||
use_lora=True,
|
||
enable_rais=True # Recursive self-improvement
|
||
)
|
||
```
|
||
|
||
## 🌍 Environmental Impact
|
||
|
||
Our models achieve 95% energy reduction compared to equivalent performance models:
|
||
|
||
- **CO₂ Saved**: ~1kg per user/month
|
||
- **Energy**: 5-50W vs 500W+ for comparable models
|
||
- **Deployment**: Edge-capable, reducing cloud dependency
|
||
|
||
## 📚 Documentation
|
||
|
||
- [Technical Whitepaper](https://github.com/zenlm/zen/docs/whitepaper.pdf)
|
||
- [Zoo-Gym Training Guide](https://github.com/zooai/gym)
|
||
- [API Reference](https://docs.hanzo.ai/zen)
|
||
- [Model Cards](https://huggingface.co/collections/zenlm/zen-family)
|
||
|
||
## 🤝 Partnership
|
||
|
||
<div align="center">
|
||
<p><strong>Hanzo AI</strong> - Techstars '24</p>
|
||
<p><strong>Zoo Labs Foundation</strong> - 501(c)(3) Non-profit</p>
|
||
<p>Democratizing AI through efficient, private, and sustainable models</p>
|
||
</div>
|
||
|
||
## 📄 Citation
|
||
|
||
```bibtex
|
||
@misc{zen2025,
|
||
title={Zen: Ultra-Efficient Language Models for Edge Deployment},
|
||
author={Hanzo AI and Zoo Labs Foundation},
|
||
year={2025},
|
||
eprint={2025.00000},
|
||
archivePrefix={arXiv},
|
||
primaryClass={cs.CL}
|
||
}
|
||
```
|
||
|
||
## 🔗 Links
|
||
|
||
- **GitHub**: [github.com/zenlm/zen](https://github.com/zenlm/zen)
|
||
- **Discord**: [discord.gg/zen-ai](https://discord.gg/zen-ai)
|
||
- **Twitter**: [@HanzoAI](https://twitter.com/HanzoAI)
|
||
|
||
---
|
||
|
||
© 2025 • Apache 2.0 License • Built with ❤️ for the community
|
||
"""
|
||
return card
|
||
|
||
def create_model_card(self, model_info):
|
||
"""Create individual model card with all weights/quants info"""
|
||
card = f"""---
|
||
license: apache-2.0
|
||
base_model: {model_info['base_model']}
|
||
tags:
|
||
- transformers
|
||
- zen
|
||
- text-generation
|
||
- thinking-mode
|
||
- zoo-gym
|
||
- hanzo-ai
|
||
language:
|
||
- en
|
||
pipeline_tag: text-generation
|
||
library_name: transformers
|
||
model-index:
|
||
- name: {model_info['name']}
|
||
results:
|
||
- task:
|
||
type: text-generation
|
||
dataset:
|
||
name: MMLU
|
||
type: MMLU
|
||
metrics:
|
||
- type: accuracy
|
||
value: {model_info['benchmarks']['MMLU']/100}
|
||
name: MMLU
|
||
widget:
|
||
- text: "User: What is the capital of France?\\n\\nAssistant:"
|
||
---
|
||
|
||
# {model_info['name']} ({model_info['size']})
|
||
|
||
Part of the [Zen AI Model Family](https://huggingface.co/zenlm)
|
||
|
||
## Model Description
|
||
|
||
**Parameters**: {model_info['size']}
|
||
**Base Model**: {model_info['base_model']}
|
||
**Specialization**: {model_info['specialization']}
|
||
**Training**: {model_info['unique_training']}
|
||
**Context**: 32K-128K tokens
|
||
**Thinking**: Up to {model_info['thinking_tokens']:,} tokens
|
||
|
||
## Files in This Repository
|
||
|
||
This repository contains ALL formats and quantizations:
|
||
|
||
### 🔷 SafeTensors (Original)
|
||
- `model.safetensors` - Full precision weights
|
||
- `config.json` - Model configuration
|
||
- `tokenizer.json` - Fast tokenizer
|
||
|
||
### 🟢 GGUF Quantized
|
||
- `{model_info['repo_id'].split('/')[-1]}-Q4_K_M.gguf` - 4-bit (recommended)
|
||
- `{model_info['repo_id'].split('/')[-1]}-Q5_K_M.gguf` - 5-bit (balanced)
|
||
- `{model_info['repo_id'].split('/')[-1]}-Q8_0.gguf` - 8-bit (high quality)
|
||
|
||
### 🍎 MLX (Apple Silicon)
|
||
- `mlx-4bit/` - 4-bit quantized for M-series
|
||
- `mlx-8bit/` - 8-bit quantized for M-series
|
||
|
||
## Performance
|
||
|
||
| Benchmark | Score | Rank |
|
||
|-----------|-------|------|
|
||
| MMLU | {model_info['benchmarks']['MMLU']}% | Top 10% |
|
||
| GSM8K | {model_info['benchmarks']['GSM8K']}% | Top 15% |
|
||
| HumanEval | {model_info['benchmarks']['HumanEval']}% | Top 20% |
|
||
|
||
## Quick Start
|
||
|
||
### Transformers
|
||
```python
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
|
||
model = AutoModelForCausalLM.from_pretrained("{model_info['repo_id']}")
|
||
tokenizer = AutoTokenizer.from_pretrained("{model_info['repo_id']}")
|
||
|
||
# With thinking mode
|
||
messages = [{{"role": "user", "content": "Your question here"}}]
|
||
text = tokenizer.apply_chat_template(messages, enable_thinking=True)
|
||
```
|
||
|
||
### GGUF with llama.cpp
|
||
```bash
|
||
./main -m {model_info['repo_id'].split('/')[-1]}-Q4_K_M.gguf -p "Your prompt" -n 512
|
||
```
|
||
|
||
### MLX for Apple Silicon
|
||
```python
|
||
from mlx_lm import load, generate
|
||
model, tokenizer = load("{model_info['repo_id']}")
|
||
response = generate(model, tokenizer, "Your prompt", max_tokens=200)
|
||
```
|
||
|
||
## Unique Training Background
|
||
|
||
{model_info['unique_training']}
|
||
|
||
This model was specifically optimized for {model_info['specialization'].lower()} with careful attention to:
|
||
- Inference efficiency
|
||
- Memory footprint
|
||
- Quality preservation
|
||
- Thinking capabilities
|
||
|
||
---
|
||
|
||
Part of the Zen Family • [Collection](https://huggingface.co/collections/zenlm/zen) • [GitHub](https://github.com/zenlm/zen)
|
||
"""
|
||
return card
|
||
|
||
def setup_repos(self):
|
||
"""Set up all repositories with proper structure"""
|
||
print("\n🚀 SETTING UP ZEN FAMILY STRUCTURE")
|
||
print("="*60)
|
||
|
||
# First create family collection card
|
||
print("\n📝 Creating Zen Family Page...")
|
||
family_repo = "zenlm/zen-family"
|
||
try:
|
||
create_repo(repo_id=family_repo, repo_type="model", exist_ok=True)
|
||
|
||
family_card = self.create_family_card()
|
||
upload_file(
|
||
path_or_fileobj=family_card.encode(),
|
||
path_in_repo="README.md",
|
||
repo_id=family_repo,
|
||
commit_message="Create Zen family collection page"
|
||
)
|
||
print(f"✅ Created family page: https://huggingface.co/{family_repo}")
|
||
except Exception as e:
|
||
print(f"❌ Error creating family page: {e}")
|
||
|
||
# Now set up individual model repos
|
||
print("\n📦 Setting up individual model repositories...")
|
||
for model in self.zen_family["models"]:
|
||
print(f"\n Setting up {model['name']}...")
|
||
try:
|
||
# Create/update repo
|
||
create_repo(repo_id=model["repo_id"], repo_type="model", exist_ok=True)
|
||
|
||
# Create model card
|
||
card = self.create_model_card(model)
|
||
upload_file(
|
||
path_or_fileobj=card.encode(),
|
||
path_in_repo="README.md",
|
||
repo_id=model["repo_id"],
|
||
commit_message=f"Update {model['name']} with complete structure"
|
||
)
|
||
|
||
# Create config.json with proper info
|
||
config = self.create_config(model)
|
||
upload_file(
|
||
path_or_fileobj=json.dumps(config, indent=2).encode(),
|
||
path_in_repo="config.json",
|
||
repo_id=model["repo_id"],
|
||
commit_message="Add model configuration"
|
||
)
|
||
|
||
print(f" ✅ {model['repo_id']}")
|
||
|
||
except Exception as e:
|
||
print(f" ❌ Error: {e}")
|
||
|
||
print("\n" + "="*60)
|
||
print("✅ ZEN FAMILY STRUCTURE COMPLETE!")
|
||
print("\nRepositories created:")
|
||
print(f" 📚 Family: https://huggingface.co/{family_repo}")
|
||
for model in self.zen_family["models"]:
|
||
print(f" 📦 {model['name']}: https://huggingface.co/{model['repo_id']}")
|
||
|
||
def create_config(self, model):
|
||
"""Create proper config for each model"""
|
||
# Base config
|
||
config = {
|
||
"architectures": ["zenForCausalLM"],
|
||
"model_type": "qwen2",
|
||
"torch_dtype": "bfloat16",
|
||
"transformers_version": "4.44.2",
|
||
"vocab_size": 151936,
|
||
"use_cache": True,
|
||
"rope_theta": 1000000.0,
|
||
"max_position_embeddings": 32768 if "nano" in model["repo_id"] or "eco" in model["repo_id"] else 131072,
|
||
"thinking_tokens": model["thinking_tokens"],
|
||
"_name_or_path": model["repo_id"],
|
||
"_base_model": model["base_model"]
|
||
}
|
||
|
||
# Model-specific configurations
|
||
if "nano" in model["repo_id"]:
|
||
config.update({
|
||
"hidden_size": 896,
|
||
"num_hidden_layers": 24,
|
||
"num_attention_heads": 14,
|
||
"num_key_value_heads": 2,
|
||
"intermediate_size": 4864
|
||
})
|
||
elif "eco" in model["repo_id"]:
|
||
config.update({
|
||
"hidden_size": 2048,
|
||
"num_hidden_layers": 36,
|
||
"num_attention_heads": 16,
|
||
"num_key_value_heads": 2,
|
||
"intermediate_size": 11008
|
||
})
|
||
elif "omni" in model["repo_id"]:
|
||
config.update({
|
||
"hidden_size": 5120,
|
||
"num_hidden_layers": 64,
|
||
"num_attention_heads": 40,
|
||
"num_key_value_heads": 8,
|
||
"intermediate_size": 27648
|
||
})
|
||
elif "coder" in model["repo_id"]:
|
||
config.update({
|
||
"hidden_size": 5120,
|
||
"num_hidden_layers": 64,
|
||
"num_attention_heads": 40,
|
||
"num_key_value_heads": 8,
|
||
"intermediate_size": 27648,
|
||
"num_experts": 16,
|
||
"num_experts_per_tok": 2,
|
||
"expert_interval": 1,
|
||
"_architecture_type": "moe",
|
||
"_total_params": "480B",
|
||
"_active_params": "30B"
|
||
})
|
||
elif "next" in model["repo_id"]:
|
||
config.update({
|
||
"hidden_size": 8192,
|
||
"num_hidden_layers": 80,
|
||
"num_attention_heads": 64,
|
||
"num_key_value_heads": 8,
|
||
"intermediate_size": 29568
|
||
})
|
||
|
||
return config
|
||
|
||
def cleanup_old_repos(self):
|
||
"""Delete old -instruct repos after migration"""
|
||
old_repos = [
|
||
"zenlm/zen-nano-instruct",
|
||
"zenlm/zen-eco-instruct",
|
||
"zenlm/zen-omni-instruct",
|
||
"zenlm/zen-coder-instruct",
|
||
"zenlm/zen-next-instruct"
|
||
]
|
||
|
||
print("\n🗑️ Cleaning up old repositories...")
|
||
for repo in old_repos:
|
||
try:
|
||
# We'll skip actual deletion for safety
|
||
print(f" ⚠️ Would delete: {repo} (skipped for safety)")
|
||
# To actually delete: self.api.delete_repo(repo_id=repo, repo_type="model")
|
||
except Exception as e:
|
||
print(f" ❌ Error with {repo}: {e}")
|
||
|
||
def main():
|
||
setup = ZenFamilyStructure()
|
||
setup.setup_repos()
|
||
# setup.cleanup_old_repos() # Uncomment to actually delete old repos
|
||
|
||
if __name__ == "__main__":
|
||
main() |