Projeleriniz için GPU · KYC'siz kripto ödeme Nasıl kiralanır
Türkçe
Konsolu aç
Uygulamalı rehber / KERNODECK

Bir CUDA hatası görünür: hangi işlem incelenmeli?

İlk hatayı koruyun, ilgili batch'i belirleyin ve uygulamayı onu tetikleyen işleme kadar küçültün. CUDA'da, eşzamansız yürütme hatanın nedeninden daha sonra raporlanmasına yol açabilir. Ardından, ortamı değiştirmeden önce indeksleri, şekilleri, türleri ve aygıtları kontrol edin. Bu yöntem zaten başlatılmış bir uygulama için geçerlidir; GPU kullanılabilirliğinin ilk kontrolünün yerini almaz.

6 dk okuma · Geliştiriciler için rehber

İlk hatayı ve bağlamını koruma

Bu kılavuz başarılı bir başlatmadan sonra başlar: PyTorch aygıtı görür, ardından uygulamanız bir batch veya operatör üzerinde başarısız olur. Küçük bir hesaplama bile çalışmıyorsa, ilk tanılamadan yeniden başlayın. Aksi halde, ilk hatayı, yineleme numarasını ve son tamamlanan adımı koruyun. İlk hatadan sonraki bir dizi mesaj, birkaç bağımsız nedeni değil, onun sonuçlarını tanımlayabilir.

Kod revizyonunu, Python ve PyTorch sürümlerini, arka ucu, sayısal türü ve giriş şekillerini not edin. Veriler için, içeriğin tam bir kopyası yerine dahili bir tanımlayıcıyı ve boyutları tercih edin. Hatalı batch'i ayırt eden şeyi arayın: uzunluk, eksik hedef, tamamlanmamış son parti, nadiren kullanılan artırma veya dal. Bu dosya, tüm bir kampanyayı yeniden başlatmadan vakayı tekrarlamayı sağlar.

Eşzamansızlığa rağmen hatalı başlatmayı yerelleştirin

CUDA'da işlemler kuyruğa alınır ve Python fonksiyonu döndükten sonra tamamlanabilir. Bu nedenle, CPU'ya bir kopyalama veya skaler okuma sırasında bildirilen bir hata önceki bir hesaplamadan kaynaklanabilir. PyTorch belgeleri bu eşzamansız yürütmeyi açıklar. İzlemede belirtilen satır, incelenecek bir gözlem noktasıdır, her zaman neden değildir.

NVIDIA/CUDA üzerinde kısa bir yeniden üretim için CUDA_LAUNCH_BLOCKING=1 ile ayrı bir başlatma önerin. Bu seçenek çağrıları eşzamanlı hale getirir ve hatayı kaynağına yaklaştırabilir. Tanı için kullanılır, süre ölçümü için değil. Ayrıca şüpheli aralığı daraltmak için büyük adımlar arasına geçici eşzamanlamalar yerleştirebilirsiniz. Ardından bu enstrümantasyonu kaldırın: normal zamanlamayı değiştirir.

Aşağıdaki komut öğreticidir ve çalıştırılmamıştır. Bir POSIX terminali ve mevcut bir train.py betiği varsayar. Atama yalnızca bu başlatma için geçerlidir; sözdizimini kabuğunuza uyarlayın. Bu NVIDIA değişkenini bir ROCm yığınına genellemeyin.

Önerilen tanı başlatması, çalıştırılmadı
CUDA_LAUNCH_BLOCKING=1 python train.py

Bir hata ailesini çok hızlı sonuca varmadan okumak

Mesaj arama alanını daraltır; yeniden üretilebilir bir vakanın yerini tutmaz. Alan dışı bir indeks, yanlış cihazdaki bir tensör ve imkânsız bir ayırma farklı doğrulamalar gerektirir. Geçersiz veriler, operatör sözleşmesi ve ikili ortam arasındaki ayrımı koruyun. Batch'i, hassasiyeti ve kitaplıkları aynı anda değiştirmek bu ayrımı ortadan kaldırır.

