Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gpu-profilering vlamgrafieken laten zien welke functies het meeste GPU-geheugen verbruiken. In dit artikel wordt uitgelegd hoe u de vlamgrafieken interpreteert die zijn gegenereerd door de GPU-profileringshulpprogramma's voor Azure Kubernetes Service (AKS).
Important
AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals het is' en 'voor zover beschikbaar' en zijn uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning naar best vermogen. Zodoende zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:
Voordat u begint, stelt u GPU-profilering in en bevestigt u dat profileringsgegevens beschikbaar zijn in Pyroscope en Grafana.
Opmerking
Tijdens de eerste uitvoering van de profilering wordt mogelijk niet elk symbool weergegeven, inclusief symbolen van opstartbewerkingen zoals het laden van modellen, terwijl de profiler de werkbelasting analyseert en symbolen oplost. Voer de workload opnieuw uit na de eerste analyse om deze symbolen vast te leggen in volgende profielen.
Inzicht in vlamgrafieken
Een vlamgrafiek visualiseert geprofileerde aanroepstacks. Elke balk vertegenwoordigt een functie en de gestapelde balken geven de aanroepketen weer of welke functie een andere functie wordt genoemd. De breedte van elke balk vertegenwoordigt de hoeveelheid gemeten resource, zoals CPU-tijd of toegewezen GPU-geheugen, die door die functie stroomt.
Belangrijke regel: Hoe breder een balk, hoe meer van de gemeten bron door die functie stroomt.
De volgende voorbeeldvlamgrafieken worden vastgelegd vanuit een vLLM-deductieworkload.
Tip
Gebruik Alle groepen uitvouwen in het flame graph-paneel van Grafana om de volledige aanroepstack te zien zonder dat delen worden samengevouwen. Gebruik het zoekvak om specifieke functies of trefwoorden te vinden. Als u wilt voorkomen dat het paneel opnieuw wordt samengevouwen, pauzeert u de automatische vernieuwing van het dashboard door het vernieuwingsinterval in de rechterbovenhoek van het Grafana-dashboard in te stellen op Uit terwijl u de uitgeklapte flame graph inspecteert.
Tip
Gebruik focusblok om u te richten op een specifiek toewijzingspad.
De symbolen lezen
Vlamgrafieklabels volgen deze conventies:
| Symboolopmaak | Meaning |
|---|---|
Foo > bar |
class Foo: method def bar() |
Foo > __init__ |
Constructor van de klasse Foo |
bar (alleen) |
Zelfstandige def bar() functie |
<interpreter trampoline> |
CPython-overhead. U kunt dit symbool negeren. |
<raw-address>, bijvoorbeeld 0x7f151 |
Systeemeigen C- of CUDA-code zonder Python symbool beschikbaar. |
Enkele voorbeelden:
-
GPUModelRunner/_allocate_kv_cache_tensors: Een methode voor een klasse. Lees dit symbool alsclass GPUModelRunner: def _allocate_kv_cache_tensors(self). -
LlamaMLP/__init__: Een constructor die wordt aangeroepen bij het maken van eenLlamaMLP(...)object. -
_compile_fx_inner: Een zelfstandige functie op moduleniveau die zich niet in een klasse bevindt.
Inzicht krijgen in eigen versus totale toewijzing
Gebruik de waarden Zelf en Totaal om te bepalen waar de resource wordt gebruikt:
- Totaal is de resource die wordt gebruikt door een functie en alles wat wordt aangeroepen. Een functie kan een groot totaal hebben, maar niets zelf toewijzen omdat deze deel uitmaakt van de aanroepketen.
- Zelf is de resource die rechtstreeks door de functie wordt gebruikt, met uitzondering van de onderliggende functies. Een hoge zelfwaarde betekent dat deze functie is waar de resource wordt verbruikt.
Als GPUModelRunner._allocate_kv_cache_tensors bijvoorbeeld 55,1 GB aan zelftoewijzing heeft, is dat de functie die torch.empty() aanroept om de sleutel-waarde-cachetensoren (KV) te maken.
Gebruik de volgende navigatietechnieken:
- Start met bladknooppunten; dat zijn balken waar niets boven staat. Hun volledige breedte vertegenwoordigt eigen toewijzing.
- Sla brede balken met nul eigen toewijzing over bij het zoeken naar de bron van een toewijzing. Deze functies orchestreren aanroepen naar andere functies.
- Onderzoek brede staven met een hoge eigen allocatie als mogelijke optimalisatiedoelen.
De grootste resourceconsumer zoeken
Gebruik de volgende stappen om hotspots te identificeren:
Bekijk de breedste balken boven aan de grafiek. Met deze leaf-functies wordt geheugen toegewezen. Hoe breder de balk, hoe meer geheugen het verbruikt.
Controleer de verhouding tussen eigen toewijzing en totale toewijzing. Een brede balk onderaan met
self: 0maakt deel uit van de oproepketen. Volg het omhoog totdat u een balk met hoge zelftoewijzing vindt.Lees de aanroepstack van beneden naar boven om te begrijpen waarom de functie is aangeroepen. Het volgende voorbeeld eindigt met de functie waarmee de toewijzing wordt uitgevoerd:
<raw-address>, for example, 0x7f151 -> native code entry <interpreter trampoline> -> CPython dispatch <module> -> script top level EngineCoreProc.run_engine_core -> vLLM engine startup EngineCore.__init__ -> engine initialization EngineCore._initialize_kv_caches -> KV cache setup Worker.initialize_from_config -> worker setup GPUModelRunner.initialize_kv_cache -> model runner GPUModelRunner._allocate_kv_cache_tensors -> actual allocation
Gebruik de volgende tabel als snelzoekgids:
| Doel | Waar moet ik naar zoeken? |
|---|---|
| Zoek wat het meeste geheugen gebruikt | Breedste bladbalk boven aan de stapel |
| Vind wat verantwoordelijk is voor het meeste geheugen | Breedste balk onderaan de stapel |
| Optimalisatiedoelen identificeren | Balken met brede automatische toewijzing |
| Functies identificeren die u kunt overslaan | Brede balken met nul eigen allocatie |