A 33.2. Batch és kis szolgáltatás egységben a kiszolgáló oldali szerződést építettük fel: bemeneti séma, kötegelt kérés, késleltetés és modellazonosító. Ott az volt a kérdés, hogy egy kérés érvényes-e. Itt az üzemeltetés következő rétegét vizsgáljuk: mi történik a modell kihelyezése után, amikor a bemeneteket folyamatosan megfigyeljük, de a helyes címkék későn vagy egyáltalán nem állnak rendelkezésre. Az üzemeltető két, gyakran összemosott dolgot akar tudni: (a) változott-e a beérkező adat vagy a modell viselkedése, és (b) romlott-e a modell tényleges pontossága. Az elsőhöz elég a produkciós napló; a másodikhoz hiteles ground truth kell.
Előismeret: a séma és a kérés fogalma a 33.2. Batch és kis szolgáltatás alfejezetből; a független tesztelés és a modellválasztási bizonyíték 32.4. VIII. ellenőrző pont: célhoz illő neurális modell alfejezetből; a küszöb validációs protokollhoz kötése 29.4. Anomáliapontszám rekonstrukcióból alfejezetből; a céleloszlás és a predikcióeloszlás megkülönböztetése 21.4. Osztályarány, súlyozás és céleloszlás alfejezetből.
Induló kérdés. Egy éles osztályozó az elmúlt órában 1000 kérést kapott. Minden kéréshez rögzítettük az inputot, a predikciót és a konfidenciát, de címke egyelőre nincs. Mit tudunk ebből a megfigyelésből a modell pontosságáról? A 3. szakasz tétele szerint a ground-truth accuracy értékéről semmit; a megfigyelés csak a bemeneti eloszlás és a modell kimeneti viselkedésének változásáról adhat jelzést.
Rögzítsük a GlyphLab-osztályozó produkciós környezetét. A modell három osztályt különböztet meg: , a címkék rendre vertical, horizontal, diagonal. A bemeneti kép , NCHW alakú, float32, minden pixelérték a intervallumban van.
Definíció (produkciós megfigyelés). A időpontig beérkezett kérés naplója
ahol a bemenet, a modell által adott osztálypredikció, a predikcióhoz tartozó konfidencia (például a softmax maximuma), pedig a kérést kiszolgáló modellverzió azonosítója. A napló nem tartalmazza a ground truth-ot.
Definíció (séma, schema). A séma a megengedett bemenetek halmaza:
a dtype- és alakfeltétellel együtt. A séma a szerződés statikus része: azt mondja meg, hogy egy input egyáltalán értelmezhető-e a modell számára, nem azt, hogy a modell jól osztályozza.
Definíció (input drift). Jelölje a tanítóhalmaz eloszlását, pedig a produkciós bemenetek eloszlását. Rögzített eltérésmérő és küszöb mellett input driftet észlelünk, ha . Mivel a valódi nem ismert, a gyakorlatban egy aggregáló leképezést választunk (például per-pixel átlag és variancia), és a produkciós köteg empirikus átlagát hasonlítjuk a tanítóhalmazból számított referenciához. A , és megválasztása maga is a felügyeleti protokoll része, és mintavételi bizonytalansággal terhelt.
Definíció (delayed label, késő címke). A
kéréshez tartozó
ground truth késő címke, ha a kérés időpontjában még nem áll
rendelkezésre, hanem egy későbbi időpontban, külön csatornán érkezik
meg. A
időpontig megérkezett címkék halmaza
,
és általában
.
A napló és a címke összekapcsolásához egy mindkét oldalon szereplő,
egyedi request_id szükséges.
Definíció (monitoring, rollback, model card). A monitoring az üzemeltetési naplókból előre rögzített szabályok szerint számított mutatók és riasztási küszöbök összessége. A rollback visszaállítás egy korábbi, mentett modellverzióra, feltéve, hogy a betöltött modell egy független ellenőrző halmazon a mentéskori viselkedést reprodukálja. A model card a modellt kísérő, géppel is olvasható dokumentum, amely rögzíti a bemeneti és kimeneti szerződést, a tanító- és tesztadatot, a mért teljesítményt, az ismert korlátokat és a felhasználási feltételeket.
A levezetési kötelezettségünk az, hogy pontosan elválasszuk a két metrikacsaládot. A következő állítás azt mondja ki, hogy a ground-truth-ot igénylő metrikák nem azonosíthatók a produkciós megfigyelésből.
Tétel 1 (címke nélküli azonosíthatatlanság). Legyen , , és legyen rögzített a megfigyelhető hármas, ahol . Az accuracy
nem függvénye a megfigyelésnek: léteznek olyan ground-truth vektorok, amelyekre , miközben a megfigyelhető mindkét esetben azonos.
Bizonyítás. Konstruktív. Válasszuk minden -re értéket. Ekkor minden indikátor , tehát . Mivel , minden -re választhatunk olyan értéket, amelyre . Ekkor minden indikátor , tehát . A két realizáció ugyanazt a predikcióvektort hagyja, és az inputok, illetve a konfidenciák definíció szerint azonosak. A megfigyelésből számított bármely determinisztikus függvény értéke tehát azonos, miközben az accuracy értéke , illetve ; a kettő különbözik.
A tétel ereje a konstrukció szélsőségességében van: még teljesen determinisztikus predikciósorozat mellett sem lehet eldönteni, hogy a modell mindent eltalált vagy mindent elhibázott, ha a címke nem áll rendelkezésre. Ugyanez az érvelés ismételhető a recall, a precision, a macro-F1, a kalibrációs hiba és a Brier score esetére, mert mindegyik a párokon értelmezett.
Következmény (metrikák osztályozása). A produkciós naplóból, címke nélkül számítható mutatók pontosan azok, amelyek csak -től függenek: kérésszám, sémaérvényességi arány, inputeloszlás-mutatók, predikcióeloszlás, konfidenciaeloszlás, késleltetés-percentilisek, szolgáltatási hibaarány. A tényleges teljesítmény mutatói — accuracy, per-class recall, macro-F1, kalibrációs hiba — a hiteles ground truth-ot igénylik. Az input drift kimutatása ezért indikátor, amely további vizsgálatot vált ki; önmagában nem teljesítménymérés.
Legyen a tanítóhalmazból számított per-pixel átlag referenciaértéke , a per-pixel szórás . Egy kérésből álló produkciós köteg képenkénti átlagintenzitása:
A normalizált abszolút eltérés kötegátlaga
Ha a riasztási küszöb , akkor a monitoring driftet jelez. A modell mind a négy képre (vertical) predikciót ad, rendre konfidenciával. Három nappal később megérkezik a ground truth: . A címkézett accuracy ezen a négy kérésen . A példa azt mutatja, hogy a drift-riasztás és a tényleges hiba együtt is felléphet; a következő szakasz viszont azt mutatja, hogy ez nem automatikus oksági kapcsolat.
A teljes monitoring-számítást szemléltető kód:
# lab/n132/monitor_demo.py
import numpy as np
rng = np.random.default_rng(20261020)
mu_ref, sigma_ref = 0.50, 0.10
# Szemléltető produkciós megfigyelés; ez nem mért futás.
means = np.array([0.48, 0.52, 0.61, 0.63], dtype=np.float32)
pred = np.array([0, 0, 0, 0], dtype=np.int64)
conf = np.array([0.98, 0.97, 0.96, 0.99], dtype=np.float32)
y_late = np.array([0, 0, 1, 1], dtype=np.int64)
D = float(np.mean(np.abs((means - mu_ref) / sigma_ref)))
print(f"drift_mutató = {D:.3f}; riasztás = {D > 0.5}")
acc = float(np.mean(pred == y_late))
print(f"címkézett accuracy (N=4) = {acc:.3f}")
# Jellemző kimenet (jelölt szemléltetés):
# drift_mutató = 0.700; riasztás = True
# címkézett accuracy (N=4) = 0.500Ha minden kéréshez megérkezne a címke, akkor a produkciós accuracy torzítatlan empirikus becslését kapnánk. A késő címke azonban szelekciót visz be. Legyen a megérkezett címkék halmaza, és tekintsük a naiv becslőt:
Ez akkor torzítatlan a teljes accuracy-ra nézve, ha a megfigyelési indikátor független a hibaeseménytől. Ha viszont a címkézési folyamat a hibás eseteket nagyobb arányban vizsgálja felül, szisztematikusan alulbecsli a valós pontosságot; ha csak a gyorsan lezárt, könnyű esetek kapnak címkét, felülbecsli.
Kézi ellenpélda a függetlenség hiányára. Legyen , minden predikció , a ground truth , tehát a teljes accuracy . Tegyük fel, hogy a címke csak azokra az esetekre érkezik meg, ahol a predikció hibás, mert csak a hibákat vizsgálják felül. Ekkor , és , ami a irányába torzít. Ha viszont a címke csak a hibátlan esetekre érkezik, és . A monitoring-protokollnak ezért rögzítenie kell a címkeforrás szelekciós szabályát, és a csúszóablakos metrikát csak akkor szabad értelmezni, ha a lefedettség elég nagy, és a szelekció függetlensége legalább heurisztikusan indokolható.
A feladat egy fiktív üzemeltetési terv a GlyphLab-osztályozóhoz,
amelyet a korábbi egységekben tanítottunk. Az alábbi terv a 12.2. Checkpoint és folytathatóság alfejezetben
bevezetett checkpoint-szerződésre és a [D09] forrásban leírt
state_dict-alapú mentési/betöltési eljárásra épül; a
konkrét fájlok és küszöbök a labor saját konfigurációját alkotják.
Modellszerződés.
model_id = "glyphnet-v2.0". Bemenet: float32 NCHW
,
értékkészlet
.
Kimenet: 3 logit, az osztályok
.
A modell a GlyphLab train splitjén tanult, a legjobb checkpoint a val
loss alapján lett kiválasztva; a tesztkiértékelés a clean test 60 képén
történt.
Naplózási séma. Minden kérés egy JSONL sor:
{"request_id": "r-0001", "ts": "2026-10-20T09:00:00Z", "schema_ok": true,
"input_mean": 0.52, "input_var": 0.08, "pred_label": 0,
"pred_conf": 0.97, "model_id": "glyphnet-v2.0",
"latency_ms": 3.1, "http_status": 200}A késő címkék külön JSONL fájlban érkeznek:
{"request_id": "r-0001", "label": 0, "label_ts": "2026-10-23T11:20:00Z", "source": "reviewer"}Követési mutatók. (1) Sémaérvényességi arány 24 órás ablakon; (2) drift-mutató a per-pixel átlag normalizált abszolút eltéréséből, napi kérésre; (3) predikcióeloszlás és átlagos konfidencia; (4) a 3 napnál idősebb, lezárt kérésekre csatlakoztatott címkézett accuracy 30 napos csúszó ablakon, csak akkor, ha a join lefedettség legalább 0.8 és a mintaméret legalább 200.
Riasztási küszöbök. Sémaérvényesség 24 h alatt ; drift-mutató ; címkézett accuracy ; HTTP 5xx arány .
Rollback-terv. Bármely riasztás emberi vizsgálatot
indít. Automatikus visszaállítás csak a címkézett accuracy vagy a
sémaérvényesség riasztására történik; a drift-riasztás önmagában csak
vizsgálatot vált ki. A visszaállítás lépései: (1) a
checkpoints/glyphnet-v1.0.pt state_dict betöltése a
deklarált GlyphNet architektúraosztályba; (2)
model.eval() mód; (3) a 60 val képen a top-1 predikciók
egyezésének ellenőrzése a mentéskori naplóval; (4) a
model_id csere és a rollback esemény naplózása. Az (1)–(3)
nélkül a visszaállítás nem minősül ellenőrzöttnek.
A monitoring-politika minimális kódja:
# lab/n132/rollback_policy.py
import numpy as np
EXPECTED_SHAPE = (1, 24, 24)
def validate_schema(x):
if not isinstance(x, np.ndarray):
return False, "nem numpy.ndarray"
if x.dtype != np.float32:
return False, f"dtype={x.dtype}, várt float32"
if x.shape != EXPECTED_SHAPE:
return False, f"shape={x.shape}, várt {EXPECTED_SHAPE}"
if x.min() < 0.0 or x.max() > 1.0:
return False, "érték [0,1]-en kívül"
if not np.all(np.isfinite(x)):
return False, "nem véges érték"
return True, "OK"
def drift_metric(x_batch, mu_ref, sigma_ref, eps=1e-6):
# x_batch: (N,1,24,24) float32; mu_ref, sigma_ref: (1,24,24) float32
mu_prod = x_batch.mean(axis=0, dtype=np.float64).astype(np.float32)
z = np.abs(mu_prod - mu_ref) / (sigma_ref + eps)
return float(z.mean())
def join_labels(requests, labels):
by_id = {r["request_id"]: r for r in requests}
joined = []
for lab in labels:
r = by_id.get(lab["request_id"])
if r is not None:
joined.append((r["request_id"], r["pred_label"], lab["label"]))
return joined
def rollback_decision(metrics, policy):
reasons = []
if metrics["schema_valid_rate_24h"] < policy["min_schema_valid_rate"]:
reasons.append("alacsony sémaérvényesség")
if metrics["drift"] > policy["max_drift"]:
reasons.append("input drift riasztás")
if (metrics["labeled_n"] >= policy["min_labeled_n"]
and metrics["labeled_accuracy"] < policy["min_accuracy"]):
reasons.append("alacsony címkézett accuracy")
if metrics["http_5xx_rate"] > policy["max_5xx_rate"]:
reasons.append("magas 5xx arány")
return ("rollback", reasons) if reasons else ("keep", [])A fenti kód kimenete nem futtatott mérés; a labor átadandó eredménye
egy OPERATIONS_PLAN.md dokumentum, amely a fenti
küszöböket, a JSONL-sémákat, a join-szabályt és a rollback-lépéseket
rögzíti, valamint a fenti szkript a naplófájlra futtatva. A
model_id, a küszöbök és a checkpoint-útvonalak a labor
saját konfigurációi, nem külső benchmarkból származó állítások.
F1 (fogalmi, nehézség 1). Soroljon fel három, a produkciós naplóból címke nélkül számítható mutatót és három, csak hiteles ground truth-tal számítható mutatót. Mindegyikhez adja meg a definíciót a 2. szakasz jelöléseivel. Átadandó: a hat definíció egy-egy képletben vagy pontos szöveges alakban.
F2 (levezetési, nehézség 2). Alkalmazza a Tétel 1 konstrukcióját , esetre. Legyen a megfigyelt predikcióvektor . Adjon meg egy és egy ground-truth vektort, amelyekre és , és indokolja, miért nem számítható ki az accuracy a megfigyelésből. Átadandó: a két vektor, a két accuracy kiszámítása és az azonosíthatatlansági indoklás.
F3 (implementációs, nehézség 2). Írjon
validate_schema függvényt a 6. szakasz sémájához, és
futtasson négy tesztesetet: helyes input; rossz dtype (például float64);
rossz alak
;
-en
kívüli érték. A függvény (bool, str) párt adjon vissza.
Átadandó: a függvény kódja, a négy hívás és a várt eredmények
logikai értékkel.
F4 (hibakeresési, nehézség 2). Egy szolgáltatás a
késő címkéket a request_id helyett a beérkezési sorrend
szerint párosítja a kérésekhez. Egy napon a label-feed 20 perces
késéssel, a kérések sorrendjétől eltérő sorrendben érkezik. Mi a hiba,
mi a következménye, hogyan javítható, és milyen teszttel ellenőrizhető a
javítás? Átadandó: a hiba oka, a következmény egy konkrét
példán, a javított join-szabály és egy olyan teszt, amelyben a két lista
sorrendje eltér.
F5 (kísérleti/transzfer, nehézség 3). Tervezzen 7 napos produkciós megfigyelési protokollt a GlyphOps-osztályozóhoz, ha a késő címke várható késése 3 nap. Határozza meg a megfigyelési egységet, a napi aggregálást, a riasztási küszöböket, a torzítás kezelését és a rollback feltételeit. Indokolja, miért nem használja a 3 napnál fiatalabb ablakot a címkézett accuracy számításához. Átadandó: egy legalább féloldalas protokoll a fenti elemekkel és a korlátok kimondásával.
F1 megoldás. Címke nélkül számítható:
Csak ground truth-tal számítható:
A két csoport elválasztása a Tétel 1 következménye: az első csoport nem függ -tól, a második igen, és a tétel konstrukciója mellett a második értéke megváltozhat azonos megfigyelés mellett.
F2 megoldás. ; ekkor minden elem egyenlő a predikcióval, tehát . ; minden elem különbözik a predikciótól, tehát . A megfigyelés mindkét esetben azonos, így a megfigyelésből képzett bármely determinisztikus függvény ugyanazt adja, miközben az accuracy és — ezért az accuracy nem azonosítható.
F3 megoldás. A függvény a 6. szakasz kódjában szerepel. A tesztek:
# lab/n132/test_schema.py
import numpy as np
from rollback_policy import validate_schema
x_ok = np.zeros((1, 24, 24), dtype=np.float32)
x_bad_dtype = np.zeros((1, 24, 24), dtype=np.float64)
x_bad_shape = np.zeros((24, 24), dtype=np.float32)
x_out = np.zeros((1, 24, 24), dtype=np.float32); x_out[0,0,0] = 1.5
for name, x in [("ok", x_ok), ("bad_dtype", x_bad_dtype),
("bad_shape", x_bad_shape), ("out_of_range", x_out)]:
ok, msg = validate_schema(x)
print(name, ok, msg)
# Várt: ok True OK; bad_dtype False; bad_shape False; out_of_range False.Az ellenőrzés a (bool, str) szerződést és a négy logikai
értéket hasonlítja össze; numerikus tolerancia itt nem kell, mert a séma
eldöntési feladat.
F4 megoldás. Hiba: a párosítás a lista
indexét használja azonosító helyett. Következmény: ha a sorrend
eltér, a label egy másik kérés predikciójához kapcsolódik, és a
számított accuracy hamis lesz. Példa: a kérések sorrendje
[r1, r2], predikciók [0, 0], a címkék késve
[r2: 1, r1: 0] sorrendben érkeznek; a sorrendpárosítás
(r1, 1) hibát ad, a helyes (r1, 0).
Javítás: a join kulcsa a request_id.
Ellenőrzés: olyan teszt, ahol a label-lista szándékosan
permutált, és az eredménynek a request_id szerinti
párosítást kell adnia:
# lab/n132/test_join.py
from rollback_policy import join_labels
req = [{"request_id": "r1", "pred_label": 0, "pred_conf": 0.9},
{"request_id": "r2", "pred_label": 0, "pred_conf": 0.8}]
lab = [{"request_id": "r2", "label": 1},
{"request_id": "r1", "label": 0}]
print(join_labels(req, lab))
# Várt: [('r1', 0, 0), ('r2', 0, 1)] a request_id szerint, nem a beérkezési sorrendben.F5 megoldás (minta-terv). Megfigyelési
egység: kérés; a napló minden kéréshez request_id-t
rendel. Napi aggregálás: naponta rögzítjük a sémaérvényességi
arányt, a drift-mutatót, a predikcióeloszlást és a 3 napnál idősebb
kérésekre csatlakoztatott accuracy-t. Küszöbök: sémaérvényesség
;
drift
;
accuracy
,
ha a lezárt mintaméret
és a lefedettség
.
Torzítás kezelés: a 3 napos késés miatt a fiatal ablakban a
címkék még nem reprezentatívak, ezért azokat kizárjuk a címkézett
metrikából; a lefedettségi arányt naplózzuk, és a szelekciós szabályt
dokumentáljuk. Rollback: automatikus visszaállítás a v1.0
state_dict-re, ha a címkézett accuracy vagy a sémaérvényesség riasztást
ad, a 6. szakasz ellenőrzési lépéseivel. Korlát: a 7 napos
ablak rövid, a drift küszöb mintavételi ingadozást is jelezhet; a terv
csak ezt a fiktív osztályozót és ezt az adatforgalmat írja le,
általánosításához hosszabb megfigyelés kell.
Tipikus tévedés. Az input drift kimutatását automatikusan a modellhiba oksági bizonyítékaként értelmezzük. Ez kétirányban hibás. Egyrészt a drift-riasztás mellett is lehet a modell pontos: ha a produkcióban sötétebb képek jelennek meg, a drift-mutató megszólal, de ha a modell kontrasztnormalizáló előfeldolgozása vagy tanult invariáns reprezentációja ezt kezeli, a ground-truth accuracy változatlan maradhat. Másrészt a drift hiánya mellett is nőhet a hiba: ha a címkéző szabályzat megváltozik, a bemeneti eloszlás azonos marad, de a korábban tanult cél már nem érvényes. Az oksági állításhoz kontrollált beavatkozás vagy legalább a címkézett metrika együttmozgásának vizsgálata kell; a drift egymagában korrelációs jelzés.
Önellenőrzés. (1) Meg tudom-e nevezni minden monitoring-mutatóhoz, hogy függ-e -tól? (2) A rollback előtt ellenőriztem-e a betöltött modell kimenetét egy független halmazon? (3) A csúszóablakos accuracy számításánál kizártam-e a még le nem zárt kéréseket? (4) A model card különválasztja-e a mért teszt eredményét a produkciós monitoring jelzésétől?
Visszahívás. A 33.2. Batch és kis szolgáltatás alfejezetben a séma a kérésérvényesség statikus szerződése volt; itt a sémaérvényességi arány már dinamikus üzemeltetési mutató. A 29.4. Anomáliapontszám rekonstrukcióból alfejezetben a küszöböt validációs címkékhez kötöttük; itt ugyanez az elv a csúszóablakos riasztási küszöbre vonatkozik. A 21.4. Osztályarány, súlyozás és céleloszlás alfejezetben a tanítóhalmaz céleloszlását különböztettük meg a predikcióeloszlástól; itt a produkciós predikcióeloszlás megváltozása nem azonos a címkeeloszlás megváltozásával.
Az üzemeltetési monitoring két eltérő kérdést kezel: a rendelkezésre álló megfigyelésből a bemeneti eloszlás, a sémaérvényesség és a modell kimeneti viselkedésének változása követhető; a tényleges pontossághoz hiteles ground truth kell. A Tétel 1 konstruktívan bizonyítja, hogy azonos input-, predikció- és konfidencianapló mellett az accuracy 1 és 0 is lehet, tehát a címkét igénylő metrika nem azonosítható a naplóból. A késő címke szelekciós torzítást vihet a csúszóablakos becslésbe, ezért a join lefedettségét és a címkeforrás szabályát rögzíteni kell. A drift-riasztás vizsgálatot indít, nem oksági bizonyíték; a rollback csak ellenőrzött state_dict-betöltéssel és független kimenet-egyezéssel érvényes.
A 34.1. Mért késleltetés, throughput és memória a hatékonyság mérését vezeti be: a késleltetés, a throughput és a memória mérését ugyanolyan protokollal, mint itt a monitoringot — előre rögzített egységgel, ismétléssel és a hardverfeltételek kimondásával. Az üzemeltetési naplóban gyűjtött latency-értékek ott válnak tudományos teljesítményállítássá.