Jak odczyt z wyprzedzeniem wpływa na czas ładowania modelu i ruch w pamięci współdzielonej?

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.

Read-ahead może skrócić sekwencyjne ładowanie modelu, pobierając z wyprzedzeniem przyszłe strony, ale zbyt duże okna mogą marnować pamięć podręczną i przepustowość współdzielonej pamięci masowej.

Gdy kilku domowych użytkowników AI otwiera ten sam wielogigabajtowy model z serwera NAS, odczyty na żądanie mogą zatrzymywać się przy każdej brakującej stronie. Prefetching może utrzymywać kolejne strony w gotowości, jednak każdy klient może również zażądać danych, których nigdy nie użyje, albo powielić ruch innego klienta. Rezultat zależy od kolejności dostępu, mapowania pamięci, ponownego wykorzystania pamięci podręcznej stron, shardingu modelu, współbieżności, opóźnień pamięci masowej oraz miejsca, w którym odbywa się buforowanie.

Read-ahead zamienia sekwencyjne żądania w wcześniejsze operacje wejścia-wyjścia

Bez użytecznego stanu pamięci podręcznej program ładujący dociera do strony i czeka, aż pamięć masowa ją zwróci. Read-ahead rozpoznaje sekwencyjny dostęp i wysyła żądania dotyczące kolejnych stron, zanim proces ich zażąda. Jeśli przewidywanie i synchronizacja są trafne, obliczenia wykorzystują bieżący obszar, podczas gdy pamięć masowa wypełnia następny.

Jądro Linuksa pamięci podręcznej stron stosuje read-ahead oraz zwiększa lub zmniejsza jego okno na podstawie obserwowanego dostępu. Pomaga to przy buforowanych odczytach sekwencyjnych, ponieważ przyszłe strony mogą już znajdować się w pamięci, gdy program ładujący do nich dotrze.

Korzyść jest największa, gdy opóźnienie pamięci masowej w przeciwnym razie powodowałoby przerwy, a model jest odczytywany w przewidywalnej kolejności. Jest mniejsza, gdy plik znajduje się już w pamięci podręcznej, bezpośrednie operacje wejścia-wyjścia omijają pamięć podręczną stron, program ładujący jawnie wstępnie ładuje wszystko albo środowisko uruchomieniowe odwołuje się do mapowanych stron w nieregularnym wzorcu.

Mapowanie pamięci sprawia, że kolejność błędów stron staje się częścią ładowania

Mapowanie pamięci może sprawiać, że uruchamianie modelu wydaje się szybkie, ponieważ środowisko uruchomieniowe tworzy mapowania adresów, zanim każda strona wag znajdzie się w pamięci. Fizyczne operacje wejścia-wyjścia odbywają się w momencie odwołania do stron. Rzeczywisty czas ładowania zależy więc od tego, czy pomiar kończy się po utworzeniu mapowania, czy trwa do momentu, gdy wnioskowanie wczyta przez błędy stron cały roboczy zestaw danych.

wagi modelu mapowane w pamięci mogą powodować opóźnienia pamięci masowej przy błędach brakujących stron, a nieregularny dostęp może generować wiele małych odczytów. Read-ahead pomaga, gdy kolejność odwołań pozostaje wystarczająco sekwencyjna, aby można ją było przewidzieć; w przeciwnym razie może pobierać niewłaściwe obszary.

Mierz zarówno czas potrzebny na utworzenie obiektu modelu, jak i czas do wygenerowania pierwszego ukończonego tokena. Zmiana, która przenosi operacje wejścia-wyjścia z uruchamiania do pierwszego żądania, nie usunęła pracy związanej z ładowaniem. Testy z rozgrzaną pamięcią podręczną należy oddzielić od testów z zimną pamięcią, ponieważ ponowne wykorzystanie stron może zdominować wynik.

Zbyt duże okna zanieczyszczają pamięć podręczną i zużywają współdzieloną przepustowość

Okno pobierania z wyprzedzeniem wykraczające poza najbliższy roboczy zestaw programu ładującego przesyła strony, które mogą zostać usunięte z pamięci przed użyciem. Strony te zajmują pamięć klienta, wypierają inne wpisy pamięci podręcznej i zużywają przepustowość łącza NAS oraz zaplecza pamięci masowej. Marnotrawstwo jest bardziej widoczne, gdy programy ładujące uruchamiają różne modele jednocześnie.

