Pierwsze wywołanie modelu po uruchomieniu procesu potrafi trwać kilka razy dłużej niż setne. Nie jest to awaria ani przypadek — to koszt pracy, którą runtime wykonuje raz.
Czym jest rozgrzewka
Rozgrzewka to początkowa faza działania procesu inferencyjnego, w której runtime kompiluje jądra obliczeniowe pod konkretną architekturę sprzętu, dobiera ich warianty dla występujących kształtów danych, alokuje bufory i zapełnia pamięć podręczną systemu plikami wag. Część runtime’ów wykonuje tę pracę w całości przy starcie, część dopiero przy pierwszym faktycznym użyciu danej ścieżki wykonania.
Co się w tym czasie dzieje
Kompilacja grafu na jądra obliczeniowe, z uwzględnieniem fuzji operatorów.
Dobór wariantów jąder przez pomiar — dla danego rozmiaru macierzy i danej karty runtime sprawdza kilka implementacji i zapamiętuje najszybszą.
Wczytanie wag z dysku do pamięci systemu, które przy drugim uruchomieniu jest natychmiastowe, bo plik siedzi już w pamięci podręcznej systemu operacyjnego.
Konsekwencja dla pomiarów
Każdy benchmark bez rozgrzewki zawyża czas i jest nieporównywalny z wynikami innych. Standardem jest odrzucenie pierwszych kilku wywołań i dopiero potem rozpoczęcie pomiaru.
Konsekwencja dla produkcji
Instancja dopiero co uruchomiona obsługuje ruch gorzej niż instancja działająca od godziny. Przy skalowaniu automatycznym oznacza to, że nagły wzrost ruchu pogarsza opóźnienie podwójnie: raz przez kolejkę, raz przez nierozgrzane instancje, które ten ruch przejmują.
Ten sam mechanizm działa po stronie dostawcy API i jest jedną z przyczyn pojedynczych odpowiedzi wolniejszych bez wyraźnego powodu.