stacks/intern-decision: compose (GPU 1, :8033, hard VRAM cap as the single .env knob, healthcheck, Homepage group 'AI - Eval & Retrieval'), .env.example and README. dns: intern-decision.fv.internal -> fv-ml1 (synced to ana/esh/nh3). acceptance on fv-ml1 GPU 3, 3 fresh processes: bit-identical to the Jev bench's native rows (pooled 240/259, Wyrd 79/84, 0/560 flips, Δp 0), negative control 10/122/14, 0 flips across restarts; largest accepted request 200 at a 10,134 MiB card peak under a 9.25 GiB cap; 503 and recovery proven at a tight cap. GPU 1 deploy held: nvidia-smi Free on GPU 1 is 15,442 MiB.
65 lines
2.7 KiB
YAML
65 lines
2.7 KiB
YAML
# intern-decision: Intern-Decision-4B (internlm, Apache-2.0) behind intern-decision-serve, on
|
|
# fv-ml1 GPU 1 (the utility card, beside vllm-coder, the erp/meromero seats and scriberr).
|
|
# Replaces semif (Prime, 2026-09-30: "replace semif with intern-decision now").
|
|
#
|
|
# One forward pass per call, scored by the checkpoint's OWN inference.py (sha256-pinned); the
|
|
# service keeps semif-serve's HTTP surface (/decide, /decide/shared, /health). Service code +
|
|
# contract: services/intern-decision-serve/ (intern-decision-serve.contract.md). Image built on
|
|
# fv-ml1 from that dir.
|
|
#
|
|
# ⚠ VRAM_CAP_GIB is a HARD cap on torch's allocator (per-process memory fraction), set so the
|
|
# container's WHOLE nvidia-smi footprint, CUDA context included, stays <= 10,300 MiB whatever
|
|
# the request (Prime/infra-ops budget with scriberr, 2026-09-30). A request that needs more
|
|
# gets 503 out_of_memory and the service stays up. See the README before changing it.
|
|
#
|
|
# .env (tunables): IMAGE, PORT, GPU_ID, VRAM_CAP_GIB, HOST_IP, INTERN_DECISION_API_TOKEN
|
|
# (vault intern-decision/api-token, >= 32 chars).
|
|
|
|
name: intern-decision
|
|
|
|
services:
|
|
intern-decision:
|
|
image: ${IMAGE:?set IMAGE}
|
|
container_name: intern-decision
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${PORT:-8033}:8000"
|
|
environment:
|
|
INTERN_DECISION_API_TOKEN: ${INTERN_DECISION_API_TOKEN:?set INTERN_DECISION_API_TOKEN}
|
|
INTERN_DECISION_DEVICE: cuda
|
|
INTERN_DECISION_VRAM_CAP_GIB: ${VRAM_CAP_GIB:?set VRAM_CAP_GIB}
|
|
INTERN_DECISION_MAX_TOKENS: ${MAX_TOKENS:-8192}
|
|
INTERN_DECISION_MAX_DECISIONS: ${MAX_DECISIONS:-64}
|
|
# POSTs in progress (queued + scoring) before new ones get 429 busy.
|
|
INTERN_DECISION_MAX_QUEUE: ${MAX_QUEUE:-32}
|
|
volumes:
|
|
# Pinned weights AND the checkpoint's inference.py, read offline. Never downloads.
|
|
- /tank/aimodels/huggingface:/hf:ro
|
|
deploy:
|
|
resources:
|
|
reservations:
|
|
devices:
|
|
- driver: nvidia
|
|
device_ids: ["${GPU_ID:-1}"]
|
|
capabilities: [gpu]
|
|
healthcheck:
|
|
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
# Startup loads ~9 GB of weights and scores the warm-up three times before it serves.
|
|
start_period: 300s
|
|
networks:
|
|
- tnet
|
|
labels:
|
|
- homepage.group=AI - Eval & Retrieval
|
|
- homepage.name=Intern-Decision — typed decisions
|
|
- homepage.icon=mdi-scale-balance
|
|
- homepage.description=Typed decisions from one forward pass (Intern-Decision-4B, fv-ml1 GPU1)
|
|
- homepage.href=http://${HOST_IP:-10.251.50.54}:${PORT:-8033}/health
|
|
|
|
networks:
|
|
tnet:
|
|
name: traefik-net
|
|
external: true
|