Błąd, który pojawia się tylko w trybie produkcyjnym
Skew treningowo-dyspozycyjny jest jednym z najbardziej zagrożających typów błędu w zastosowanych modelach maszynowych, ponieważ podczas dewelopera on jest niewidoczny: model trenuje bez problemu, metryki oceny poza systemem wyglądają dobrze, a awaria pojawi się dopiero, gdy rzeczywista ruchu dotrze do punktu końcowego w trybie produkcyjnym i predykcje okazują się systematycznie gorsze niż zapewne były oceniane metryki poza systemem. Pochodzenie błędu jest prawie zawsze taka, że wartości cech, które model widział podczas treningu, zostały obliczone za pomocą innego ścieżki kodowej, uruchamianej na innej źródle danych i w inny czas względem wydarzenia przewidzanego, niż te, które widzi podczas inferencji.
Przykład konkretny i popularny: model antydoktrynalny jest trenowany z cechą „średnia kwota transakcji w ciągu ostatnich 30 dni”, obliczona przez regularne zadanie SQL typu batch, które uruchamia się codziennie nad pełnym magazynem transakcji, korzystając z czystych, deduplikowanych danych całkowicie rozliczonych. W trybie produkcyjnym ta sama cecha jest obliczana przez usługę online, która zapytuje o bieżące dane transakcyjne w czasie żądania, korzystając z danych, które mogą zawierać niezrozliczone transakcje, mogą brakić najnowszych kilku minut ze względu na opóźnienie replikacji, a definicja „ostatniego 30 dni” może być względem innej referencyjnej godziny niż użyta przez zadanie batch. Oba obliczenia są racjonalnymi implementacjami „średnia kwota transakcji w ciągu ostatnich 30 dni”, ale nie są tym samym funkcją, a model, uczony na podstawie cech obliczanych za pomocą batch version's, otrzymuje systematycznie różne wejścia w trybie produkcyjnym niż był trenowany — co zniża wydajność w sposób, który nie może być naprawiony żadną ilością dostosowywania modelu poza systemem, ponieważ błąd nie jest w modelu na all.
Dlaczego to się zdarza strukturalnie, a nie tylko jako błąd w kodowaniu
Jest podziwiajace, aby traktować przesunięcie treningu-służenia jako prosty błąd wynikający z niedocenionych inżynierów piszących dwie wersje tej samej logiki i że dyscyplina kodowania powinna go naprawić. W praktyce powtarza się ono na dobrze zarządzanych zespołach, ponieważ dwa konteksty obliczeń mają rzeczywiste różnice ograniczenia, które prowadzą do innych implementacji nawet gdy inżynierowie starają się utrzymać je w zgodzie. Obliczanie cech treningowych offline zwykle działa jako zadanie w poziomie nad magazynem danych, optymalizowane dla przepływności nad historycznymi danymi, często napisane w Sparku lub SQL, z uprzejmym prawem do pełnych skanów tabel i skomplikowanych joinów na dużych oknach historycznych. Obliczanie cech podczas online zwykle działa pod ścisłym bugetem czasu (często milisekundy), przeciwko bazom danych operacyjnym lub pamięci wypromieniowej zamiast magazynu, często przepisywane na inny język dla wydajności i pod presją do przybliżania lub uproszczenia dowolnego obliczenia, które byłoby za wolne do wykonania na żądanie.
Poprawność w momencie jest mniej oczywistym i bardziej zagrożającym wariantem tej samej problematyki. Podczas budowania zestawu treningowego z historycznych danych cecha dla danego przykładu treningowego musi być obliczona używając tylko informacji, które rzeczywiście były dostępne na czas przewidywania historycznego — nie informacji, które przybyły później i zostały wypełnione ponownie do magazynu. Proste połączenie batchowe, które prosto pociąga za siebie „aktualne” wartości cech dla historycznych przykładów wprowadza przepustowość: model trenuje na informacjach z przyszłości względem wydarzenia, które przewiduje, produkuje doskonałe metryki offline i niewłaściwie zanika w środowisku produkcyjnym, gdzie ta przyszła informacja, prawidłowo, nadal nie jest dostępna. To jest osobisty błąd od opisanej powyżej niezgodności logiki online/offline, ale kompensuje tę samą podstawową problematykę — że trening i służba potrzebują dokładnie takich samej wartości cechy w exact tym samym logicznym momencie. Budowanie tego zgodności ręcznie, pipeline za pipeline, jest tam, gdzie zespoły consistentnie się mylą.
Co właściwie robi sklep z cechami
Koncepcja architektury sklepu z cechami polega na tym, że logiczne obliczenia cech stają się pojedynczym, wersjonowanym i udostępnianym artefaktem, a nie czymś, co powtarza się dla każdego pipeline. Sklep dzieli przechowywanie na dwa warstwy synchroniczne, które obsługują różne wzory dostępu bez powtórzenia definicji cech. Sklepy offline (zazwyczaj oparte na magazynach danych lub lakehouse, takich jak BigQuery, Snowflake czy Parquet) przechowują pełną historię czasową wartości cech, optymalizowane dla dużych połączeń punktowych w czasie, które są potrzebne do budowy zestawu treningowego. Sklepy online (zazwyczaj niskopozostawiające magazyny klucz-wartość, takie jak Redis lub DynamoDB) przechowują tylko najnowsze wartości każdej cechy dla każdego entyta, optymalizowane dla szybkich zapytań pojedynczych wierszy potrzebnych do obliczeń na żywo. Kluczowo, oba sklepy są napełniane tym samym definicjami transformacji cech, które są zwykle wyrażone jednym razem w formie deklaratywnej (wyrażeniu SQL lub funkcji przekształceniowej zarejestrowanej w sklepie z cechami) i następnie materializowane w obu miejscach przez własny pipeline sklepu, co oznacza, że ścieżki obliczeń batchowe i streamingowe są generowane z jednego źródła prawdy, a nie pisane ręcznie dwoma różnymi zespołami.
Ta architektura z jednym definicji jest tym, co na prawdę usuwa offset treningowy i serwerowy, w przeciwieństwie do tylko uproszczenia detekcji: jeśli istnieje tylko jedno miejsce, w którym jest napisana logika cech, nie ma drugiej implementacji, która mogłaby się odchylić od pierwszej. Współczesne sklepy z cechami (Feast, Tecton, Databricks Feature Store, SageMaker Feature Store) rozwiązują problem poprawności w czasie punktu, poprzez obsługę „wrażliwej na czas” dołączania, które podczas budowy zestawu treningowego automatycznie pobiera wartość każdego cechy jako była ona w określonym momencie zdarzenia dla każdego przykładu treningowego, a nie obecna wartość, co jest dokładnie to dołączanie zapobiegające przewodzeniu, które zespoły musiały ręcznie budować i często niewłaściwie wykonywać.
Co nie rozwiązuje magazynu cech i kiedy jest ono wartą obciążenia
Magazyn cech to infrastruktura, a nie gwarancja, więc warto być jasno zorientowanym w jego granicach. Nie eliminuje potrzeby starannie zaprojektowania cech, nie automatycznie złapie definicji cechy, która jest koncepcyjnie błędna (tylko że jest zgodnie zastosowana), a także nie usuwa pracy inżynieryjskiej związanej z opóźnieniem — nawet dobrze zaprojektowanej cechy może nadal być wolne do dostarczenia online, niezależnie od architektury magazynu. Może też potrzebować przybliżonej wersji (aktualizowanego incymentalnie średnika zdecremującego zamiast pełnego przetworzenia), niezależnie od obecności magazynu.
Obciążenie związane z adopcją magazynu cech — budowanie online infrastruktury magazynu, migracja istniejących pipeline-ów do wspólnego formatu definicji, trening zespołów na nowym abstrakcji — jest rzeczywiste. Dla jednego zespołu uruchamiającego jeden lub dwa modele z prostymi i stabilnymi cechami, ręczne zarządzanie zgodnością między małym liczbą dobrze przetestowanych implementacji batchowych a online może naprawdę być mniej obciążającym niż adopcja pełnego platformy magazynu cech. Przykładem sytuacji, kiedy wskazuje na adopcję magazynu cech, jest kiedy organizacja ma wielu zespółów tworzących wiele modeli, które powtarzają się i używają wspólnej części cech (wartość życia klienta, liczba najnowszych zakupów itp. tendencje do niezależnego, niesytetycznego i bezużytecznego ponownego przetwarzania między różnymi zespołami ML w firmie), kiedy koszt incidentu skojarzonego z przesunięciem treningowego-służbowego został już zapłacony co najmniej raz, lub kiedy liczba modeli w produkcji jest wystarczająca, aby wspólna, zarządzana i odkrywalna katalog cech stała się wartościowa w sobie samodzielnie, niezależnie od problemu skojarzonego z przesunięciem treningowym-służbowym.
Często zadawane pytania
Co dokładnie jest przesunięciem treningu i dostarczania?
To niezgodność między wartościami cech, na których model był treningowy, a wartościami cech, które otrzymuje podczas rzeczywistego wnioskowania. Powstaje ona z powodu faktu, że obie wartości są obliczane przez różne ścieżki kodu, źródła danych lub różnice w czasie, nawet jeśli obie te wartości są formalnie implementacją tej samej definicji cechy.
Jak jest inaczej z magazynem cech w stosunku do prostego przechowywania wartości cech w Redis?
Magazyn przechowuje obliczone wartości, ale nie mówi nic o tym, jak te wartości były obliczane ani czy ta sama logika wygenerowała wartości treningowe offline. Kluczowym wkładem magazynu cech jest jedna, wersjonowana definicja cechy, która generuje zarówno historyczne wartości offline, jak i online przechowywane wartości, co gwarantuje logiczną zgodność obu zestawów danych, a nie ich niezależne utrzymanie.
Co to jest poprawność punktu w czasie i dlaczego ma znaczenie?
Oznacza to, że podczas budowania przykładu treningowego z historycznych danych, każda cecha musi być obliczona przy użyciu tylko informacji, które prawdopodobnie byłyby dostępne w momencie timestamp tego przykładu. Przewidowanie naruszenia tej reguły powoduje przepływ etykiety (leakage), gdzie model wydaje się bardzo dokładny offline, ponieważ był treningowy na informacjach przyszłych, których nie będzie miał w produkcji.
Czy mała drużyna potrzebuje magazynu cech?
Niekoniecznie. Druzyna działająca nad małą liczbą modeli z prostymi i dobrze testowanymi cechami często może utrzymywać zgodność ręcznie. Magazyny cech zdobywają swoją obciążoną strukturę, gdy kilka drużyn i modeli zaczyna dzielić się powtarzalnymi cechami lub gdy przesunięcie treningu i dostarczania już spowodowało drogoceną incydent w produkcji.
▶ Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Feature Store Skew Detector i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.