ZenLM is a groundbreaking collaboration between Hanzo AI(https://hanzo.ai) (Techstars-backed GenAI lab) and Zoo Labs Foundation(https://zoo.ngo) (501(c)(3) environmental non-profit), building AI models that run entirely on your device—no cl
Category: Hanzo Ecosystem Difficulty: Beginner Prerequisites: Python 3.10+, basic terminal knowledge Related Skills: hanzo-gym.md, python-sdk.md, hanzo-desktop.md
ZenLM is a groundbreaking collaboration between Hanzo AI (Techstars-backed GenAI lab) and Zoo Labs Foundation (501(c)(3) environmental non-profit), building AI models that run entirely on your device—no cloud, no subscriptions, no surveillance.
Mission: "Democratize AI while protecting our planet"
Why ZenLM?
| Model | Size | Description | Use Case | |-------|------|-------------|----------| | zen-nano-instruct | 4B | Ultra-fast instruction following | Chat, coding, Q&A | | zen-nano-thinking | 4B | Chain-of-thought reasoning | Math, logic, analysis | | zen-nano-instruct-4bit | 1.5GB | Quantized for mobile/edge | iOS, Android, Pi | | zen-nano-thinking-4bit | 1.5GB | Quantized reasoning | Mobile reasoning | | zen-eco | 4B | Efficient instruct/thinking | Production use | | zen-agent | 4B | Tool-calling & function execution | Sub-agents, APIs | | zen-director | 5B | Text-to-video generation | Video content | | zen-musician | 7B | Music generation with lyrics | Music creation |
GitHub Organization: github.com/zenlm HuggingFace Organization: huggingface.co/zenlm
Zen models are optimized for local inference on consumer hardware:
See model cards on HuggingFace for specific benchmark results.
pip install transformers torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# Load zen-nano-instruct
model = AutoModelForCausalLM.from_pretrained(
"zenlm/zen-nano-instruct",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-nano-instruct")
# Generate response
input_text = "Explain quantum computing in simple terms"
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=200, temperature=0.7)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
pip install mlx-lm
from mlx_lm import load, generate
# Load zen-nano-instruct (optimized for M-series)
model, tokenizer = load("zenlm/zen-nano-instruct")
# Generate at 50+ tokens/sec on M1 Pro
response = generate(
model,
tokenizer,
prompt="Write a haiku about AI",
max_tokens=100,
temp=0.7
)
print(response)
# Install llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make
# Download GGUF version (1.5GB quantized)
huggingface-cli download zenlm/zen-nano-instruct-4bit \
--include "*.gguf" \
--local-dir ./models
# Run inference (50+ tokens/sec on CPU!)
./llama-cli \
-m ./models/zen-nano-instruct-Q4_K_M.gguf \
-p "Your prompt here" \
-n 512 \
--temp 0.7
Best for: General chat, coding, question answering
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-nano-instruct")
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-nano-instruct")
messages = [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Write a Python function to reverse a string"}
]
text = tokenizer.apply_chat_template(messages, tokenize=False)
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=500)
print(tokenizer.decode(outputs[0]))
Best for: Math, logic, transparent reasoning
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-nano-thinking")
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-nano-thinking")
# Enable chain-of-thought
messages = [
{"role": "user", "content": "Solve: If 3 apples cost $5, how much do 7 apples cost?"}
]
# Model will show reasoning steps
text = tokenizer.apply_chat_template(messages, tokenize=False)
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=500)
response = tokenizer.decode(outputs[0])
# Output shows thinking process:
# <think>
# Cost per apple = $5 / 3 = $1.67
# For 7 apples: 7 * $1.67 = $11.67
# </think>
# Answer: 7 apples cost $11.67
Best for: Tool calling, function execution, sub-agents
from transformers import AutoModelForCausalLM, AutoTokenizer
import json
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-agent")
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-agent")
# Define available tools
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather in a location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"}
},
"required": ["location"]
}
}
}
]
messages = [
{"role": "user", "content": "What's the weather in San Francisco?"}
]
# Model generates function call
text = tokenizer.apply_chat_template(
messages,
tools=tools,
tokenize=False
)
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=200)
response = tokenizer.decode(outputs[0])
# Parse function call and execute
# function_call = {"name": "get_weather", "arguments": {"location": "San Francisco"}}
# Full 4B model (3.8GB memory)
python -c "
from mlx_lm import load, generate
model, tokenizer = load('zenlm/zen-nano-instruct')
print(generate(model, tokenizer, prompt='Hello!'))
"
# 4-bit quantized (1.5GB memory)
python -c "
from mlx_lm import load, generate
model, tokenizer = load('zenlm/zen-nano-instruct-4bit')
print(generate(model, tokenizer, prompt='Hello!'))
"
# llama.cpp for ARM
./llama-cli \
-m zen-nano-instruct-Q4_K_M.gguf \
-p "Hello from Raspberry Pi!" \
-n 100 \
--threads 4
import { pipeline } from '@xenova/transformers';
// Load zen-nano in browser
const generator = await pipeline(
'text-generation',
'zenlm/zen-nano-instruct',
{ device: 'webgpu' }
);
const output = await generator('Explain neural networks', {
max_length: 200
});
console.log(output[0].generated_text);
| Quantization | Size | Quality | Speed | Use Case | |--------------|------|---------|-------|----------| | Q2_K | 1.2GB | 85% | Fastest | Mobile/Edge | | Q4_K_M | 1.5GB | 95% | Fast | Recommended | | Q5_K_M | 1.8GB | 97% | Medium | Balanced | | Q8_0 | 2.4GB | 99% | Slower | Quality-focused |
# Download specific quantization
huggingface-cli download zenlm/zen-nano-instruct-4bit \
--include "*Q4_K_M.gguf" \
--local-dir ./models
# 4-bit MLX (optimized for M-series)
pip install mlx-lm
python -m mlx_lm.convert \
--hf-path zenlm/zen-nano-instruct \
--mlx-path ./zen-nano-mlx \
--quantize
from transformers import AutoModelForCausalLM
from auto_gptq import AutoGPTQForCausalLM
# 4-bit GPTQ for NVIDIA
model = AutoGPTQForCausalLM.from_quantized(
"zenlm/zen-nano-instruct-gptq",
device="cuda:0"
)
from hanzoai import Hanzo
client = Hanzo()
response = client.chat.completions.create(
model="zen-nano-instruct",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
from openai import OpenAI
client = OpenAI(
base_url="https://api.hanzo.ai/v1",
api_key=os.environ["HANZO_API_KEY"],
)
response = client.chat.completions.create(
model="zen-nano-instruct",
messages=[{"role": "user", "content": "Hello!"}],
)
Train custom ZenLM models using LLaMA Factory:
# Fine-tune zen-nano for your domain
llamafactory-cli train \
--stage sft \
--model_name_or_path zenlm/zen-nano-instruct \
--dataset your_dataset \
--template qwen3 \
--finetuning_type lora \
--output_dir ./zen-nano-custom \
--flash_attn fa2 \
--use_unsloth true
# Export to GGUF for deployment
llamafactory-cli export \
--model_name_or_path ./zen-nano-custom \
--export_dir ./zen-nano-gguf \
--export_quantization_bit 4
See hanzo-gym.md for comprehensive training guide.
| | Local (ZenLM) | Cloud API | |--|---|---| | Cost | Free (Apache 2.0) | Per-token pricing | | Privacy | 100% local, data stays on device | Data sent to provider | | Latency | 20-50ms (no network) | 200-500ms (network + queue) | | Offline | Works fully offline | Requires internet | | Quality | Competitive at 4B scale | Larger models available |
ZenLM is co-developed with Zoo Labs Foundation (501(c)(3)), focused on sustainable and accessible AI research.
# Medical records, financial data, legal documents
# Data never leaves your device
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-nano-instruct")
tokenizer = AutoTokenizer.from_pretrained("zenlm/zen-nano-instruct")
# Process sensitive data locally
sensitive_text = "Patient diagnosis: ..."
inputs = tokenizer(f"Summarize: {sensitive_text}", return_tensors="pt")
outputs = model.generate(**inputs, max_length=200)
summary = tokenizer.decode(outputs[0])
# Airplanes, remote locations, intermittent connectivity
from mlx_lm import load, generate
# Works 100% offline
model, tokenizer = load("zenlm/zen-nano-instruct-4bit")
response = generate(model, tokenizer, prompt="Help with code offline")
# Use zen-nano via gateway for cost-optimized production
from hanzoai import Hanzo
client = Hanzo()
response = client.chat.completions.create(
model="zen-nano-instruct", # Cheapest Zen model
messages=[{"role": "user", "content": query}],
)
# Raspberry Pi, edge servers, mobile devices
# Install llama.cpp on ARM
./llama-cli \
-m zen-nano-instruct-Q4_K_M.gguf \
-p "Process sensor data: ..." \
--threads 4
# Lightweight agents for tool calling
model = AutoModelForCausalLM.from_pretrained("zenlm/zen-agent")
# Each sub-agent runs zen-agent locally (4GB memory)
# Coordinate 10+ agents on single machine
FROM python:3.10-slim
# Install ZenLM
RUN pip install transformers torch mlx-lm
# Download model
RUN python -c "
from transformers import AutoModelForCausalLM, AutoTokenizer
AutoModelForCausalLM.from_pretrained('zenlm/zen-nano-instruct')
"
EXPOSE 8080
CMD ["python", "server.py"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: zenlm-inference
spec:
replicas: 3
template:
spec:
containers:
- name: zenlm
image: zenlm/zen-nano-instruct:latest
resources:
limits:
memory: "4Gi"
cpu: "2"
WASM deployment is planned but not yet available. For now, use container-based serverless (Cloud Run, Lambda with container support).
Last Updated: 2026-03-13 Category: Hanzo Ecosystem Related: zenlm, models, local-ai, inference, edge Prerequisites: Python 3.10+, basic terminal knowledge