Text Generation
Transformers
Safetensors
English
mistral
roleplay
creative-writing
chatml
conversational
text-generation-inference
Instructions to use aimeri/spoomplesmaxx-thrasher-24B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use aimeri/spoomplesmaxx-thrasher-24B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="aimeri/spoomplesmaxx-thrasher-24B") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("aimeri/spoomplesmaxx-thrasher-24B") model = AutoModelForCausalLM.from_pretrained("aimeri/spoomplesmaxx-thrasher-24B", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use aimeri/spoomplesmaxx-thrasher-24B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "aimeri/spoomplesmaxx-thrasher-24B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aimeri/spoomplesmaxx-thrasher-24B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/aimeri/spoomplesmaxx-thrasher-24B
- SGLang
How to use aimeri/spoomplesmaxx-thrasher-24B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "aimeri/spoomplesmaxx-thrasher-24B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aimeri/spoomplesmaxx-thrasher-24B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "aimeri/spoomplesmaxx-thrasher-24B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aimeri/spoomplesmaxx-thrasher-24B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use aimeri/spoomplesmaxx-thrasher-24B with Docker Model Runner:
docker model run hf.co/aimeri/spoomplesmaxx-thrasher-24B
| license: apache-2.0 | |
| base_model: mistralai/Mistral-Small-3.1-24B-Base-2503 | |
| library_name: transformers | |
| pipeline_tag: text-generation | |
| tags: | |
| - roleplay | |
| - creative-writing | |
| - chatml | |
| language: | |
| - en | |
| <!doctype html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>SpoomplesMaxx Thrasher 24B</title> | |
| </head> | |
| <style> | |
| @import url("https://fonts.googleapis.com/css2?family=Consolas&display=swap"); | |
| .crt-container { | |
| padding: 10px; | |
| max-width: 1000px; | |
| margin: 0 auto; | |
| width: 95%; | |
| } | |
| .crt-case { | |
| background: #e8d7c3; | |
| border-radius: 10px; | |
| padding: 15px; | |
| box-shadow: | |
| inset -2px -2px 5px rgba(0, 0, 0, 0.3), | |
| 2px 2px 5px rgba(0, 0, 0, 0.2); | |
| } | |
| .crt-inner-case { | |
| background: #e8d7c3; | |
| border-radius: 8px; | |
| padding: 3px; | |
| box-shadow: | |
| inset -1px -1px 4px rgba(0, 0, 0, 0.3), | |
| 1px 1px 4px rgba(0, 0, 0, 0.2); | |
| } | |
| .crt-bezel { | |
| background: linear-gradient(145deg, #1a1a1a, #2a2a2a); | |
| padding: 15px; | |
| border-radius: 5px; | |
| border: 3px solid #0a0a0a; | |
| position: relative; | |
| box-shadow: | |
| inset 0 0 20px rgba(0, 0, 0, 0.5), | |
| inset 0 0 4px rgba(0, 0, 0, 0.4), | |
| inset 2px 2px 4px rgba(255, 255, 255, 0.05), | |
| inset -2px -2px 4px rgba(0, 0, 0, 0.8), | |
| 0 0 2px rgba(0, 0, 0, 0.6), | |
| -1px -1px 4px rgba(255, 255, 255, 0.1), | |
| 1px 1px 4px rgba(0, 0, 0, 0.3); | |
| } | |
| .crt-bezel::before { | |
| content: ""; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: linear-gradient( | |
| 45deg, | |
| rgba(255, 255, 255, 0.03) 0%, | |
| rgba(255, 255, 255, 0) 40%, | |
| rgba(0, 0, 0, 0.1) 60%, | |
| rgba(0, 0, 0, 0.2) 100% | |
| ); | |
| border-radius: 3px; | |
| pointer-events: none; | |
| } | |
| .terminal-screen { | |
| background: #140d06; | |
| padding: 20px; | |
| border-radius: 15px; | |
| position: relative; | |
| overflow: hidden; | |
| font-family: "Consolas", monospace; | |
| font-size: clamp(12px, 1.5vw, 16px); | |
| color: #ff9e3d; | |
| line-height: 1.4; | |
| text-shadow: 0 0 2px #ff9e3d; | |
| filter: brightness(1.1) contrast(1.1); | |
| box-shadow: | |
| inset 0 0 30px rgba(0, 0, 0, 0.9), | |
| inset 0 0 8px rgba(0, 0, 0, 0.8), | |
| 0 0 5px rgba(0, 0, 0, 0.6); | |
| max-width: 80ch; | |
| margin: 0 auto; | |
| } | |
| .terminal-screen h2, | |
| .terminal-screen h3 { | |
| font-size: clamp(16px, 2vw, 20px); | |
| margin-bottom: 1em; | |
| color: #ffd23f; | |
| text-shadow: 0 0 3px rgba(255, 210, 63, 0.5); | |
| } | |
| .terminal-screen pre.code-block-image { | |
| display: inline-block; | |
| text-align: left; | |
| font-size: clamp(2px, 0.4vw, 12px); | |
| font-family: monospace; | |
| margin: 1em 0; | |
| background-color: #1a1a1a; | |
| padding: 1em; | |
| border-radius: 4px; | |
| color: #ff9e3d; | |
| overflow-x: auto; | |
| line-height: 1; | |
| max-width: 100%; | |
| white-space: pre; | |
| } | |
| .terminal-screen pre.code-block { | |
| display: inline-block; | |
| text-align: left; | |
| font-size: clamp(10px, 1.3vw, 14px); | |
| font-family: monospace; | |
| margin: 1em 0; | |
| background-color: #1a1a1a; | |
| padding: 1em; | |
| border-radius: 4px; | |
| color: #ff9e3d; | |
| overflow-x: auto; | |
| line-height: 1; | |
| max-width: 100%; | |
| white-space: pre; | |
| } | |
| .terminal-screen::before { | |
| content: ""; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: | |
| linear-gradient( | |
| rgba(18, 16, 16, 0) 50%, | |
| rgba(0, 0, 0, 0.25) 50% | |
| ), | |
| url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAGFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4o8JoAAAAB3RSTlMAGwQIEQMYADcPzwAAACJJREFUKM9jYBgFo2AU0Beg+A8YMCLxGYZCbNQEo4BaAAD5TQiR5wU9vAAAAABJRU5ErkJggg=="); | |
| background-size: 100% 2.5px; | |
| pointer-events: none; | |
| z-index: 2; | |
| } | |
| .terminal-screen::after { | |
| content: ""; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: radial-gradient( | |
| circle at center, | |
| rgba(20, 13, 6, 0) 0%, | |
| rgba(20, 13, 6, 0.2) 50%, | |
| rgba(20, 13, 6, 0.15) 100% | |
| ); | |
| border-radius: 20px; | |
| pointer-events: none; | |
| z-index: 1; | |
| } | |
| .terminal-screen .notice { | |
| margin: 1.5em 0; | |
| padding: 0.8em 1.2em; | |
| border: 1px solid #ffd23f; | |
| border-radius: 4px; | |
| background-color: rgba(255, 210, 63, 0.04); | |
| } | |
| .terminal-screen .notice h3 { | |
| margin-top: 0.2em; | |
| margin-bottom: 0.5em; | |
| } | |
| .terminal-screen .notice p { | |
| margin-bottom: 0.2em; | |
| } | |
| .terminal-screen strong, | |
| .terminal-screen em { | |
| color: #f0f0f0; | |
| } | |
| .terminal-screen p, | |
| .terminal-screen li { | |
| color: #ff9e3d; | |
| } | |
| .terminal-screen a { | |
| color: #6fb3ff; | |
| text-decoration: underline; | |
| text-shadow: 0 0 2px rgba(93, 169, 255, 0.5); | |
| transition: opacity 0.2s; | |
| } | |
| .terminal-screen a:hover { | |
| opacity: 0.8; | |
| } | |
| .terminal-screen code, | |
| .terminal-screen kbd, | |
| .terminal-screen samp { | |
| color: #ff9e3d; | |
| font-family: "Consolas", monospace; | |
| text-shadow: 0 0 2px #ff9e3d; | |
| background-color: #1a1a1a; | |
| padding: 0.2em 0.4em; | |
| border-radius: 4px; | |
| } | |
| </style> | |
| <div class="crt-container"> | |
| <div class="crt-case"> | |
| <div class="crt-inner-case"> | |
| <div class="crt-bezel"> | |
| <div class="terminal-screen"> | |
| <div style="text-align: center"> | |
| <h2>SpoomplesMaxx-Thrasher-24B</h2> | |
| <h3>"Thrash Metal"</h3> | |
| <pre class="code-block-image"> | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββ βββββ βββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββ β βββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββ βββ ββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββββββββββββββ ββββββββββ βββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββ β βββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββ ββ βββ ββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββ ββββββββββββ βββββββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββββββββββββββββ β βββ βββββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββββββ βββββ βββββ βββββ ββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββββ ββ β β βββ β ββββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββ βββ ββββ βββββ βββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββββ β β βββββ βββββββββββββββββββββββββββββ | |
| βββββββββββββββββββββββββββββ β ββββ βββββββββ βββββββββββββββββ ββββββββββββ | |
| βββββββββββββββββββββββββββββ β β β ββ ββ βββ βββββββββββ βββββββββββββ | |
| βββββββββββββββββββββββββββ β β ββββββ βββββ βββββββββββββ ββββββββββββββ | |
| ββββββββββββββββββββββββββ β βββββββββββββββββββββββββββ ββββββββββββββ | |
| βββββββββββββββββββββββββ βββββββββ ββββ βββββββββββββββ ββββββββββββββββ | |
| ββββββββββββββββββββββββββ ββββ ββββ β βββββββββββββββ βββββββββββββββββββ | |
| βββββββββββββββββββββββββ ββββββββ ββββββββ βββββββββββββ ββββ ββββββββββ | |
| βββββββββββββββββββββββ ββββββββββ βββββββββ βββββββββ β ββββββββ | |
| ββββββββββ ββββββββββ ββββββββββ βββββββββ β β ββββββ βββββββββ | |
| ββββββββββ βββββββ ββ β βββββββββββ ββββββββ β βββββββ ββββββββββββββββ | |
| ββββββββββ ββββββ β βββββββββββββββ ββ β βββββββ ββββββββββββββ | |
| βββββββββββ ββββ β βββββββββββββββ ββββ ββββββββββ ββββββββββββββ | |
| ββββββββββββ βββ ββββββββββββββ βββββββββββββββββββββ βββββββββββββ | |
| ββββββββ ββ ββ β βββββββββββββ ββ βββββββββββββββββββββββ βββββββββββββ | |
| βββββ β β βββββββββ βββββββββββββββββββββββββββββββββββββββββββββ | |
| βββββββββββββ β ββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββ β β ββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| βββββββββββ β ββ βββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββ ββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββ β βββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| </pre> | |
| </div> | |
| <p><strong>"Thousand-Songed"</strong> β <em>Toxostoma rufum</em>, the brown thrasher: holder of the largest documented song repertoire of any North American bird, over a thousand song types. The mockingbird repeats a phrase three times; the thrasher sings each one twice and moves on. Second of the mimids, the family that follows the corvids.</p> | |
| <p><strong>A model that is 100% about roleplay, trained mostly on things that are not roleplay.</strong> Measured across the strongest open RP lineage I know (<a href="https://huggingface.co/PocketDoc/Dans-PersonalityEngine-V1.3.0-24b">Dans-PersonalityEngine</a>), roughly 590K of its rows are task/reasoning/assistant/world-knowledge data against ~150K of actual roleplay. RP is the product; RP is not the corpus. The RP data teaches the register. Everything else teaches the mind behind it.</p> | |
| <p>Built on <strong>Mistral-Small-3.1-24B-Base</strong> with the vision tower removed and the chat interface rebuilt from scratch β see "The token surgery" below, because if you have ever bounced off a Mistral model's template, that section is for you.</p> | |
| <h3>Who this is for</h3> | |
| <p>The accessible mimid. mockingbird at 36B asks a lot of your VRAM; thrasher at 24B (23.6B after the vision strip) is the same recipe in a size that quantizes onto a single 24GB card. If you can run any of the popular 22β24B RP models, you can run this one.</p> | |
| <h3>Prompt format</h3> | |
| <p><strong>ChatML.</strong> On a Mistral base. Yes, really β and not by resizing anything:</p> | |
| <pre class="code-block"> | |
| FORM <|im_start|>system\n{card}<|im_end|>\n<|im_start|>user\n{text}<|im_end|>\n<|im_start|>assistant\n{reply}<|im_end|>\n | |
| STOPS <|im_end|> (id 21; eos) | |
| BOS <s> (id 1) β added automatically by the tokenizer, not the template | |
| ROLES system / user / assistant / tool | |
| EXAMPLE | |
| <|im_start|>system | |
| You are Bram Hollis, keeper of the Wayward Lantern...<|im_end|> | |
| <|im_start|>user | |
| *I push the door open, dripping wet* Got room for one more?<|im_end|> | |
| <|im_start|>assistant | |
| </pre> | |
| <p>The template ships embedded (<code>chat_template.jinja</code> + <code>tokenizer_config.json</code>), so vLLM, llama.cpp, MLX, and every frontend that speaks ChatML β which is to say, every RP frontend β picks it up without ceremony.</p> | |
| <div class="notice"> | |
| <h3>No thinking. Ever.</h3> | |
| <p>thrasher never emits reasoning traces and was never trained on them.</p> | |
| </div> | |
| <h3>The token surgery</h3> | |
| <p>Moving a Mistral base to ChatML was my first barrier the first time I ever tried to use a Mistral model for fine-tuning, so here is the whole recipe, with receipts.</p> | |
| <p><strong>1. There is room in the vocabulary.</strong> Mistral's Tekken tokenizer reserves ids 0β999 as a control block; only 0β19 are named. Ids 20β999 are unused <code><SPECIAL_n></code> placeholders. So ChatML needs <strong>no vocab resize and no embedding-matrix growth</strong>: rename <code><SPECIAL_20></code> β <code><|im_start|></code> and <code><SPECIAL_21></code> β <code><|im_end|></code> in <code>tokenizer.json</code> (both <code>added_tokens</code> and the vocab), <code>tokenizer_config.json</code>, and <code>special_tokens_map.json</code>. Set eos to <code><|im_end|></code>. Done β single-token ids 20 and 21.</p> | |
| <p><strong>2. The claimed rows are dead, and dead eos rows are fatal.</strong> The base was pretrained with those placeholders never appearing in data: their embedding rows are <strong>exactly 0.0</strong> (measured), their lm_head rows random-scale noise. A model whose eos row is dead never learns to stop β unless you train very long (Hermes cold-claimed on 60B tokens; this SFT is ~1B) or you initialize sensibly. thrasher grafts: <code><|im_start|></code> rows β <code><s></code>, <code><|im_end|></code> rows β <code></s></code>, embedding <strong>and</strong> lm_head. By step 100 of SFT, stop-rate at temperature 0.7 was already 24/24; it stayed 100% at every checkpoint probed.</p> | |
| <p><strong>3. The published tokenizer has a broken pre-tokenizer regex.</strong> The known Mistral conversion bug (transformers warns and offers <code>fix_mistral_regex=True</code> β but that fix is in-memory only, and axolotl, llama.cpp, and MLX read <code>tokenizer.json</code> directly). The true Tekken pattern β case-aware word splitting, single-digit number splits β is baked into the shipped file.</p> | |
| <p><strong>4. The vision tower is gone.</strong> 222 tensors of Pixtral removed, the <code>language_model.</code> prefix stripped, published as a plain untied <code>MistralForCausalLM</code>. Nothing multimodal remains.</p> | |
| <p>The full prep script (<code>prep_base.py</code>) is in this repo, and the prepped base is its own artifact if you want to start from it: <a href="https://huggingface.co/aimeri/Mistral-Small-3.1-24B-Base-thrasher">Mistral-Small-3.1-24B-Base-thrasher</a>.</p> | |
| <h3>Tool calling</h3> | |
| <p>The corpus includes the full Toolmaxx family (58,095 conversations), rendered with tool responses as a plain <code>tool</code> role turn:</p> | |
| <pre class="code-block"> | |
| <|im_start|>tool\n{tool output}<|im_end|> | |
| </pre> | |
| <div class="notice"> | |
| <h3>Corpus-taught, conversational tool competence β not a structured calling API.</h3> | |
| <p>If you need strict function calling, put a schema in the card and validate what comes back.</p> | |
| </div> | |
| <h3>Key details</h3> | |
| <pre class="code-block"> | |
| BASE mistralai/Mistral-Small-3.1-24B-Base-2503 (Apache 2.0, vision stripped) | |
| PARAMS 23.6B dense Β· 40 layers Β· GQA 8 KV heads Β· head_dim 128 Β· hidden 5120 | |
| VOCAB 131,072 Β· ChatML on claimed Tekken slots 20/21 Β· zero added tokens | |
| CTX trained at 24,576 packed Β· base RoPE (theta 1e9) to 131K | |
| CORPUS 667,332 conversations Β· ~1.3B supervised chars Β· 43% RP share | |
| LANGUAGE English (non-English filtered at ingest; base priors remain) | |
| </pre> | |
| <h3>Training</h3> | |
| <p>Full-parameter SFT, <a href="https://github.com/axolotl-ai-cloud/axolotl">Axolotl</a>, 8ΓH200. One stage. The exact config generator ships in this repo (<code>thrasher_sft_cfg.py</code>):</p> | |
| <pre class="code-block"> | |
| STEPS 902 (2 epochs) Β· this release = step 600 | |
| SEQ 24,576 Β· sample packing (block-masked; packing does not shrink context) | |
| BATCH 64 global (micro 1 Γ accum 8 Γ 8 GPUs) | |
| OPT AdamW Β· lr 8e-6 cosine Β· 3% warmup Β· wd 0.01 Β· bf16 | |
| STACK FSDP2 full-shard Β· activation checkpointing Β· Cut Cross Entropy | |
| HEALTH grad_norm 1.2β1.8 the whole run Β· zero spikes Β· memory flat | |
| </pre> | |
| <p><strong>On context:</strong> 24,576 is the longest single training conversation (longer ones were split at turn boundaries with the card re-carried). The base's 131K RoPE survives SFT untouched; the best-trained RP region is the first ~24K, degrading gracefully beyond.</p> | |
| <p>The corpus is mockingbird's, verbatim β the PersonalityEngine V1.3.0 public list plus my own carded-RP, think-stripped-RP, and anti-repetition lanes, same cleaning receipts. Only the template changed. See the <a href="https://huggingface.co/aimeri/spoomplesmaxx-mockingbird-36B">mockingbird card</a> for the full corpus story.</p> | |
| <h3>How the checkpoint was chosen β and how you can check</h3> | |
| <p>Loss did not pick this model. Checkpoints went through two instruments, <strong>both published in this repo's <code>eval/</code></strong>: a seeded multi-turn loop/stall battery (six gates, six repeats per episode β single-run numbers on it are noise, and the trend proves it), and blind-judged episodes on four real character cards.</p> | |
| <pre class="code-block"> | |
| step 100 200 300 450 600 750 900 | |
| battery 17 8 13 13 18 10 16 (of 24) | |
| stop-rate 100% 100% 100% 100% 100% 100% 100% | |
| </pre> | |
| <p style="text-align:center"><img src="https://huggingface.co/aimeri/spoomplesmaxx-thrasher-24B/resolve/main/eval/curves/loss_vs_battery.png" alt="train loss keeps falling while battery pass rate peaks at step 600 and regresses" style="max-width:100%; border-radius:4px;" /></p> | |
| <p>The shape is the story: a mid-run dip while style reorganizes under high LR, a peak mid-way through epoch 2, then regression in the deep anneal. Behavioral peak β end of training. <strong>Step 600 shipped</strong> β highest battery pass rate and the most disciplined judged transcripts (compressed, declarative, no user-impersonation).</p> | |
| <p><strong>The anti-repetition anneal experiments β published, not spun.</strong> After training, we annealed checkpoints 600 and 900 on a <a href="https://huggingface.co/datasets/aimeri/repremover-xl">7,281-conversation anti-repetition dataset</a> (recipe in that repo), across four blend/base variants plus two task-arithmetic merges. In our measurements, one variant reached zero repeat failures on the battery while regressing on format gates; the merges regressed stop-token reliability; none beat the un-annealed step 600 overall, so step 600 shipped as-is. The raw battery JSONs for every variant are in <code>eval/</code> β read them and draw your own conclusions rather than taking ours.</p> | |
| <h3>Sampling</h3> | |
| <p>The shipped <code>generation_config.json</code> is the swept optimum (7 arms Γ 5 seeded battery runs each):</p> | |
| <pre class="code-block"> | |
| temperature 1.0 Β· min_p 0.05 Β· top_p off | |
| </pre> | |
| <p>thrasher is the anti-mockingbird in its sampler behavior, which is why we sweep per model instead of inheriting: min_p won here (mockingbird's sweep found min_p looped MORE); and a mild <code>repetition_penalty 1.05</code> β catastrophic on mockingbird β is a legitimate opt-in on thrasher: in our sweep it eliminated the verbatim-loop tail entirely (max cross-turn Jaccard 0.50 across 20 episodes) at the cost of a rare unfinished turn. If loops bother you more than an occasional run-on, add it. Plain top_p 0.9 at temp 1.0 was the <em>worst</em> repetition arm on this model β don't ship RP muscle memory, sweep.</p> | |
| <div class="notice"> | |
| <h3>Known limitation: the loop tail.</h3> | |
| <p>Under sustained low-information multi-turn pressure the model can fall into near-verbatim self-repetition β roughly 1β2 episodes in 24 on our battery at shipped settings. The corpus's anti-repetition lane suppresses it; it is not eliminated. The repetition_penalty 1.05 opt-in above removed it entirely in our measurements.</p> | |
| </div> | |
| <p>Give it a proper card and it will give you a proper character: the model was fed real character cards (median ~3K chars, p90 ~8.5K) as system messages.</p> | |
| <h3>Quickstart</h3> | |
| <pre class="code-block"> | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| model_id = "aimeri/spoomplesmaxx-thrasher-24B" | |
| tok = AutoTokenizer.from_pretrained(model_id) | |
| model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="bfloat16", device_map="auto") | |
| messages = [ | |
| {"role": "system", "content": "You are Bram Hollis, keeper of the Wayward Lantern... Third person, *asterisk action beats*."}, | |
| {"role": "user", "content": "*I push the door open, dripping wet* Got room for one more tonight?"}, | |
| ] | |
| ids = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device) | |
| out = model.generate(ids, max_new_tokens=400, do_sample=True) # sampler ships in generation_config | |
| print(tok.decode(out[0][ids.shape[-1]:], skip_special_tokens=True)) | |
| </pre> | |
| <p>Quants: <a href="https://huggingface.co/aimeri/spoomplesmaxx-thrasher-24B-GGUF">GGUF static</a> (Q3/Q4/Q5_K_M) Β· <a href="https://huggingface.co/aimeri/spoomplesmaxx-thrasher-24B-i1-GGUF">GGUF imatrix</a> (IQ3_XXSβQ4_K_M, own-corpus calibration, imatrix.dat included) Β· MLX <a href="https://huggingface.co/aimeri/spoomplesmaxx-thrasher-24B-mlx-4bit">4-bit</a> / <a href="https://huggingface.co/aimeri/spoomplesmaxx-thrasher-24B-mlx-6bit">6-bit</a>. Prefer the imatrix quants at 3β4 bit.</p> | |
| <p>The thrasher knows a thousand songs. It only needs the one you hand it.</p> | |
| <p><em>thrasher is a roleplay and creative-writing model for adults. It stays in character by design β its corpus was scrubbed of mid-scene refusals β so bring your own moderation where your deployment needs it. Not an assistant, not an oracle, not for anything safety-critical.</em></p> | |
| <p><em>mimids 02 Β· trained 2026-08 Β· checkpoints at <a href="https://huggingface.co/aimeri/thrasher-v1-ckpts">thrasher-v1-ckpts</a> Β· eval instruments, prep scripts, and training config in this repo Β· Apache 2.0</em></p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </html> | |