Pantheon/docs/guides/install.md

129 lines
6.0 KiB
Markdown

# Install
Build and run Pantheon on each supported platform. For a first run, see
[Quickstart](quickstart.md).
## Requirements
- A C11 compiler and `make`.
- Foundry, a git submodule at `./foundry`. Clone with
`git clone --recursive https://git.teamide.dev/David/Pantheon.git`; in an existing
clone run `git submodule update --init`. The Makefile looks for Foundry in this order:
`FOUNDRY=/path/to/foundry`, then `./foundry` (the submodule, or a symlink), then
`../foundry` (a sibling checkout). If none exists the build stops with
`Foundry not found at ...`.
- Nothing else for a CPU build. BLAS, threads and accelerators are opt-in flags.
## Linux (CPU)
```bash
sudo apt install libopenblas-dev # only for USE_BLAS=1
make USE_BLAS=1 USE_THREADS=1 pantheon
```
- `USE_BLAS=1` links OpenBLAS (`-lopenblas`).
- `USE_THREADS=1` adds the compute thread pool; size it with `PN_THREADS` (`0` = auto).
## macOS
```bash
make USE_BLAS=1 USE_THREADS=1 pantheon # Accelerate
make USE_BLAS=1 USE_THREADS=1 USE_METAL=1 pantheon # + Metal GPU backend
```
`USE_BLAS=1` uses Apple's Accelerate framework, so no extra install is needed.
`USE_METAL=1` (macOS only) compiles Foundry's Objective-C Metal backend and links the
Metal, MetalPerformanceShaders and Foundation frameworks.
## NVIDIA CUDA
```bash
make USE_CUDA=1 USE_BLAS=1 pantheon # Linux only
```
- **No CUDA toolkit or `nvcc` needed to build.** The kernels are embedded as PTX
(ISA 7.4, target `sm_37`) and the driver is loaded with `dlopen` at run time.
- **At run time** the process needs `libcuda.so.1` (the NVIDIA driver). The PTX needs a
driver that supports CUDA 11.4 or newer; Kepler cards such as the Tesla K80 top out at the
470 driver branch. cuBLAS (`libcublas.so.11`) is optional — without it a warning prints and
the custom kernels are used.
- With no driver or no card, the same binary runs on the CPU. `GET /` then reports
`"dies_visible": 0`.
- Pick devices with `--dies 0,1` or `CUDA_VISIBLE_DEVICES`; die numbers are relative to the
visible devices.
## Tenstorrent
**Ornith 1.5 9B is the only model supported on the card for now**; other models may load but
are not supported. The quick way is the two scripts at the repo root:
```bash
./install.sh # build pantheon-tt, set up card access (udev rule; asks before sudo)
./run_ornith.sh # download + check the model, serve on 127.0.0.1:8080
```
By hand:
```bash
make USE_TT=1 pantheon # Linux only, Blackhole p150a
```
- **No TT software needed to build.** Tensix programs are embedded in the binary
(`foundry/tt/ft_tt_programs.h`), so neither SFPI nor tt-metal is required.
- **At run time** the card must be reachable: by default through tt-kmd
(`/dev/tenstorrent/<n>`), or with `FT_TT_DRIVER=udrv` through Foundry's userspace driver,
which needs no kernel module but needs root or the udev rule
`foundry/tt/tools/60-foundry-blackhole.rules`. An explicit `FT_TT_DRIVER=udrv` that cannot
reach the card stops the process rather than falling back to the CPU.
- Read [accel-foundry.md §7](../architecture/accel-foundry.md) before running on the card:
what it can serve today, known limits, and hazards that cost a power cycle.
## Which binary you built
Each backend writes its own file and `pantheon` is a symlink to the last one built:
| Build | Binary |
|---|---|
| `make` | `pantheon-cpu` |
| `make USE_CUDA=1` | `pantheon-cuda` |
| `make USE_TT=1` | `pantheon-tt` |
| `make USE_METAL=1` | `pantheon-metal` |
Combined flags get combined names (e.g. `pantheon-cuda-tt`). Check what a binary is with
`./pantheon --backend` (prints `cuda`, `tt`, `metal` or `cpu`). Restore the link without
rebuilding: `ln -sfn pantheon-cuda pantheon`.
## Hardware notes
- **Build on the machine you run on.** The default flags include `-march=native`, so a binary
built on an AVX2 machine dies with `Illegal instruction` (SIGILL) on an older CPU such as a
no-AVX Pentium. `PORTABLE=1` builds a copyable binary instead (`-march=x86-64-v2` on x86-64,
the compiler default elsewhere), at some cost in speed.
- **Small hosts.** The `pantheon` binary is a single compiler invocation; `-j` only helps the
test build. On a 2-core host use `make -j2 ... test`.
- **Host RAM.** 8 GB is the design point: weights are mmap'd, and after a GPU upload the CUDA
paths drop the weight page cache (`QWEN35_DROP_WEIGHTS`, on by default).
## Running the tests
```bash
make USE_BLAS=1 test
```
Tests that need a model file print `[SKIP]` with the env var to set (e.g. `PN_QWEN35_MODEL`).
## Troubleshooting
| Symptom | Meaning / fix |
|---|---|
| `Illegal instruction` at start | Built on a newer CPU. Rebuild on the target machine. |
| `serve: REFUSED to start — ... has NO accelerator backend compiled in` | `--dies` was given to a binary without that backend. Check `./pantheon --backend`; build with `USE_CUDA=1` / `USE_TT=1`, or drop `--dies` to serve on the CPU. |
| `serve: REFUSED ... the die manager probed 0 dies` | Backend present but no device visible: driver not loaded, card missing, or `CUDA_VISIBLE_DEVICES` empty. |
| HTTP `429 server_busy` with `Retry-After` | Every decode slot is busy and the queue is full (or a 30 s queue wait timed out). Retry after the given seconds. |
| HTTP `429 model_at_session_capacity` | A new `session_id` while all `max_sessions` slots hold live sessions. Release idle sessions (`POST /session/release`) or raise `--max-sessions`. |
| HTTP `503 server_memory_constrained` | Host memory pressure: admission refused the prompt, or the queue is full under critical pressure. Transient; retry later. |
| HTTP `422 context_over_budget` | The prompt exceeds the per-session window (`kv_cap`). Not transient: shorten the conversation, then retry. Nothing is dropped silently. |
| `bpe: tokenizer.ggml.pre is unsupported; falling back to the qwen35/GPT-2 pre-tokenizer` | The model's pre-tokenizer is not implemented (e.g. SmolLM2). It still runs, but prompt token IDs may differ from the reference. See [supported-models.md](../reference/supported-models.md#known-issues). |
Full error list: [HTTP API](../reference/http-api.md#error-responses).