zbyt agresywny read-ahead może zanieczyszczać pamięć podręczną bezużytecznymi danymi, a zbyt mały powoduje późniejsze odczyty na żądanie; oba zjawiska pogarszają wydajność. Jeden stały domyślny parametr nie może być optymalny jednocześnie dla ładowania sekwencyjnego, rozproszonego dostępu ekspertów i mieszanego ruchu pamięci masowej.

Współdzielona pamięć masowa potęguje skutki błędnych ustawień, ponieważ każdy klient dokonuje lokalnych przewidywań i nie musi wiedzieć, co pobierają inni klienci. Jeśli buforowanie po stronie serwera nie potrafi scalać tych odczytów, zsynchronizowane uruchomienia mogą zamienić agresywny prefetching w nagły skok ruchu, który opóźni każdy program ładujący oraz niezwiązane z nim zadania NAS.

-15% OFF

Miejsce buforowania decyduje o tym, czy programy ładujące współdzielą korzyść

Pamięć podręczna stron klienta pomaga procesom na danym komputerze, natomiast pamięć podręczna NAS może pomóc wielu klientom, lecz nadal wymaga przesyłania danych przez sieć. Pamięć GPU jest kolejnym, odrębnym miejscem docelowym. Te same bajty modelu mogą być więc przechowywane na serwerze, w pamięci RAM klienta i w akceleratorze, przy czym żadna pojedyncza warstwa nie eliminuje przesyłania danych przez pozostałe.

Przy shardingu modelu procesy robocze mogą odczytywać tylko przypisane im obszary, a nie cały plik. Read-ahead całego pliku może osłabić tę korzyść, pobierając shardy, których proces nigdy nie użyje, podczas gdy dostęp dopasowany do granic shardów może utrzymać pobieranie z wyprzedzeniem w użytecznym zakresie.

Współbieżne procesy na jednym hoście mogą współdzielić strony plików mapowanych w pamięci, ale oddzielne hosty nie mogą współdzielić pamięci RAM klientów. Testuj rzeczywistą topologię: lokalny dysk SSD, NAS przez Ethernet, rozproszoną pamięć podręczną albo skopiowane pliki modeli. To samo ustawienie read-ahead może zmniejszyć lokalne przestoje, a jednocześnie zwiększyć całkowitą liczbę bajtów przesyłanych przez sieć.

Dostosuj read-ahead do obciążeń zimnych, ciepłych i współbieżnych

Podczas testów pozostaw bez zmian plik modelu, środowisko uruchomieniowe, ścieżkę pamięci masowej i sprzęt, a sprawdź kilka rozmiarów okna. Rejestruj czas do pierwszego tokena przy zimnej pamięci podręcznej, czas ponownego uruchomienia przy rozgrzanej pamięci, liczbę bajtów odczytanych z pamięci masowej, przepustowość sieci, liczbę błędów stron, presję na pamięć podręczną oraz opóźnienia innych obciążeń NAS. Powtórz pomiary dla jednego programu ładującego i oczekiwanej liczby współbieżnych procesów.

Praktyczne omówienie prefetchingu i pamięci podręcznej pokazuje, że te warstwy współdziałają, zamiast działać jak niezależne przełączniki. Ulepszenia należy przypisywać użytecznym wcześniejszym odczytom, buforowaniu po stronie serwera lub ponownemu wykorzystaniu danych przez klienta, a nie pojedynczej wartości czasu uruchamiania.

Najlepsze ustawienie zależy od obciążenia. Zwiększaj read-ahead, dopóki ogranicza przestoje przy zimnej pamięci podręcznej bez istotnego zwiększania liczby nieużywanych bajtów lub zakłóceń między procesami; zmniejszaj go, gdy dostęp jest rzadki, model jest podzielony na shardy albo presja na pamięć podręczną jest wysoka. Ponownie oceń ustawienia po zmianie środowiska uruchomieniowego, formatu modelu, układu shardów lub topologii pamięci masowej.

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.