26.3.3 Teljesítmény profilozó eszközök

2025.10.06.
AI Biztonság Blog

A benchmark lefuttatása csak a fél siker. Az eredmények – például egy váratlanul hosszú inferenciaidő vagy egy kiugró memóriahasználat – csupán tünetek. A valódi Red Teaming munka ott kezdődik, ahol feltárjuk a tünetek mögötti okokat. Ehhez pedig elengedhetetlenek a profilozó eszközök, amelyekkel mikroszkóp alá vehetjük a kód futását és az erőforrás-használatot.

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

Miért és Hogyan Profilozzunk?

A profilozás a program futásának elemzése annak érdekében, hogy megértsük, mely részei mennyi ideig futnak, vagy mennyi erőforrást (CPU, memória, GPU) használnak. A cél a szűk keresztmetszetek (bottlenecks) azonosítása. Két alapvető megközelítés létezik:

  • Mintavételező (Sampling) profilozás: A profiler rendszeres időközönként „ránéz” a program futó veremére (call stack) és feljegyzi, melyik függvény fut éppen. Alacsony overhead mellett ad egy jó statisztikai áttekintést, de pontatlan lehet a rövid ideig futó függvényeknél.
  • Determinisztikus (Instrumentation) profilozás: A profiler minden függvényhívást és visszatérést rögzít. Rendkívül pontos, de jelentős lassulást okozhat a program futásában, mivel minden eseményt naplózni kell.

Red Teaming során mindkét módszer hasznos. Egy gyors mintavételezéssel azonosíthatod a gyanúsan sokat futó komponenseket, majd egy determinisztikus elemzéssel mélyebbre áshatsz az adott komponens működésében.

Alapvető Eszközök a Python Ökoszisztémában

A legtöbb AI/ML projekt Python alapú, így érdemes az itt elérhető leggyakoribb eszközökkel kezdeni. Ezek az eszközök a legtöbb esetben elegendőek a problémák feltárásához.

1. cProfile: A Beépített Munkaló

A Python standard könyvtárának része, így mindig kéznél van. Determinisztikus profilozást végez, és részletes statisztikát ad a függvényhívások számáról és az azokban eltöltött időről.

Használata parancssorból a legegyszerűbb:

python -m cProfile -o profile_output.prof my_script.py

Az eredményfájlt a pstats modul segítségével elemezheted. Egy tipikus kimenet így néz ki:

ncalls tottime percall cumtime percall filename:lineno(function)
1000 2.540 0.003 3.120 0.003 utils.py:50(preprocess_data)
1 0.002 0.002 5.890 5.890 main.py:10(run_inference)
  • ncalls: Hívások száma.
  • tottime: A függvényben eltöltött teljes idő, a hívott függvények idejét nem számítva.
  • cumtime: A függvényben és az általa hívott összes alfüggvényben eltöltött kumulatív idő. Ez segít megtalálni a leginkább „költséges” hívási láncokat.

2. line_profiler: Soronkénti Elemzés

Amikor a cProfile megmutatja, hogy egy adott függvény lassú, a line_profiler segít kideríteni, hogy a függvényen belül melyik sor a felelős a lassulásért. Ehhez a vizsgálni kívánt függvényeket egy @profile dekorátorral kell ellátni.

# A kódunkban (pl. data_processing.py)
from line_profiler import profile

@profile
def lassu_adatfeldolgozas(data):
 # ... bonyolult műveletek ...
 for i in range(len(data)):
 # Ez a sor lesz a bűnös?
 data[i] = bonyolult_transzformacio(data[i]) 
 return data

# ... a kód többi része ...

A futtatás a kernprof eszközzel történik:

kernprof -l -v data_processing.py

A kimenet soronként megmutatja a futási időt, a hívások számát és a soronkénti idő arányát a függvény teljes futási idejéhez képest.

3. memory_profiler: A Memóriazabálók Nyomában

Egy Red Teaming támadás nem mindig a CPU-t terheli, hanem okozhat memóriaszivárgást vagy extrém memóriafoglalást is. A memory_profiler a line_profiler-hez hasonlóan működik, de a memóriahasználatot méri soronként.

# A kódban
from memory_profiler import profile

@profile
def memoriaigenyes_muvelet(meret):
 # Hatalmas lista létrehozása
 nagy_lista = [0] * (meret * 1024 * 1024) 
 # ... műveletek a listán ...
 del nagy_lista # Felszabadítás ellenőrzése
 return True

Futtatás:

python -m memory_profiler my_memory_script.py

A kimenet megmutatja az egyes sorok végrehajtása utáni teljes memóriahasználatot és a sor által okozott memória-növekményt (Increment).

Vizualizáció: Amikor a Kép Többet Mond Ezer Sornál

A profiler-ek szöveges kimenetei sűrűek és nehezen értelmezhetők. A vizualizációs eszközök, mint például a flame graph-ok, segítenek gyorsan átlátni a hívási hierarchiát és az időbeli arányokat. A cProfile kimenetét könnyedén átalakíthatod vizuális formába olyan eszközökkel, mint a snakeviz vagy a gprof2dot.

Egy flame graph lényege, hogy a hívási vermet (call stack) ábrázolja. Az X-tengelyen a minták száma (az idővel arányos), az Y-tengelyen pedig a verem mélysége látható. Minél szélesebb egy sáv, annál több időt töltött a program az adott függvényben (vagy annak gyermekeiben).

main() process_data() run_inference() load_file() normalize_batch() – a szűk keresztmetszet model.forward() Flame Graph: A szélesebb blokkok több időt jelentenek.

Parancs a snakeviz használatára:

pip install snakeviz
snakeviz profile_output.prof

Ez elindít egy helyi webszervert, ahol interaktívan böngészheted a flame graph-ot, rákattintva az egyes függvényekre, hogy részletesebb adatokat kapj.

Javasolt Profilozási Munkafolyamat

Egy tipikus Red Teaming vizsgálat során a következő lépéseket érdemes követni:

  1. Benchmark futtatás: Futtasd le a benchmarkot az anomáliát okozó bemenettel (lásd 26.3.2 fejezet).
  2. Magas szintű elemzés (cProfile): Futtasd újra a kódot a cProfile segítségével, hogy beazonosítsd a legtöbb időt felemésztő függvényeket.
  3. Vizualizáció (SnakeViz): Töltsd be az eredményt egy vizualizációs eszközbe, hogy átlásd a hívási láncokat és arányokat. A legszélesebb „tornyok” a flame graph-on a fő gyanúsítottak.
  4. Mélyelemzés (line_profiler): Ha egy konkrét saját függvény a szűk keresztmetszet, használd a line_profiler-t, hogy megtaláld a problémás sorokat.
  5. Memória-analízis (memory_profiler): Ha a probléma nem a sebesség, hanem a memóriahasználat, ismételd meg a 3. és 4. lépést a memory_profiler segítségével.
  6. Iteráció: A talált probléma javítása után futtasd újra a profilozást, hogy megbizonyosodj róla, a javítás valóban hatékony volt, és nem hozott létre újabb szűk keresztmetszetet máshol.

Ezek az eszközök és ez a munkafolyamat együttesen egy erőteljes arzenált adnak a kezedbe, hogy a felszíni tünetek mögé láss és feltárd a rendszerek rejtett teljesítménybeli sebezhetőségeit.