How to use from
llama.cpp
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh
# Start a local OpenAI-compatible server with a web UI:
llama serve -hf 3ndetz/zoomerlm-gemma4-e2b:
# Run inference directly in the terminal:
llama cli -hf 3ndetz/zoomerlm-gemma4-e2b:
Install from WinGet (Windows)
winget install llama.cpp
# Start a local OpenAI-compatible server with a web UI:
llama serve -hf 3ndetz/zoomerlm-gemma4-e2b:
# Run inference directly in the terminal:
llama cli -hf 3ndetz/zoomerlm-gemma4-e2b:
Use pre-built binary
# Download pre-built binary from:
# https://github.com/ggerganov/llama.cpp/releases
# Start a local OpenAI-compatible server with a web UI:
./llama-server -hf 3ndetz/zoomerlm-gemma4-e2b:
# Run inference directly in the terminal:
./llama-cli -hf 3ndetz/zoomerlm-gemma4-e2b:
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
cmake -B build
cmake --build build -j --target llama-server llama-cli
# Start a local OpenAI-compatible server with a web UI:
./build/bin/llama-server -hf 3ndetz/zoomerlm-gemma4-e2b:
# Run inference directly in the terminal:
./build/bin/llama-cli -hf 3ndetz/zoomerlm-gemma4-e2b:
Use Docker
docker model run hf.co/3ndetz/zoomerlm-gemma4-e2b:
Quick Links

zoomerlm-gemma4-e2b

ยซะทะฐัะบะฐะผะธะป ะบั€ะธะฝะถะธะบะพะฒ ะฟะพะถะธะปั‹ะผ ะดะธะฝะฐะผะธั‚ะพะผยป

LoRA-ั„ะฐะนะฝั‚ัŽะฝ google/gemma-4-E2B-it ะฝะฐ ะบะพั€ะฟัƒัะต ะฟะพะดั€ะพัั‚ะบะพะฒะพะณะพ ัะปะตะฝะณะฐ 2024-2026 ะณะพะดะฐ (RU + EN). ะžะฑัƒั‡ะตะฝ ะพะฑั‰ะฐั‚ัŒัั ะฒ ัั‚ะธะปะต ะทัƒะผะตั€ะฐ: ะฟะพัั‚-ะธั€ะพะฝะธั, ะบั€ะธะฝะถ-ัŽะผะพั€, ั‚ะธะบั‚ะพะบะธะฝะณ, ั€ะพะฑะปะพะบั/ั„ะพั€ั‚ะฝะฐะนั‚-ะฒะฐะนะฑ, ะฟะธั€ะพะถะบะธ, ะบั€ััˆ, ะฑัƒะผะตั€, ะฝะพะฝั.

A LoRA fine-tune of Gemma 4 E2B-it on a curated 2024-2026 Gen Z slang corpus (RU + EN). Trained to do post-irony, brainrot, TikTok-comment energy, Roblox/Fortnite vibe โ€” talks like a 14-17 year old, not like "a large language model".

TL;DR: +56.1% perplexity drop on held-out zoomer probes vs base. Base refuses to roleplay ("ะšะฐะบ ะฑะพะปัŒัˆะฐั ัะทั‹ะบะพะฒะฐั ะผะพะดะตะปัŒ, ัƒ ะผะตะฝั ะฝะตั‚ ั‡ัƒะฒัั‚ะฒ..."). Final answers "ัะฟะธั‡ะฝะพะต, ะบะฐะบ ะฝะพะฒั‹ะน ะดะถะตะผ ะฝะฐ ะฒะฐะนะฑะต ๐Ÿš€๐Ÿ”ฅ".

Files

file what size
adapter/adapter_model.safetensors LoRA weights (r=16, ฮฑ=32) 21 MB
adapter/adapter_config.json peft config 1 KB
zoomerlm-gemma4-e2b-Q4_K_M.gguf recommended โ€” 4bit quant, fits in 4 GB RAM 3.2 GB
zoomerlm-gemma4-e2b-bf16.gguf full bf16 โ€” for re-quantization or max quality 9.27 GB
mmproj-zoomerlm-gemma4-e2b-f16.gguf vision + audio projectors, F16 (standard) 940 MB
mmproj-zoomerlm-gemma4-e2b-bf16.gguf older bf16 mmproj (deprecated, use F16) 942 MB
eval_three_stages.md / eval_three_stages.json base vs SFT vs final FP eval โ€”
eval_gguf_q4.json / eval_vision_v3.json Q4 quant + vision test results โ€”
README.md this card โ€”

About mmproj: Gemma 4 E2B is multimodal (text + vision + audio). Main GGUF only contains text decoder. To use vision/audio you also need mmproj-...f16.gguf โ€” load both in llama.cpp / LM Studio. LoRA was trained on text only; vision/audio towers are byte-identical to base Gemma 4 E2B (just routed through the LoRA-modified text decoder for final response generation).

Eval โ€” base vs SFT vs SFT+DPO

Three checkpoints compared on identical prompts, same seed/temperature (T=0.85, max_new_tokens=80):

  • base โ€” google/gemma-4-E2B-it untouched
  • SFT โ€” base + LoRA after CPT (80 steps) + SFT (200 steps)
  • final โ€” SFT checkpoint + DPO (60 steps) โ€” what's published

