sarasa
A minimum LLM training framework built on pure PyTorch with simplicity and extensibility.
[!CAUTION]
sarasais developed by an error-prone human and thus may contain many bugs. Use it at your own risk.
Installation
uv sync [--extra cpu|cu128|cu130] [--extra flash_attn]
or
uv add sarasa[cpu|cu128|cu130]
Features
-
Pure PyTorch implementation
-
Flexible configuration system with command-line overrides
-
Support from a single GPU to multiple GPUs (simple DDP and FSDP for now)
-
Selective activation checkpointing (SAC) for memory efficiency
-
Async distributed checkpoint saving / loading
-
Profiling
-
FP8 training
-
Post-training
Usage
It's (almost) ready to use. First, set up tokenizer, e.g.,
mkdir tokenizer
cd tokenizer
uvx hf download --local-dir . --include "tokenizer*" "meta-llama/Llama-3.1-8B"
Then, the following command starts training of a GPT model on FineWeb-edu with a single or multiple GPUs.
uv run torchrun --nproc_per_node="gpu" main.py \
--config-file configs/example.py \
[--train.local-batch-size 8 ...] # override config options as needed
For details, run
uv run torchrun --nproc_per_node="gpu" main.py --help
Extending sarasa with Custom Components
Extending sarasa is as simple as defining your own configuration dataclasses with create methods.
Users can define custom configurations for models, optimizers, learning-rate schedulers, and datasets.
Here's an example of using a custom optimizer:
from sarasa import Trainer, Config
from custom_optim import CustomOptimizer, CustomOptimizer2
@dataclass
class CustomOptim:
lr: float = ...
def create(self,
model: torch.nn.Module
) -> torch.optim.Optimizer:
return CustomOptimizer(model.parameters(), lr=self.lr, ...)
@dataclass
class CustomOptim2:
lr: float = ...
def create(self,
model: torch.nn.Module
) -> torch.optim.Optimizer:
return CustomOptimizer2(model.parameters(), lr=self.lr, ...)
if __name__ == "__main__":
config = Config.from_cli(optim_type=CustomOptim | CustomOptim2)
trainer = Trainer(config)
trainer.train()
Thanks to tyro's type support, sarasa can automatically recognize multiple custom optimizer types.
From the command line, you can specify which custom optimizer to use:
python script.py optim:custom_optim --optim.lr 0.001 ...
# or
python script.py optim:custom_optim2 --optim.lr 0.002 ...
(As tyro automatically converts config class names from CamelCase to snake_case, config class names are recommended not to include Config suffixes.)
Config File Example
It's very simple. IDE autocompletion will help you.
from sarasa import Config, Data, LRScheduler, Model, Train, LRScheduler
from custom_optim import CustomOptim
# only one Config instance should be defined in each config file
config = Config.create(
model=Model(num_layers=12),
train=Train(
local_batch_size=16,
global_batch_size=256,
dtype="bfloat16",
),
optim=CustomOptim(lr=0.001),
lr_scheduler=LRScheduler(
decay_type="linear",
warmup_steps=1000,
total_steps=100000,
),
data=Data(tokenizer_path="./tokenizer"),
seed=12,
)
Acknowledgements
This project is heavily inspired by and borrows code from torchtitan.
Release files for sarasa 0.0.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sarasa-0.0.12.tar.gz | 33.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sarasa-0.0.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 71.0 kB
Release files / sarasa-0.0.12.tar.gz
| Download URL | sarasa-0.0.12.tar.gz |
|---|---|
| Size | 33.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36e0d73fabb8916a965367f23541fdd13a331c66c141d0a87f965cc517885493
|
|
BLAKE2b-256 checksum How to use checksums |
e6dcada9276ac0f62ac379b60b5050c4ad8ad5e25f371b736d504784e3a8f658
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
|
Release files / sarasa-0.0.12-py3-none-any.whl
| Download URL | sarasa-0.0.12-py3-none-any.whl |
|---|---|
| Size | 37.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eb5090ea0f6d0caa139f9db94bcbd69286b067ba06feab58fbf60bedc18d2eae
|
|
BLAKE2b-256 checksum How to use checksums |
171bbe642d9e8c4a7da75ea7d63f3028ff308bccb615d18a19386593e596d8cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
|