Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
3.9 KiB
NixOS guest (VM 200 llm-nixos, 192.168.1.67)
NixOS 26.05, systemd-boot, kernel 6.18, NVIDIA open driver 595.71 (CUDA 13.2). The complete config
is in nixos/ and is the source of truth: /etc/nixos on the guest should match it.
What the config sets up
- Network: static 192.168.1.67/24 on
ens18, gateway .1, DNS 1.1.1.1/8.8.8.8 (NetworkManager removed). Static becauselovey-fansonly trusts GPU temps from this address. Firewall on: TCP 22 (SSH) and 8080 (Strata). - Users:
jasonand root are SSH-key only; sudo needs no password. - NVIDIA: open kernel module, headless,
nvidia-persistenced.nvidia-container-toolkit+ podman (--device nvidia.com/gpu=all). - CUDA tooling:
cuda_nvccand the cuda-maintainers cachix substituter, so nothing CUDA-heavy compiles locally.programs.nix-ldwithconfig.hardware.nvidia.packagein its libraries: without that, pip/uv torch and vLLM can't findlibcudaandtorch.cuda.is_available()is False. - Memory: memlock unlimited (PAM and systemd default), needed for pinned host memory.
- /models: virtiofs from lovey's
/mnt/models,nofail. - Services:
nvidia-power-limit,gpu-temp-push,strata(see strata.md).
GPU tuning
- Power cap:
nvidia-power-limitrunsnvidia-smi -pl 250after persistenced on every boot (stock is 350 W). - gpu-unlock (
nixos/gpu-unlock.nix): the Zagitta/gpu-unlock kernel driver, pinned ataf28cbb, enables full-rate FP16/BF16/TF32 tensor math on GA102. It runs inside the guest and flashes nothing. The Nix file builds the module for the guest kernel and generates its firmware from pinned NVIDIA 610.43.03 inputs (all SHA-256 checked), loadsgpu_unlockfrom the initrd beforenvidia, and setsgpu_unlock.targets=all. To disable it, drop that kernel parameter.- Check:
journalctl -k -b | grep -E "gpu_unlock|entry:".unlockedappears only on the first boot after lovey powers off. After a VM reboot it logsunlock failed (-114)(-EALREADY): the cards are still unlocked, which is harmless. - The unlock survives VM reboots and host bus resets; only a host power-off clears it.
- Check:
Dense 8192³ GEMM, torch 2.14 / cu130:
| Power limit | FP16 | BF16 |
|---|---|---|
| 250 W | 77–81 TFLOPS | 80–86 TFLOPS |
| 350 W | 112–114 TFLOPS | 115–116 TFLOPS |
A stock 3090 peaks at about 71 TFLOPS. The 250 W cap costs ~30% of matmul (prefill) throughput; decode is bandwidth-bound and barely changes.
The cap is 275 W since 2026-10-27. In Strata's benchmark, 275 W vs 250 W gave +4.6% prompt tok/s at 16K, unchanged decode, and +2–4°C (see benchmarks/standard). Strata's real gain is far smaller than the GEMM numbers above suggest, because much of each request isn't matmul-bound.
Temps
4-minute dual-GPU BF16 burn at 250 W: GPU0 34→45°C, GPU1 44→55°C (still creeping), fans ~36%. GPU1 runs ~10°C warmer than GPU0 (loop order or block contact). Plenty of headroom.
Rebuild
- Create VM 200 (proxmox-host.md) and boot the NixOS 26.05 minimal ISO.
- Partition: 1 GB ESP (vfat) + ext4 root on the 100 GB disk; mount at
/mntand/mnt/boot. nixos-generate-config --root /mnt, then copyconfiguration.nixandgpu-unlock.nixfrom this repo. Keep the generatedhardware-configuration.nix(its disk UUIDs are new) but add the/modelsvirtiofs entry from the copy here.nixos-install, reboot, detach the ISO.- Check:
nvidia-smishows both 3090s at 275 W,ls /models,systemctl status gpu-temp-pushandjournalctl -u lovey-fanson the host shows a GPU temperature. - Install Strata: strata.md.
Applying a config change: edit here, copy to /etc/nixos/, sudo nixos-rebuild switch, commit.