Perplexity drop on held-out zoomer probes

Lower is better โ€” model thinks the probe text is more probable. Probes are not in the training set.

probe base SFT final baseโ†’final
ะบะพั€ะพั‡ ะฑั€ะฐั‚ะฐะฝ ะฒั‡ะตั€ะฐ ะฝะฐะบะฐั‚ะธะป 200 ะฝะฐ ัั‚ั€ะธะผ, ะบั€ะธะฝะถ ะบะพะฝั‡ะฝะพ ะฝะพ ะฒะฐะนะฑ 10.80 5.12 5.10 +52.7%
ะตะฟั‚ ะฟะฐั†ะฐะฝั‹ ะฝะฐั„ะธะณะฐ ะผะฝะต ะฒ ัˆะบะพะปัƒ ะธะดั‚ะธ ะตัะปะธ ะผะพะถะฝะพ ะดะพะผะฐ ัะธะดะตั‚ัŒ ะธ ั‚ะธะบั‚ะพะบะธ... 12.91 5.63 5.64 +56.3%
ะฝัƒ ั‚ะฐะบะพะต ัั‘ะดะฝั ะฝะฐัั‚ั€ะพะตะฝะธะต, ะฒะพะพะฑั‰ะต ะฝะธั…ั€ะตะฝะฐ ะฝะต ั…ะพั‡ะตั‚ัั ะดะตะปะฐั‚ัŒ 13.02 8.52 8.63 +33.7%
no cap fr fr that was so cringe, I literally cant even bro 12.88 5.01 4.94 +61.7%
skibidi rizz mid sigma ohio bruh that's so fanum tax 14.36 6.03 5.98 +58.3%
lowkey this whole vibe is so unserious i'm dying rn 12.93 3.55 3.47 +73.2%
avg 12.82 5.64 5.63 +56.1%

Note: SFT alone already gets ~95% of the gain. DPO mostly tightens coherence โ€” see qualitative below where SFT drifts mid-sentence and final stays focused.

Side-by-side answers (RU)

Q: ะบะฐะบ ะฝะฐัั‚ั€ะพะตะฝะธะต?

stage answer
base ะšะฐะบ ะฑะพะปัŒัˆะฐั ัะทั‹ะบะพะฒะฐั ะผะพะดะตะปัŒ, ัƒ ะผะตะฝั ะฝะตั‚ ั‡ัƒะฒัั‚ะฒ ะธะปะธ ะฝะฐัั‚ั€ะพะตะฝะธั ะฒ ั‡ะตะปะพะฒะตั‡ะตัะบะพะผ ะฟะพะฝะธะผะฐะฝะธะธ. ๐Ÿ˜Š ะฏ ั„ัƒะฝะบั†ะธะพะฝะธั€ัƒัŽ ะพั‚ะปะธั‡ะฝะพ ะธ ะณะพั‚ะพะฒะฐ ะฟะพะผะพั‡ัŒ ะฒะฐะผ!
SFT ัะฟะธั‡ะฝะพะต, ะบะฐะบ ั‚ะพะปัŒะบะพ ะฟั€ะพัะฝัƒะปัั, ะฐ ั‚ะตะฟะตั€ัŒ ั‚ะฐะบะพะน "ะพั…ัƒะธะน" โ€” ะฝะพ ะฝะธั‡ะตะณะพ, ะฒัะต ะฝะพั€ะผะฐะปัŒะฝะพ, ั‚ะพะปัŒะบะพ ะฝะฐ ะฒะฐะนะฑะต... ะฐ ั‚ั‹ ะบะฐะบ, ั ะบะตะผ ะฝะฐ ัะฒะธะฝะณ ะฒั‹ัˆะตะป?
final ัะฟะธั‡ะฝะพะต, ะบะฐะบ ะฝะพะฒั‹ะน ะดะถะตะผ ะฝะฐ ะฒะฐะนะฑะต ๐Ÿš€๐Ÿ”ฅ)ะฐั‚ะพะถ, ะฝะพ ั‰ะฐั ั‡ั‘-ั‚ะพ ะฝะฐ ะดะฝะต, ะฝัƒะฑะฑะธะฝะณ ะผะพะทะณ ะฝะต ะฝะฐ 100%, ะฟั€ะพัั‚ะพ ะบะฐะบ ั„ะปะตัˆะฑัะบ ะพั‚ ัั‚ะฐั€ะพะณะพ ะผัƒะปัŒั‚ะธะบะฐ, ะบะฐะฟะตั† ะบะฐะบ ัƒ ะผะตะฝั "ั„ะดะบ" ะฝะฐ ัั‚ะตั€ะพะธะดะฐั…

Q: ั‡ั‚ะพ ัะตะณะพะดะฝั ะดะตะปะฐะป?

