Co powoduje, że lokalne środowisko uruchomieniowe AI ładuje duplikaty modeli?

Eva Wong jest Technicznym pisarzem i stałym majsterkowiczem w ZimaSpace. Całe życie geek z pasją do homelabów i oprogramowania open-source, specjalizuje się w tłumaczeniu skomplikowanych koncepcji technicznych na przystępne, praktyczne przewodniki. Eva wierzy, że samodzielne hostowanie powinno być zabawą, a nie czymś onieśmielającym. Poprzez swoje samouczki umożliwia społeczności rozwiewanie tajemnic konfiguracji sprzętu, od budowy pierwszego NAS po opanowanie kontenerów Docker.

Zduplikowane kopie modelu pojawiają się, gdy oddzielne procesy, repliki, sesje lub konteksty urządzeń nie mogą współdzielić jednej załadowanej alokacji wag.

Domowy serwer AI może wykazywać mniej więcej dwukrotnie większe użycie pamięci RAM lub VRAM po dodaniu interfejsu webowego, procesu roboczego działającego w tle, usługi głosowej, indeksatora dokumentów lub drugiego punktu końcowego API. Plik modelu na dysku może pozostać pojedynczy, podczas gdy kilka obiektów środowiska wykonawczego przechowuje niezależne wagi, przekonwertowane tensory, wstępnie spakowane kernele, pamięci podręczne i konteksty urządzeń. Część duplikacji jest przypadkowa, a inne kopie są celowymi replikami tworzonymi na potrzeby współbieżności, izolacji lub wykonywania równoległego.

Jeden plik modelu może utworzyć kilka niezależnych obiektów środowiska wykonawczego

Wczytanie z tej samej ścieżki nie oznacza, że dwie aplikacje odwołują się do jednego modelu w pamięci. Każda instancja środowiska wykonawczego może przeanalizować punkt kontrolny i przydzielić własne tensory.

Wskazówki Google Cloud dotyczące wnioskowania rozróżniają konfiguracje, które wczytują jedną kopię modelu na proces lub na maszynę wirtualną.

Jeśli użycie pamięci rośnie skokami odpowiadającymi rozmiarowi modelu wraz ze zwiększaniem liczby procesów roboczych, główną przyczyną jest replikacja instancji. Mniejsze przyrosty wskazują raczej na pamięci podręczne, alokatory lub konteksty wykonywania przypisane do poszczególnych procesów roboczych.

Serwery webowe i procesy robocze zadań często uruchamiają oddzielne procesy

Serwer frontendu, konsument kolejki, harmonogram, usługa transkrypcji i proces roboczy RAG mogą każdy importować moduł wczytujący model, nawet jeśli należą do jednego stosu Compose.

Izolacja procesów zapewnia każdej usłudze własną przestrzeń adresową. Strony pamięci CPU mogą czasami być współdzielone za pomocą mechanizmów systemu operacyjnego, ale zwykłe obiekty frameworków i alokacje GPU nie stają się automatycznie jednym współdzielonym serwerem modelu.

Duplikacja przebiega zgodnie z identyfikatorami procesów i granicami usług. Jeśli zatrzymanie jednego kontenera zwalnia w przybliżeniu jedną kopię modelu, kontener nie przekazywał jedynie żądań do centralnego środowiska wykonawczego.

Repliki obsługujące model są z założenia pojedynczymi kopiami

Systemy automatycznego skalowania zwiększają przepustowość, uruchamiając więcej replik. Replika to niezależny proces roboczy zdolny do obsługi żądań, gdy inne procesy są zajęte.

Ray Serve definiuje repliki jako niezależne kopie działające w oddzielnych procesach aktorów.

Wzrost użycia pamięci odpowiadający skokom ruchu lub zdarzeniom automatycznego skalowania jest celową replikacją, a nie wyciekiem. Przyczyną jest wybrany model współbieżności, nawet jeśli dodatkowe repliki potrzebują później czasu na zmniejszenie liczby.

-15% OFF

Wiele sesji wnioskowania może duplikować inicjalizatory i wstępnie spakowane wagi

Aplikacja może utworzyć kilka sesji w jednym procesie na potrzeby różnych wątków, punktów końcowych, profili lub dostawców wykonywania.

Dokumentacja ONNX Runtime opisuje współdzielenie alokatorów, inicjalizatorów i wstępnie spakowanych wag między sesjami, ponieważ oddzielne sesje w przeciwnym razie zwiększają zużycie pamięci.

