--- 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 `__` (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//configs/...`. You can also place your own model manually under `trained_models//`: ``` 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.