GPU untuk proyek Anda · pembayaran kripto tanpa KYC Cara menyewa
Bahasa Indonesia
Buka konsol
Panduan praktis / KERNODECK

DataLoader macet: periksa data sebelum worker

Mulailah dengan num_workers=0 dan urutan tetap, periksa satu sampel lalu satu batch penuh, dan pisahkan pembacaan, transformasi, penggabungan, serta transfer GPU. Setelah itu, masukkan kembali worker secara bertahap. GPU yang menunggu tidak membuktikan bahwa penyimpanan lambat: kesalahan data, serialisasi, atau penggabungan yang mahal dapat memblokir rantai sebelum komputasi.

7 menit baca · Panduan untuk developer

Menentukan apa yang harus diserahkan oleh loader

Tuliskan kontrak keluaran sebelum mengoptimalkan: jumlah elemen, tipe setiap bidang, dimensi, rentang target, dan aturan untuk input yang tidak lengkap. Bedakan antara pengenal contoh dan posisinya dalam sebuah batch. Sebuah transformasi dapat mengubah bentuk atau menyaring input; program pelatihan harus tahu apakah hal itu diizinkan.

Ambil sampel yang representatif yang mencakup file biasa, kasus batas, dan elemen terakhir dari dataset. Buka setiap elemen dengan persiapan yang persis sama seperti Dataset. Lalu periksa penggabungannya. Akses individual yang berhasil tidak membuktikan bahwa beberapa hasil dapat ditumpuk. Untuk teks, dokumentasikan padding dan mask; untuk gambar, kanal, dimensi, dan urutan sumbu.

Tetapkan cakupannya: data lokal atau jarak jauh, dekode disertakan atau tidak, transformasi tetap atau acak. Pertahankan di antara dua pengaturan; keuntungan yang tampak bisa berasal dari pekerjaan yang dihilangkan.

Kembali ke satu proses untuk membaca kesalahan

Reproduksi terlebih dahulu dengan num_workers=0, shuffle=False, dan batch kecil. Pemuatan kemudian berlangsung di proses utama dan jejak kesalahan umumnya lebih mudah dibaca. Dokumentasi DataLoader merekomendasikan kemungkinan ini untuk debugging. Catat pengenal elemen yang gagal sebelum didekode, tanpa menyalin konten sensitifnya ke log.

Lakukan secara terpisah: akses mentah, transformasi, collate_fn, lalu transfer. Jika alur gagal sebelum transfer, mengubah CUDA bukanlah langkah pertama. Jika macet hanya dengan beberapa worker, periksa objek dan sumber daya yang diteruskan ke proses tersebut. Bandingkan iterasi pertama dan berikutnya: mulai kerja para worker dapat menjelaskan penantian awal tanpa menetapkan masalah yang berulang.

Timeout dapat membuat penantian terlihat, tetapi tidak memperbaiki sumber yang tidak tersedia maupun worker yang macet. Simpan langkah terakhir yang diketahui dan kurangi jumlah input alih-alih menambah batas waktu ini tanpa henti.

Contoh yang dikerjakan: tiga kanal diharapkan, satu gambar berbeda

Pertimbangkan empat catatan pedagogis. Tiga yang pertama menghasilkan tensor berbentuk [3, 16, 16], yang keempat [1, 16, 16]. Dengan kontrak yang mewajibkan tiga kanal, elemen keempat harus diidentifikasi sebelum penumpukan. Skenario ini tidak dijalankan di sini; ini menggambarkan hasil yang diharapkan berdasarkan bentuk yang dipilih.

Fungsi di bawah ini mengasumsikan bahwa setiap catatan memiliki bidang id, x, dan y, bahwa x adalah tensor CPU dan y adalah indeks bilangan bulat. Fungsi ini menolak ketidaksesuaian alih-alih menghapus gambar secara diam-diam. Untuk proyek Anda, putuskan secara eksplisit apakah gambar monokrom harus dikonversi menjadi tiga kanal atau ditolak saat impor. Keputusan ini bergantung pada makna data dan prapemrosesan yang diharapkan oleh model.

