Gpu-profileringsvlamgrafieken analyseren op Azure Kubernetes Service (AKS) (preview)

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.

Schermopname van de initiƫle samengevouwen vlamgrafiekweergave in Grafana voor een vLLM-workload, met gestapelde balken die de aanroepstacks voor GPU-geheugentoewijzing vertegenwoordigen.

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.

Schermafbeelding van de flamegraph in Grafana voor een vLLM-workload nadat u Alle groepen uitvouwen hebt geselecteerd, waarop de volledige aanroepstack met afzonderlijke functieframes voor toewijzingen van GPU-geheugen wordt weergegeven.

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 als class GPUModelRunner: def _allocate_kv_cache_tensors(self).
  • LlamaMLP / __init__: Een constructor die wordt aangeroepen bij het maken van een LlamaMLP(...) 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:

  1. Bekijk de breedste balken boven aan de grafiek. Met deze leaf-functies wordt geheugen toegewezen. Hoe breder de balk, hoe meer geheugen het verbruikt.

  2. Controleer de verhouding tussen eigen toewijzing en totale toewijzing. Een brede balk onderaan met self: 0 maakt deel uit van de oproepketen. Volg het omhoog totdat u een balk met hoge zelftoewijzing vindt.

  3. 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

Volgende stappen