mirror of
https://github.com/zenlm/zen-trainer.git
synced 2026-10-30 14:57:38 +00:00
Training framework for Zen Coder models supporting 5 architectures: - Zen Coder 4B (Qwen3-4B-Instruct) - Zen Coder 24B (Devstral-Small-2-24B) - Zen Coder 123B (Devstral-2-123B) - Zen Coder MAX (GLM-4.7 358B MoE) - Zen Coder ULTRA (Kimi K2 1T MoE) Features: - Unified ZenTrainer class with auto backend selection (MLX/Unsloth/DeepSpeed) - 12 ARC benchmark suite (TAU-Bench, SWE-bench, etc.) - Training cost estimation for 8xH200 @ $35/hr - CLI tools: zen-train, zen-benchmark Dataset: hanzoai/zen-agentic-dataset (8.47B tokens, 3.35M samples)
136 lines
4.4 KiB
Python
136 lines
4.4 KiB
Python
"""
|
|
Zen Trainer - Fine-tuning framework for Zen Coder models
|
|
|
|
Supports fine-tuning 5 model architectures:
|
|
Tier 1: Qwen3 4B (lightweight, 8GB VRAM) $326
|
|
Tier 2: Devstral 24B (mid-range, 24GB VRAM) $814
|
|
Tier 3: Devstral 123B (large, 128GB VRAM) $2,171
|
|
Tier 4: GLM-4.7 358B (MoE, 180GB VRAM) $4,071
|
|
Tier 5: Kimi K2 1T (MoE, 400GB VRAM) $10,856
|
|
|
|
Costs based on 8xH200 @ $35/hr, 3.35M training samples.
|
|
Local training on Mac Studio 512GB is FREE (except ULTRA).
|
|
|
|
Backends:
|
|
- MLX (Apple Silicon, local) - Tier 1-2, 4 (MAX)
|
|
- Unsloth/PyTorch (NVIDIA GPUs, 2x faster) - Tier 1-4
|
|
- DeepSpeed ZeRO-3 (Multi-GPU clusters) - All tiers
|
|
- HuggingFace Autotrain (Cloud) - All tiers
|
|
|
|
Benchmarks (12 ARC from GLM-4.5):
|
|
Agentic: TAU-Bench, BFCL V3, BrowseComp
|
|
Reasoning: MMLU-Pro, AIME-24, MATH-500, SciCode, GPQA, HLE, LiveCodeBench
|
|
Coding: SWE-bench Verified, Terminal-Bench
|
|
|
|
Usage:
|
|
from zen_trainer import ZenTrainer, ZEN_MODELS, ZenBenchmark
|
|
|
|
# Train
|
|
trainer = ZenTrainer(
|
|
model_key="qwen3-4b",
|
|
dataset_path="hanzoai/zen-agentic-dataset",
|
|
output_dir="./output/zen-coder-4b",
|
|
)
|
|
trainer.train()
|
|
|
|
# Benchmark
|
|
bench = ZenBenchmark(
|
|
model_path="./output/zen-coder-4b",
|
|
model_key="qwen3-4b",
|
|
)
|
|
bench.run_all()
|
|
bench.compare_to_baseline()
|
|
"""
|
|
|
|
__version__ = "0.1.0"
|
|
|
|
from .models import ZEN_MODELS, get_model_config, estimate_training_cost, COST_SUMMARY
|
|
from .trainer import ZenTrainer, train_all_models
|
|
from .benchmark import ZenBenchmark, benchmark_all_models, generate_leaderboard
|
|
|
|
__all__ = [
|
|
# Models
|
|
"ZEN_MODELS",
|
|
"get_model_config",
|
|
"estimate_training_cost",
|
|
"COST_SUMMARY",
|
|
# Training
|
|
"ZenTrainer",
|
|
"train_all_models",
|
|
# Benchmarks
|
|
"ZenBenchmark",
|
|
"benchmark_all_models",
|
|
"generate_leaderboard",
|
|
]
|
|
|
|
|
|
def main():
|
|
"""CLI entry point for zen-train command."""
|
|
import argparse
|
|
import sys
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="Zen Trainer - Fine-tune Zen Coder models",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog="""
|
|
Examples:
|
|
zen-train --model qwen3-4b --dataset ./data --output ./output
|
|
zen-train --model devstral-24b --dataset hanzoai/zen-agentic-dataset
|
|
zen-train --list-models
|
|
zen-train --estimate glm47-358b --samples 100000
|
|
""",
|
|
)
|
|
parser.add_argument("--model", "-m", type=str, help="Model key to train")
|
|
parser.add_argument("--dataset", "-d", type=str, help="Dataset path (local or HuggingFace)")
|
|
parser.add_argument("--output", "-o", type=str, default="./output", help="Output directory")
|
|
parser.add_argument("--backend", "-b", type=str, default="auto",
|
|
choices=["auto", "mlx", "unsloth", "deepspeed"],
|
|
help="Training backend")
|
|
parser.add_argument("--epochs", "-e", type=int, help="Number of epochs")
|
|
parser.add_argument("--list-models", action="store_true", help="List available models")
|
|
parser.add_argument("--estimate", type=str, help="Estimate cost for model key")
|
|
parser.add_argument("--samples", type=int, default=10000, help="Sample count for estimate")
|
|
parser.add_argument("--costs", action="store_true", help="Show training cost summary")
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.costs:
|
|
print(COST_SUMMARY)
|
|
return 0
|
|
|
|
if args.list_models:
|
|
print("Available models:")
|
|
for key, cfg in ZEN_MODELS.items():
|
|
print(f" {key:20} - {cfg.name} ({cfg.size_b}B, {cfg.vram_qlora}GB VRAM)")
|
|
return 0
|
|
|
|
if args.estimate:
|
|
est = estimate_training_cost(args.estimate, args.samples)
|
|
print(f"\nTraining estimate for {est['model']}:")
|
|
print(f" Samples: {est['samples']:,}")
|
|
print(f" Hours: {est['hours_estimate'][0]}-{est['hours_estimate'][1]}")
|
|
print(f" Cost: ${est['cost_estimate_usd'][0]:,}-${est['cost_estimate_usd'][1]:,}")
|
|
print(f" Platform: {est['recommended_platform']}")
|
|
return 0
|
|
|
|
if not args.model or not args.dataset:
|
|
parser.print_help()
|
|
print("\nError: --model and --dataset are required for training")
|
|
return 1
|
|
|
|
# Start training
|
|
trainer = ZenTrainer(
|
|
model_key=args.model,
|
|
dataset_path=args.dataset,
|
|
output_dir=args.output,
|
|
backend=args.backend,
|
|
epochs=args.epochs,
|
|
)
|
|
trainer.train()
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
sys.exit(main())
|