Gufo OCI Images for AMD Strix Halo

CI

Reproducible Docker and Podman images for local LLM inference, development, serving, and coding-agent evaluation on AMD Ryzen AI Max (Strix Halo). Images are built directly from pinned Nix flake derivations for gfx1151 and XDNA2.

Toolbx and Distrobox are not supported. The containers run as the dedicated gufo user (UID/GID 1000:1000) and contain no sudo or PAM stack.

Images

Image Reference Purpose
gufo-runtime ghcr.io/gufo-org/toolboxes/gufo-runtime:latest Gufo inference, serving, benchmarks, and diagnostics
gufo-dev ghcr.io/gufo-org/toolboxes/gufo-dev:latest C++/HIP development, profiling, and kernel tuning
eval-agent ghcr.io/gufo-org/toolboxes/eval-agent:latest Coding-agent evaluation against an endpoint you select
gufo-eval-agent ghcr.io/gufo-org/toolboxes/gufo-eval-agent:latest Local Gufo serving and eval-agent in one container

The examples use rootless Podman with crun. --userns=keep-id:uid=1000,gid=1000 maps the invoking host user to the image's gufo account, so writable bind mounts work without changing their ownership. --group-add keep-groups carries the caller's supplementary GPU groups into the container.

For Docker, omit --userns=keep-id:uid=1000,gid=1000, replace --group-add keep-groups with numeric --group-add options for the GIDs owning /dev/kfd and the AMD render node, and ensure writable bind mounts permit UID 1000.

Pull

./refresh-toolboxes.sh all

# Or pull one image directly.
podman pull ghcr.io/gufo-org/toolboxes/eval-agent:latest

Gufo runtime

The container user needs the supplementary GIDs that own the host GPU device nodes. On a typical system:

podman run --rm -it \
  --userns=keep-id:uid=1000,gid=1000 \
  --device /dev/kfd \
  --device /dev/dri \
  --group-add keep-groups \
  --ulimit memlock=-1 \
  -v /path/to/models:/models:ro \
  ghcr.io/gufo-org/toolboxes/gufo-runtime:latest \
  gufo diagnose

Replace renderD128 if the AMD render node has another number. Run a model by replacing the final command, for example:

gufo bench --model /models/model.gguf -p 512 -n 128

Evaluate an existing endpoint

--network host makes a server on the Linux host's loopback interface visible at the same address inside the container. Bubblewrap requires the relaxed container seccomp policy to create the evaluation sandbox.

mkdir -p results

podman run --rm -it \
  --userns=keep-id:uid=1000,gid=1000 \
  --network host \
  --security-opt seccomp=unconfined \
  -v "$PWD/results:/results" \
  ghcr.io/gufo-org/toolboxes/eval-agent:latest \
  eval-agent run sparql-university \
    --base-url http://127.0.0.1:8080/v1 \
    --output /results/result.json \
    --platform strix-halo \
    --engine gufo \
    --backend rocm

Set GUFO_EVAL_API_KEY with --env when the endpoint requires a credential. The image includes a single-user Nix database; the gufo user owns only the store metadata and top-level directory needed to realize task derivations.

Start Gufo and evaluate it

The combined image provides eval-agent-with-gufo. It starts Gufo, waits for /v1/models, runs eval-agent, and always stops the server afterward.

mkdir -p results

podman run --rm -it \
  --userns=keep-id:uid=1000,gid=1000 \
  --device /dev/kfd \
  --device /dev/dri \
  --group-add keep-groups \
  --security-opt seccomp=unconfined \
  --ulimit memlock=-1 \
  -v /path/to/models:/models:ro \
  -v "$PWD/results:/results" \
  ghcr.io/gufo-org/toolboxes/gufo-eval-agent:latest \
  eval-agent-with-gufo --model /models/model.gguf -- \
    run sparql-university \
    --output /results/result.json \
    --platform strix-halo \
    --engine gufo \
    --backend rocm

Launcher defaults match eval-agent: port 8080, context 32768, and maximum generation 16384. Override them with launcher options or GUFO_MODEL, GUFO_HOST, GUFO_PORT, GUFO_CONTEXT, and GUFO_MAX_TOKENS. Repeat --llm-arg ARG for additional Gufo LLM options.

Development image

Mount a checkout owned by UID 1000 and start the default shell:

podman run --rm -it \
  --userns=keep-id:uid=1000,gid=1000 \
  --device /dev/kfd \
  --device /dev/dri \
  --group-add keep-groups \
  --ulimit memlock=-1 \
  -v "$PWD:/workspace" \
  -w /workspace \
  ghcr.io/gufo-org/toolboxes/gufo-dev:latest

Build locally with Nix

nix run .#stream-gufo-runtime | podman load
nix run .#stream-gufo-dev | podman load
nix run .#stream-eval-agent | podman load
nix run .#stream-gufo-eval-agent | podman load

nix build .#packages.x86_64-linux.gufo-runtime-image

Host configuration and background serving

License

MIT. See LICENSE.

S
Description
Gufo OCI Images for AMD Strix Halo
Readme MIT
281 KiB
0 Stars 1 Watchers 0 Forks
Languages
Nix 44.4%
Shell 41.2%
Dockerfile 14.4%