Narzędzie do wyświetlania pamięci
Możesz użyć narzędzia Memory Viewer, aby zwizualizować wykorzystanie pamięci w całym okresie działania programu. Możesz uzyskać szczegółowe informacje o zawartości pamięci w momencie szczytowego wykorzystania pamięci, m.in. w celu debugowania sytuacji braku pamięci. Narzędzie do wyświetlania pamięci pozwala sprawdzić globalne wykorzystanie pamięci i to, jak blisko jest ono do wyczerpania pamięci.
Wszystkie informacje wyświetlane w Menedżerze pamięci są czysto statyczne i pochodzą z kompilatora XLA. Dynamiczne informacje o czasie wykonywania są prezentowane w narzędziu Profile pamięci.
Obsługiwane platformy
TPU: obsługiwane
GPU: obsługiwane
Komponenty przeglądarki pamięci
Aplikacja Memory Viewer składa się z kilku kluczowych elementów:
- Menu użytkownika, które umożliwiają dostosowywanie danych wizualizowanych:
- Typy pamięci: obsługiwane typy pamięci zależą od akceleratora. W przypadku kart graficznych główną rolę odgrywa pamięć o wysokiej przepustowości (HBM), natomiast w przypadku TPU możesz dodatkowo wyświetlać wykorzystanie pamięci na chipie, w tym VMEM, SMEM, CMEM, flagi synchronizacji (SFlag), Sparsecore, a także pamięci hosta.
- Moduły: to programy XLA, które były częścią Twojego wykonania. Dobrym punktem wyjścia jest często moduł najwyższego poziomu o nazwie „jit_train_step” lub „jit_generate”.
- Sekcja tekstu ogólnego zawiera informacje ogólne, takie jak maksymalne przydzielone miejsce na potrzeby programu, podział na argumenty i zmiennych tymczasowych itp. Występuje pewien narzut spowodowany wypełnianiem, co jest konieczne ze względu na ograniczenia dotyczące obsługiwanych kształtów tensorów na akceleratorach. Jeśli ta wartość jest dużą częścią całkowitego przydziału, może to oznaczać możliwość optymalizacji.
- Wykres liniowy „Rozmiar przydziału pamięci w stosunku do kolejności programu” przedstawia wykorzystanie pamięci w stosunku do punktów programu (sekwencja HLO) zgodnie z harmonogramem kompilatora.
- Pamiętaj, że oś X to nie czas.
- Wykres wyróżnia punkt w programie, w którym wybrany moduł osiąga maksymalne wykorzystanie pamięci. Profilator i narzędzia nie są świadome współlokowania modułów na danym układzie lub w danej pamięci. Podczas kompilowania każdego modułu kompilator oznacza profil za pomocą „punktu wyjściowego” łącznej alokowanej pamięci (określanej przez moduły, które zostały skompilowane przed tym modułem), a potem liczy w górę i w dół w miarę dalszego przydzielania i zwalniania pamięci. Nie są jednak rejestrowane żadne przyszłe alokacje przez inne moduły skompilowane przed wykonaniem. Pamiętaj o tym podczas debugowania sytuacji OOM.
Wykresy bufora na dole strony pokazują wykorzystanie pamięci w punkcie szczytowego wykorzystania programu (wskazujący na to punkt na wykresie liniowym wykorzystania pamięci). Są 3 wykresy, które pokazują cały zestaw buforów przydzielonych przez program, ale posortowany na 3 różne sposoby:
- Według kolejności w programie: kolejność, w jakiej zostały utworzone podczas wykonywania programu, przy czym te najstarsze znajdują się po lewej stronie.
- Według rozmiaru: te procesy, które mają największy wpływ na szczytowe wykorzystanie pamięci, znajdują się po lewej stronie.
Zacznij od marginesu, który one wymagają: po lewej stronie znajdują się te, które są najbardziej „nieefektywne” z perspektywy sprzętu.
Pamiętaj, że kolory buforów nie mają żadnego szczególnego znaczenia.
Najedź kursorem na bufor na dowolnym z tych 3 wykresów, aby wyświetlić 2 dodatkowe opcje:
- Nakładka na wykresie liniowym wykorzystania pamięci w kolorze odpowiadającym karcie bufora, wskazująca czas trwania tego bufora, czyli poziomą belkę, której lewy i prawy brzeg wskazują punkty alokacji i odalokacji w ramach kolejności programu. Wysokość paska poziomego przedstawia względną wielkość wybranego bufora w porównaniu z maksymalnym przydziałem.
- Oddzielna karta z informacjami o buforze, zwykle po lewej stronie, z szczegółami dotyczącymi konkretnej opcji. Typowa karta zawiera te informacje:
- Nazwa: nazwa operacji XLA, której możesz szukać w GraphViewer lub Trace Viewer.
- Rozmiar: rozmiar bufora z wypełnieniem i bez niego.
- Shape: określa rangę, rozmiar i typ danych tablicy N-wymiarowej.
- Nazwa operacji w ramach frameworka: wyświetla nazwę operacji w ramach frameworka powiązanej z tą alokacją.
- Typ przydziału: przydziały bufora są podzielone na następujące typy: parametr, dane wyjściowe, lokalny wątek i tymczasowy (np. przydział bufora wewnątrz fuzji).