Jeśli jeden proces posiada kilka obiektów sesji, a użycie pamięci rośnie podczas inicjalizacji każdej sesji, zduplikowany stan znajduje się wewnątrz aplikacji, a nie między kontenerami.

Rozgałęzianie procesu nie gwarantuje współdzielenia wag akceleratora

Proces nadrzędny może wczytać model przed utworzeniem procesów roboczych i sprawiać wrażenie, że współdzieli strony pamięci CPU dzięki mechanizmowi kopiowania przy zapisie. Inicjalizacja akceleratora i zmienny stan środowiska wykonawczego komplikują to założenie.

Wskazówki PyTorch dotyczące wieloprocesowości wyjaśniają, że tensory mogą korzystać z mechanizmów pamięci współdzielonej między procesami, ale współdzielenie wymaga jawnie zaprojektowanego, zgodnego rozwiązania.

Proces roboczy, który przenosi model do GPU, zmienia wagi, tworzy pamięć podręczną lub inicjalizuje się po utworzeniu przez spawn, może przydzielić nową kopię, nawet jeśli pierwotne strony punktu kontrolnego CPU były współdzielone.

Oddzielne konteksty CUDA dodają stan urządzenia przypisany do procesu

Dwa procesy korzystające z jednego GPU zwykle działają za pośrednictwem oddzielnych kontekstów CUDA, chyba że używana jest specjalna architektura współdzielenia.

Firma NVIDIA zauważa, że wiele procesów aplikacji CUDA zazwyczaj tworzy wiele kontekstów z narzutem pamięci.

Narzut związany z kontekstem sam w sobie nie jest drugą pełną kopią modelu, ale może towarzyszyć zduplikowanym wagom, kernelom, obszarom roboczym i pamięciom podręcznym. Dlatego wzrost pamięci mniejszy niż rozmiar punktu kontrolnego również może wynikać z duplikacji procesów.

Dwie instancje środowiska wykonawczego na jednym GPU niezależnie rezerwują pamięć

Panel może uruchamiać jeden serwer modelu, podczas gdy usługa automatyzacji uruchamia drugi — oba wskazują ten sam punkt kontrolny i urządzenie.

Dokumentacja vLLM wyjaśnia, że wykorzystanie pamięci GPU jest limitem przypisanym do instancji i podaje przykład dwóch instancji dzielących pojemność jednego GPU.

Jeśli każdy punkt końcowy ma własny nasłuchujący proces, logi, harmonogram i pamięć podręczną KV, oba procesy są niezależnymi silnikami wnioskowania. Współdzielony katalog modeli zapobiega ponownemu pobieraniu plików, ale nie zapobiega duplikowaniu alokacji środowiska wykonawczego.

Przeładowania mogą pozostawić stary proces obok nowego

Mechanizmy automatycznego przeładowywania, nadzorcy, aktualizacje kroczące, nieudane zamknięcia i restarty kontroli stanu mogą uruchomić zastępczy proces, zanim stary proces roboczy zwolni model.

Ta przyczyna objawia się tymczasową lub trwałą parą niemal identycznych procesów o różnych godzinach uruchomienia. Żądania mogą trafiać tylko do nowszego procesu, podczas gdy starszy nadal zajmuje RAM lub VRAM.

Artykuł ZimaSpace wyjaśniający, dlaczego należy oddzielać stan środowiska wykonawczego AI od plików modeli, wyznacza tę granicę: jedna pamięć podręczna punktu kontrolnego może obsługiwać wiele wdrożeń, ale topologia usług nadal określa liczbę załadowanych kopii.

Najczęściej zadawane pytania

Czy jeden plik modelu na dysku oznacza, że w pamięci RAM znajduje się tylko jedna kopia?

Nie. Kilka procesów lub sesji może niezależnie odczytać ten sam plik i przydzielić własne tensory, pamięci podręczne oraz stan wykonywania.

Czy każda dodatkowa kopia jest wyciekiem pamięci?

Nie. Repliki, procesy równoległe tensorowo, środowiska awaryjne i izolowane usługi mogą celowo przydzielać dodatkowy stan. Wyciek rośnie bez odpowiadającego mu aktywnego obiektu środowiska wykonawczego.

Czy kontenery mogą automatycznie współdzielić jeden model GPU?

Nie. Kontenery mogą uzyskiwać dostęp do tego samego urządzenia i plików, ale do ponownego wykorzystania jednej załadowanej alokacji modelu potrzebują współdzielonego procesu obsługującego żądania lub jawnie zaprojektowanego rozwiązania międzyprocesowego.

Centrum Technologii i Sztucznej Inteligencji

Więcej do przeczytania

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.