Cara Memperbaiki “RuntimeError: CUDA Error: Pernyataan Sisi Perangkat Dipicu”

Diterbitkan: 2025-10-14

Jika Anda bekerja dengan model pembelajaran mendalam di PyTorch, kemungkinan besar Anda menemukan pesan kesalahan yang membingungkan seperti:

 RuntimeError: CUDA error: device-side assert triggered

Kesalahan ini bisa sangat membuat frustrasi, terutama bila Anda tidak yakin apa penyebabnya. Tidak seperti banyak kesalahan pemrograman yang memberi Anda jejak tumpukan berguna yang menunjukkan masalahnya, kesalahan ini lebih terasa seperti GPU Anda mengangkat alisnya dan diam-diam pergi. Namun jangan khawatir — di akhir panduan ini, Anda tidak hanya akan memahami mengapa hal ini terjadi, namun juga cara memperbaikinya secara metodis.

Apa Sebenarnya Arti Kesalahan Ini?

Kesalahan ini terjadi ketika kernel CUDA yang berjalan di GPU Anda mengalami kegagalan pernyataan. Hal ini biasanya disebabkan oleh masukan yang tidak valid atau perilaku tak terduga yang mungkin tidak Anda tangkap dalam mode CPU. Karena ini adalah masalah tingkat GPU, masalah ini cenderung mogok tanpa pesan debug mendetail yang biasa kami lihat dari pengecualian Python.

Penyebab umum meliputi:

  • Kesalahan pengindeksan (misalnya, mencoba menggunakan indeks kelas yang tidak ada)
  • Bentuk tensor tidak valid
  • Penggunaan fungsi kerugian salah
  • Data yang melanggar ekspektasi (seperti tensor kosong)

Untungnya, dengan pendekatan yang tepat, Anda dapat melacak dan memperbaiki masalah ini—mari kita lihat caranya.

Proses Langkah demi Langkah untuk Mendiagnosis dan Memperbaiki

1.Jalankan Model Anda di CPU

Langkah diagnostik pertama adalah menonaktifkan CUDA dan menjalankan semua yang ada di CPU. Seringkali, saat dijalankan di CPU, PyTorch memberikan pesan kesalahan yang lebih jelas karena pernyataan sisi perangkat sekarang ditampilkan sebagai pengecualian Python dengan konteks penuh.

Untuk beralih ke mode CPU, ubah kode Anda sebagai berikut:

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

Jika pernyataan gagal, Anda sekarang akan mendapatkan pelacakan tumpukan yang jauh lebih informatif.

2. Periksa Label Target Anda

Salah satu penyebab paling umum dari kesalahan ini adalah label kelas yang tidak tepat — terutama saat menggunakan nn.CrossEntropyLoss . Fungsi kerugian ini mengharapkan tensor target Anda menyertakan indeks kelas antara 0 dan num_classes - 1 . Jadi, jika model Anda menghasilkan 10 kelas, targetnya harus berupa bilangan bulat dari 0 hingga 9.

Kesalahan umum:

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

Jika indeks ini di luar batas, Anda akan mengalami pernyataan pada GPU. Untuk memvalidasi ini, gunakan:

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

Jika Anda melakukan klasifikasi gambar, pastikan juga bentuk target Anda sesuai. Untuk CrossEntropyLoss , bentuknya harus [batch_size] , bukan enkode one-hot!

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

3. Periksa Kesalahan pada DataLoader

Terkadang kesalahan berasal dari kumpulan data atau DataLoader Anda, terutama saat digunakan dalam pelatihan batch. Jika beberapa label rusak atau tidak konsisten, label tersebut dapat merusak model Anda di GPU.

Periksa kembali kumpulan data Anda seperti ini:

 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]

Hal ini sangat berguna jika kumpulan data Anda dibuat dari file CSV atau logika pemrosesan khusus yang mungkin secara diam-diam menimbulkan label yang tidak valid.

