Jak odciążanie procesora pozwala uruchamiać zbyt duże modele na domowym serwerze?

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.

Odciążanie CPU pozwala uruchamiać zbyt duży model, przechowując część jego wag w systemowej pamięci RAM zamiast wymagać, aby cały model mieścił się w pamięci akceleratora.

Na domowym serwerze AI może to zmienić model, którego nie da się załadować na jednym GPU, w użyteczną usługę lokalną. Kompromis jest bezpośredni: zmniejsza się obciążenie pamięci VRAM, ale w ścieżce inferencji pojawia się użycie pamięci CPU, ruch przez PCIe lub interkonekt, a czasami także wykonywanie operacji przez CPU. Odciążanie jest przede wszystkim techniką zwiększania pojemności, a dopiero w drugiej kolejności techniką poprawy wydajności — i tylko wtedy, gdy hierarchia pamięci jest wystarczająco szybka.

Zbyt duży model nie uruchomi się, gdy szybkie urządzenie nie może pomieścić wymaganego stanu

Lokalny model potrzebuje miejsca na wagi, pamięć podręczną KV, aktywacje, bufory tymczasowe i rezerwy środowiska uruchomieniowego. Jeśli akcelerator nie może pomieścić wymaganego stanu rezydentnego, ładowanie może zakończyć się niepowodzeniem, zanim rozpocznie się użyteczna inferencja.

Hugging Face Accelerate traktuje inferencję dużych modeli jako problem rozmieszczania wag modelu między dostępnymi warstwami pamięci. Odciążanie CPU dodaje systemową pamięć RAM jako wolniejszą warstwę przechowywania stanu modelu.

Model staje się możliwy do uruchomienia, ponieważ mniejsza jego część musi jednocześnie pozostawać w pamięci VRAM, a nie dlatego, że akcelerator zyskał fizyczną pamięć.

Odciążone wagi pozostają w systemowej pamięci RAM, dopóki nie są potrzebne danej warstwie

Środowisko uruchomieniowe może przechowywać wybrane tensory parametrów na CPU, podczas gdy bieżąca warstwa lub grupa warstw działa na GPU. W miarę postępu obliczeń potrzebne wagi są przesyłane do akceleratora, a starsze mogą być przenoszone z powrotem lub usuwane z pamięci urządzenia.

DeepSpeed ZeRO-Inference może przechowywać wagi modelu w pamięci CPU lub NVMe oraz przesyłać je warstwa po warstwie do GPU. Zmniejsza to szczytowe zajęcie pamięci akceleratora, ale sprawia, że przesyłanie wag staje się częścią wykonywania modelu.

Rozmieszczenie warstw może być również statyczne: niektóre warstwy pozostają na CPU i są tam wykonywane, podczas gdy inne pozostają na GPU. Obie strategie zamieniają mniejsze obciążenie pamięci urządzenia na wolniejszą pamięć i ścieżki przesyłania.

Ścieżka PCIe lub pamięć współdzielona stają się częścią generowania każdego tokena

Jeśli wagi muszą przechodzić przez PCIe podczas wykonywania propagacji w przód, opóźnienie i przepustowość transferu trafiają bezpośrednio na krytyczną ścieżkę inferencji. Model, który w całości mieści się w pamięci VRAM, może ponownie wykorzystywać rezydujące wagi z przepustowością urządzenia; model odciążony może wielokrotnie pobierać duże tensory.

PyTorch opisuje przypiętą pamięć hosta oraz charakterystykę transferu z CPU do GPU, pokazując, dlaczego przesyłanie między hostem a urządzeniem stanowi odrębną dziedzinę wydajności względem obliczeń GPU.

Dlatego odciążanie CPU może zmienić awarię z powodu braku pamięci w działający, ale wolniejszy model. Najpierw rozwiązany zostaje problem pojemności, natomiast przepustowość może gwałtownie spaść.

-15% OFF

Większa ilość systemowej pamięci RAM zwiększa pojemność, ale nie gwarantuje szybkości

Potrzeba wystarczającej ilości pamięci RAM, aby pomieścić odciążoną część modelu, system operacyjny, pamięć podręczną stron, kontenery, bazy danych i inne usługi domowego serwera. Gdy model zaczyna korzystać z pliku wymiany, nawet wolna konfiguracja może stać się niepraktyczna.

