diff --git a/servers/unraid/tail2-pose-server/DEPLOYMENT.md b/servers/unraid/tail2-pose-server/DEPLOYMENT.md index ce9d8a1..aa59037 100644 --- a/servers/unraid/tail2-pose-server/DEPLOYMENT.md +++ b/servers/unraid/tail2-pose-server/DEPLOYMENT.md @@ -6,7 +6,8 @@ GPU-only, receive-only NDI inference service. It never saves frames/crops and ha - Token: `/mnt/user/appdata/tail2-pose-server/secrets/api-token` (mode 0600) - Source: `TAIL 2_1621D2 (OBSBOT)` / `192.168.50.207` - Coordinate contract: unmodified NDI buffer, no horizontal flip -- Models: official OpenMMLab RTMDet-tiny and RTMW-m 256x192. RTMDet-m/RTMW-l were tested first but failed the 15 FPS requirement. Model hashes are in `models/SHA256SUMS`. +- Default backend: RTMLib 0.0.15, official YOLOX-m HumanArt+COCO 640x640 and RTMPose-m Body17 256x192, ONNX Runtime GPU with CUDA EP first. +- Alternatives: `openmmlab`, `rtmlib_wholebody` (DWPose-m 133), and `rtmlib_rtmw_l`. The original RTMDet-tiny + RTMW-m OpenMMLab path remains available as the baseline. - NDI binding: cyndilib 0.1.1 and its distributed NDI runtime. NDI's redistributable license applies; do not redistribute the image outside this private deployment without reviewing that license. Rotate the integration token after onboarding clients: @@ -19,7 +20,9 @@ docker compose restart tail2-pose-server ## Current acceptance status -`blocked` for the requested performance SLO only. Functional/API/privacy/stability acceptance passed, including a 600.072-second NDI soak with 6,355 strictly increasing messages and no WS failures. Live p50/p95/p99 source-to-send latency was 91.629/122.584/139.033 ms (~10.59 output FPS), so p95 exceeds 100 ms and output is below 15 FPS. Offline 1/2/4-person p50 was 144.228/154.546/153.313 ms. No OOM; maximum selected-GPU memory was 14,145 MiB and temperature 43 C. +The RTMLib optimization passes the offline inference target. Body17 1/2/4-person p50 is 19.405/24.543/34.781 ms and p95 is 19.734/25.727/36.191 ms. DWPose-m WholeBody 1/2/4-person p50 is 19.905/26.193/37.770 ms and p95 is 20.237/27.489/39.592 ms. All cases used 100 warmups and 300 measured iterations with real 1/2/4-person detector results. + +Live acceptance is currently blocked externally: the camera IP responds, but the NDI finder repeatedly reports `last_sources=[]`. Re-run the live WebSocket and 30-minute soak acceptance after `TAIL 2_1621D2 (OBSBOT)` resumes broadcasting. The one-shot validation services are profile-gated and do not run during normal Arcane lifecycle: diff --git a/servers/unraid/tail2-pose-server/compose.yaml b/servers/unraid/tail2-pose-server/compose.yaml index 336a92d..f364fce 100644 --- a/servers/unraid/tail2-pose-server/compose.yaml +++ b/servers/unraid/tail2-pose-server/compose.yaml @@ -166,6 +166,20 @@ services: } > "$$out/process-map.csv" chmod -R a+rX,u+w "$$out" + gpu-final-snapshot: + image: tail2-pose-server:0.1.0 + container_name: tail2-pose-gpu-final-snapshot + gpus: all + restart: "no" + volumes: + - ./validation:/validation + entrypoint: ["/bin/bash", "-lc"] + command: + - | + nvidia-smi --query-gpu=index,uuid,pstate,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw,clocks.current.sm,temperature.gpu --format=csv,noheader,nounits > /validation/gpu-final-snapshot.csv + nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_gpu_memory --format=csv,noheader,nounits > /validation/gpu-final-processes.csv + chmod 0666 /validation/gpu-final-snapshot.csv /validation/gpu-final-processes.csv + benchmark-rtmlib-body: profiles: ["validation"] image: tail2-pose-server:0.1.0 @@ -265,6 +279,7 @@ services: done benchmark-openmmlab: + profiles: ["validation"] image: tail2-pose-server:0.1.0 container_name: tail2-pose-benchmark-openmmlab gpus: all