Analisis grafik flame profiling GPU di Azure Kubernetes Service (AKS) (Pratinjau)

Grafik api pembuatan profil GPU menunjukkan fungsi mana yang mengonsumsi memori GPU terbanyak. Artikel ini menjelaskan cara menginterpretasikan grafik api yang dihasilkan oleh alat pembuatan profil GPU untuk Azure Kubernetes Service (AKS).

Important

Fitur pratinjau AKS tersedia atas dasar layanan mandiri dan pendaftaran sukarela. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan pratinjau tersebut dikecualikan dari perjanjian tingkat layanan (SLA) serta garansi terbatas. Fitur pratinjau AKS sebagian didukung oleh dukungan pelanggan sebatas upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Sebelum memulai, siapkan pembuatan profil GPU dan konfirmasikan bahwa data pembuatan profil tersedia di Pyroscope dan Grafana.

Nota

Proses profiling pertama mungkin tidak menampilkan semua simbol, termasuk simbol dari operasi saat startup seperti pemuatan model, sementara profiler menganalisis beban kerja dan mengurai simbol. Jalankan beban kerja lagi setelah analisis awal untuk mengambil simbol-simbol ini di profil berikutnya.

Memahami grafik flame

Grafik api memvisualisasikan tumpukan panggilan yang difilterkan. Setiap bilah mewakili sebuah fungsi, dan bilah bertumpuk menunjukkan rantai panggilan, atau fungsi mana yang memanggil fungsi lain. Lebar setiap bilah mewakili jumlah sumber daya yang diukur, seperti waktu CPU atau memori GPU yang dialokasikan, yang mengalir melalui fungsi tersebut.

Aturan kunci: Semakin lebar bilah, semakin banyak sumber daya yang diukur mengalir melalui fungsi tersebut.

Contoh grafik api berikut diambil dari beban kerja inferensi vLLM.

Cuplikan layar tampilan awal grafik flame dalam keadaan diciutkan di Grafana untuk beban kerja vLLM, yang menampilkan bilah bertumpuk yang merepresentasikan tumpukan panggilan alokasi memori GPU.

Tip

Gunakan Perluas semua grup di panel grafik api Grafana untuk melihat tumpukan panggilan penuh tanpa menciutkan. Gunakan kotak Pencarian untuk menemukan fungsi atau kata kunci tertentu. Untuk mencegah panel diciutkan lagi, jeda refresh otomatis dasbor dengan mengatur interval refresh ke Nonaktif di sudut kanan atas dasbor Grafana saat Anda memeriksa grafik api yang diperluas.

Cuplikan layar grafik api di Grafana untuk beban kerja vLLM setelah memilih Perluas semua grup, memperlihatkan tumpukan panggilan penuh dengan bingkai fungsi individual untuk alokasi memori GPU.

Tip

Gunakan blok Fokus untuk fokus pada jalur alokasi tertentu.

Membaca simbol

Label grafik api mengikuti konvensi berikut:

Format simbol Meaning
Foo > bar class Foo: method def bar()
Foo > __init__ Konstruktor kelas Foo
bar (sendirian) Fungsi mandiri def bar()
<interpreter trampoline> Overhead CPython. Anda dapat mengabaikan simbol ini.
<raw-address>, misalnya, 0x7f151 Kode C atau CUDA asli tanpa simbol Python tersedia.

Contohnya meliputi:

  • GPUModelRunner / _allocate_kv_cache_tensors: Metode pada kelas. Baca simbol ini sebagai class GPUModelRunner: def _allocate_kv_cache_tensors(self).
  • LlamaMLP / __init__: Konstruktor yang dipanggil saat membuat LlamaMLP(...) objek.
  • _compile_fx_inner: Fungsi tingkat modul mandiri yang tidak berada di dalam kelas.

Memahami alokasi mandiri versus total

Gunakan nilai Mandiri dan Total untuk menentukan di mana sumber daya digunakan:

  • Total adalah sumber daya yang dikonsumsi oleh fungsi dan semua yang dipanggilnya. Sebuah fungsi dapat memiliki total yang besar tetapi tidak mengalokasikan apa pun sendiri karena fungsi tersebut merupakan bagian dari rantai pemanggilan.
  • Self adalah sumber daya yang digunakan langsung oleh fungsi, tidak termasuk fungsi turunannya. Nilai diri yang tinggi berarti fungsi ini adalah tempat sumber daya dikonsumsi.

Misalnya, jika GPUModelRunner._allocate_kv_cache_tensors memiliki alokasi mandiri 55,1 GB, itu adalah fungsi yang memanggil torch.empty() untuk membuat tensor cache nilai kunci (KV).

Gunakan teknik navigasi berikut:

  • Mulailah dengan simpul daun, yang merupakan bilah tanpa apa pun di atasnya. Keseluruhan lebarnya mewakili alokasi sendiri.
  • Lewati bilah lebar dengan alokasi mandiri nol saat Anda mencari sumber alokasi. Fungsi-fungsi ini mengatur panggilan ke fungsi lain.
  • Selidiki bilah lebar dengan alokasi mandiri tinggi sebagai target pengoptimalan potensial.

Menemukan konsumen sumber daya terbesar

Gunakan langkah-langkah berikut untuk mengidentifikasi hotspot:

  1. Lihatlah bilah terluas di bagian atas grafik. Fungsi daun ini mengalokasikan memori. Semakin lebar bar, semakin banyak memori yang dikonsumsinya.

  2. Periksa alokasi mandiri versus total. Bilah lebar di bagian bawah dengan self: 0 adalah bagian dari rantai panggilan. Telusuri ke atas hingga Anda menemukan bar dengan alokasi sendiri yang tinggi.

  3. Baca tumpukan panggilan dari bawah ke atas untuk memahami mengapa fungsi dipanggil. Contoh berikut berakhir dengan fungsi yang melakukan alokasi:

    <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
    

Gunakan tabel berikut sebagai referensi cepat:

Maksud Apa yang harus dicari
Temukan apa yang paling banyak mengalokasikan memori Bilah daun terluas di bagian atas tumpukan
Temukan apa yang bertanggung jawab atas memori terbanyak Bilah terluas di bagian bawah tumpukan
Mengidentifikasi target pengoptimalan Batang dengan alokasi sendiri yang lebar
Mengidentifikasi fungsi yang dapat Anda lewati Bilah lebar dengan alokasi mandiri nol

Langkah berikutnya