129 lines
6.0 KiB
Markdown
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).
|