Azure Kubernetes Service (AKS) üzerinde GPU profil oluşturma alev graflarını analiz etme (Önizleme)

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.

Gpu bellek ayırma çağrı yığınlarını temsil eden yığılmış çubukları gösteren vLLM iş yükü için Grafana'daki ilk daraltılmış alev grafiği görünümünün ekran görüntüsü.

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.

Tüm grupları genişlet'i seçtikten sonra, GPU bellek ayırmaları için tek tek işlev çerçeveleriyle birlikte tam çağrı yığınını gösteren vLLM iş yükü için Grafana'daki alev grafiğinin ekran görüntüsü.

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 olarak class GPUModelRunner: def _allocate_kv_cache_tensors(self)okuyun.
  • LlamaMLP / __init__: Nesne oluştururken çağrılan bir LlamaMLP(...) 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:

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

  2. Kendi kendine ve toplam ayırmayı denetleyin. Alttaki self: 0 geniş çubuk, çağrı zincirinin bir parçasıdır. Yüksek kendi kendine ayırmaya sahip bir çubuk bulana kadar yukarı doğru izleyin.

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

Sonraki Adımlar