98ee7dffe2
PR-GPU-Health-1. 운영 준비성 표준화 PR (모델 성능 개선 아님). - OCR /smoke endpoint 추가 (160x60 OK PNG in-memory, 200/503 분기, Docker healthcheck 미사용) - marker /health endpoint 추가 (stt/ocr 동일 시그니처) - reranker docker-compose healthcheck 추가 (TEI :80/health) - scripts/gpu_service_smoke.sh: docker exec 표준 점검 (OCR/STT expose-only) - scripts/gpu_vram_fixture.sh: Mode A sequential + Mode B light overlap + --stress 옵션 - tests/load/fixtures/: synthetic ocr_ok.png / sine_30s.wav / lorem_1p.pdf OCR 빈 응답 false negative — root cause: ports 미매핑. 결정: ocr-service / stt-service 는 expose-only 유지, 운영 점검은 docker exec 내부 curl 표준. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
78 lines
2.5 KiB
Bash
Executable File
78 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# GPU 미디어/검색 서비스 health/ready/smoke 점검 (PR-GPU-Health-1).
|
|
# OCR/STT/reranker 는 expose-only 라 docker exec 내부 curl 표준 경로 사용.
|
|
# marker 는 ports 매핑이 있지만 일관성을 위해 동일 패턴.
|
|
set -uo pipefail
|
|
|
|
OCR=hyungi_document_server-ocr-service-1
|
|
MARKER=hyungi_document_server-marker-service-1
|
|
RERANKER=hyungi_document_server-reranker-1
|
|
STT=hyungi_document_server-stt-service-1
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
vram() {
|
|
nvidia-smi --query-gpu=memory.used,memory.free --format=csv,noheader,nounits 2>/dev/null \
|
|
| awk -F',' '{printf "used=%dMiB free=%dMiB\n", $1, $2}'
|
|
}
|
|
|
|
probe() {
|
|
local label="$1" container="$2" path="$3" timeout="${4:-5}"
|
|
printf " %-22s " "$label"
|
|
if out=$(docker exec "$container" curl -fsS -m "$timeout" "$path" 2>&1); then
|
|
echo "OK $(echo "$out" | head -c 120)"
|
|
PASS=$((PASS+1))
|
|
else
|
|
echo "FAIL $(echo "$out" | head -c 120)"
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
}
|
|
|
|
probe_post() {
|
|
local label="$1" container="$2" url="$3" body="$4" timeout="${5:-30}" expect="${6:-}"
|
|
printf " %-22s " "$label"
|
|
if out=$(docker exec "$container" curl -fsS -m "$timeout" -H 'Content-Type: application/json' -X POST -d "$body" "$url" 2>&1); then
|
|
if [[ -z "$expect" || "$out" == *"$expect"* ]]; then
|
|
echo "OK $(echo "$out" | head -c 100)"
|
|
PASS=$((PASS+1))
|
|
else
|
|
echo "FAIL(unexpected body) $(echo "$out" | head -c 100)"
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
else
|
|
echo "FAIL $(echo "$out" | head -c 100)"
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
}
|
|
|
|
echo "=== nvidia-smi baseline ==="
|
|
BASE=$(vram); echo " $BASE"
|
|
echo
|
|
|
|
echo "=== health / ready ==="
|
|
probe "OCR /health" "$OCR" "http://127.0.0.1:3200/health" 5
|
|
probe "OCR /ready" "$OCR" "http://127.0.0.1:3200/ready" 5
|
|
probe "marker /health" "$MARKER" "http://127.0.0.1:3300/health" 5
|
|
probe "marker /ready" "$MARKER" "http://127.0.0.1:3300/ready" 5
|
|
probe "reranker /health" "$RERANKER" "http://127.0.0.1:80/health" 5
|
|
probe "stt /health" "$STT" "http://127.0.0.1:3300/health" 5
|
|
probe "stt /ready" "$STT" "http://127.0.0.1:3300/ready" 5
|
|
|
|
echo
|
|
echo "=== smoke ==="
|
|
probe "OCR /smoke" "$OCR" "http://127.0.0.1:3200/smoke" 30
|
|
probe_post "bge-m3 embed" "$OCR" "http://ollama:11434/api/embeddings" '{"model":"bge-m3","prompt":"smoke test"}' 30 '"embedding"'
|
|
|
|
echo
|
|
echo "=== nvidia-smi after ==="
|
|
AFTER=$(vram); echo " $AFTER"
|
|
echo
|
|
echo " baseline: $BASE"
|
|
echo " after : $AFTER"
|
|
echo
|
|
echo "=== summary ==="
|
|
echo " pass=$PASS fail=$FAIL"
|
|
|
|
exit $FAIL
|