📦 Installation¶
There are three ways to get LiSa-LLM running. Pick the first one that fits:
| Way | Best for | Needs |
|---|---|---|
| Release binary | Bare-metal Linux servers and desktops | Linux with glibc 2.35+ |
| Container image | Docker, Compose, Kubernetes, macOS/Windows via Docker Desktop | Docker or Podman |
| Build from source | NVIDIA GPUs other than the CUDA image's, tuning for your exact CPU, hacking | A C++20 compiler, CMake |
Then grab a model (Getting a model) and head to the quick start.
Release binaries¶
Every release ships a ready-to-run archive for Linux x86_64 and aarch64 (64-bit Arm):
VERSION=1.0.1 ARCH=x86_64 # or aarch64
curl -LO https://github.com/Yog-Sotho/LiSa-LLM/releases/download/v$VERSION/lisa-$VERSION-linux-$ARCH.tar.gz
tar xzf lisa-$VERSION-linux-$ARCH.tar.gz
./lisa-$VERSION-linux-$ARCH/bin/lisa --version
What's inside:
| Path | What it is |
|---|---|
bin/lisa |
The server. Everything but glibc is linked in: no libraries to install |
config.yaml |
The sample configuration, every option commented |
doc/ |
README, changelog, security policy, threat model |
THIRD-PARTY-NOTICES.md, licenses/ |
Licences of everything linked into the binary |
- Which Linux? Any with glibc 2.35 or newer: Ubuntu 22.04, Debian 12, Fedora 36, RHEL 10
and their successors. Check yours with
ldd --version. - Which CPU? The x86_64 build targets x86-64-v3: AVX2, FMA and F16C (Intel Haswell or AMD Excavator, 2013, or newer). On an older CPU it stops at startup with a clear message instead of crashing; build from source to run there.
- Put
bin/lisaanywhere on yourPATH, e.g.sudo install -m 755 lisa-*/bin/lisa /usr/local/bin/.
Verify what you downloaded before running it: see Verifying a release.
Container images¶
Images live on the GitHub Container Registry:
| Image | Platforms | What it runs |
|---|---|---|
ghcr.io/yog-sotho/lisa-llm:1.0.1 (also :latest) |
linux/amd64, linux/arm64 | CPU inference |
ghcr.io/yog-sotho/lisa-llm:1.0.1-cuda (also :latest-cuda) |
linux/amd64 | NVIDIA GPUs, compute capability 7.5–9.0 (Turing to Hopper) |
KEY="$(openssl rand -hex 24)"; echo "Your API key: $KEY"
docker run --rm -p 8080:8080 -v ./models:/models:ro \
-e LISA_API_KEYS="$KEY" -e LISA_API_KEY= \
ghcr.io/yog-sotho/lisa-llm:1.0.1
- The model is expected at
/models/model.gguf(mount a folder that has one, or setLISA_MODEL_PATH). LISA_API_KEY=clears the image's placeholder key. The server listens on0.0.0.0inside the container and refuses to start with a weak or placeholder key there.- The images run as an unprivileged user (UID 10001) and have a
HEALTHCHECKthat asks/readyz. - In the plain image the sandbox is off, because Docker's default security profiles block the
user namespaces it needs. To turn it on, see Deployment → Sandbox in a container,
or use the
lisa-sandboxedCompose service.
For Docker Compose, Kubernetes and GPU setups, see Deployment.
Build from source¶
1. Install the tools¶
- CMake 3.28 or newer, and Ninja (or Make)
- A C++20 compiler: GCC 13+ or Clang 18+
- OpenSSL 3 (model SHA-256 and TLS), libseccomp (the sandbox), yaml-cpp (built from source if missing)
- Optional: the CUDA toolkit for NVIDIA GPU offload
Ubuntu / Debian:
sudo apt update
sudo apt install build-essential cmake ninja-build pkg-config libssl-dev libyaml-cpp-dev libseccomp-dev
Fedora / RHEL:
sudo dnf install gcc-c++ cmake ninja-build openssl-devel yaml-cpp-devel libseccomp-devel
Arch Linux:
sudo pacman -S base-devel cmake ninja openssl yaml-cpp libseccomp
llama.cpp, cpp-httplib, nlohmann/json and Catch2 are downloaded by CMake while it configures, each
pinned to a release tag whose commit (or archive SHA-256) is checked. Building offline? Point
FETCHCONTENT_SOURCE_DIR_<NAME> at local checkouts.
2. Build¶
git clone https://github.com/Yog-Sotho/LiSa-LLM.git
cd LiSa-LLM
cmake --preset release
cmake --build --preset release
ctest --preset release # optional: the unit tests
./build/release/lisa --version
| Preset | What you get |
|---|---|
release |
Optimised build with portable CPU flags (x86-64-v3); add -DLISA_NATIVE=ON to tune for this machine |
portable |
The release-archive build: static dependencies, runs on other machines |
cuda |
NVIDIA GPU offload (needs the CUDA toolkit) |
dev, asan-ubsan, tsan, coverage, fuzz |
For contributors: see CONTRIBUTING.md |
Main CMake options:
| Option | Default | Meaning |
|---|---|---|
LISA_CUDA |
OFF |
CUDA offload |
LISA_SANDBOX |
ON |
The sandboxed worker (needs libseccomp) |
LISA_TLS |
ON |
HTTPS support (needs OpenSSL) |
LISA_NATIVE |
ON |
Tune for the build machine's CPU |
LISA_HARDENING |
ON |
Stack protector and clash protection, _FORTIFY_SOURCE=3, CET, full RELRO, PIE |
LISA_PORTABLE |
OFF |
Link dependencies statically for distribution |
LISA_SANITIZERS |
empty | e.g. address,undefined |
3. Build the container yourself¶
docker build -t lisa-llm . # CPU
docker build -t lisa-llm:cuda \
--build-arg BUILD_IMAGE=nvidia/cuda:12.6.3-devel-ubuntu24.04 \
--build-arg RUNTIME_IMAGE=nvidia/cuda:12.6.3-runtime-ubuntu24.04 \
--build-arg LISA_CUDA=ON . # GPU
The lisa-cuda service in docker-compose.yml has the same build
arguments, with the base images pinned by digest.
Getting a model¶
LiSa runs any GGUF model llama.cpp supports: Llama, Mistral, Qwen, Gemma, Phi, DeepSeek and many more, in every quantisation. The tokenizer and chat template come from the file itself.
mkdir -p models
# Tiny and fast, good for a first try (≈ 490 MB)
curl -L -o models/model.gguf \
https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q4_k_m.gguf
# A more capable chat model (≈ 2 GB)
curl -L -o models/model.gguf \
https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q4_K_M.gguf
Fine-tuned your own with LLM Fine-Tuner? Its GGUF export loads as is.
Tip: pin the exact file you meant to serve. Put its checksum in the config and LiSa refuses to start on anything else:
sha256sum models/model.gguf # → model_sha256: "<the 64 hex digits>"
Verifying a release¶
Release archives and images are signed with Sigstore by the release workflow. The signing is keyless: the certificate names this repository's workflow and the tag, so nobody can sign with it from anywhere else. Every artifact also carries SLSA build provenance and an SPDX SBOM (the list of everything inside).
You need cosign and, for the provenance checks, the GitHub CLI.
VERSION=1.0.1 FILE=lisa-1.0.1-linux-x86_64.tar.gz
IDENTITY="https://github.com/Yog-Sotho/LiSa-LLM/.github/workflows/release.yml@refs/tags/v$VERSION"
ISSUER=https://token.actions.githubusercontent.com
# Archive: checksum, signature, provenance
sha256sum --check --ignore-missing SHA256SUMS
cosign verify-blob "$FILE" --bundle "$FILE.sigstore.json" \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER"
gh attestation verify "$FILE" --repo Yog-Sotho/LiSa-LLM
# Image: signature, provenance, SBOM
cosign verify ghcr.io/yog-sotho/lisa-llm:$VERSION \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER"
gh attestation verify oci://ghcr.io/yog-sotho/lisa-llm:$VERSION --repo Yog-Sotho/LiSa-LLM
cosign verify-attestation --type spdxjson ghcr.io/yog-sotho/lisa-llm:$VERSION \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER" > /dev/null
SHA256SUMS, the .sigstore.json bundles and the .spdx.json SBOMs are attached to each
GitHub release.
Support matrix¶
| Status | |
|---|---|
| Linux x86_64 | Release binary (x86-64-v3) and images; developed and benchmarked here |
| Linux aarch64 | Release binary and image, built and unit-tested on GitHub's Arm runners |
| Kernel | 5.13+ recommended (Landlock); the sandbox needs unprivileged user namespaces and seccomp |
| NVIDIA GPUs | CUDA image for compute capability 7.5–9.0; any CUDA GPU when built from source; GPU mode runs without the sandbox |
| AMD/Intel GPUs, Apple Metal | Not yet (llama.cpp's Vulkan, ROCm and Metal backends aren't wired up) |
| macOS, Windows, BSD | Not supported natively (the sandbox is Linux-only); use the container image |