1. Temukan kembali apa yang masih diketahui kernel
File notebook dan state kernel tidak selalu menceritakan hal yang sama. Sebuah variabel bisa berasal dari sel yang telah dihapus, sebuah list mungkin telah diubah beberapa kali, dan objek yang dimuat sebelum perubahan kode terakhir tetap tersimpan di memori. Hasil yang ditampilkan karena itu tidak membuktikan bahwa sel-sel saat ini masih menghasilkan hasil tersebut dalam urutan yang terlihat.
Simpan salinan kerja, mulai ulang kernel, lalu jalankan sel dari awal hingga akhir. Catat sel pertama yang gagal atau berubah hasilnya. Cari dependensi yang hilang alih-alih menyuntikkan ulang variabel secara manual dari sesi lama. Kernel Jupyter adalah proses terpisah; menutup tab tidak sama dengan membangun ulang lingkungan yang bersih.
Inventarisasikan juga efek eksternal: pengunduhan, pemasangan paket, perubahan direktori, pembacaan file yang sudah dihasilkan, dan penggunaan variabel lingkungan. Sel yang hasilnya tampak langsung bisa jadi hanya menggunakan ulang file lama. Skrip Anda nantinya harus dapat membedakan input yang disengaja dari sisa percobaan.
2. Tulis kontrak sebelum memindahkan kode
Pilih satu tugas saja untuk diekstrak. Misalnya: membaca file skor, mempertahankan ID yang skornya mencapai ambang batas, dan menulis hasilnya. Contoh dalam panduan ini bersifat edukatif, tidak dijalankan, dan tanpa GPU. Fungsinya untuk menunjukkan dependensi suatu eksekusi, bukan untuk mengumumkan suatu pengukuran atau alat yang disertakan bersama Kernodeck.
Definisikan input, parameter, dan output dengan cukup presisi untuk memverifikasi transformasinya. Di sini, ambang batas bersifat inklusif: skor yang sama dengan 0,5 dipertahankan. ID harus tetap terkait dengan skornya dan urutan input dipertahankan. Output yang sudah ada tidak boleh tergantikan secara tidak sengaja oleh percobaan baru.
Langkah ini menghindari migrasi yang ambigu: jika notebook menyingkirkan skor yang sama dengan ambang batas sedangkan skrip mempertahankannya, berarti Anda telah mengubah perhitungannya. Putuskan secara eksplisit apakah ini koreksi atau regresi. Sertakan kasus yang tepat berada di batas, bukan hanya dua nilai yang berjauhan.
Geser tabel untuk membaca semua kolom.| Elemen | Nilai contoh | Kriteria |
|---|---|---|
| Input | a: 0,4; b: 0,8; c: 0,5 | Tiga ID berbeda, skor sudah tervalidasi antara 0 dan 1. |
| Parameter | Ambang batas 0,5 | Perbandingan lebih besar atau sama dengan. |
| Output yang diharapkan | b, lalu c | Dua ID, tanpa duplikasi maupun pengurutan ulang. |
3. Ekstrak fungsi yang tidak lagi bergantung pada sel
Pisahkan transformasi dari operasi baca dan tulis. Fungsi perhitungan menerima datanya dan ambang batasnya, lalu mengembalikan ID yang terpilih. Fungsi ini tidak mengakses variabel global bernama seuil, tidak membuka file secara implisit, dan tidak mengubah daftar input. Ini memungkinkan notebook dan skrip memanggil perhitungan yang persis sama.
Dalam cuplikan, data diasumsikan sudah tervalidasi sesuai kontrak sebelumnya. Jadi fungsinya bukan validator file yang lengkap. Batasan ini disengaja: verifikasi format di pintu masuk program, lalu jaga agar transformasinya mudah dipahami. Menambahkan parameter tidak boleh mengharuskan Anda mencari kembali sel yang pernah mengubah suatu nilai.
Notebook boleh tetap menjadi alat eksplorasi Anda. Biarkan ia mengimpor fungsi ini alih-alih memelihara salinan kedua. Setelah memodifikasi modul, mulai dari kernel yang baru untuk membandingkan kedua alur; fungsi lama yang sudah diimpor tidak boleh mengacaukan verifikasi.
def retenir_identifiants(records, seuil):
return [
record["id"]
for record in records
if record["score"] >= seuil
]
if __name__ == "__main__":
records = [
{"id": "a", "score": 0.4},
{"id": "b", "score": 0.8},
{"id": "c", "score": 0.5},
]
attendu = ["b", "c"]
obtenu = retenir_identifiants(records, 0.5)
if obtenu != attendu:
raise SystemExit("Sélection inattendue")4. Jadikan parameter sebagai input yang terlihat
Titik masuk skrip memproses argumen, memvalidasi pilihan, dan memanggil fungsi. Modul standar argparse mendeskripsikan opsi dan menghasilkan bantuan; ia tidak mengenal aturan bisnis Anda. Bilangan float yang diterima secara sintaksis masih bisa berada di luar rentang yang diizinkan. Karena itu, ambang batas pada contoh ini memerlukan pemeriksaan tambahan.
Tentukan resolusi jalur secara eksplisit: relatif terhadap direktori tempat perintah dijalankan, atau terhadap folder proyek yang dipilih secara eksplisit. Jangan gunakan perubahan direktori tersembunyi di tengah komputasi. Blok di bawah ini hanya menunjukkan penguraian argumen; pembacaan data dan penulisan masih perlu dihubungkan di dalam program pembaca.
Jauhkan rahasia dari argumen-argumen ini. Parameter yang dapat dibagikan menjelaskan eksperimen; akses ke repositori atau penyimpanan mengikuti jalur lain. Perintah yang berguna bagi rekan kerja harus dapat disalin tanpa ikut menyalin token.
import argparse
from pathlib import Path
def lire_arguments():
parser = argparse.ArgumentParser()
parser.add_argument("--input", required=True, type=Path)
parser.add_argument("--output", required=True, type=Path)
parser.add_argument("--seuil", required=True, type=float)
args = parser.parse_args()
if not 0 <= args.seuil <= 1:
parser.error("Le seuil doit être compris entre 0 et 1.")
return args5. Beri skrip akhir dan keluaran yang dapat diverifikasi
Tempatkan orkestrasi di dalam sebuah fungsi main dan picu fungsi tersebut di bawah kondisi if __name__ == "__main__". Modul dengan demikian dapat diimpor oleh notebook tanpa langsung menjalankan pemrosesan. Impor mendefinisikan alat; entri utama memutuskan kapan membaca, menghitung, dan menulis.
Tetapkan folder terpisah untuk setiap eksekusi. Simpan parameter non-sensitif yang benar-benar digunakan dan identitas masukan, lalu tulis hasilnya. Untuk seleksi kita, periksa jumlah pengenal, keanggotaannya dalam masukan, dan aturan ambang batas. Berkas JSON yang terbentuk dengan baik bisa saja berisi pengenal yang salah; keberadaannya saja tidak cukup.
Sediakan kegagalan eksplisit jika berkas masukan tidak ada atau jika tujuan tidak dapat digunakan. Hindari mengganti masalah ini dengan daftar kosong: daftar kosong bisa ditafsirkan sebagai seleksi yang valid. Program harus membedakan tidak ada hasil yang memenuhi ambang batas dan tidak ada hasil karena pembacaan gagal.
6. Membandingkan dalam dua eksekusi yang baru
Gunakan dulu tiga baris edukatif. Dengan ambang batas 0,5, harapkan b dan c; dengan 0,9, harapkan daftar kosong; dengan 0,4, harapkan ketiga pengenal. Jawaban ini dapat disimpulkan dari kontrak dan tidak disajikan sebagai hasil yang dieksekusi di sini. Jawaban ini memungkinkan Anda mengenali operator perbandingan yang terbalik atau urutan yang salah.
Selanjutnya jalankan notebook Anda yang telah dimulai ulang dan skrip Anda dalam proses yang baru, pada masukan yang sama. Bandingkan nilai yang berguna, bukan tangkapan layar atau jam yang tercatat di dalam berkas. Tambahkan kumpulan data kedua yang representatif dan masukan yang tidak valid. Dokumentasikan perbedaan yang diharapkan, seperti penyajian keluaran yang lebih sederhana.
Konversi nbconvert dapat mempercepat pemindahan awal sel, tetapi perintah magisnya mungkin masih bergantung pada Jupyter. Hapus atau ganti instruksi khusus notebook, tampilan yang tidak perlu, dan instalasi yang dilakukan secara spontan. Ekspor hanyalah titik awal; perbandingan dari keadaan yang baru menentukan apakah migrasi sudah selesai.
7. Beralih ke GPU tanpa memasukkan kembali keadaan tersembunyi
Setelah alur CPU dipahami, sambungkan pemuatan model dan backend ke struktur eksplisit yang sama. Pertahankan versi, presisi, masukan, dan tujuan. Peralihan ke GPU tidak memperbaiki urutan sel yang tidak konsisten maupun berkas yang dihasilkan oleh uji coba lama. Periksa secara terpisah bahwa PyTorch benar-benar dapat menghitung pada perangkat yang dipilih.
Jika dua peluncuran menghasilkan nilai yang berbeda, bedakan antara keadaan yang terlupakan, sumber acak, dan batas numerik komputasi. Sebuah seed bukanlah janji universal tentang identitas antarversi dan antarperangkat keras. Untuk pelatihan yang terputus, gunakan prosedur khusus untuk checkpoint: panduan ini mengubah titik masuk, tanpa merekonstruksi keadaan optimizer atau generator.
Keluaran yang berguna adalah program yang dapat Anda jelaskan dalam satu perintah, beserta prasyarat dan kontrol hasilnya. Notebook tetap bebas untuk eksplorasi dan plotting; ia tidak lagi sendirian menyimpan memori tentang bagaimana komputasi harus dijalankan.