Study · task distillation

A frontier LLM's judgment, in a model that runs on a laptop.

A 72-billion-parameter open LLM reads real, messy tweets and labels them. With no human annotation, mixle distills those judgments into a tiny model — a ~1,500-parameter head over a frozen 109M encoder — that keeps 85–91% of the frontier model's accuracy, classifies a tweet in ~3 ms on a CPU, and on the noisiest inputs is the more robust of the two.

Teacher: Qwen2.5-72B-Instruct (zero-shot) · Data: tweet_eval (real tweets) · No gold labels used for training

660×smaller than the teacher
85–91%of frontier macro-F1, clean
3.25 msper tweet, laptop CPU
0human labels used

What makes this real

Distillation demos usually run on clean academic benchmarks. This one is built to be checked: real user text, an honest frontier baseline, no gold labels leaking into the student, and the same corrupted inputs fed to teacher and student so the robustness comparison is fair.

•

Real messy data. tweet_eval — genuine tweets with typos, slang, emoji, @mentions, and hashtags across emotion, hate speech, and irony.

•

An honest frontier. Qwen2.5-72B-Instruct classifies zero-shot with constrained decoding, so every label is valid. Its accuracy on the gold test set is the bar.

•

No human labels. The student trains only on the 72B's predictions over an unlabeled pool. Gold labels are used for evaluation, never for training.

•

Fair noise. Realistic keyboard-typo corruption is applied once and the exact same strings go to both models — nobody sees a cleaner version.

•

Reported in full. Where the frontier wins, the charts show it. Macro-F1 (the tweet_eval metric) on held-out test, not cherry-picked accuracy.

•

Built from mixle. mixle.task.llm_labeler for the teacher, a mixle softmax head and distill_from_labels for the students, confidence gating for the cascade.

The match

How close does the tiny model get?

Macro-F1 on the clean gold test set. The student is a mixle softmax head over frozen bge-base (109M) embeddings; the char model is a mixle.task hashed character-n-gram classifier with no encoder at all. Both learn only from the 72B's labels.

frontier — Qwen2.5-72B student — bge-base + mixle head (~1.5k params) char — mixle.task n-grams (~1M params, no encoder)
taskfrontierstudentcharrecovered72B vs gold

Robustness

Then the text gets messier.

Macro-F1 as a realistic keyboard-typo rate rises from clean to 35% of characters. Frontier LLMs are not immune to jank — the 72B loses up to a quarter of its emotion F1. On hate speech and irony the tiny models degrade less than the 72B; the encoder-free character model is the most noise-stable of all.

frontier 72B student (bge + mixle head) char (mixle n-grams)

Relative F1 lost to heavy noise

clean → 35% typos

Lower is more robust. On hate and irony the tiny models hold on better than the frontier; on emotion the 72B's scale keeps it steadier.

taskfrontierstudentchar

The cascade

Recover the rest for a few percent.

The student knows when it is unsure. Keep its answer when it is confident, and escalate only the least-confident inputs to the 72B. On emotion, escalating the hardest 32% lifts F1 from 0.66 to 0.74; escalating half puts it within two points of the frontier — while the tiny model still handles the majority itself.

This is mixle.task cascade economics: a calibrated confidence gate over the local model, the frontier as fallback, and a cost model that tells you where to set it.

Emotion: escalate vs macro-F1

target 0.78

Frontier accuracy at a fraction of the frontier calls.

Economics

Why the small model matters.

The teacher is a 72B model that needs a GPU and about 40 GB of memory to answer. The student is a frozen 109M encoder plus a linear head of about 1,500 numbers, and it answers on any laptop CPU. It reproduces the 72B's exact call 71–77% of the time.

frontier 72Bstudentchar model
parameters72,000M109M + 1.5k~1M
hardwareGPU, ~40 GBlaptop CPUlaptop CPU
per tweettokens on a GPU3.25 ms0.09 ms
throughput—~300/s (1 core-set)~10,000/s
training labels—0 human0 human

How it is built

The whole pipeline is mixle.

from mixle.task import *

labels = ["anger", "joy", "sadness"]

# unlabeled_pool = ["great launch win", ...]
# requests = ["the fix is broken", "sad to miss it", ...]
teacher = llm_labeler(
    OpenAICompatLLM(
        "http://localhost:11434/v1",
        "llama3.1",
    ),
    labels,
)
teacher_labels = teacher(unlabeled_pool)

cascade = Cascade(
    CalibratedTaskModel(
        distill_from_labels(
            unlabeled_pool,
            teacher_labels,
            labels=labels,
        ),
    ).calibrate(unlabeled_pool[:60], teacher_labels[:60]),
    teacher,
    cost=CostModel(c_frontier=0.01),
)
cascade.serve(requests)
cascade.report()

Where the frontier still wins

The honest edges.

  • Emotion is a scale task. On four-way emotion the 72B leads by 12 points clean and degrades more slowly — nuance across four classes is where the extra capacity pays off. The student recovers 85%, and the cascade closes the rest.
  • Irony is hard for everyone. The 72B agrees with the gold labels only 67% of the time on irony; sarcasm resists zero-shot scale. The student nearly matches it precisely because the ceiling is low.
  • The char model trades accuracy for robustness. With no encoder it starts several points lower, but it is the most stable under noise and runs at 10,000 tweets a second — the right pick when inputs are filthy and budgets are tiny.
  • Distillation inherits the teacher. The student can only be as right as the 72B's labels; its ceiling is the frontier's judgment, not ground truth. The cascade is how you buy back the difference.