🛏️ trimbed
Trim a tokenizer's vocabulary, and optionally its model's embedding table, down to the subset you actually need. You can specify "what you need" explicitly, by presets, or by providing a corpus (one or more datasets) as an anchor for what you'd actually like to keep.
The most typical use would be to provide a corpus of the domain and/or language that is relevant for you, and then specifying to, for example, keep only the top 32k tokens from that corpus, or to remove the tail of the corpus by only keeping 99.95% of its tokens. But more options are available!
Read the documentation for the full guides and the API reference.
Installation
pip install trimbed # tokenizer trimming only
pip install "trimbed[model]" # + torch, for trimming embeddings
pip install "trimbed[model,convert]" # + sentencepiece/protobuf, for spiece-only tokenizers
Or preferably with uv add.
From a git clone the above would be uv sync, uv sync --extra model and
uv sync --all-extras.
Quickstart
Installing the package comes with the trimbed command, which is the main entrypoint
for users. It has a number of subcommands: trim, count, inspect and presets.
trimbed --help lists them.
If you have only cloned the repository, python -m trimbed.cli works too.
# What am I dealing with?
trimbed inspect --model codefuse-ai/F2LLM-v2-160M
# Trim tokenizer + model from a config file
trimbed trim --config my_config.yaml
# Same config but overridden one value and nothing written (dry-run)
trimbed trim --config my_config.yaml --dry-run selection.top_k=30000
# Or without a config, keeping a preset
# (only all alphanumeric tokens in the vocab are kept),
# and the model is not trimmed
trimbed trim --model google-bert/bert-base-multilingual-cased \
--keep-preset alphanumeric --output-dir trimmed/bert --no-trim-model
From Python:
from trimbed import TrimConfig, TrimPipeline
config = TrimConfig.from_yaml("my_config.yaml")
report = TrimPipeline(config).run()
print(report.render())
examples/ has a few Python examples: inspecting a tokenizer, trimming from
rules alone, trimming over a corpus with the model, and registering your own preset.
What it does
- One code path for every family. trimbed operates on the
tokenizersbackend document (tokenizer.json) rather than on SentencePiece protobufs, so BPE, WordPiece, Unigram and WordLevel are all covered. The vocabulary surgery itself is delegated to skeletoken. - Selection with provenance. Structural tokens, must-keep rules and the corpus frequency ranking are unioned, closed over BPE merge dependencies, then capped. Every kept token records why it survived.
- Prompts and chat templates stay intact.
keep_textsandkeep_chat_templatekeep the ids a prompt is made of, so it goes on tokenizing exactly as it does now. - The model follows. Embedding table, output head, head bias, tied and untied,
encoder-decoders,
pad_to_multiple_ofalignment rows, and the token ids stored on the config and generation config. - It proves its work. Both tokenizers re-encode sampled texts, and both models can be run and compared, before anything is called a success.
Documentation
| Command line | The four subcommands and their flags |
| Configuration | Every config field, and how the override layers stack |
| How selection works | What survives a trim and why |
| Trimming a model | Embedding and head surgery, and verification |
| Output and reports | What lands in the output directory |
| Extending trimbed | A new tokenizer family or a new preset |
| API reference | Every public symbol |
Contributing
See CONTRIBUTING.md. In short: make style, make test and
make build-docs before you push.
Acknowledegments
We rely heavily on the internals of skeletoken to map out tokenizers to a standardized Pydantic format.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trimbed-0.0.2.tar.gz.
File metadata
- Download URL: trimbed-0.0.2.tar.gz
- Upload date:
- Size: 221.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
291c4993b9a785e0ac7eeb6bae1ecc2c168916b4def5bdc104a92e829fa9aa1e
|
|
| MD5 |
a6a8a3555463f6382cce76d1f3a94250
|
|
| BLAKE2b-256 |
6c3b8d9a6dd1035e9db8eef8b9dc2f2bba69dff42e514dc8e2c737c91b2fbebe
|
File details
Details for the file trimbed-0.0.2-py3-none-any.whl.
File metadata
- Download URL: trimbed-0.0.2-py3-none-any.whl
- Upload date:
- Size: 72.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c3c22ce6c4b666f4894bab63978cb61800542726ae10858d53d44b735a77f75
|
|
| MD5 |
6ad65279fd3ac0d33fee0cab4a3ce13e
|
|
| BLAKE2b-256 |
533e2858be38accc1bc7d7a0f50f55bc9ca1f846c807f59d0592d7c647f70344
|