Setelah perbaikan, keempat pengenal harus tetap ada dan tensor yang digabungkan harus berbentuk [4, 3, 16, 16]. Tambahkan penjagaan yang sesuai untuk target: gambar yang dimensinya benar masih bisa membawa anotasi yang tidak valid.

Penggabungan pedagogis yang diusulkan, tidak dijalankan
import torch
from torch.utils.data import DataLoader

def assemble(records):
    for item in records:
        if tuple(item["x"].shape) != (3, 16, 16):
            raise ValueError(f"Bentuk tak terduga untuk {item['id']}")
    return {
        "ids": [item["id"] for item in records],
        "x": torch.stack([item["x"] for item in records]),
        "y": torch.tensor([item["y"] for item in records],
                          dtype=torch.long),
    }

# dataset adalah Dataset Anda yang menghasilkan record yang dijelaskan.
# Dalam skrip multiproses, buat loader di bawah pelindung main.
if __name__ == "__main__":
    loader = DataLoader(dataset, batch_size=4, num_workers=0,
                        shuffle=False, collate_fn=assemble)
    iterator = iter(loader)
    batch = next(iterator)

Mengaktifkan kembali workers tanpa mengubah data

Beralih dari nol ke sejumlah kecil workers dengan mempertahankan batch, urutan, dan transformasi. Uji satu epoch penuh, lalu epoch kedua: beberapa kesalahan hanya muncul saat iterator dimulai ulang atau ketika sumber daya telah terpakai. Menambah paralelisme hanya berguna jika pekerjaan persiapan benar-benar dapat berjalan secara paralel.

Metode start bergantung pada sistem dan versi Python. Dengan spawn, lindungi titik masuk program dengan if __name__ == '__main__' dan definisikan Dataset, collate_fn, serta fungsi worker di tingkat modul, bukan di dalam lambda lokal. Dokumentasi proses juga menjelaskan mengapa lock atau thread warisan dapat menyebabkan deadlock. Pertahankan inisialisasi akses yang khusus untuk setiap proses jika pustaka mengharuskannya.

Untuk IterableDataset, verifikasi partisi antar workers menggunakan pengenal: beberapa worker tidak boleh masing-masing mengonsumsi aliran yang sama secara keseluruhan. Jangan hanya menilai jumlah batch; periksa juga duplikat dan elemen yang hilang.

Mengukur waktu tunggu dan throughput dengan satuan yang jelas

Gunakan dua pengamatan yang saling melengkapi. Penelusuran loader saja menghitung contoh yang disiapkan selama interval tertentu. Penelusuran terintegrasi memeriksa apa yang terjadi ketika model mengonsumsi data tersebut. Yang pertama membantu mengisolasi persiapan; ini tidak secara otomatis mewakili throughput pelatihan.

Dalam protokol Anda, hitung contoh yang benar-benar terkirim, lalu bagi dengan detik yang berlalu. Nyatakan lintasan yang dikecualikan untuk pemanasan, cache data, transformasi, dan jumlah pengulangan. Simpan nilai setiap lintasan alih-alih hanya memilih yang terbaik. Tabel di bawah ini adalah lembar pencatatan: tidak ada nilai performa yang diisi.

Jika bentuk bervariasi, jumlah contoh per detik dapat menyamarkan perubahan beban. Tambahkan satuan yang relevan, seperti piksel yang didekode atau token yang benar-benar disiapkan, sambil tetap menyimpan jumlah contoh. Untuk melokalisasi waktu tunggu dalam loop lengkap, pisahkan penamaan pembacaan batch berikutnya dari komputasi.

