Four sections: env var naming rule (HIP collision, TEMP/HOST/GPU_MAX_HEAP_SIZE), crash-loop diagnostic procedure, operational quirks (sudo -S, pkill -x, slow load, page-cache confound), and the Dankclaw memory model (96 GiB SVM budget).
5.5 KiB
AGENTS.md — vllmScripts Agent Rules
Overview
This project manages deployment scripts for two LLM inference servers. Dankclaw runs a vLLM-ROCm service for Ling-3.0-flash (CIRU INT4). Dankserver runs a llama.cpp service for Qwen3.6-35B-A3B (HauhauCS uncensored Q6_K_P) with a DFlash draft and CPU-offloaded MoE experts. See docs/deployment.md for the full deployment and update process.
Git Workflow
All script edits must flow through git. Do not edit files on the remote machine directly.
Protocol
- Source the script from the target machine — fetch it from the server where it runs
- Place it in this repo — commit the fetched version
- Edit here — make all changes locally in the working tree
- Commit and push — push to origin (Gitea on dankclaw)
- Pull on the target —
git pullon the remote machine before restarting - Restart the service — use the updated script on the target
Deployment & Update Process
Use scripts/deploy.sh to deploy committed changes to a target. It pushes main, pulls on the target, restarts the service, and checks the health endpoint.
./scripts/deploy.sh dankclaw # vLLM (frank-default-large, port 7770)
./scripts/deploy.sh dankserver # llama.cpp (frank-default-small, port 7770)
./scripts/deploy.sh dankclaw --dry-run # preview without changes
Deployment workflow:
graph LR
A[Edit locally] --> B[Commit]
B --> C[Push to origin]
C --> D[deploy.sh: pull on target]
D --> E[restart service]
E --> F[health check]
Target map:
| Target | Host | Runtime | Service | Port |
|---|---|---|---|---|
| Dankclaw | dank@dankclaw | vLLM-ROCm (CIRU INT4) | frank-default-large | 7770 |
| Dankserver | dank@dankserver | llama.cpp (Q6_K_P + DFlash, MoE offload) | frank-default-small | 7770 |
Runtime & Troubleshooting
Env var naming rule — HIP runtime collision
The ROCm HIP runtime reads the bare environment variables TEMP, HOST, and GPU_MAX_HEAP_SIZE. The serve scripts export the env file with set -a. A tunable named TEMP leaks into HIP. On 2026-08-13 TEMP=1.0 made HIP use the path 1.0 for its JIT kernel cache, then segfaulted every model load. Commit 227ce01 fixed it by renaming the sampling variable to TEMPERATURE.
Never name a tunable TEMP, HOST, or GPU_MAX_HEAP_SIZE. Check for collisions with this command:
strings /opt/rocm-*/lib/libamdhip64.so.* | grep -xE "TEMP|HOST|GPU_MAX_HEAP_SIZE"
Crash-loop diagnostic procedure
When a llama service segfaults during model load, follow these steps.
graph TD
A[Service SEGVs at load] --> B[Read journal + kernel segfault line]
B --> C{Segfault in libamdhip64?}
C -- yes --> D[Bisect script vs raw binary]
C -- no --> E[Check config, memory, model files]
D --> F[Run gdb for backtrace]
F --> G[Find root cause]
- Read the service journal with
journalctl -u <service> -n 100. Then read the kernel segfault line withjournalctl -k. A segfault at address 8 inlibamdhip64means a NULL unref in the HIP runtime. - Run the serve script directly. Then run the raw binary with the same flags. A different outcome isolates the env file sourcing.
- Run gdb for the backtrace with this command:
gdb -batch -ex run -ex "bt 25" --args bash scripts/serve-llama-frank-large.shllama-serverbuffers its timed stdout. On SIGSEGV the log tail is lost. Trust gdb, not the log. - Kernel spam about
amdgpu: SVM mapping failedis a symptom, not the root cause. Investigate other causes before assuming memory pressure.
Operational quirks
sudoon both boxes needs a tty. The remote sudo steps indeploy.shfail non-interactively. Useecho '<password>' | sudo -S <command>.- Never run
pkill -fwith a pattern that appears in your own command line. It kills your ssh session. Usepkill -x <exact-name>. - Model load is slow: about 3 minutes warm, more than 8 minutes cold. Health returns
503 Loading modelthe whole time. That is normal. Do not kill the process. - Page-cache state confounds crash tests. Cold-cache loads are slow and survive. Warm-cache loads crash fast. Control for it when testing.
Dankclaw memory model
The GPU budget on Dankclaw is the rocm-smi figure: 96 GiB addressable VRAM (SVM). The GPU node reports local_mem_size 0, so all allocations are GTT/SVM-backed. Trust rocm-smi and the runtime. Do not use free or dmidecode for the GPU budget; they show the CPU-side carve-out. This is intentional. Do not change it.
Why
Direct edits on the remote drift from version control. Future agents will not know what changed. Git is the single source of truth.
User request → Fetch script from remote → Commit here → Edit → Commit → Push → Pull on remote → Restart
Summary
| Context | Action |
|---|---|
| Editing a deployment script | Work through git — fetch, commit, edit, push, pull, restart. Never edit on the remote directly. |
| Script exists only on remote | Pull it into the repo first — commit the fetched version before making changes. |
| Unstaged local changes | Commit or discard — check git status before starting work. Ask the user if unsure. |
| Deploying a committed change | Run scripts/deploy.sh <target> — it pushes, pulls on the target, restarts the service, and checks health. See docs/deployment.md. |
| Tests exist | Run them — verify tests pass after every change. Do not commit failing tests. |