Memory Viewer Tool
Mit dem Memory Viewer können Sie die Speichernutzung über die Laufzeit des Programms hinweg visualisieren. Sie können sich die Details des Arbeitsspeicherinhalts zum Zeitpunkt der Spitzenspeichernutzung ansehen, um beispielsweise Probleme mit unzureichendem Arbeitsspeicher zu beheben. Mit dem Memory Viewer können Sie die globale Arbeitsspeichernutzung und die Wahrscheinlichkeit sehen, dass der Arbeitsspeicher nicht mehr ausreicht.
Alle Informationen, die im Arbeitsspeicher-Viewer angezeigt werden, sind rein statisch und stammen aus dem XLA-Compiler. Dynamische Laufzeitinformationen werden im Tool „Arbeitsspeicherprofil“ angezeigt.
Unterstützte Plattformen
TPU: Unterstützt
GPU: Unterstützt
Komponenten des Memory Viewer
Der Arbeitsspeicher-Viewer besteht aus mehreren Hauptkomponenten:
- Drop-down-Menüs für Nutzer, mit denen Sie die visualisierten Daten anpassen können:
- Speichertypen: Die unterstützten Speichertypen sind beschleunigerabhängig. Bei GPUs liegt der Schwerpunkt auf dem High Bandwidth Memory (HBM). Bei TPUs können Sie zusätzlich die Nutzung von On-Chip-Speichern wie VMEM, SMEM, CMEM, Sync Flags (SFlag), Sparsecore und auch den Hostspeicher einsehen.
- Module: Dies sind die XLA-Programme, die Teil Ihrer Ausführung waren. Ein guter Ausgangspunkt ist oft ein Modul der obersten Ebene mit einem Namen wie „jit_train_step“ oder „jit_generate“.
- Der Textbereich mit der Übersicht enthält allgemeine Informationen wie die für das Programm erforderliche maximale Arbeitsspeicherzuweisung, die Aufteilung zwischen Argumenten und temporären Variablen usw. Durch Padding entsteht ein Overhead, der durch Einschränkungen bei den unterstützten Formen von Tensoren auf Beschleunigern erforderlich ist. Wenn dieser Puffer einen großen Teil der Gesamtzuweisung ausmacht, kann das auf eine Optimierungsmöglichkeit hinweisen.
- Im Liniendiagramm „Größe der Arbeitsspeicherzuweisung im Vergleich zur Programmreihenfolge“ wird die Arbeitsspeichernutzung im Vergleich zu den Programmpunkten (HLO-Sequenz) dargestellt, die vom Compiler geplant wurden.
- Die X-Achse ist nicht die Zeitachse.
- Im Diagramm wird der Punkt im Programm mit der maximalen Speichernutzung des ausgewählten Moduls hervorgehoben. Der Profiler und die Tools sind sich der gemeinsamen Belegung von Modulen auf einem bestimmten Chip/Speicher nicht bewusst. Wenn jedes Modul kompiliert wird, fügt der Compiler dem Profil den „Baseline“-Startpunkt des gesamten zugewiesenen Arbeitsspeichers (von Modulen, die vor diesem kompiliert wurden) hinzu und zählt von dort aus nach oben und unten, wenn weitere Zuweisungen und Deaktivierungen erfolgen. Alle zukünftigen Zuordnungen durch andere Module, die vor der Ausführung kompiliert wurden, werden jedoch nicht erfasst. Berücksichtigen Sie dies beim Beheben von OOM-Situationen.
In den Pufferdiagrammen unten auf der Seite wird die Speichernutzung am Spitzenlastpunkt des Programms aufgeschlüsselt (dieser wird durch die vertikale Linie im Liniendiagramm zur Speichernutzung angezeigt). Es gibt drei Diagramme, die alle die vom Programm zugewiesenen Buffers enthalten, aber auf drei verschiedene Arten sortiert sind:
- Nach Programmreihenfolge: Die Reihenfolge, in der sie während der Programmausführung erstellt wurden, wobei die ältesten Elemente links angezeigt werden.
- Nach Größe: Die Elemente mit der größten Auswirkung auf den Punkt der maximalen Speichernutzung befinden sich auf der linken Seite.
Durch den zusätzlichen Speicherplatz, den sie erfordern: Die am wenigsten „effizienten“ aus hardwaretechnischer Sicht sind links zu sehen.
Die Farben der Puffer haben keine bestimmte Bedeutung.
Wenn Sie den Mauszeiger in einem der drei Diagramme auf einen Zwischenspeicher bewegen, werden zwei zusätzliche Ansichten angezeigt:
- Ein Overlay auf dem Liniendiagramm für die Speichernutzung in einer Farbe, die der Zwischenspeicherkarte entspricht, das die Lebensdauer dieses Zwischenspeichers angibt. Das ist eine horizontale Leiste, deren linker und rechter Rand die Zuordnungs- und Deaktivierungspunkte innerhalb der Programmabfolge angeben. Die Höhe der horizontalen Balken entspricht der relativen Größe des ausgewählten Buffers im Vergleich zur maximalen Zuweisung.
- Eine separate Karte mit Zwischenspeicherdetails, in der sich gegebenenfalls Details zum jeweiligen Vorgang befinden, befindet sich in der Regel auf der linken Seite. Eine typische Karte enthält folgende Informationen:
- Name: Der Name des XLA-Vorgangs, nach dem Sie im Graph Viewer oder Trace Viewer suchen können.
- Größe: Die Größe der Pufferzuweisung mit und ohne Auffüllung.
- „Shape“ (Form): Beschreibt Rang, Größe und Datentyp des n-dimensionalen Arrays.
- Name des Framework-Vorgangs: Der Name des Framework-Vorgangs, der mit dieser Zuordnung verknüpft ist.
- Zuordnungstyp: Die Pufferzuordnungen werden in die folgenden Typen kategorisiert: Parameter, Ausgabe, Thread-lokal und Temporär (z.B. Pufferzuordnung innerhalb einer Fusion).