Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
GPU profili oluşturma alev grafikleri, hangi işlevlerin en fazla GPU belleği tüketeceğini gösterir. Bu makalede, Azure Kubernetes Service (AKS) için GPU profil oluşturma araçları tarafından oluşturulan alev grafiklerinin nasıl yorumlanması açıklanır.
Important
AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "mevcut olduğu şekilde" sağlanmakta olup, hizmet seviyesi anlaşmalarına ve sınırlı garantilere dahil edilmemektedir. AKS önizlemeleri, müşteri desteği ekibi tarafından maksimum çaba gösterilerek kısmen ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:
Başlamadan önce GPU profili oluşturmayı ayarlayın ve profil oluşturma verilerinin Pyroscope ve Grafana'da kullanılabilir olduğunu onaylayın.
Note
İlk profil oluşturma çalıştırması, model yükleme gibi başlangıç işlemlerindeki simgeler de dahil olmak üzere her simgeyi göstermeyebilirken, profil oluşturucu iş yükünü analiz eder ve sembolleri çözümler. sonraki profillerde bu simgeleri yakalamak için ilk analizden sonra iş yükünü yeniden çalıştırın.
Alev grafiklerini anlama
Alev grafiği profilli çağrı yığınlarını görselleştirir. Her çubuk bir işlevi temsil eder ve yığılmış çubuklar çağrı zincirini veya başka bir işlev olarak adlandırılan işlevi gösterir. Her çubuğun genişliği, cpu süresi veya ayrılmış GPU belleği gibi ölçülen kaynağın bu işlevden geçen miktarını temsil eder.
Temel kural: Çubuk ne kadar genişse, ölçülen kaynağın o işlevden geçen miktarı o kadar fazla olur.
Aşağıdaki örnek alev grafikleri bir vLLM çıkarım iş yükünden yakalanır.
Tip
Grafana'nın alev grafiği panelinde, daraltmadan çağrı yığınının tamamını görmek için Tüm Grupları Genişlet seçeneğini kullanın. Belirli işlevleri veya anahtar sözcükleri bulmak için Arama kutusunu kullanın. Panelin yeniden daralmasını önlemek için, genişletilmiş alev grafiğini incelerken Grafana gösterge panosunun sağ üst köşesindeki yenileme aralığını Kapalı olarak ayarlayarak gösterge panosunun otomatik yenilemesini duraklatın.
Tip
Belirli bir ayırma yoluna odaklanmak için Odak bloğunu kullanın.
Sembolleri okuma
Alev grafı etiketleri şu kurallara uyar:
| Simge biçimi | Anlamı |
|---|---|
Foo > bar |
class Foo: method def bar() |
Foo > __init__ |
Foo sınıfının oluşturucusu |
bar (tek başına) |
Bağımsız def bar() işlev |
<interpreter trampoline> |
CPython ek yükü. Bu simgeyi yok sayabilirsiniz. |
<raw-address>, örneğin, 0x7f151 |
Python simgesi olmayan yerel C veya CUDA kodu. |
Örnekler şunları içerir:
-
GPUModelRunner/_allocate_kv_cache_tensors: Bir sınıftaki bir yöntem. Bu simgeyi olarakclass GPUModelRunner: def _allocate_kv_cache_tensors(self)okuyun. -
LlamaMLP/__init__: Nesne oluştururken çağrılan birLlamaMLP(...)oluşturucu. -
_compile_fx_inner: Bir sınıfın içinde olmayan tek başına bir modül düzeyi işlevi.
Kendi ayırma ile toplam ayırmayı anlayın
Kaynağın nerede kullanıldığını belirlemek için Self ve Total değerlerini kullanın:
- Toplam , bir işlev ve çağırdığı her şey tarafından tüketilen kaynaktır. Bir işlevin toplam değeri yüksek olabilir, ancak çağrı zincirinin bir parçası olduğu için kendisi hiçbir ayırma yapmayabilir.
- Self , alt işlevleri hariç, doğrudan işlev tarafından tüketilen kaynaktır. Yüksek bir self değeri, bu fonksiyonun kaynağın tüketildiği yer olduğunu gösterir.
Örneğin, GPUModelRunner._allocate_kv_cache_tensors 55,1 GB kendi bellek ayırımına sahipse, anahtar-değer (KV) önbellek tensörlerini oluşturmak için torch.empty() öğesini çağıran işlev odur.
Aşağıdaki gezinti tekniklerini kullanın:
- Üzerinde hiçbir şey olmayan çubuklar olan yaprak düğümleriyle başlayın. Tam genişlikleri, kendi kendine ayrılan alanı temsil eder.
- Bir tahsisin kaynağını ararken, öz tahsisi sıfır olan geniş çubukları atlayın. Bu işlevler, diğer işlevlere yapılan çağrıları koordine eder.
- Yüksek öz ayırmaya sahip geniş çubukları, olası iyileştirme hedefleri olarak inceleyin.
En büyük kaynak tüketicisini bulma
Etkin noktaları belirlemek için aşağıdaki adımları kullanın:
Grafiğin en üstündeki en geniş çubuklara bakın. Bu yaprak işlevleri bellek ayırır. Çubuk ne kadar genişse, o kadar fazla bellek tüketir.
Kendi kendine ve toplam ayırmayı denetleyin. Alttaki
self: 0geniş çubuk, çağrı zincirinin bir parçasıdır. Yüksek kendi kendine ayırmaya sahip bir çubuk bulana kadar yukarı doğru izleyin.İşlevin neden çağrıldığını anlamak için çağrı yığınını aşağıdan yukarıya okuyun. Aşağıdaki örnek, ayırmayı gerçekleştiren işlevle sona erer:
<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
Hızlı başvuru olarak aşağıdaki tabloyu kullanın:
| Goal | Nelere dikkat etmeli |
|---|---|
| En çok belleği ayıranı bulma | Yığının en üstündeki en geniş yaprak çubuğu |
| En fazla bellek için neyin sorumlu olduğunu bulma | Yığının en altındaki en geniş çubuk |
| İyileştirme hedeflerini belirleme | Geniş kendi kendine ayırmaya sahip çubuklar |
| Atlayabileceğiniz işlevleri tanımlama | Kendi kendine ayırması olmayan geniş çubuklar |