Kategori: Çalışma zamanı: Arabellek tahsisi 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 şu durumlarda oluşur:
jax.device_putüzerinden 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 çıkış ayırmalarıyla ilgili hatalar.
Bu hataların genellikle birkaç nedeni vardı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, 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 alanı sağlanana 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 kaplanan yerini azaltma
- Grup boyutunu küçültün: Grup 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'sine dağıtmak üzere model paralelliği ya da parçalama gibi teknikler kullanın.
- Dizi/bağlam uzunluğunu kısaltın: Diziler üzerinde çalışan modellerde (ör. dil modelleri) giriş dizisi uzunluğunu kısaltmak, bellekte kaplanan yeri önemli ölçüde azaltabilir.
- 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. Daha fazla bilgi için Bağış arabelleği başlıklı makaleyi okuyun. - Kontrol noktası stratejisini optimize edin: Model durumunun tamamını tek seferde kaydetmek yerine yalnızca model ağırlıklarını kaydetmeyi veya parçalanmış bir kontrol noktası stratejisi kullanmayı düşünebilirsiniz.
- Adres belleği düzeni ve dolgu
- 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 olma
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.
Her programın kullandığı bellek miktarını azaltmak için kullanabileceğiniz diğer stratejiler hakkında bilgi edinmek üzere Hata kodu: E1000 başlıklı makaleyi de inceleyin.
Araçlar
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.