Geser tabel untuk membaca semua kolom.
Lembar pencatatan untuk diisi dengan beban Anda, tanpa nilai performa yang diasumsikan
PengaturanElemen yang diverifikasiDurasi yang diamatiKesimpulan yang diharapkan
workers=0Pengenal, bentuk, targetDiukur dalam detikReferensi yang benar
Sejumlah kecil workersHimpunan masukan yang samaDiukur dalam detikKeuntungan atau biaya tambahan yang nyata
Pengaturan sama, epoch keduaTanpa kehilangan atau duplikasiDiukur dalam detikEfek pemanasan dan cache

Menangani memori, pra-pemuatan, dan transfer secara terpisah

Workers dan batch yang menunggu mengonsumsi memori host. Pantau memori tersebut selama uji coba Anda sebelum menyimpulkan bahwa hanya VRAM yang penting. Pra-pemuatan yang lebih dalam dapat memindahkan waktu tunggu sekaligus meningkatkan pemakaian; ini tidak menjamin lebih banyak hasil per detik. Kurangi dulu variabel yang dicurigai dan bandingkan cakupan yang sama.

pin_memory dan transfer non-blocking berkaitan dengan perpindahan data ke akselerator. Resep optimasi PyTorch menyajikannya sebagai tuas yang perlu ditinjau bersama perangkat keras dan beban. Keduanya tidak memperbaiki dekode yang salah. Mulailah dengan data CPU di dalam workers, lalu atur transfer di proses yang mengendalikan komputasi. Manfaat dan tumpang tindih yang efektif harus diamati, bukan diasumsikan.

Jika persistent_workers digunakan, perhatikan sumber daya dan status yang dipertahankan antar epoch. Pengaturan yang memuaskan pada satu batch saja tidak cukup untuk memverifikasi penutupan file atau pembaruan sumber.

Terima pengaturan hanya jika data tetap benar

Hasil yang diharapkan adalah loop yang menerima semua input yang direncanakan, dalam kerangka yang dipilih, tanpa kesalahan senyap. Bandingkan ID dan target sebelum dan sesudah optimasi. Jelaskan drop_last jika Anda mengecualikan batch terakhir yang tidak lengkap. Jika transformasi bersifat acak, kendalikan kebijakannya alih-alih menuntut kesamaan piksel yang akan bertentangan dengan kebijakan tersebut.

Pertahankan pengaturan paling sederhana yang memenuhi kebutuhan terukur. Peningkatan jumlah worker bisa jadi tidak meningkatkan apa pun jika penyimpanan, dekode, atau model sudah menjadi batasnya. Sumber daya CPU, RAM, dan penyimpanan sebuah server tidak dapat disimpulkan dari nama GPU-nya: sebutkan kebutuhan tersebut secara terpisah saat Anda menyiapkan lingkungan Kernodeck Anda.

Pertanyaan Anda

Apakah num_workers=0 menonaktifkan pelatihan GPU?

Tidak. Pengaturan itu menempatkan pemuatan data di proses utama. Model tetap dapat berhitung di GPU. Pengaturan ini terutama memungkinkan pembacaan error baca, transformasi, dan perakitan secara lebih langsung.

Apakah harus memilih jumlah worker sebanyak inti CPU?

Tidak secara otomatis. Pengaturan yang tepat bergantung pada pekerjaan persiapan, memori, akses data, dan kecepatan konsumsi model. Bandingkan beberapa nilai dengan menjaga beban tetap sama dan mengendalikan input yang dikirim.

Apakah batch yang lebih kecil memperbaiki worker yang berhenti?

Batch yang lebih kecil dapat mengubah tekanan memori, tetapi tidak memperbaiki anotasi yang tidak valid, sumber daya yang tidak dapat diserialisasi, atau file yang tidak terbaca. Reproduksi dulu dengan nol worker untuk mengidentifikasi tahap yang bermasalah.

Apakah waktu yang dihabiskan di next(iterator) mengukur disk?

Tidak. Setelah iterator=iter(loader), next(iterator) menunggu satu batch. Dekode, transformasi, perakitan, komunikasi antar proses, dan pramuat dapat terjadi. Pengukuran baca saja dan pelacakan loop lengkap menjawab pertanyaan yang berbeda.