Cihazda yürütülen bir assertion'dan sonra, aynı süreçte aynı eğitimi sürdürmeye çalışmayın. NVIDIA, cudaErrorAssert'in mevcut ayırmaları geçersiz kıldığını ve sürecin sonlandırılıp yeniden başlatılması gerektiğini belirtir. Bir notebook'ta bu, düzeltilmiş yeniden üretimden önce çekirdeğin yeniden başlatılması anlamına gelir. Ancak yeniden başlatmak ne hatalı bir hedefi ne de geçersiz bir indeksi düzeltir.

Tüm sütunları görmek için tabloyu kaydırın.
Tanı ipuçları, mesaj ile neden arasında otomatik bir ilişkilendirme olmadan
Gözlemlenen ipucuİlk doğrulamaKaçınılacak sonuç
device-side assertİpuçları, hedefler ve operatör koşullarıGPU kesinlikle arızalıdır
Out of memoryŞekiller, tensörlerin yaşam süresi, süreç belleğiHer CUDA hatası VRAM yetersizliğidir
Operatör veya çekirdek mevcut değilSürümler, uzantı, arka uç ve dtypeHer şeyi rastgele yeniden yüklemek
Farklı cihazlarModelin ve her girişin yerleşimiKökenini anlamadan bir kopya eklemek

İşlenmiş örnek: dört sınıflı bir problemde bir sınıf 4

Çıktısı dört sütuna sahip öğretici bir sınıflandırıcı ele alalım. Sınıfları 0'dan 3'e kadar indekslenmiştir. 4 değerini içeren bir açıklama dosyası, 1'den 4'e bir kodlamayı veya beklenmedik bir beşinci sınıfı ortaya çıkarabilir. Çıktı boyutunu basitçe artırmak, açıklamaların anlamını çözmeden bir kısıtı ortadan kaldırırdı.

Aşağıda önerilen kontrol, hedeflerin CPU'ya aktarılmasından önce uygulanır. Çalıştırılmamıştır. Uzun türündeki sınıf indeksleri için CrossEntropyLoss sözleşmesini, ignore_index=-100 açıkça seçilerek gösterir. Olasılık dağılımlarından oluşan hedefleri kapsamaz. Bu senaryoda [0, 2, 4] reddedilmelidir; bu beklenen sonuç kuraldan çıkarılmıştır, bir ölçüm olarak sunulmamıştır.

Ardından veri hazırlığındaki eşlemeyi düzeltin ve sınıf adlarıyla bijeksiyonunu kontrol edin. Tüm kaynakların aynı kuralı kullanıp kullanmadığını bilmeden her yerden 1 çıkarmayın. Hatalı vakayı projeyle birlikte saklanan küçük bir doğrulama kümesine ekleyin.

Sınıf indeksleri için öğretici CPU koruması
import torch

classes = 4
ignore_index = -100
target = torch.tensor([0, 2, 4], dtype=torch.long)
if target.ndim != 1 or target.dtype != torch.long:
    raise ValueError("Cibles : vecteur d’indices attendu")
valid = target[target != ignore_index]
if valid.numel() == 0:
    raise ValueError("Aucune cible exploitable dans ce batch")
if bool(((valid < 0) | (valid >= classes)).any()):
    raise ValueError("Indice de classe hors domaine")

Tetikleyiciyi silmeden programı küçültme

Önce aynı dönüşümlerle tek bir girdiyi veya tek bir batch'i yeniden çalıştırın. Uzaktan izlemeyi, sonuç yazımını ve hatayla ilgisiz dalları kaldırın. dtype'ı, biçimleri ve şüpheli operatörü koruyun. Hata belirli bir uzunluğa veya bellek düzenine bağlıysa, küçük boyutlu rastgele bir tensör bunu artık yeniden üretmeyebilir.

