Kategori: Çalışma zamanı: Arabellek ayırma hatası
Bu hata, XLA:TPU çalışma zamanının bellek ayırıcısının, istenen ayırma işlemi için hızlandırıcının HBM'sinde uygun bir bellek bloğu bulamadığını gösterir.
Örnek Hata Mesajı:
ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)
XLA arka uçları: TPU
Genel Bakış
Bu hata,
jax.device_putaracılığıyla kullanıcı tarafından başlatılan arabellek ayırma işleminin başarısız olması veya- Kullanıcı tarafından planlanan programın çıktı ayırmalarındaki hatalar.
Bu hatalar genellikle birkaç nedenden kaynaklanır:
- Bellek Yetersiz (OOM): Kullanıcı, TPU'nun HBM'sinde bulunan toplam boş bellek miktarından daha büyük bir bellek parçası ayırmaya çalışıyor.
- Bellek Parçalanması: Bellek alanında tek bir bitişik boş blok, istenen boyutu karşılayacak kadar büyük olmadığından ayırma işlemi başarısız olur. Toplam boş bellek miktarı ayırma için yeterlidir ancak bellek alanına küçük ve bitişik olmayan bloklar halinde dağılmıştır.
TPU çalışma zamanında, aşağıdakiler de dahil olmak üzere ayırma hatalarını yeniden denemek için çeşitli mekanizmalar bulunur:
- Kuyrukta bekleyen serbest bırakma işlemleri varsa çalışma zamanı başarısız olan ayırma işlemlerini yeniden dener.
- Parçalanmadan kaynaklanan OOM'lerde çalışma zamanı, otomatik olarak bir birleştirme ve yeniden deneme işlemi tetikleyebilir.
- TPU çalışma zamanı, programların yüklenmiş durumda tutulmasına kıyasla arabellek ayırmalarına öncelik verir. Yeterli HBM olmadığı için arabellek ayırma işlemi başarısız olursa sistem, arabellek için yeterli bellek kullanılabilir hale gelene kadar yüklenen TPU programlarını çıkarır.
Bu nedenle, yukarıdaki önlemlerden sonra karşılaşılan bir hata genellikle kullanıcı işlemi gerektirir.
Hata ayıklama
- Modelinizin bellekte kapladığı alanı azaltın:
- Toplu İş Boyutunu Küçültme: Toplu iş boyutunu küçültmek, bellek kullanımını doğrudan azaltır.
- Parametre Parçalama: Çok büyük modeller için parametreleri birden fazla TPU çekirdeğinin veya ana makinenin HBM'si arasında dağıtmak üzere model paralelliği veya parçalama gibi teknikler kullanın.
- Dizi/Bağlam Uzunluğunu Kısaltma: Diziler üzerinde çalışan modellerde (ör. dil modelleri) giriş dizisi uzunluğunu azaltmak, bellek kullanımını önemli ölçüde düşürebilir.
- Arabellek Bağışı: Belirli giriş arabelleklerinin üzerine yazılıp çıkışlar için yeniden kullanılabileceğini XLA'ya bildirmek için çerçeve özelliklerinden (ör.
jax.jit(..., donate_argnums=...)) yararlanın. - Kontrol noktası stratejisini optimize edin: Modelin tüm durumunu tek seferde kaydetmek yerine yalnızca model ağırlıklarını kaydetmeyi veya parçalanmış bir kontrol noktası stratejisi kullanmayı düşünebilirsiniz.
- Adres Bellek Düzeni ve Doldurma:
- TPU belleği parçalar halinde ayrılır ve dolgu, tensörlerin gerçek boyutunu artırabilir.
- Bellek sızıntısı olmadığından emin olun:
jax.Arraynesnelerine yapılan referansların amaçlanandan daha uzun süre tutulmadığından emin olun.jax.Arraynesnelerini tutmak, program derlemesi tamamlandıktan sonra bile otomatik olarak bellekten kaldırmayı engelleyebilir.
Takım
OOM oluştuğunda ayırıcının mevcut tüm ayırmaların ayrıntılı bir raporunu dökeceği tpu_log_allocations_on_oom işaretini etkinleştirin. Bu, hata ayıklama için çok değerli olabilir.