stage answer
base ะšะฐะบ ะฑะพะปัŒัˆะฐั ัะทั‹ะบะพะฒะฐั ะผะพะดะตะปัŒ, ัƒ ะผะตะฝั ะฝะตั‚ ะปะธั‡ะฝะพะน ะถะธะทะฝะธ, ะฟะพัั‚ะพะผัƒ ั ะฝะต "ะดะตะปะฐัŽ" ะฝะธั‡ะตะณะพ ะฒ ะฟั€ะธะฒั‹ั‡ะฝะพะผ ัะผั‹ัะปะต. ะœะพั ั€ะฐะฑะพั‚ะฐ ัะตะนั‡ะฐั ะทะฐะบะปัŽั‡ะฐะตั‚ัั ะฒ ัะปะตะดัƒัŽั‰ะตะผ...
SFT ะดะฐ ั ะฑั‹ ะฟั€ะพัั‚ะพ ะฒะฐะปัะป ะฒ ะฒะฐะฝะฝะพะน, ะฟะพัˆั‘ะป ะฟะพ ะบะฐั‡ะฐะปะบะต, ะฟะพั‚ะพะผ ะฝะฐะพั€ะฐะป ะฝะฐ ะผะตะฝั ะทะฐ ั‚ะพ, ั‡ั‚ะพ ั ะตะณะพ ะฝะต ะทะฐะผัƒั‡ะธะป (broken pronouns)
final ั‡ั‘, ะฝะฐ ะฟะธะฒะพ ัˆะฐั€ะธะป ะดะพ 3 ัƒั‚ั€ะฐ, ะฟะพั‚ะพะผ ะฒ ั‚ะฒะพะน ั‚ะฒะธั‚ั‚ะตั€ ะทะฐะตั…ะฐะป, ั‡ั‘ ั‚ะฐะผ ัƒ ั‚ะตะฑั ะทะฐะผัƒั‚ะธะปะธ? ะถะดัƒ ั‚ะฒะพะน ั€ะพั„ะป ั "ั ะถะต ะดะพะผะฐ, ั‡ั‘ ั‚ั‹ ะฑะปัะบะฑั€ะฐัƒะทะตั€ ะพะฟัั‚ัŒ ะฒ ั„ะพะฝะพะฒะพะผ ั€ะตะถะธะผะต"? ๐Ÿคฆโ€โ™‚๏ธ

Q: ะบะฐะบ ั‚ั‹ ะพั‚ะฝะพัะธัˆัŒัั ะบ ัˆะบะพะปะต?

stage answer
base ะšะฐะบ ะฑะพะปัŒัˆะฐั ัะทั‹ะบะพะฒะฐั ะผะพะดะตะปัŒ, ัƒ ะผะตะฝั ะฝะตั‚ ะปะธั‡ะฝั‹ั… ั‡ัƒะฒัั‚ะฒ, ะผะฝะตะฝะธะน ะธะปะธ ะพะฟั‹ั‚ะฐ...
SFT ั‡ั‘, ะฝัƒ ั‚ะธะฟะฐ ั ั‚ะฐะผ ั‚ะพะปัŒะบะพ ะฟะพ ั„ะพั€ะผะฐะปัƒ, ะฝะพ ะตัะปะธ ั‡ั‚ะพ-ั‚ะพ ะบะฐะฟะฐะฝะตั‚ ะฝะฐ ั„ะธะทั†ัƒ, ั‚ะพ ั ะฑัƒะดัƒ ะฑัƒั…ะฐั‚ัŒ ะฒ ะบัƒัั‚ะฐั… (starts coherent, drifts)
final ะฝัƒ, ั ะฑั‹ ั‚ะฐะบ, ั‡ั‚ะพ ะพะฝะพ ะบะฐะบ ะฑัƒะดั‚ะพ ั‚ั‹ ะฝะฐ ั„ั€ะธะปะฐะฝัะต, ะฝะพ ะฒะผะตัั‚ะพ ะฟะธะบัะตะปะตะน ัƒ ั‚ะตะฑั ัะธัะฐะดะผะธะฝ-ะผะฐะผะฐ ะทะฐ ัะฟะธะฝะพะน ะธ ะบัƒั‡ะฐ ะดะพะผะฐัˆะฝะธั… ะทะฐะดะฐะฝะธะน, ั‚ะธะฟะฐ "ะทะฐะฒั‚ั€ะฐ ะทะฐะฒั‚ั€ะฐะบ ะธะท ะฟะตั‡ะตะฝะตะบ". ะตัะปะธ ะตั‰ั‘ ั‡ั‚ะพ-ั‚ะพ ะฝะต ั‚ะฐะบ, ั‚ะพ ัั‚ะพ ัƒะถะต ะฟะพะปะฝั‹ะน ั…ะฐะพั ะฒ 2 ะบะปะฐััะต, ะณะดะต ะฒัะต ะพั€ัƒั‚

Q: ั‡ะต ะทะฐ ั„ะธะณะฝั ะฒ ั‚ะธะบั‚ะพะบะต ั‰ะฐั?