pengembang introspektif, memeriksa kode, laptop, debugging

Kesalahan Umum Lainnya

4. Ukuran Batch Tidak Cocok

Terkadang model atau fungsi kerugian mengharapkan masukan dalam bentuk tertentu. Ketidakcocokan dapat menyebabkan masalah yang tidak kentara. Pastikan ukuran batch Anda dalam input dan target selaras:

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

Hal ini terutama penting ketika menggunakan DataLoader dengan drop_last=False — kumpulan terakhir mungkin lebih kecil bergantung pada ukuran kumpulan data Anda. Model atau operasi Anda seperti BatchNorm harus menanganinya dengan benar atau secara eksplisit memeriksa batch yang lebih kecil.

5. Tensor yang Tidak Disengaja pada Perangkat Berbeda

Pastikan fitur dan model input Anda ada di perangkat yang sama. Jika Anda mengirim model Anda ke CUDA tetapi membiarkan masukan Anda pada CPU, segala sesuatunya akan gagal secara tidak terduga, seringkali tanpa kesalahan yang membantu.

Selalu periksa kembali dengan:

 assert inputs.device == model.device

Tip Lanjutan: Aktifkan Pelaporan Kesalahan Penuh

Jika menjalankan dengan CPU tidak membantu, atau Anda bekerja dalam pengaturan CPU/GPU campuran dan masih tidak mendapatkan kesalahan yang berguna — coba atur:

 CUDA_LAUNCH_BLOCKING=1 python my_script.py

Ini memberitahu PyTorch untuk menjalankan kode GPU secara sinkron, sehingga kode tersebut akan mogok tepat pada titik kegagalannya. Ini mungkin sedikit memperlambat eksekusi, tetapi memberikan penelusuran balik yang lebih jelas.

Hanya dalam Python, tanpa memodifikasi shell:

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

Sekarang runtime harus menawarkan informasi yang lebih spesifik tentang di mana pernyataan CUDA terjadi.

Perbaiki dengan Contoh

Mari kita lihat contoh praktisnya. Misalkan Anda sedang membangun model untuk klasifikasi digit di MNIST dan menentukan lapisan model akhir Anda sebagai berikut:

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

Di loop pelatihan, Anda memiliki:

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

Tapi label Anda seperti:

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

Bentuk ini tidak benar. CrossEntropyLoss mengharapkan label sebagai vektor 1D dari indeks kelas:

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

Memperbaiki bentuk ini saja dapat menyelesaikan masalah.

model pytorch, fungsi kehilangan, kesalahan GPU, perbaikan

Ringkasan: Daftar Periksa untuk Memperbaiki Kesalahan

Sebelum Anda mulai mencabut rambut, ikuti daftar periksa berikut:

  1. Beralih ke mode CPUdan coba lagi — pesan kesalahannya mungkin lebih deskriptif.
  2. Verifikasi label kelas:Pastikan label tersebut berada dalam rentang yang valid dan format yang benar.
  3. Periksa data yang berasal dari DataLoader— lakukan iterasi secara batch dan periksa anomali.
  4. Pastikan bentuk dan dimensi tensor yang tepat, terutama untuk keluaran dan target.
  5. Gunakan CUDA_LAUNCH_BLOCKING=1untuk mendapatkan penelusuran balik tersinkronisasi dan mendetail dari CUDA.

Kesimpulan

Meskipun kesalahan yang dipicu oleh pernyataan di sisi perangkatmungkin terasa samar dan buram pada awalnya, pada akhirnya hal tersebut merupakan cara model atau data Anda untuk memberi tanda bahaya kepada Anda. Dengan memeriksa label, bentuk data, dan memanfaatkan mode CPU serta pemblokiran peluncuran secara sistematis, Anda hampir selalu dapat mengisolasi masalahnya.

Lain kali, alih-alih bereaksi dengan kebingungan, Anda akan dipersenjatai dengan pengetahuan dan perangkat diagnostik. Selamat men-debug!