1. Pisahkan program, parameternya, dan pelacakan komersial
Kode mendeskripsikan perilaku program. Konfigurasi menentukan beban kerja: model, data, batch, presisi, dan tujuan. Secret memberikan akses ke sumber daya yang diperlukan. Jaga elemen-elemen ini tetap terpisah agar dapat mengubah percobaan tanpa menulis ulang kode atau menyalin token ke dalam file bersama.
Referensi perintah Kernodeck memungkinkan Anda menemukan konteks penyewaan di akun Anda. Identitas percobaan membedakan eksekusi program Anda selama periode tersebut. Hubungkan keduanya dalam catatan Anda jika itu membantu, tetapi jangan meminta skrip Anda menyimpulkan status komputasi dari status pembayaran.
Ambil contoh proyek klasifikasi dokumen yang harus dijalankan beberapa kali pada sampel yang sama. Kontrak program mendeskripsikan file input, parameter yang diterima, folder output, dan cara menampilkan error. Panduan tentang data menjabarkan validasi konten; di sini, kami menyusun antarmuka yang menghubungkan tahapan-tahapan tersebut.
2. Tulis kontrak input yang eksplisit dan berversi
Dokumentasikan field wajib dan nilai yang diterima. Hindari nilai default tersembunyi untuk keputusan yang mengubah hasil, seperti model atau perangkat. Nomor skema membedakan bentuk konfigurasi dari versi kode; nomor ini tidak menggantikan versi kode tersebut.
Dalam contoh edukatif ini, file JSON berisi skema, path input, batch, dan perangkat yang diminta. Path relatif dibaca dari folder konfigurasi. Aturan yang dipilih untuk contoh ini menghindari ketergantungan pada direktori tempat rekan kerja menjalankan perintah.
Membaca JSON hanya memvalidasi sintaksisnya. Program Anda kemudian harus memeriksa tipe, field, dan batasan proyek. Jika terjadi error, program harus berhenti sebelum memuat sumber daya yang mahal, dengan pesan yang menyebutkan parameter yang perlu diperbaiki.
{
"schema_version": 1,
"input": "../data/pilote.jsonl",
"batch_size": 4,
"device": "cuda"
}3. Siapkan titik masuk yang menolak error sederhana
argparse memungkinkan Anda mendeklarasikan opsi dan menghasilkan bantuan untuk perintah Anda. Contoh berikut hanyalah pra-kontrol: contoh ini membaca konfigurasi, memeriksa field-nya, dan mendeteksi folder output yang sudah digunakan. Contoh ini tidak memuat model atau data ke memori dan tidak menguji ketersediaan GPU.
Simpan kode edukatif ini ke prepare_run.py jika Anda ingin menyesuaikannya. Kode ini disediakan tanpa eksekusi yang terverifikasi. Selanjutnya tambahkan pemeriksaan bisnis Anda di aplikasi, alih-alih menganggap pesan akhir sebagai hasil komputasi. Perangkat cuda tetap merupakan permintaan; PyTorch juga menggunakan nama ini dengan ROCm.
Penolakan terhadap direktori output yang sudah ada di sini merupakan konvensi perlindungan terhadap tercampurnya percobaan. Perintah pemulihan yang sesungguhnya harus menerima opsi dan pemeriksaan yang berbeda. Jangan mengubah peluncuran baru menjadi pemulihan implisit hanya karena ada file yang tersedia.
import argparse
import json
from pathlib import Path
parser = argparse.ArgumentParser(description="Memvalidasi peluncuran proyek")
parser.add_argument("--config", type=Path, required=True)
parser.add_argument("--run-dir", type=Path, required=True)
args = parser.parse_args()
try:
config_path = args.config.resolve()
config = json.loads(config_path.read_text(encoding="utf-8"))
except (OSError, UnicodeError, json.JSONDecodeError) as exc:
parser.error(f"Konfigurasi tidak dapat dibaca: {exc}")
expected = {"schema_version", "input", "batch_size", "device"}
if not isinstance(config, dict) or set(config) != expected:
parser.error("Bidang yang diharapkan: schema_version, input, batch_size, device")
if type(config["schema_version"]) is not int or config["schema_version"] != 1:
parser.error("schema_version harus bernilai 1")
if type(config["batch_size"]) is not int or config["batch_size"] < 1:
parser.error("batch_size harus berupa bilangan bulat positif")
if config["device"] not in ("cpu", "cuda"):
parser.error("device harus bernilai cpu atau cuda")
if not isinstance(config["input"], str) or not config["input"]:
parser.error("input harus berupa jalur yang tidak kosong")
input_path = (config_path.parent / config["input"]).resolve()
run_dir = args.run_dir.resolve()
if not input_path.is_file():
parser.error("Berkas masukan tidak ada")
if run_dir.exists():
parser.error("Pilih direktori keluaran baru")
print(json.dumps({
"status": "configuration_validated",
"input": str(input_path),
"run_dir": str(run_dir),
"device_requested": config["device"],
"batch_size": config["batch_size"]
}, ensure_ascii=False))python prepare_run.py --config config/pilote.json --run-dir runs/pilote-0014. Memberi identitas pada eksekusi dan hasilnya
Kaitkan setiap peluncuran dengan pengenal pendek yang unik dalam kampanye Anda. Catat revisi kode, skema, dan parameter yang benar-benar digunakan, lalu referensi data dan model. Simpan nilai-nilai ini bersama keluaran agar sebuah hasil tidak bergantung pada berkas konfigurasi yang diubah di kemudian hari.
Untuk membandingkan dua ukuran batch, buat dua percobaan dan dua direktori. Pertahankan sampel yang sama dan identifikasi perbedaan yang disengaja. Nama pilote-001 dan pilote-002 tidak dengan sendirinya menjelaskan apa yang berubah: manifes menghubungkan nama dengan parameter.
Sediakan format ringkasan yang dapat dibaca oleh perkakas Anda. Format itu dapat membedakan elemen yang diterima, berhasil, ditolak, dan yang masih harus diproses. Pilih aturan keberhasilan yang lengkap dan jangan menandai sebuah percobaan selesai begitu hasil pertama ditulis. Kode keluar program harus tetap konsisten dengan kesimpulan ini.
Geser tabel untuk membaca semua kolom.| Berkas atau status | Peran | Pemeriksaan yang diharapkan |
|---|---|---|
| manifest.json | Identitas kode, data, dan parameter | Nilai yang benar-benar digunakan, tanpa rahasia. |
| results.jsonl | Satu keluaran per elemen yang diterima | Pengenal yang dikenal dan format yang sesuai. |
| errors.jsonl | Elemen yang ditolak dan alasan yang berguna | Tidak ada penghilangan diam-diam atau konten sensitif yang tidak perlu. |
| summary.json | Kesimpulan percobaan dan penghitung | Jumlah yang konsisten, berkas dibaca ulang sebelum status akhir. |
5. Menampilkan peristiwa yang berguna bagi perkakas Anda
Buat beberapa transisi menjadi terlihat: konfigurasi diterima, data dapat diakses, model dimuat, keluaran pertama ditulis, dan pemrosesan selesai. Sebuah jejak harus memungkinkan menjawab “sejauh mana peluncuran ini?” tanpa menyalin dokumen atau prompt. Kaitkan tahap dan pengenal percobaan dengan pesan.
Modul logging di Python memungkinkan pengorganisasian pesan berdasarkan tingkat dan tujuan. Selanjutnya pilih konvensi peristiwa Anda sendiri dan dokumentasikan. Aplikasi yang menulis galat lalu berakhir dengan sukses membuat otomatisasi menyesatkan; sebaliknya, setiap peringatan tidak berarti hasilnya tidak dapat digunakan.
Jangan mencampuradukkan peristiwa yang dikirim dengan hasil yang bertahan: pesan “pencadangan dimulai” tidak membuktikan bahwa sebuah berkas telah dibaca ulang. Untuk eksekusi yang berjalan lama, panduan khusus menjelaskan keterkaitan antara proses dan sesi. Antarmuka Anda terutama harus menyimpan kesimpulan yang dapat diakses setelah koneksi interaktif berakhir.
6. Menentukan kegagalan, pemulihan, dan verifikasi akhir
Klasifikasikan kegagalan yang berguna: konfigurasi tidak valid, sumber daya tidak ada, kesalahan komputasi, dan hasil yang tidak sesuai. Berikan langkah berikutnya untuk masing-masing. Jangan pasang percobaan ulang otomatis tanpa memutuskan efek mana yang boleh diulang: menulis ulang keluaran yang sudah diterima dan melanjutkan dari checkpoint memerlukan aturan yang berbeda.
Prosedur akhir Anda menjelaskan cara menjalankan, memantau, menghentikan, melanjutkan, dan mengekspor. Untuk pemrosesan dokumen, simpan daftar ID yang sudah selesai dan yang perlu diproses ulang. Untuk pelatihan, gunakan protokol yang memverifikasi status tersimpan dalam proses baru. Folder yang tidak kosong bukan bukti bahwa kelanjutan berjalan dengan benar.
Terakhir, uji proyek dari pemanggilan baru, dengan konfigurasi yang diketahui dan tujuan yang berbeda. Verifikasi penolakan yang diharapkan, lalu jalankan alur lengkap yang kecil. Pemeriksaan awal di halaman ini tidak mencakup akses bersamaan, eksposur publik suatu layanan, maupun izin penyimpanan: hal-hal tersebut memerlukan perancangan tersendiri.