“RuntimeError: CUDA Hatası: Cihaz Tarafında Onay Tetiklendi” Nasıl Düzeltilir

Yayınlanan: 2025-10-14

PyTorch'ta derin öğrenme modelleriyle çalışıyorsanız, muhtemelen aşağıdaki gibi kafa karıştırıcı bir hata mesajıyla karşılaşmışsınızdır:

 RuntimeError: CUDA error: device-side assert triggered

Bu hata, özellikle buna neyin sebep olduğundan tam olarak emin olmadığınızda inanılmaz derecede sinir bozucu olabilir. Size soruna işaret eden yararlı bir yığın izi veren birçok programlama hatasından farklı olarak, bu hata daha çok GPU'nuzun kaşlarını kaldırdığını ve sessizce uzaklaştığını hissedebilir. Ancak endişelenmeyin; bu kılavuzun sonunda bunun yalnızca neden olduğunu değil, aynı zamanda bunu yöntemsel olarak nasıl düzeltebileceğinizi de anlayacaksınız.

Bu Hata Aslında Ne Anlama Geliyor?

Bu hata, GPU'nuzda çalışan bir CUDA çekirdeği bir onaylama hatasıyla karşılaştığında ortaya çıkar. Bunun nedeni genellikle geçersiz giriş veya CPU modunda yakalayamayacağınız beklenmeyen davranışlardır. GPU düzeyinde bir sorun olduğu için Python istisnalarından görmeye alışık olduğumuz ayrıntılı hata ayıklama mesajları olmadan çökme eğilimi gösterir.

Yaygın nedenler şunları içerir:

  • Dizin oluşturma hataları (örneğin, var olmayan bir sınıf dizinini kullanmaya çalışmak)
  • Geçersiz tensör şekilleri
  • Yanlış kayıp fonksiyonu kullanımı
  • Beklentileri aşan veriler (boş tensörler gibi)

Neyse ki, doğru yaklaşımla bu sorunun izini sürüp çözebilirsiniz; hadi nasıl yapılacağını anlatalım.

Teşhis ve Düzeltme İçin Adım Adım Süreç

1.Modelinizi CPU üzerinde çalıştırın

İlk teşhis adımı CUDA'yı devre dışı bırakmak ve CPU'daki her şeyi çalıştırmaktır. Çoğu zaman, CPU üzerinde çalışırken PyTorch daha net hata mesajları sağlar çünkü cihaz tarafındaki iddialar artık tam bağlamda Python istisnaları olarak atılmaktadır.

CPU moduna geçmek için kodunuzu aşağıdaki gibi değiştirin:

 device = torch.device("cpu") model.to(device)

Bir iddia başarısız olursa, artık çok daha bilgilendirici bir yığın izlemesi almalısınız.

2. Hedef Etiketlerinizi Kontrol Edin

Bu hatanın en sık görülen nedenlerinden biri, özellikle nn.CrossEntropyLoss kullanılırken uygunsuz sınıf etiketleridir. Bu kayıp işlevi, hedef tensörünüzün 0 ile num_classes - 1 arasındaki sınıf dizinlerini içermesini bekler. Yani modeliniz 10 sınıf çıkarıyorsa hedeflerin 0'dan 9'a kadar tamsayılar olması gerekir.

Yaygın hata:

 # Target contains 10 instead of 0–9 range target = torch.tensor([10])

Bu endeksler sınırların dışındaysa GPU'da bir iddiayla karşılaşırsınız. Bunu doğrulamak için şunu kullanın:

 assert target.max().item() < num_classes

Görüntü sınıflandırması yapıyorsanız hedefinizin şeklinin uygun olduğundan da emin olun. CrossEntropyLoss için tek seferde kodlanmış değil, [batch_size] şeklinde olmalıdır!

 # Incorrect (for CrossEntropyLoss) target = torch.tensor([[0, 0, 1], [1, 0, 0]]) # Correct target = torch.tensor([2, 0])

3. DataLoader'da hatalar olup olmadığını inceleyin

Bazen hata, özellikle toplu eğitimde kullanıldığında veri kümenizden veya DataLoader'dan gelebilir. Bazı etiketler bozuk veya tutarsızsa GPU'daki modeliniz bozulabilir.

Veri kümenizi şu şekilde iki kez kontrol edin:

 for i, (x, y) in enumerate(loader): assert y.dtype == torch.long assert y.max().item() < num_classes assert x.shape[0] == y.shape[0]

Bu, özellikle veri kümeniz bir CSV dosyasından veya sessizce geçersiz etiketler ortaya çıkarabilecek özel işleme mantığından oluşturulmuşsa kullanışlıdır.

