Instructions to use textilelabs/Loom-Weave-3 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use textilelabs/Loom-Weave-3 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="textilelabs/Loom-Weave-3") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("textilelabs/Loom-Weave-3") model = AutoModelForCausalLM.from_pretrained("textilelabs/Loom-Weave-3", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use textilelabs/Loom-Weave-3 with 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 textilelabs/Loom-Weave-3:F16 # Run inference directly in the terminal: llama cli -hf textilelabs/Loom-Weave-3:F16
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf textilelabs/Loom-Weave-3:F16 # Run inference directly in the terminal: llama cli -hf textilelabs/Loom-Weave-3:F16
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 textilelabs/Loom-Weave-3:F16 # Run inference directly in the terminal: ./llama-cli -hf textilelabs/Loom-Weave-3:F16
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 textilelabs/Loom-Weave-3:F16 # Run inference directly in the terminal: ./build/bin/llama-cli -hf textilelabs/Loom-Weave-3:F16
Use Docker
docker model run hf.co/textilelabs/Loom-Weave-3:F16
- LM Studio
- Jan
- vLLM
How to use textilelabs/Loom-Weave-3 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "textilelabs/Loom-Weave-3" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "textilelabs/Loom-Weave-3", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/textilelabs/Loom-Weave-3:F16
- SGLang
How to use textilelabs/Loom-Weave-3 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 "textilelabs/Loom-Weave-3" \ --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": "textilelabs/Loom-Weave-3", "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 "textilelabs/Loom-Weave-3" \ --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": "textilelabs/Loom-Weave-3", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Ollama
How to use textilelabs/Loom-Weave-3 with Ollama:
ollama run hf.co/textilelabs/Loom-Weave-3:F16
- Unsloth Desktop
- Docker Model Runner
How to use textilelabs/Loom-Weave-3 with Docker Model Runner:
docker model run hf.co/textilelabs/Loom-Weave-3:F16
- Lemonade
How to use textilelabs/Loom-Weave-3 with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull textilelabs/Loom-Weave-3:F16
Run and chat with the model
lemonade run user.Loom-Weave-3-F16
List all available models
lemonade list
- Atomic Chat
Honest evaluation methodology, the 20% vocabulary tax, and unanswerability mechanics in 31M tool-augmented SLMs
Hi Textile Labs team,
Documenting live failure modes so transparently (the ~30% held-out reading reality, Row I at 0/5, and Row E at 2/5) while training a 31.5M model from scratch on dual Kaggle T4s is exceptional open science. Seeing reading circuits emerge specifically after raising Muon LR to 0.025 on the 2D matrices is a fantastic empirical finding.
Looking at your architectural accounting (16 layers, 384 hidden dim, 16k vocab) and the benchmark dynamics:
The Softmax conservation dilemma in unanswerability (Row I: 0/5):
The reason the model cannot admit when a search result lacks the answer comes down to standard Softmax normalization. Because attention weights strictly sum to 1.0 across the sequence, the network is mathematically forced to allocate its probability mass over whatever tokens are present in the search snippet.
Without an explicit rejection sink or gating mechanism, background tokens absorb residual attention mass, compelling the generation head to extract an answer even from irrelevant text.The 20.0% vocabulary tax on a 31.5M budget:
With a 16,384 vocabulary at hidden size 384 and tied weights, your embedding table consumes ~6.29M parameters.
Out of your 31.47M budget, that single static lookup table accounts for exactly 20.0% of the entire model.
At hidden dimension 384 with GQA (6 heads / 2 KV), a complete transformer block costs roughly ~1.57M parameters. Your static embedding weights equal the parameter budget of 4 full transformer layers.
Applying two-stage low-rank factorization (16,384 -> 64 -> 384 = ~1.07M params) reclaims over 5.2M parameters. Reallocating those weights directly into depth would allow you to expand from 16 to 19 or 20 physical layers within the exact same 31.5M ceiling, providing substantial relational capacity for parsing noisy prose.Context retention and state continuity in tool loops (Row E: 2/5):
In multi-turn tool harnesses, passing raw previous turns and search outputs through dense quadratic attention quickly saturates the 1,024 context window and causes attention dilution.
In an open architecture project called Maba v2 (reference release: https://huggingface.co/AndrewThompson1233/maba-v2-architecture), we explore sub-100M efficiency using a 3:1 macro-topology (DGDA linear recurrence paired with sparse attention):
Instead of re-attending across historical search passes, linear recurrence updates an associative memory matrix in constant O(1) state space. This preserves conversation continuity and tool states across multi-turn queries without context bloat or quadratic slowdown.The 10-epoch curriculum and held-out divergence:
Your tuning vs held-out gap (11/20 down to 6/20) aligns closely with small-model memorization dynamics. In sub-50M regimes, repeating data across 10 epochs tends to drive cross-entropy down while causing zero-shot generalization on unseen syntax to plateau or drift. Fresh token diversity usually yields a much sharper reading threshold than multi-epoch recycling.
Did you observe gradient norm spikes or representation drift during the 10-epoch run when Muon was active on the attention projections?
Best,
Andrew
Thanks Andrew. This is genuinely useful and you clearly read the card closely.
You are completely right about the vocabulary point, and the math checks out. The 16,384 token embedding takes up about 6.3 million parameters, which is a flat 20% of the budget or roughly four layers' worth of capacity. Factorizing it or simply shrinking the vocabulary to buy depth is a real lever. We will test it in the next generation since it lines up perfectly with the work we are already doing to add depth.
I also agree that Row I is a genuine weakness when it comes to the model admitting a result does not contain the answer. The main cause for us right now is the data. We shipped with very few examples of unanswerable prompts, so the model never learned how to make that move. We have added those types of rows to the training data for the next model and expect Row I to improve. Your idea about attention sinks and explicit rejection is really interesting too, and we will keep it in mind if the data fix is not enough.
I really appreciate the quantitative feedback. This is exactly the kind of thing that makes releasing openly worth it.
If you have other ideas, whether on architecture, training data, or how we evaluate these models, we'd genuinely welcome them. Feedback like yours directly shapes what we build next, and we would love to hear anything you would like to share.
Thanks,
The textilelabs team
Hi Textile Labs team,
Glad the vocab math clicked! Gaining 4 extra layers on a 31M budget is going to be huge for depth.
A couple quick thoughts since you asked:
- For unanswerability: adding negative pairs usually does the trick. If it still hallucinates, try adding a dedicated null/sink token at prompt start. It gives Softmax a zero-penalty place to dump attention mass when the text has no answer.
- For tied factorization: when projecting down (e.g. 16k -> 64 -> 384), project back to rank-64 right before the LM head. That way you keep weights tied with the embedding table cleanly.
Really looking forward to Loom Weave 4! :)
Best,
Andrew