Mini-Transformer / README.md
AlaBoussoffara's picture
Update README.md
7633571
|
Raw
History Blame Contribute Delete
9.45 kB
---
title: Mini Transformer Demo
emoji: 🤖
colorFrom: yellow
colorTo: purple
sdk: docker
app_port: 7860
---
# Mini Transformer Demo
Chainlit-powered dialogue interface that loads a mini encoder–decoder Transformer from `trained_models/` and serves it via Hugging Face Spaces. If you want the full project write-up, see [README.project.md](README.project.md).
# Mini-Transformer
A compact, encoder–decoder Transformer packaged so it can be used both as a Python library and as a ready-to-run demo. The repository mirrors the installable package layout so cloning the repo or `pip install mini-transformer` gives the same structure and tooling.
## Highlights
- Typed, unit-tested implementation of an encoder–decoder Transformer with reusable building blocks (`mini_transformer/modules`).
- Hydra configuration system with both packaged defaults (`mini_transformer/conf`) and editable configs in the repo.
- Ready-made UIs: FastAPI REST server and Chainlit chat interface.
- CLI convenience commands for inference, serving, UI launch, and Hugging Face model downloads.
- Makefile shortcuts, notebooks, and Docker dev environment for day-to-day work.
## Models
### Small Model
The small model is a compact encoder-decoder transformer designed for efficient machine translation. Architecture details:
- Parameters: ~25M
- Architecture: 4 encoder/decoder layers, 4 attention heads, d_model=512, d_ff=1024
- Vocabulary: BPE tokenizer with 8K tokens
- Maximum sequence length: 128 tokens
Performance metrics (tested on 10K samples):
- BLEU score: 25.13 (EN-FR translation)
- Token accuracy: 63.43%
- Perplexity: 3.532
- Latency: 38.5ms average, 48.1ms p95 per sentence
- Additional metrics: chrF: 56.17, ROUGE-1: 59.19%, ROUGE-2: 40.03%
The model demonstrates good balance between performance and computational efficiency, making it suitable for deployment in resource-constrained environments while maintaining reasonable translation quality.
## Hugging Face Spaces DEMO
Here you can find a Huggingface Spaces for a quick demo
https://huggingface.co/spaces/AlaBoussoffara/Mini-Transformer
## Installation
```bash
# inside the repository (editable install with optional extras)
pip install -e .[server,viz]
```
Or install the published package:
```bash
pip install "mini-transformer[server,viz]"
```
## Repository Layout
- `src/mini_transformer/` – installable package (model code, CLI, apps, packaged Hydra configs).
- `configs/` – editable Hydra configs for local experiments.
- `trained_models/` – place downloaded or exported checkpoints here (see below).
- `notebooks/` – exploratory notebooks (`train.ipynb`, `tokenizer.ipynb`, etc.).
- `tests/` – unit and smoke tests.
- Supporting files: `pyproject.toml`, `Makefile`, `Dockerfile.dev`, `environment.yml`, etc.
## Training Notebook
`notebooks/train.ipynb` demonstrates the Hydra-driven training loop used during development.
- All hyper-parameters come from the composed config (see `configs/train_mode.yaml`); the key knobs live under `trainer.*`.
- Checkpoint cadence is controlled by `trainer.save_interval` (in optimizer steps) and always saves on epoch boundaries.
- Dataloader behaviour (workers, pinned memory) can be tuned via `trainer.num_workers` and `trainer.pin_memory`.
- Gradient accumulation is respected even for partial micro-batch sets, so you can safely mix different batch counts.
For long-running jobs consider exporting the notebook to a script (`jupyter nbconvert --to script`) or reusing the same logic inside a CLI tool.
## Preparing Models
Download the demo models hosted on Hugging Face:
```bash
mini-transformer-fetch AlaBoussoffara/transformer_test
mini-transformer-fetch AlaBoussoffara/transformer_small
```
Use `--name` to customise the local directory and `--force` to refresh an existing download.
The local folder name defaults to `<author>__<repo>` (e.g. `AlaBoussoffara__transformer_small`). The Hugging Face repo is downloaded as a whole, so if the model files live inside a subfolder (for example `transformer_small/small_model_v1/`), move that entire inner folder—the one that already contains `configs/`, `checkpoints/`, and `tokenizer/`—into `trained_models/` so it becomes your model directory. In practice, after fetching `AlaBoussoffara/transformer_small`, move the `transformer_small/small_model_v1/` directory into `trained_models/` and rename it to the directory name you want to use (for example `AlaBoussoffara__transformer_small/`) so that the final layout is `trained_models/<model-name>/configs/...`.
You can also place your own model manually under `trained_models/<model-name>/`:
```
trained_models/
my-model/
configs/
config_inference.yaml
checkpoints/
best.pt
tokenizer/
tokenizer.json
```
Relative paths in `config_inference.yaml` should stay inside the model folder. Set `MINI_TRANSFORMER_MODELS=/path/to/trained_models` if you store models elsewhere.
## CLI Usage
Install the optional extras (see Installation) and use the commands below.
```bash
mini-transformer-infer --model AlaBoussoffara__transformer_small -t "Once upon a time"
mini-transformer-serve --model AlaBoussoffara__transformer_small --reload
mini-transformer-ui --model AlaBoussoffara__transformer_small --host 0.0.0.0 --port 8000
```
If you see “Tokenizer file not found”, update the model config or set `MINI_TRANSFORMER_TOKENIZER_PATH` to the correct JSON file.
## Chainlit Demo
Follow these steps to spin up the bundled Chainlit chat UI for a local inference demo.
1. Install the project with the server extras (or run `make create-env`):
```bash
pip install -e .[server]
```
2. Download a demo checkpoint (skip if you already have one under `trained_models/`):
```bash
mini-transformer-fetch AlaBoussoffara/transformer_small
```
3. Launch the Chainlit UI, pointing to the model folder you want to use (defaults to the first available model):
```bash
mini-transformer-ui --model AlaBoussoffara__transformer_small --host 0.0.0.0 --port 8000
```
4. Open http://localhost:8000 in your browser, send a prompt, and use `/model` in chat to switch between downloaded checkpoints.
Use `/config temperature=0.7 top_k=50` (or `/config reset`) to tweak generation settings on the fly.
### Environment Variables
- `MINI_TRANSFORMER_MODELS` – override the models root directory.
- `MINI_TRANSFORMER_MODEL_NAME` – preselect a model for the server/UI.
- `MINI_TRANSFORMER_CONFIG_DIR` / `MINI_TRANSFORMER_CONFIG_NAME` – point to custom Hydra configs.
- `MINI_TRANSFORMER_UI_HOST` / `MINI_TRANSFORMER_UI_PORT` – defaults for Chainlit binding.
- Optional overrides: `MINI_TRANSFORMER_CHECKPOINT_BEST`, `MINI_TRANSFORMER_TOKENIZER_PATH`, `MINI_TRANSFORMER_OUTPUT_DIR`, etc.
## Docker Inference UI
Build the lean inference image and launch the Chainlit UI in a container:
```bash
make docker-build-infer
make docker-run-infer # press Ctrl+C to stop
```
Models stay outside the container under `trained_models/`, mounted at runtime with docker compose.
## Programmatic Inference
```python
from mini_transformer.model_loader import compose_model_config
from mini_transformer.inference import run_inference
cfg = compose_model_config("AlaBoussoffara__transformer_small")
cfg.input_text = "Hello world"
print(run_inference(cfg)[0])
```
## Development Quickstart
```bash
make create-env
make lint
make type
make test
pre-commit run --all-files # optional: run all hooks locally
```
## Testing & QA
- Unit tests live under `tests/units/`; run them with `make test` or `python -m pytest`.
- The suite covers core building blocks (attention math, masking, sampling), CLI flows, and attention-debug utilities—including both pre- and post-layernorm configurations.
- Add tests alongside new features; keeping coverage high ensures `mini-transformer` behaves the same whether it runs from the repo or as an installed package.
## Makefile Shortcuts
```bash
make help # list common tasks
make create-env # create/update the conda env and install extras
make lint # format + lint (ruff + black)
make lint-check # lint without auto-fixes
make fmt # format code
make precommit # run the configured pre-commit hooks (auto-fixes where possible)
make type # mypy
make test # pytest
make cov # pytest with coverage
make fetch-test # download AlaBoussoffara/transformer_test
make fetch-small # download AlaBoussoffara/transformer_small
make infer # quick demo inference
make serve # run FastAPI server (reload mode)
make ui # launch Chainlit UI
make docker-build-dev # build the development container
make docker-run-dev # open an interactive shell in the development container
make docker-build-infer # build the inference/UI container
make docker-run-infer # run the inference service (Ctrl+C to stop)
```
## Full Workflow At A Glance
1. Fetch a model: `mini-transformer-fetch AlaBoussoffara/transformer_small`
2. Run inference: `mini-transformer-infer --model AlaBoussoffara__transformer_small -t "Once upon a time"`
3. Launch FastAPI (optional): `mini-transformer-serve --model AlaBoussoffara__transformer_small --reload`
4. Start Chainlit UI (optional): `mini-transformer-ui --model AlaBoussoffara__transformer_small --host 0.0.0.0 --port 8000`
Environment variables (`MINI_TRANSFORMER_MODELS`, `MINI_TRANSFORMER_MODEL_NAME`, etc.) let you tailor the workflow to your setup.