içe dönük geliştirici, kodu inceleme, dizüstü bilgisayar, hata ayıklama

Diğer Yaygın Tuzaklar

4. Eşleşmeyen Parti Boyutları

Bazen model veya kayıp fonksiyonu girdilerin belirli şekillerde olmasını bekler. Uyumsuzluklar ince sorunlara yol açabilir. Girişlerdeki ve hedeflerdeki parti büyüklüğünüzün hizalandığından emin olun:

 # torchvision models usually expect [N, 3, 224, 224] assert inputs.shape[1:] == (3, 224, 224)

Bu özellikle DataLoader'ı drop_last=False ile kullanırken önemlidir; veri kümesi boyutunuza bağlı olarak son grup daha küçük olabilir. Modeliniz veya BatchNorm gibi operasyonlarınız bunu doğru bir şekilde ele almalı veya daha küçük partileri açıkça kontrol etmelidir.

5. Farklı Cihazlardaki Kazara Tensörler

Hem giriş özelliklerinizin hem de modelinizin aynı cihazda olduğundan emin olun. Modelinizi CUDA'ya gönderirseniz ancak girişlerinizi CPU'da bırakırsanız, işler beklenmedik bir şekilde başarısız olur ve çoğu zaman yararlı hatalar olmaz.

Her zaman aşağıdakileri iki kez kontrol edin:

 assert inputs.device == model.device

Gelişmiş İpucu: Tam Hata Raporlamasını Etkinleştirin

CPU üzerinde çalışmak işe yaramıyorsa veya karışık bir CPU/GPU kurulumunda çalışıyorsanız ve hala yararlı hatalar alamıyorsanız, aşağıdaki ayarı deneyin:

 CUDA_LAUNCH_BLOCKING=1 python my_script.py

Bu, PyTorch'a GPU kodunu eşzamanlı olarak çalıştırmasını söyler, böylece tam hata noktasında çöker. Yürütmeyi biraz yavaşlatabilir ancak çok daha net bir geri izleme sağlar.

Yalnızca Python'da, kabuğu değiştirmeden:

 import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1"

Artık çalışma zamanı, CUDA iddiasının nerede gerçekleştiği hakkında daha spesifik bilgiler sunmalıdır.

Örnekle Düzelt

Pratik bir örneğe bakalım. MNIST'te rakam sınıflandırması için bir model oluşturduğunuzu ve son model katmanınızı aşağıdaki gibi tanımladığınızı varsayalım:

 self.fc = nn.Linear(128, 10)

Eğitim döngüsünde şunlara sahipsiniz:

 criterion = nn.CrossEntropyLoss() output = model(images) # Output shape: [batch_size, 10] loss = criterion(output, labels)

Ancak etiketleriniz şöyle:

 labels = torch.tensor([[0], [1], [2]])

Bu şekil yanlıştır. CrossEntropyLoss , etiketlerin sınıf endekslerinin 1 boyutlu vektörü olmasını bekler:

 labels = torch.tensor([0, 1, 2])

Yalnızca bu şekli düzeltmek sorunu çözebilir.

pytorch modeli, kayıp fonksiyonu, grafik işlemci hatası, düzeltme

Özet: Hatayı Düzeltmeye Yönelik Kontrol Listesi

Saçınızı yolmaya başlamadan önce şu kontrol listesini izleyin:

  1. CPU moduna geçinve tekrar deneyin; hata mesajı daha açıklayıcı olabilir.
  2. Sınıf etiketlerini doğrulayın:Geçerli aralıkta ve doğru biçimde olduklarından emin olun.
  3. DataLoader'dan gelen verileri inceleyin; gruplar arasında yineleme yapın ve anormallikleri kontrol edin.
  4. Özellikle çıktılar ve hedefler içinuygun tensör şekilleri ve boyutları olduğundan emin olun.
  5. CUDA'dan ayrıntılı, senkronize bir geri izleme almak içinCUDA_LAUNCH_BLOCKING=1 kullanın.

Çözüm

Cihaz tarafında tetiklenenhata ilk başta belirsiz ve anlaşılmaz görünse de, sonuçta bu, modelinizin veya verilerinizin size kırmızı bayrak sallama şeklidir. Etiketlerinizi, veri şekillerinizi sistematik olarak kontrol ederek, CPU modunu ve başlatma engellemeyi kullanarak sorunu neredeyse her zaman izole edebilirsiniz.

Bir dahaki sefere kafa karışıklığıyla tepki vermek yerine bilgi ve teşhis araç seti ile donanmış olacaksınız. Mutlu hata ayıklama!