User request 2026-08-19 (second pass): parallel slots degraded performance. PARALLEL=1, CTX_SIZE=262144 (native max, -c equals the per-slot context with one slot). Concurrent requests queue on the single slot; the server never preempts a running generation. pi models.json contextWindow/maxTokens back to 262144 (outside repo). Docs updated to match.
6.7 KiB
Deployment and Update Process
This page describes how to deploy and update the LLM servers on Dankserver and Dankclaw. The process uses git as the single source of truth. All script edits flow through this repository.
Overview
Two servers run LLM inference services. Each server pulls its scripts from this repository. The deployment process moves a committed change from the repository to a running service.
| Target | Host | Runtime | Service | Port |
|---|---|---|---|---|
| Dankserver | dank@dankserver | upstream llama.cpp (Qwen3.6-35B-A3B Q6_K_P + ngram-mod, MoE on CPU) | frank-default-small | 7770 |
| Dankclaw | dank@dankclaw | CIRU ROCmFPX llama.cpp (jcbtc Qwen3.8-27B-CIRU-ActiveFPX-PromptForge v2, native MTP + PromptForge DualView, 262K ctx / 1 slot) | frank-default-large | 52625 |
Workflow
The deployment workflow has six steps.
graph LR
A[Edit scripts locally] --> B[Commit]
B --> C[Push to origin<br>Gitea on Dankclaw]
C --> D[Pull on target<br>git pull]
D --> E[Restart systemd service]
E --> F[Verify health endpoint]
- Fetch the current script from the target machine.
- Commit the fetched version in this repository.
- Edit the script locally in the working tree.
- Commit and push the change to origin.
- Pull the change on the target machine.
- Restart the service and verify that it is healthy.
Deploy Script
The scripts/deploy.sh script executes steps 4 through 6. Run it from the repository root.
Run this command to deploy to Dankserver:
FRANK_SUDO_PW=... ./scripts/deploy.sh dankserver
Run this command to deploy to Dankclaw:
FRANK_SUDO_PW=... ./scripts/deploy.sh dankclaw
Add the --dry-run flag to preview without making changes:
./scripts/deploy.sh dankserver --dry-run
The script does these actions:
- Verifies that the local working tree has no uncommitted changes.
- Pushes the
mainbranch to origin. - Pulls the repository on the target machine.
- Symlinks the systemd unit, reloads systemd, enables, and restarts the service.
- Waits for the health endpoint to respond (over ssh).
Set FRANK_SUDO_PW when running headless, so that remote sudo reads the
password from stdin (sudo -S). The passwordless restart helpers from the
retired topology are obsolete and are not used.
Health endpoints:
- Dankserver:
http://127.0.0.1:7770/health - Dankclaw:
http://127.0.0.1:52625/health
Manual Update
Update Dankserver (frank-default-small)
Run these commands on Dankserver:
cd /home/dank/vLLM
git pull origin main
sudo ln -sf /home/dank/vLLM/scripts/frank-default-small.service /etc/systemd/system/frank-default-small.service
sudo systemctl daemon-reload
sudo systemctl restart frank-default-small
curl -sf http://127.0.0.1:7770/health
Update Dankclaw (frank-default-large)
Run these commands on Dankclaw:
cd /home/dank/vllmScripts
git pull origin main
sudo ln -sf /home/dank/vllmScripts/scripts/frank-default-large.service /etc/systemd/system/frank-default-large.service
sudo systemctl daemon-reload
sudo systemctl restart frank-default-large
curl -sf http://127.0.0.1:52625/health
Service Units
Dankserver — frank-default-small
The active service on Dankserver is upstream llama.cpp (b10121) serving
Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q6_K_P.gguf under the
alias frank-default-small on port 7770. It runs the stock
/home/dank/llama.cpp/build/bin/llama-server binary with the 36 MoE
experts on CPU (--n-cpu-moe 36) and 7 CPU threads, ngram-mod
speculative decoding (n_min 48 / n_max 64 / n_match 24), f16 KV for both
K and V, context 700000 (4 slots of ~175K each), batch 8192 / ubatch 3072,
--no-mmap. The unit file is scripts/frank-default-small.service. It
launches through scripts/serve-frank-small.sh, which reads tunables from
scripts/frank-default-small.env.
Dankclaw — frank-default-large
The active service on Dankclaw is the CIRU ROCmFPX llama.cpp runtime serving
jcbtc/Qwen3.8-27B-CIRU-ActiveFPX-PromptForge (v2 GGUF + FFN/GDN
companions) under the alias frank-default-large on port 52625. It runs
/home/dank/ciru-qwen38/ROCmFPX/build-promptforge/bin/llama-server (ROCm
7.15 SDK in the retired ling3-ciru venv) with native depth-4 MTP
(--spec-type draft-mtp), f16 KV for both K and V, full 262144 context
(1 slot; concurrent requests queue, the server never preempts a running
generation), batch 2048 / ubatch 2048, 16
context checkpoints, 8 GiB
prompt cache, and reasoning in deepseek format. The unit file is
scripts/frank-default-large.service. It launches through
scripts/serve-frank-large.sh, which reads tunables from
scripts/frank-default-large.env. See ciru-activefpx-promptforge.
Validation
The deploy script checks the health endpoint after a restart. For deeper checks, run a completion request against the endpoint:
curl -s http://127.0.0.1:7770/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"frank-default-small","messages":[{"role":"user","content":"Say OK"}]}'
Troubleshooting
If the health check fails after a deploy:
- Read the service logs with
journalctl -u <service> -n 200. - Confirm that the model files exist in the cache.
- Confirm that the GPU has free memory (
nvidia-smion Dankserver,rocm-smion Dankclaw). - Check the service status with
systemctl status <service>.
Incident: HIP Runtime Crash From the TEMP Env Variable (2026-08-13)
On 2026-08-13 the old frank-default-large service crash-looped for hours on Dankclaw. Root cause: the env files exported TEMP=1.0 (a sampling default). The ROCm HIP runtime reads TEMP as its JIT kernel-cache directory, used the path 1.0, failed, and segfaulted on a NULL object. Fix: rename the sampling variable to TEMPERATURE (commit 227ce01).
If a service segfaults at load with no obvious cause, compare the exported env against the HIP runtime's env reads. Do not name any tunable TEMP, HOST, or GPU_MAX_HEAP_SIZE.
Incident: Jobs "Released Prematurely" Under Parallel Load (2026-08-13)
Historical: on the retired topology, parallel jobs on the Dankserver 35B service died with a cuBLAS crash under researcher load. The affected service is retired. A client abort logs W srv stop: cancel task, id_task = N; a natural stop logs only slot release with truncated = 0. The server never preempts a running generation.
See Also
- AGENTS.md — the git workflow rules
- README.md — repository overview
- index.md — knowledge base index
- frank-redo-2026-08-17.md — the full redo runbook
- serverAppConfigs knowledge base — the sibling Podman app stack on the same hosts