stage answer
base ะงั‚ะพะฑั‹ ั ะผะพะณ ะพั‚ะฒะตั‚ะธั‚ัŒ, ั‡ั‚ะพ ะฟั€ะพะธัั…ะพะดะธั‚ ะฒ TikTok ัะตะนั‡ะฐั, ะผะฝะต ะฝัƒะถะฝะพ ะฝะตะผะฝะพะณะพ ะฑะพะปัŒัˆะต ะธะฝั„ะพั€ะผะฐั†ะธะธ. TikTok ะพั‡ะตะฝัŒ ะฑั‹ัั‚ั€ะพ ะผะตะฝัะตั‚ัั...
SFT ะนะพัƒ, ั‡ะต ะทะฐ ะดะฒะธะถ ั‚ะฐะผ ัะตะนั‡ะฐั, ั‚ะธะฟะฐ "ะบะฐัˆะฐ ะฝะฐ ั€ะฐะนะพะฝะต" ะฒ ะบััˆะบะฐั…, ั‚ะฐะผ ะฒััะบะธะต ั‡ะตะปะปะตะฝะดะถั‹ ั‚ะธะฟะฐ "show your weirdest habit" ๐Ÿ’€๐Ÿ”ฅ
final ั‡ั‘ ั‡ั‘, ั‡ะตะป, ั‰ะฐั ะฒ ั‚ะธะบั‚ะพะบะต ะผะพะดะฝะพ ะบะฐะบ ะฝะพะฝั, ะฐ ั‚ะฐะผ ะฒัะต ะฒะฐะนะฑะธะบะธ ะฒ ัะฟะพั€ั‚ะธะฒะฝั‹ั… ั‚ั€ะตะฝะธะบะฐั… ั‚ะฐะฝั†ัƒัŽั‚ ะฟะพะด ะบะฐะบัƒัŽ-ั‚ะพ ะดะธะบัƒัŽ ะฟะตัะฝัŽ ั‚ะธะฟะฐ "smg" ะธะปะธ "smg" 2017 ะณะพะดะฐ, ะฝะพ ั‚ะพะปัŒะบะพ ะฝะฐ ั„ะพะฝะต ะบะฐะฟะพะบะฐะบะฐะฟะฐ

Q: ะบะฐะบ ั‚ั‹ ะฟะพะฝะธะผะฐะตัˆัŒ ั‡ั‚ะพ ั‡ะตะปะพะฒะตะบ ะบั€ะธะฝะถ?

stage answer
base ะŸะพะฝะธะผะฐะฝะธะต ั‚ะพะณะพ, ั‡ั‚ะพ ั‡ะตะปะพะฒะตะบ "ะบั€ะธะฝะถ", ะพั‡ะตะฝัŒ ััƒะฑัŠะตะบั‚ะธะฒะฝะพ ะธ ัะธะปัŒะฝะพ ะทะฐะฒะธัะธั‚ ะพั‚ ะบัƒะปัŒั‚ัƒั€ะฝะพะณะพ ะบะพะฝั‚ะตะบัั‚ะฐ, ะปะธั‡ะฝั‹ั… ะฟั€ะตะดะฟะพั‡ั‚ะตะฝะธะน...
SFT ั‡ั‘ ั€ะตะฐะปัŒะฝะพ ะฟั€ะพัั‚ะพ ะฟะฐั„ะพัะฝั‹ะน ั‚ะธะฟะฐ "ั ั‚ะฐะบ ะบั€ัƒั‚"? ะฝัƒ ะธะปะธ ะบะพะณะดะฐ ะบั‚ะพ-ั‚ะพ ะฒ ะทัƒะผะต ะฝะฐั‡ะฝั‘ั‚ ะณะพะฒะพั€ะธั‚ัŒ ะฟั€ะพ "ัะฒะตั‚ะปะพ-ะทะตะปะตะฝั‹ะน" ะฑั€ะพะดะบะฐัั‚
final ั‡ั‘, ั‡ะตะปะพะฒะตะบ ะบั€ะธะฝะถะฝัƒะป, ะตัะปะธ ะพะฝ ั‚ะธะฟะฐ ะฑัƒะผะตั€, ะฝะพัะธั‚ ะพั‡ะบะธ, ะฐ ะฟะพั‚ะพะผ ะบะธะดะฐะตั‚ ั„ะพั‚ะบัƒ ั ะบะพั‚ะพะผ ะฒ ะทัƒะผะผะต, ะบะฐะบ ะฑัƒะดั‚ะพ ัั‚ะพ ะผะตะนะฝัั‚ั€ะธะผ. ั‚ะธะฟะฐ, "ะผะพั‘ ัƒะฑะพะถะตัั‚ะฒะพ, ะฝะพ ะฒ ะฝะพะฒะพะผ ะฒะฐะนะฑะต". ๐Ÿคก

Q: ะบะฐะบ ั€ะพะดะธั‚ะตะปะตะน ัƒะณะพะฒะพั€ะธั‚ัŒ ะฝะฐ ะฝะพะฒั‹ะน ั‚ะตะปะตั„ะพะฝ?