Her seferinde tek bir değişikliği karşılaştırın: isteğe bağlı uzantı devre dışı, referans operatör, olağan hassasiyet veya mevcut olduğunda aynı işlemin CPU üzerinde çalıştırılması. CPU'da başarı bir ipucudur, CUDA doğrulaması değildir. Özel bir fonksiyon için strides, bitişiklik ve boyutlarla ilgili varsayımları da kaydedin. Düzeltmeden önce başarısız olan ve düzeltmeden sonra başarılı olan bir örnek arayın; yalnızca istisna oluşmaması yerine çıktı doğrulaması yapın.

Düzeltmeyi başlangıçtaki kapsam üzerinde doğrulama

Kabul edilebilir bir düzeltme, minimal durumu, komşu durumları ve özgün akışın temsili bir bölümünü geçmelidir. Özellikle son batch'i, kısa bir girdiyi, uzun bir girdiyi ve eşlemenin sınır değerlerini yeniden ele alın. Reddedilen öğelerin tanımlanabilir olduğunu ve işlenen girdi sayısının beklenen sayıda kaldığını doğrulayın. İstisnaları sessizce yok saymak, görünür bir çökmeyi eksik bir sonuca dönüştürebilir.

Tanılama modunu kaldırın, yeni bir süreçle başlayın ve davranışı normal yapılandırmayla doğrulayın. Nedeni, uygulanan değişikliği ve gerileme testini saklayın. Bir eğitimi yarıda kesmişseniz, hatadan önce doğrulanmış tutarlı bir checkpoint'ten başlayın; bir kesinti sırasında yazılmış bir dosyanın varlığı, devam edilebilirliğini garanti etmeye yetmez.

Daha hedefli bir analizi ne zaman istemek gerektiğini bilme

Aynı minimal durum geçerli girdilerle başarısız olursa, kesin bir talep hazırlayın: işlem, biçimler, türler, backend, sürümler ve ilk ilgili mesaj. Kişisel tanımlayıcıları ve gereksiz yolları kaldırın. Bir ikili uzantı kendi uyumluluk matrisini gerektirebilir; PyTorch'un genel desteği bu uzantıyı otomatik olarak doğrulamaz.

ROCm üzerinde PyTorch, torch.cuda arayüzünü ve cuda aygıt adlarını korur. Bir NVIDIA yordamını uygulamadan önce bu yığını tanımlamak için torch.version.hip'i kontrol edin. Mesajlar, araçlar ve tanılama seçenekleri farklılık gösterebilir. Burada açıklanan hiçbir kontrol, hazırlanan ortamların bir Kernodeck teklifiyle uyumlu olduğunu kanıtlamaz; GPU seçmeden önce ihtiyacınızı netleştirmek için bu ölçütleri kullanın.

Sorularınız

CUDA_LAUNCH_BLOCKING=1 bir CUDA hatasını düzeltir mi?

Hayır. Hatalı işlemi yerelleştirmeye yardımcı olmak için CUDA çağrılarını senkron hale getirir. Bunu kısa bir yeniden üretim üzerinde kullanın, ardından nedeni düzeltin ve normal performansı ölçmeden önce kaldırın.

device-side assert'ten sonra bir notebook'a devam edebilir miyim?

Düzeltilmiş durumu yeniden çalıştırmadan önce çekirdeği yeniden başlatın. Aygıt tarafındaki bir assert, bağlamı kullanılamaz ve ayırmaları geçersiz bırakabilir. Yeniden başlatma bir bağlamı geri yükler, ancak hatalı indeksleri veya verileri düzeltmez.

Aynı hesaplama CPU'da geçiyorsa GPU arızalı mıdır?

Hayır. Bu sonuç iki yürütme yolunu ayırt eder. Bir dtype, bir uzantı, bir çekirdek veya bir veri kısıtı farkı açıklayabilir. Sonuca varmadan önce ilgili GPU yığını üzerinde minimal bir işlemi yeniden üretin.

NVIDIA yordamı ROCm üzerinde aynı mıdır?

Tamamen değil. ROCm için PyTorch da torch.cuda kullanır, ancak araçlar ve bazı tanılama değişkenleri farklıdır. HIP'i torch.version.hip ile tanımlayın ve gerçek backend'e karşılık gelen belgelere başvurun.