Alat Penampil Memori
Anda dapat menggunakan Memory Viewer untuk memvisualisasikan penggunaan memori selama masa aktif program. Anda dapat mempelajari detail konten memori pada titik penggunaan memori puncak, termasuk untuk men-debug situasi Kehabisan Memori (OOM). Memory Viewer dapat membantu Anda melihat penggunaan memori global dan seberapa dekat komputasi dengan kehabisan memori.
Semua informasi yang ditampilkan di Memory Viewer bersifat sepenuhnya statis, yang diperoleh dari compiler XLA; informasi runtime dinamis ditampilkan di alat Profil Memori.
Platform yang Didukung
TPU: Didukung
GPU: Didukung
Komponen Penampil Memori
Memory Viewer terdiri dari beberapa komponen utama:
- Dropdown kontrol pengguna yang memungkinkan Anda menyesuaikan data yang
divisualisasi:
- Jenis memori: Jenis memori yang didukung bergantung pada akselerator. Untuk GPU, fokusnya adalah pada High Bandwidth Memory (HBM), sedangkan untuk TPU, Anda juga dapat melihat penggunaan untuk memori dalam chip termasuk VMEM, SMEM, CMEM, Sync Flags (SFlag), Sparsecore, dan juga memori Host.
- Modul: Ini adalah program XLA yang merupakan bagian dari eksekusi Anda. Titik awal yang baik sering kali berupa modul tingkat atas, yang diberi label seperti “jit_train_step” atau “jit_generate”.
- Bagian ringkasan tekstual memberikan informasi tingkat tinggi seperti alokasi memori puncak yang diperlukan untuk program, pemisahan antara argumen vs. variabel sementara, dll. Ada overhead yang dikenakan oleh padding, yang diperlukan oleh batasan pada bentuk tensor yang didukung di akselerator. Jika padding ini merupakan sebagian besar dari total alokasi, hal itu dapat menunjukkan peluang pengoptimalan.
- Diagram garis “Ukuran Alokasi Memori vs. Urutan Program” memetakan penggunaan memori
versus titik program (Urutan HLO) seperti yang dijadwalkan oleh compiler.
- Perhatikan bahwa sumbu x bukan waktu.
- Diagram secara khusus menyoroti titik dalam program dengan penggunaan memori puncak modul yang dipilih. Profiler dan alat tidak mengetahui keberadaan bersama modul pada chip/memori tertentu. Saat setiap modul dikompilasi, compiler menganotasi profil dengan titik awal “dasar pengukuran” dari total memori yang dialokasikan (oleh modul yang dikompilasi sebelum modul ini), dan menghitung naik dan turun dari sana saat alokasi dan penghapusan lebih lanjut terjadi. Namun, alokasi mendatang oleh modul lain yang dikompilasi sebelum eksekusi tidak diambil; perhatikan hal ini saat men-debug situasi OOM.
Diagram buffering di bagian bawah halaman mengelompokkan penggunaan memori pada titik program penggunaan puncak (ditunjukkan dengan garis vertikal dalam diagram garis penggunaan memori). Ada tiga diagram, semuanya menampilkan seluruh kumpulan buffering yang dialokasikan oleh program, tetapi diurutkan dengan tiga cara yang berbeda:
- Menurut urutan program: urutan saat program dijalankan, dengan yang paling lama muncul di sebelah kiri.
- Menurut ukuran: yang memiliki dampak terbesar pada titik penggunaan memori puncak berada di sebelah kiri.
Berdasarkan overhead padding yang diterapkan: yang paling “tidak efisien” dari perspektif hardware akan muncul di sebelah kiri.
Perhatikan bahwa warna buffering tidak memiliki arti tertentu.
Mengarahkan kursor ke buffer di salah satu dari tiga diagram akan menampilkan dua tampilan tambahan:
- Overlay pada diagram garis penggunaan memori dalam warna yang cocok dengan kartu buffering, yang menunjukkan masa aktif buffering tersebut; yaitu, batang horisontal yang tepi kiri dan kanannya menunjukkan titik alokasi dan penghapusan alokasi, dalam urutan program. Tinggi batang horizontal mewakili ukuran relatif buffering yang dipilih dibandingkan dengan alokasi puncak.
- Kartu detail buffering terpisah, biasanya di sisi kiri, dengan detail
tentang operasi tertentu sebagaimana berlaku. Kartu standar menyertakan
informasi berikut:
- Nama: Nama operasi XLA, yang dapat Anda telusuri di Graph Viewer atau Trace Viewer.
- Ukuran: Ukuran alokasi buffer, dengan dan tanpa padding.
- Bentuk: Menjelaskan peringkat, ukuran, dan jenis data array berdimensi N.
- Nama operasi framework: Menampilkan nama operasi framework yang terkait dengan alokasi ini.
- Jenis alokasi: Mengkategorikan alokasi buffering ke dalam jenis berikut: Parameter, Output, Thread-local, dan Temporary (misalnya, alokasi buffering di dalam penggabungan).