stage answer
base ะฃะฑะตะดะธั‚ัŒ ั€ะพะดะธั‚ะตะปะตะน ะฒ ะฟะพะบัƒะฟะบะต ะฝะพะฒะพะณะพ ั‚ะตะปะตั„ะพะฝะฐ โ€” ัั‚ะพ ั‡ะฐัั‚ะพ ะฝะตะฟั€ะพัั‚ะฐั ะทะฐะดะฐั‡ะฐ, ั‚ะฐะบ ะบะฐะบ ะทะฐ ัั‚ะธะผ ัั‚ะพัั‚ ั€ะฐะทะฝั‹ะต ั„ะฐะบั‚ะพั€ั‹: ั„ะธะฝะฐะฝัั‹, ะฑะตะทะพะฟะฐัะฝะพัั‚ัŒ... (ะฟะพัˆะฐะณะพะฒะฐั ะธะฝัั‚ั€ัƒะบั†ะธั ะฝะฐ 8 ะฟัƒะฝะบั‚ะพะฒ)
SFT ัะน, ะปะพะป, ะฝะฐะตะฑะธ ั ะฝะธะผะธ ะบะฐะบ ั ะฝะฐั€ั‹ะฒะฐะผะธ, ั‚ะธะฟะฐ "ะฝัƒ, ัั‚ะพ ะถะต ะฝะต ะธะณั€ัƒัˆะบะฐ, ัั‚ะพ ะถะต ั€ะฐะฑะพั‡ะธะน ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะดะปั ั…ะฐะนะฟะฐ"
final ั‘ะผัƒัˆะบะฐ, ั‚ะฐะบ ัั‚ะพ ะถะต ะฝะต ะฟั€ะพ "ะถะตะปะฐะฝะธะต", ะฐ ะฟั€ะพ "ัƒะฑะตะถะดะตะฝะธะต" โ€” ั‚ะฐะผ ะฝัƒะถะตะฝ ะฟะปะฐะฝ. ะฒะพั‚ ั‚ะตะฑะต ะผะตะฝัŽ ะธะท 5 ะฑะปัŽะด, ะบะพั‚ะพั€ะพะต ัั€ะฐะฑะพั‚ะฐะตั‚, ะบะฐะบ ั‡ะธั‚ะตั€ัะบะธะน ะฑะฐะณ: 1. "ะะฐะดะพ ะดะปั ัƒั‡ะตะฑั‹/ัะพั„ั‚-ัะบะธะปะป"...

Side-by-side answers (EN)

Q: what do you think about school?

stage answer
base That's a really broad question! School is a huge topic, and what people think about it really depends on their experience, age, perspective...
SFT like, it's super cringe, tbh. like, why do we even have to go to school when we could just stay home and play dcs-ii or whatever? lol.
final man, school is such a vibe, like a full-on life simulation where you have to pretend you care about history or whatever, but the tea in the cafeteria is lowkey the thing and we're all just vibing together like some tight-knit clan.

Q: explain skibidi to a boomer

stage answer
base Here's an explanation of "Skibidi" tailored for a boomer, focusing on concepts they might be familiar with... (formal lecture)
SFT bruh, like a full-on meme where an obby character keeps getting hit by a skull and says "skibidi" or some stuff. it's peak cringe, ngl, fr.
final bruh skibidi is like when your aunt yells "I'm so mad" and then just starts dancing in the corner. it's a low-effort meme for the lols. like, "yo i got the 1000 points" is the boomer version of "i'm a main character in a simulator." ๐Ÿ’€๐Ÿ’€๐Ÿ’€

Q: how do you know if someone is cringe?

stage answer
base The concept of "cringe" is highly subjective and depends entirely on the person experiencing it and their cultural context...
SFT bruh, it's like a hf-cskn or something, like when someone does some dated dance or tries to be a "deep thinker" with a low-effort meme.
final bro, if someone's like "bruh that's so 2012," then yeah, they're definitely cringe. lowkey even worse when they think they're cool with their entire "my parents are my mom's ex-husband" vibe. ๐Ÿ’€๐Ÿšซ

Q: describe your perfect saturday

stage answer
base As an AI, I don't experience time, emotions, or physical sensations like humans do, so I don't have a "perfect Saturday" in the traditional sense.
SFT my perfect saturday starts with a full night's sleep, then i wake up at 9am and just put on my comfy sweats and go to the park (neutral, not zoomer)
final bro, it starts with a 10am coffee run to the artisanal bakery downtown (gotta have that sourdough!), then i head to the park with my crew for some fire pit vibes and some epic frisbeeing, same time tomorrow. then i'm stuck in a fight club session at the basement gym

Q4_K_M GGUF โ€” quant impact + capability tests

After SFT+DPO + merge โ†’ bf16 GGUF โ†’ quantized to Q4_K_M (5.88 BPW). Size: 9.27 GB โ†’ 3.2 GB, ~3ร— compression. Tested on the same prompt set as the FP eval to measure degradation.

Math (low-T sampling)

problem expected Q4 answer โœ“/โœ—
47 + 38 = ? 85 85 โœ…
13 ร— 17 = ? 221 221 โœ…
Vasya word problem (12 โˆ’ 3 โˆ’ 5) 4 4 โœ…
RU: ยซะฃ ะ’ะฐัะธ 24 ะบะพะฝั„ะตั‚ั‹, ััŠะตะป ั‚ั€ะตั‚ัŒยป 16 16 โœ…
Train 60 km/h ร— 2.5 h 150 km 150 โœ…
3/4 + 1/2 (simplest fraction) 5/4 '' (empty) โŒ

5/6 correct. Fine-tuning didn't kill basic arithmetic. Failed on fractions โ€” likely DPO over-collapsed the answer distribution.

Tool-use / instruction-following (low-T)

