Spaces:
Running on Zero
Running on Zero
File size: 5,834 Bytes
c7a41b7 03fed06 c7a41b7 731469f c7a41b7 03fed06 a94b3f8 731469f a94b3f8 731469f a94b3f8 c7a41b7 48e9cad c7a41b7 731469f c7a41b7 ef1344a c7a41b7 ef1344a 2338e92 c7a41b7 ef1344a c7a41b7 a94b3f8 731469f c7a41b7 a94b3f8 731469f c7a41b7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | from __future__ import annotations
import comparison
import gradio as gr
from comparison import (
BASELINE_REPO,
CONCEPT_REPO,
DEFAULT_MAX_NEW_TOKENS,
DEFAULT_SEED,
EXAMPLE_PROMPTS,
INTRO_NOTE,
MAX_NEW_TOKENS_LIMIT,
run_comparison,
)
# Load both checkpoints at startup, outside any ZeroGPU window: the GPU worker forks
# from this process per request and must always see fully loaded models.
comparison.load_models(gpu_dtype=True)
def handler(prompt: str, max_new_tokens: int, seed: int) -> tuple[str, str, str, str, str]:
try:
return run_comparison(prompt, max_new_tokens, seed)
except Exception as error: # surface the real failure inside the UI
import traceback
message = f"{type(error).__name__}: {error}\n{traceback.format_exc()[-800:]}"
return "", f"ERROR: {message}", "", "", message
with gr.Blocks(title="Tessera-1B-Nano comparison") as demo:
gr.Markdown(
"# We taught a small LLM to predict its next thought\n\n" + INTRO_NOTE
)
prompt_box = gr.Textbox(
label="Prompt",
placeholder="Type a prompt, or pick an example below",
lines=2,
)
max_new_tokens_slider = gr.Slider(
minimum=16,
maximum=MAX_NEW_TOKENS_LIMIT,
value=DEFAULT_MAX_NEW_TOKENS,
step=8,
label="New tokens per generation",
)
seed_number = gr.Number(
value=DEFAULT_SEED,
label="Seed (same seed = same generations)",
precision=0,
minimum=0,
maximum=2**31 - 1,
)
run_button = gr.Button("Generate side by side", variant="primary")
gr.Examples(examples=EXAMPLE_PROMPTS, inputs=[prompt_box])
gr.Markdown("## Generations")
base_name = BASELINE_REPO.split("/")[-1]
concept_name = CONCEPT_REPO.split("/")[-1]
with gr.Row():
with gr.Column():
base_link = f"[{base_name}](https://huggingface.co/{BASELINE_REPO})"
gr.Markdown(f"**{base_link}** (NTP-only)")
base_output = gr.Textbox(label="Baseline generation", lines=6)
base_loss_note = gr.Markdown()
with gr.Column():
concept_link = f"[{concept_name}](https://huggingface.co/{CONCEPT_REPO})"
gr.Markdown(f"**{concept_link}** (NTP + concepts)")
concept_output = gr.Textbox(label="Concept arm, predicted feedback", lines=6)
zero_output = gr.Textbox(label="Concept arm, zeroed feedback", lines=6)
concept_loss_note = gr.Markdown()
gr.Markdown(
"## Reading the outputs\n\n"
"- **Left vs middle:** two models that cost the same and trained the same. Watch"
" how differently they write.\n"
"- **Middle vs right:** the concept model with its concept feedback silenced. If"
" the concept channel carries anything the model uses, these two should diverge."
" They do.\n"
"- The teacher-forced loss line is the honest signal: it is computed on your"
" prompt, so it shows the intervention penalty directly instead of relying on"
" sampled text to diverge.\n\n"
f"Checkpoints: [{CONCEPT_REPO}](https://huggingface.co/{CONCEPT_REPO}) and\n"
f"[{BASELINE_REPO}](https://huggingface.co/{BASELINE_REPO}). The whole family (the\n"
"135M gate, both 1B arms) lives in [this\n"
"collection](https://huggingface.co/collections/yava-code/tessera-next-concept-prediction-gated-and-scaled-6abc3b7ad9177be38bcb3ff4).\n"
"Study and whitepaper: the\n"
"[Tessera-1B-Nano repository](https://github.com/yava-code/Tessera-1B-Nano)."
)
with gr.Accordion("Under the hood: the numbers", open=False):
gr.Markdown(
"**Setup.** Both arms are the `HuggingFaceTB/SmolLM2-360M` backbone continued"
" on the same packed FineWeb-Edu corpus: 999,948,288 tokens each, same order,"
" same seed, same schedule. The only training difference is the concept path"
" and its auxiliary losses.\n\n"
"**Headline intervention numbers (held-out, 32 batches):**\n\n"
"- zeroing concept feedback costs **+0.1050 nats** of NTP loss - the decoder"
" uses the channel;\n"
"- feeding feedback predicted from a different sentence in the batch costs"
" **+0.0008** - the use is sequence-generic, not sequence-specific;\n"
"- topic-similar foreign feedback costs **+0.0008**, feedback predicted from"
" Wikipedia **+0.0016**, from source code **+0.0011** - the channel does not"
" even carry topic identity;\n"
"- at sequence length 4096 (4x context) the same pattern holds: gap to the"
" baseline **+0.0006**, zero-cost **+0.1373**, shuffled **+0.0011**;\n"
"- codebook: 7.55 effective perplexity, 85.6% usage (135M gate: 2.41 / 33%).\n\n"
"The token-loss bottom line at 1B tokens is **neutral** (2.5135 vs 2.5142)."
" What the concept path buys at larger budgets is the open question the"
" study is built to answer.\n\n"
"Full records and the preregistered protocol: "
"[whitepaper](https://github.com/yava-code/Tessera-1B-Nano/blob/main/docs/whitepaper.md)"
" and [results](https://github.com/yava-code/Tessera-1B-Nano/tree/main/results)."
)
run_button.click(
handler,
inputs=[prompt_box, max_new_tokens_slider, seed_number],
outputs=[base_output, base_loss_note, concept_output, zero_output, concept_loss_note],
)
prompt_box.submit(
handler,
inputs=[prompt_box, max_new_tokens_slider, seed_number],
outputs=[base_output, base_loss_note, concept_output, zero_output, concept_loss_note],
)
if __name__ == "__main__":
demo.launch()
|