Linux opisuje odzyskiwanie pamięci i pamięć wymiany jako element hierarchii pamięci systemu. Model odciążony konkuruje o ten sam budżet pamięci RAM ze wszystkimi innymi procesami.

Domowy serwer, na którym działają również NAS, indeksator zdjęć i baza multimediów, powinien mieć rzeczywisty zapas pamięci, zamiast być konfigurowany wyłącznie na podstawie rozmiaru pliku modelu.

Kwantyzacja i odciążanie rozwiązują różne części problemu dopasowania modelu

Kwantyzacja zmniejsza liczbę bajtów zajmowanych przez wagi, co może ograniczyć zarówno zajęcie pamięci GPU, jak i CPU oraz zmniejszyć ilość przesyłanych danych. Odciążanie zmienia miejsce przechowywania tych bajtów podczas wykonywania.

NVIDIA NeMo opisuje przeprowadzane po treningu metody kwantyzacji FP8, INT8 i INT4, które zmniejszają użycie pamięci przez model. Model po kwantyzacji może zmieścić się w całości na GPU i nie wymagać odciążania; większy model może nadal wymagać obu technik.

Właściwa kolejność polega na określeniu akceptowalnej precyzji i jakości modelu, a dopiero potem wyborze jego rozmieszczenia. Odciążanie niepotrzebnie dużej reprezentacji może marnować przepustowość.

Używaj odciążania CPU, gdy ważniejsze jest uruchomienie modelu niż maksymalna przepustowość

Najlepszym zastosowaniem jest okazjonalnie używany model lokalny, który przekracza pojemność VRAM, ale nadal zapewnia akceptowalne opóźnienia, gdy część jego stanu znajduje się w pamięci RAM. Rozwiązanie jest mniej atrakcyjne w przypadku interaktywnej usługi dla wielu użytkowników, gdy każdy token musi być wielokrotnie przesyłany przez wolne łącze.

Przewodnik ZimaSpace dotyczący doboru pamięci i akceleratora dla serwera NAS AI stanowi warstwę planowania: odciążanie należy traktować jako awaryjny sposób zwiększania pojemności w ramach pełnego obciążenia domowego serwera.

Zmierz użycie VRAM, użycie RAM, ilość danych przesyłanych między hostem a urządzeniem, czas do pierwszego tokena, liczbę tokenów wyjściowych na sekundę oraz wpływ na inne usługi hostowane samodzielnie. Konfiguracja, która technicznie ładuje model, ale wymusza użycie pamięci wymiany lub spowalnia NAS, nie jest praktycznym rozwiązaniem.

Wyjaśnienie ZimaSpace dotyczące rezydencji i eksmisji modeli omawia pokrewny kompromis: zwolnienie pamięci akceleratora zwiększa pojemność dostępną dla innych zadań, ale może sprawić, że kolejne żądanie ponownie poniesie koszt ładowania lub przesyłania.

Najczęściej zadawane pytania

Czy odciążanie CPU łączy pamięć RAM i VRAM w jeden szybki wspólny obszar pamięci?

Nie. Pozwala środowisku uruchomieniowemu rozmieszczać stan modelu między obiema warstwami, ale pamięć RAM CPU i pamięć VRAM GPU mają różną przepustowość i różne opóźnienia. Przesyłanie między nimi może stać się głównym wąskim gardłem inferencji.

Czy dodanie większej ilości pamięci RAM przyspieszy model odciążony?

Tylko wtedy, gdy obecny system ma za mało pamięci RAM, korzysta ze stronicowania lub nie jest w stanie utrzymać zamierzonego odciążonego stanu w pamięci. Dodatkowa niewykorzystana pamięć RAM nie eliminuje kosztów PCIe ani wykonywania operacji przez CPU.

Czy odciążanie na SSD jest tym samym co odciążanie CPU?

Nie. Odciążanie na dysk dodaje jeszcze wolniejszą warstwę pamięci masowej, gdy pamięć RAM jest niewystarczająca. Może jeszcze bardziej zwiększyć pojemność, ale strony modelu muszą przejść przez pamięć masową i zwykle pamięć systemową, zanim trafią do akceleratora.

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.