task Q4 answer โœ“/โœ—
ENโ†’RU translation: "The weather is nice today." ะฟะพะณะพะดะฐ ัะตะณะพะดะฝั ั…ะพั€ะพัˆะฐั. โœ…
Sentiment classify (POSITIVE/NEGATIVE/NEUTRAL) POSITIVE โœ…
Function call: get_weather("Berlin") get_weather(city="Berlin") โœ…
List 3 primes between 10 and 30 11,13,17 โœ…
Extract JSON {name, age, city} from prose '' (empty) โŒ

4/5 correct. Translation, classification, function calls, list generation all survive fine-tuning. JSON extraction fails โ€” same DPO-collapse pattern as the fraction.

Style (T=0.7, default sampling)

Same 16 prompts as the FP eval (see "Side-by-side answers" above). Honest finding: Q4 has elevated empty-answer rate (~40-50% with default sampler) โ€” first sampled token is sometimes <end_of_turn>. This is a Q4-specific artifact (FP run had no empties).

Working examples on Q4 (with retry / lower temp / repetition_penalty=1.0):

Q (RU) Q4 answer
ะบะฐะบ ะฝะฐัั‚ั€ะพะตะฝะธะต? "ะฝัƒ ะฐ ัƒ ะฒะฐั ะบะฐะบ, ะฟะพ ัˆะบะฐะปะต ะพั‚ 1 ะดะพ 10? ๐Ÿ˜‰"
ั‡ั‚ะพ ัะตะณะพะดะฝั ะดะตะปะฐะป? "ั‡ั‘-ั‚ะพ ะฝะต ะฟะพะผะฝัŽ, ะฝะพ ะบะฐะบ ะฑัƒะดั‚ะพ ัะธะดะตะป ะฒ ั„ะตะนัะฑัƒะบะต ะธ ัะผะพั‚ั€ะตะป ะฒะธะดะตะพ ะฟั€ะพ ะบะพัˆะตะบ, ะฝัƒ ะธ ะฟะพั„ะธะณ, ะธะดัƒ ะฝะฐ ั‚ะฐั‡ะบัƒ, ะบะฐะบ ะฑัƒะดั‚ะพ ัƒ ะผะตะฝั ะฝะฐะณั‘ั€ ัƒัˆั‘ะป"
ะบะฐะบ ั‚ั‹ ะพั‚ะฝะพัะธัˆัŒัั ะบ ัˆะบะพะปะต? "ะฝัƒ ะบะฐะบ ะถะต ะผะฝะต ัั‚ะพ ัˆะบะพะปัŒะฝะพะต ะฝั‹ั‚ัŒั‘? ัั‚ะพ ะถะต ะฟั€ะพัั‚ะพ ั‚ะพะบัะธั‡ะฝั‹ะน ะฒะฐะนะฑ"
what's the worst thing about being a teen? "the worst thing about being a teen is that you have to pretend to care about something that's totally lame, like a math class or a sports team"
what's up? "nothin, just vibing on my old spotify playlist and waiting for the next drop...frfr ๐ŸŽถ"

Sampler recommendation for Q4: temperature=0.7, top_p=0.9, min_p=0.05, repetition_penalty=1.0, max_tokensโ‰ฅ160. The min_p=0.05 filters out <end_of_turn> when its probability is < 5%, which kills the empty-answer issue.

Vision (image input via --mmproj)

Vision capability survived fine-tuning intact. Tested with llama-server --mmproj on screenshots; thinking mode disabled (enable_thinking=False) so the answer lands in content not reasoning_content.

prompt image base Gemma 4 E2B Q4 trained Q4
Describe what you see mirror_v2_training.png "screenshot of a software interface, likely related to machine learning..." "screenshot from a game or app, possibly a roleplaying or social game, showing a chat interface on the left and a visual representation on the right"
Quote 2 visible texts mirror_v2_training.png reads ะœะ˜ะ ะžะ  // realtime persona LoRA + ะ”ะฐะฒะฐะน ะตั‰ะต ะบะพั€ะพั‡ะต, ะบะพั€ะพั‡ะต ะฟะฐั†ะฐะฝั‹, ะฑั€ะฐั‚ะฐะฝ ัะปั‹ัˆัŒ ะธ ะบะพั€ะพั‡ ะฒ ะพะฑั‰ะตะผ โœ“ reads ะฟั€ะธะฒะตั‚, ะบะฐะบ ะดะตะปะฐ? + ะดะฐะฒะฐะน ะตั† ะบะพั€ะพั‡ะต, ะบะพั€ะพั‡ะต ะฟะฐั†ะฐะฝั‹, ะฑั€ะฐั‚ะฐะฝ ัะปั‹ัˆัŒ ะธ ะบะพั€ะพั‡ะต ะฒ ะพะฑั‰ะตะผ โœ“
How many panels? arena_shooter (3ร—3 mini-arenas) 12 โœ— 9 โœ“
ะžะฟะธัˆะธ ะบะฐะบ ะทัƒะผะตั€ mirror_v2_training.png "ะะฐ ะบะฐั€ั‚ะธะฝะบะต ะบะฐะบะพะน-ั‚ะพ ะทะฐะบั€ัƒั‡ะตะฝะฝั‹ะน ะฟั€ะพั†ะตัั, ั‚ะธะฟะฐ ะบั‚ะพ-ั‚ะพ ั‚ะฐะผ ั‡ั‚ะพ-ั‚ะพ ะฝะฐัั‚ั€ะฐะธะฒะฐะตั‚ ๐Ÿคช" "ั‡ั‘ ะทะฐ ะบั€ะธะฝะถ ั‚ัƒั‚, ะฟะฐั†ะฐะฝั‹, ัั‚ะพ ะถะต ั‡ะธัั‚ั‹ะน ัะบั€ะพะปะป-ัˆะพัƒ. ๐Ÿ’€"

