Health check HTTP standar (liveness/readiness probe) pada LLM runtime seperti vLLM, TGI, atau Triton hanya memverifikasi alokasi memori GPU dan kesiapan server HTTP. Probe ini mengembalikan status 200 OK meskipun model mengalami degradasi internal, seperti kegagalan adherence system prompt, tokenizer mismatch, atau regresi kuantisasi yang memicu halusinasi dan kerusakan format output.
Mirror canary deployment memitigasi risiko ini. Sebelum traffic pengguna dialihkan ke pod versi baru, traffic di-mirror atau dialirkan synthetic probe paralel. Tujuannya: mengukur kepatuhan struktur output, latensi token, dan semantic drift secara realtime.
1. Desain Synthetic Mirror Probe
Synthetic probe mengeksekusi test suite deterministik ke instance canary secara berkala. Karakteristik utama probe ini meliputi:
- Suhu Nol (
temperature=0.0): Mengeliminasi variasi stokastik untuk mendeteksi deviasi keluaran yang murni berasal dari bobot atau chat template. - Validasi Skema Keras: Memeriksa apakah output JSON mematuhi JSON Schema target tanpa teks halusinasi di luar kurung kurawal.
- Verifikasi System Prompt Adherence: Memastikan instruksi negatif (misal: "Jangan sebutkan kata X") dan format constraint tetap dipatuhi.
- Pengukuran Latensi Parsial: Memisahkan Time to First Token (TTFT) dan Inter-Token Latency (ITL).
Skrip Probe Deterministik
import json
import time
import urllib.request
from typing import Dict, Any
CANARY_URL = "http://llm-canary-service.internal:8000/v1/chat/completions"
GOLDEN_TEST_PAYLOAD = {
"model": "current-target-canary",
"messages": [
{"role": "system", "content": "You are a strict data parser. Respond ONLY in valid JSON with keys: 'status' and 'code'. No intro, no markdown code fence."},
{"role": "user", "content": "Parse: Operation completed successfully. Error 0."}
],
"temperature": 0.0,
"max_tokens": 32
}
def execute_probe() -> Dict[str, Any]:
req = urllib.request.Request(
CANARY_URL,
headers={"Content-Type": "application/json"},
data=json.dumps(GOLDEN_TEST_PAYLOAD).encode("utf-8"),
method="POST"
)
start_time = time.perf_counter()
try:
with urllib.request.urlopen(req, timeout=5.0) as resp:
latency = time.perf_counter() - start_time
if resp.status != 200:
return {"pass": False, "error": f"HTTP_{resp.status}", "latency": latency}
body = json.loads(resp.read().decode("utf-8"))
output_text = body["choices"][0]["message"]["content"].strip()
# Assert 1: Strict JSON validity
parsed = json.loads(output_text)
# Assert 2: Adherence to expected schema keys
if set(parsed.keys()) != {"status", "code"}:
return {"pass": False, "error": "SCHEMA_MISMATCH", "latency": latency}
# Assert 3: Exact semantic match on deterministic query
if parsed.get("code") != 0:
return {"pass": False, "error": "SEMANTIC_DRIFT", "latency": latency}
return {"pass": True, "error": None, "latency": latency}
except json.JSONDecodeError:
return {"pass": False, "error": "JSON_PARSE_FAIL", "latency": time.perf_counter() - start_time}
except Exception as e:
return {"pass": False, "error": type(e).__name__, "latency": time.perf_counter() - start_time}
if __name__ == "__main__":
res = execute_probe()
assert res["pass"] is True, f"Probe failed: {res['error']}"
2. Observabilitas Telemetri: OpenTelemetry & Prometheus
Hasil probe dikonversi menjadi metrik Prometheus oleh runner probe internal atau sidecar agent. Metrik utama yang wajib diobservasi:
llm_probe_adherence_ratio: Rasio request probe yang sukses melewati validasi skema dan constraint instruksi (target > 0.99).llm_probe_drift_score: Jarak embedding kosinus atau Levenshtein distance terhadap respons baseline golden set.llm_time_to_first_token_seconds: Histogram latensi pemrosesan prompt awal.llm_generation_tokens_per_second: Throughput pembangkitan token di GPU canary.
Visualisasi metrik dilakukan paralel antara deployment stable dan canary. Deviasi rasio adherence di bawah baseline langsung mengindikasikan masalah kompatibilitas model atau template formatting.
3. Automated Rollback Berbasis Metrik
Gunakan Argo Rollouts bersama AnalysisTemplate untuk menghentikan traffic shift otomatis jika metrik integritas output LLM canary turun di bawah batas toleransi.
Konfigurasi AnalysisTemplate dan Rollout
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: llm-canary-adherence-analysis
spec:
metrics:
- name: probe-adherence-check
interval: 30s
successCondition: result[0] >= 0.98
failureLimit: 2
provider:
prometheus:
address: http://prometheus-k8s.monitoring:9090
query: |
sum(rate(llm_probe_adherence_success_total{deployment="llm-canary"}[2m]))
/
sum(rate(llm_probe_adherence_count_total{deployment="llm-canary"}[2m]))
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: llm-inference-deployment
spec:
replicas: 10
strategy:
canary:
analysis:
templates:
- templateName: llm-canary-adherence-analysis
steps:
- setWeight: 5
- pause: {duration: 5m}
- setWeight: 20
- pause: {duration: 10m}
Jika canary menghasilkan output di luar skema validasi selama interval evaluasi, metrik jatuh di bawah ambang 0.98. Argo Rollouts langsung menghentikan promosi, mengalihkan 100% traffic kembali ke pod stable, dan menandai rollout sebagai Degraded.
4. Format Postmortem Root Cause Regresi LLM
Jika rollback terpicu, lakukan isolasi masalah menggunakan format insiden ringkas berikut:
Ringkasan: Rollback otomatis terpicu pada step canary 5% (timestamp 14:02 UTC).
Indikator Kegagalan:llm_probe_adherence_ratiodrop ke 0.72. Probe mencatat errorJSON_PARSE_FAIL.
Root Cause: Bobot model hasil kuantisasi AWQ 4-bit merusak stop-sequence generation, menyebabkan model menambahkan token trailing alih-alih menutup JSON string. Chat template Jinja pada image baru kehilangan flagadd_generation_prompt=True.
Tindakan Mitigasi: Revert image inference server ke hash commit sebelumnya. Tambahkan unit test parser pada golden set sebelum push registry.
5. CI/CD Gate Test Preventif
Mencegah regresi lolos ke tahap canary dilakukan dengan memindahkan pengujian ke pipeline CI/CD sebelum deployment manifest di-apply:
- Tokenizer & Chat Template Parity: Eksekusi assertion script yang menguji kesamaan token ID hasil tokenize antara versi release kandidat dan versi target.
- Offline Golden Eval (Zero-Shot Regression Test): Uji 100 sample prompt deterministik menggunakan lightweight runner. Pipeline diwajibkan fail jika terjadi degradasi akurasi skema sebesar 0% toleransi.
- Quantization Distortion Test: Hitung nilai perplexity pada dataset benchmark standar (seperti WikiText-2) untuk memastikan kuantisasi tidak merusak kapasitas reasoning dasar sebelum model dikemas ke dalam artifact registry.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!