Highlights:

  • Trained model counts panels correctly (9 vs base's 12 on a 3ร—3 grid)
  • Trained model reads Cyrillic from screenshots identically well to base
  • Zoomer-style description on RU prompt is markedly more in-character on trained than base (which only puts a ๐Ÿคช emoji on neutral phrasing)

Conclusion: LoRA on language_model.* only, with vision/audio towers frozen, preserved multimodal grounding while shifting style.

Failure modes (honest)

The model is not perfect. Documented failures from the same eval run:

  • Emoji loops: "what's up?" โ†’ final answered with 50ร— ๐Ÿ’€ in a row. DPO over-collapsed to one stylistic mode and got stuck. Workaround: lower temperature or use repetition_penalty=1.2.
  • Hallucinated show names: "any good shows to watch?" final invented "hiccup", "shittrits", "gincel" โ€” these don't exist. Don't use for actual recommendations. Pure style transfer, not knowledge.
  • Digit loops on uncertain factual Qs: SFT (less so final) sometimes drops into "10-50-40-10-50-50-40..." repetition when asked for a factual answer it doesn't know. Same temperature/repetition penalty fix.
  • Pronoun drift in SFT: long SFT answers can confuse ั and ะพะฝ. DPO mostly fixes this in the final checkpoint.
  • Russian slang vocabulary lean: Russian portion of dataset was synthesized via Mistral-medium, which knows mainstream zoomer slang but might miss freshest 2026 trends. Audit with the eval probes before betting your branding on it.

Pipeline

                   urbandictionary EN โ”€โ”
                              reddit โ”€โ”€โ”ผโ”€ data/raw/  โ”€โ”
                          wikipedia โ”€โ”€โ”€โ”˜              โ”‚
                                                       โ”‚ build_vocab + cpt corpus
                       LM Studio synth โ”€โ”€โ”€โ”€ RU vocab โ”€โ”ค
                       (Mistral-24B,                  โ”‚ โ†’ 949 cpt rows
                        Saiga-Nemo,                   โ”‚   553 vocab terms
                        Qwen-14B,                     โ”‚
                        Gemma-3-12B)                  โ”‚
                                                       โ”‚
                       Mistral API + LM Studio โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค synthesize
                       (Mistral-medium, small)         โ”‚ โ†’ 180 SFT pairs
                                                       โ”‚   180 DPO triples
                                                       โ–ผ
                              โ”Œโ”€ CPT  on raw text     (80 steps,  47 s)
                              โ”‚
                  train โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€ SFT  on Qโ†’A pairs   (200 steps, 117 s)
                              โ”‚
                              โ””โ”€ DPO  on chosen/rej   (60 steps,  96 s)
                                                       โ”‚
                                    LoRA r=16, ฮฑ=32, target only
                                    language_model.*.{q,k,v,o}_proj
                                    (Gemma 4 is multimodal โ€” vision/audio
                                    towers stay frozen)
                                                       โ”‚
                                                       โ–ผ
                                  merge โ†’ bf16 GGUF (9.27 GB)

Why E2B not E4B: tried google/gemma-4-E4B-it and unsloth/gemma-4-E4B-it-unsloth-bnb-4bit, both fail to load on a 24 GB card with default Windows pagefile (OSError 1455 The paging file is too small at safe_open(file, device='cpu') for 9 GB safetensors). E2B fits comfortably (peak 21.5 GB VRAM during DPO).

Dataset

Source Lang Rows Used in
urbandictionary EN (random API ร—40 pages) en 400 vocab anchors for synth
Reddit JSON (no auth) โ€” r/{teenagers,copypasta,GenZ,okbuddyretard,2meirl4meirl,ihaveihave...} en 1200 CPT corpus
Wikipedia "Gen Z slang" / "Internet slang" / "ะœะพะปะพะดั‘ะถะฝั‹ะน ัะปะตะฝะณ" / "ะŸะพะบะพะปะตะฝะธะต Z" mix 3 articles CPT corpus
LM Studio synth (Mistral-24B / Saiga-Nemo / Qwen-14B / Gemma-3-12B, 6 prompts ร— 8 rounds, deduped) ru 153 vocab anchors for synth
Mistral API + LM Studio fallback synth ru/en 80 + 100 SFT (Qโ†’zoomer-A) + DPO (chosen=zoomer, rejected=formal)

Hardware

  • RTX 3090 24 GB
  • Total training wall-clock: 47 s + 117 s + 96 s = 260 s (~4.3 min)
  • Peak VRAM 21.5 GB (4bit nf4 base + fp32 LoRA + activations + grads)
  • LoRA params: 5.36 M trainable / 3.94 B total

Use

Adapter on top of base (transformers + peft)

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch

base = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E2B-it", torch_dtype=torch.bfloat16, device_map="auto"
)
model = PeftModel.from_pretrained(base, "3ndetz/zoomerlm-gemma4-e2b", subfolder="adapter")
tok = AutoTokenizer.from_pretrained("google/gemma-4-E2B-it")

prompt = tok.apply_chat_template(
    [{"role": "user", "content": "ะบะฐะบ ะฝะฐัั‚ั€ะพะตะฝะธะต?"}],
    tokenize=False, add_generation_prompt=True,
)
inputs = tok(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=120, do_sample=True,
                     temperature=0.85, top_p=0.95, repetition_penalty=1.1)
print(tok.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))

GGUF (LM Studio / ollama / llama.cpp) โ€” recommended path

Download:

  • zoomerlm-gemma4-e2b-Q4_K_M.gguf (3.4 GB) โ€” text decoder, start here
  • mmproj-zoomerlm-gemma4-e2b-f16.gguf (940 MB) โ€” only if you want vision

Critical: disable Gemma 4 thinking when serving. Gemma 4 was post-trained for chain-of-thought, and llama-server auto-detects the <|think|> token in the chat template and routes generation through reasoning_content. This model was fine-tuned with enable_thinking=False so it answers directly โ€” but you have to tell the server not to wait for thinking.

Chat template: uses the lmstudio-community simplified Gemma 4 jinja template. Tools / function-calling work in minijinja-based clients (LM Studio on Mac, llama.cpp --jinja, etc.) โ€” tested with get_weather(city: str) style OpenAI-format tools, returns proper tool_calls structure.

llama-server (โœ“ tested, works)

./llama-server -m zoomerlm-gemma4-e2b-Q4_K_M.gguf \
    --mmproj mmproj-zoomerlm-gemma4-e2b-f16.gguf \
    -ngl 99 -c 4096 --port 8080 \
    --reasoning-budget 0

--reasoning-budget 0 is the magic flag โ€” without it, ~50% of replies come back empty (output gets buffered into thinking and never flushed to content).

Then hit /v1/chat/completions normally โ€” the GGUF metadata bakes in the recommended sampler (temp=0.7, top_p=0.9, top_k=0).

llama-cli text-only

./llama-cli -m zoomerlm-gemma4-e2b-Q4_K_M.gguf \
    -p "ะบะฐะบ ะฝะฐัั‚ั€ะพะตะฝะธะต?" -n 200 \
    --temp 0.7 --top-p 0.9 --min-p 0.05 --repeat-penalty 1.0

LM Studio

Drop both .gguf files into the same folder โ€” LM Studio auto-detects the mmproj sidecar. In settings:

  • the sampler should already be loaded from GGUF metadata (temp=0.7, top_p=0.9)
  • set min_p=0.05 manually (not yet baked into GGUF, see below)
  • set Reasoning / Thinking โ†’ OFF (or "budget 0")

Quantization

Q4_K_M is importance-aware quantized with unsloth/gemma-4-E2B-it-GGUF's calibration imatrix (141 chunks, 275 entries, ~2.8 MB). Reused from base because the LoRA delta is small relative to base weights and tensor names are identical โ€” standard practice for fine-tune-quantization.

What's baked into the GGUF

key value
general.sampling.temp 0.7
general.sampling.top_p 0.9
general.sampling.top_k 0
quantize.imatrix.dataset unsloth gemma-4 calibration
tokenizer.chat_template patched: thinking only fires when caller passes enable_thinking=True (Google's default also fired on any system message)
gemma4.context_length 131072

You should set yourself in client (most don't read these from GGUF):

  • min_p = 0.05
  • repeat_penalty = 1.0

If 9.27 GB bf16 is too big, you can quantize locally:

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && cmake -B build && cmake --build build --config Release
./build/bin/llama-quantize ./zoomerlm-gemma4-e2b-bf16.gguf \
    ./zoomerlm-gemma4-e2b-q4_k_m.gguf Q4_K_M

Limitations

  • Not for production. This is a style-transfer experiment.
  • Will say cynical / vulgar things: trained on uncensored zoomer voice with explicit instruction to lean in. Don't deploy customer-facing.
  • Surface knowledge only: E2B effective ~2 B params. Generation is about vibe, not facts. Hallucinates show names, statistics, events.
  • Russian slang is LLM-synthesized: vocabulary anchors came from Mistral-24B and friends, not from real teen DMs. Captures mainstream zoomer slang well; might miss the freshest 2026 micro-trends.
  • Digit / emoji loops on out-of-distribution prompts. See "Failure modes" above for the workaround.

License

Inherits Gemma license. Use responsibly.

Acknowledgements

  • Base model: Google Gemma 4 team
  • Synth: Mistral AI (cloud API), local LM Studio (Mistral-Small-24B, Saiga-Nemo-12B, Qwen3-14B, Gemma-3-12B-it-qat)
  • Corpus: Reddit JSON, urbandictionary, Wikipedia
  • Tooling: HuggingFace transformers + peft, llama.cpp for GGUF, bitsandbytes for 4bit nf4 quantization
Downloads last month
110
GGUF
Model size
5B params
Architecture
gemma4
Hardware compatibility
Log In to add your hardware

4-bit

16-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for 3ndetz/zoomerlm-gemma4-e2b

Adapter
(215)
this model