2
Arsitektur Repository
Repository ini adalah harness finetuning yang tipis. Dua skrip di akar repository menjadi entry point — main.py untuk training dan evaluasi, predict.py untuk prediksi ulang — dan keduanya mengimpor fungsi dari utils/ secara langsung tanpa lapisan paket perantara (main.py:14-151, predict.py:13-152). Halaman ini memetakan siapa bergantung pada siapa; rincian tiap tahap dibahas di halaman masing-masing.
Peta ketergantungan antar modul
Arah impor konsisten: entry point bergantung pada utils/, dan hanya utils/functions.py yang mengimpor modules/ (utils/functions.py:6-73). utils/args_helper.py menjadi tempat ketiga lapisan bertemu karena ia mengimpor kelas dataset, fungsi metrik, dan forward function sekaligus (utils/args_helper.py:1-144).
graph TD
m_main["main.py<br/>training + evaluation"]
p_pred["predict.py<br/>prediction"]
a_helper["utils/args_helper.py<br/>parser + dataset dispatch"]
f_utils["utils/functions.py<br/>model loading"]
d_utils["utils/data_utils.py<br/>Dataset + DataLoader"]
fwd["utils/forward_fn.py"]
mets["utils/metrics.py"]
w_cls["modules/word_classification.py"]
m_cls["modules/multi_label_classification.py"]
dset[("dataset/")]
saved[("save/ artefacts")]
m_main --> a_helper
m_main --> f_utils
m_main -.-> d_utils
m_main -.-> fwd
p_pred --> a_helper
p_pred --> f_utils
p_pred --> mets
p_pred -.-> fwd
a_helper --> d_utils
a_helper --> fwd
a_helper --> mets
f_utils --> w_cls
f_utils --> m_cls
d_utils -.-> dset
f_utils -.-> saved
style m_main fill:#2d7d46,color:#fff
style p_pred fill:#2d7d46,color:#fff
style a_helper fill:#f59e0b,color:#000
style dset fill:#336791,color:#fff
style saved fill:#8b5cf6,color:#fff
%% fig: Peta ketergantungan modul IndoNLU
%% desc: Dua entry point memakai utils/, args_helper menyatukan data, forward dan metrik, sementara functions memuat bobot dari save/ dan memilih kepala di modules/.Garis putus-putus menandai pemanggilan saat runtime, bukan impor. main.py tidak mengimpor utils/forward_fn.py; ia memakai fungsi yang sudah diisi append_dataset_args lewat args['forward_fn'] saat memanggil train(...) (main.py:1855). Pola yang sama berlaku untuk bobot: berkasnya dibaca dari model_dir yang disusun dari args['model_dir'], args['dataset'], dan args['experiment_name'] (utils/functions.py:222-2256).
Dua entry point dan pembagian tugas
Keduanya memakai parser dan pemuat model yang berbeda, tetapi berbagi append_dataset_args dan model_dir yang sama.
| Aspek | main.py | predict.py |
|---|---|---|
| Parser | get_parser (utils/args_helper.py:33-607) | get_eval_parser (utils/args_helper.py:62-808) |
| Urutan pemanggilan | get_parser() lalu append_dataset_args (main.py:141-1429) | get_eval_parser() lalu append_dataset_args (predict.py:68-6910) |
| Pemuat model | load_model(args) (main.py:16011) | load_eval_model(args) (predict.py:79-8112) |
| Sumber bobot | checkpoint Hugging Face atau embedding fasttext/word2vec (utils/functions.py:286-30513) | best_model_0.th di model_dir (utils/functions.py:222-2256) |
| Fase yang dicetak | =========== TRAINING PHASE =========== lalu =========== EVALUATION PHASE =========== (main.py:170-19814) | =========== PREDICTION =========== (predict.py:91-9715) |
| Artefak | best_model_0.th, vocab.txt, config.json (main.py:188-19416) | prediction_result.csv (predict.py:99-10717) |
⚠️
main.pymembuat foldermodel_dirsendiri dan menolak menimpanya kecuali diberi--force(main.py:144-15118), sedangkanpredict.pyhanya membaca folder itu dan mencetakModel doesn't exist in {model_dir}bilabest_model_0.thtidak ada (predict.py:99-10717). Menjalankan prediksi sebelum training selesai hanya menghasilkan pesan itu, bukan berkas submission.
Alur training lengkap ada di Alur Training dan Evaluasi, dan pemilihan model_checkpoint di Konfigurasi Argumen dan Pemilihan Model.
append_dataset_args sebagai titik sambung
Setiap nama dataset punya satu cabang di append_dataset_args yang mengisi set kunci yang sama: task, num_labels, dataset_class, dataloader_class, forward_fn, metrics_fn, valid_criterion, jalur berkas, dan word_tokenizer_class (utils/args_helper.py:85-9019).
graph LR
darg["--dataset"] --> br["append_dataset_args"]
marg["--model_checkpoint / --model_type"] --> gmc["get_model_class"]
br --> tsk["task: sequence / token / multi_label"]
br --> dcls["dataset_class + dataloader_class"]
br --> ffn["forward_fn"]
br --> mfn["metrics_fn"]
tsk --> gmc
gmc --> hcls["pred_cls: Bert / Albert / XLM / XLMRoberta"]
dcls --> batch["batch tensor + label"]
ffn --> outp["loss, list_hyp, list_label"]
mfn --> outp
style br fill:#f59e0b,color:#000
style gmc fill:#8b5cf6,color:#fff
style outp fill:#2d7d46,color:#fff
%% fig: Dispatch argumen ke fungsi dan kelas model
%% desc: append_dataset_args mengisi task, kelas dataset, forward_fn dan metrics_fn, lalu get_model_class memilih pred_cls dari task dan model_checkpoint.task | Contoh dataset | forward_fn | metrics_fn | pred_cls |
|---|---|---|---|---|
sequence_classification | emotion-twitter (utils/args_helper.py:85-9019) | forward_sequence_classification | emotion_detection_metrics_fn | BertForSequenceClassification |
multi_label_classification | absa-airy (utils/args_helper.py:103-10820) | forward_sequence_multi_classification | absa_metrics_fn | BertForMultiLabelClassification |
token_classification | term-extraction-airy (utils/args_helper.py:121-12621) | forward_word_classification | aspect_extraction_metrics_fn | BertForWordClassification |
get_model_class memilih pred_cls dari pasangan model_type dan task (utils/functions.py:145-17822), sedangkan load_model memilih kelas Transformers bawaan untuk sequence_classification (utils/functions.py:300-30523). Nama dataset di luar daftar cabang berhenti dengan ValueError (utils/args_helper.py:300-30124).
Ketiga forward function mengembalikan bentuk yang sama, loss, list_hyp, list_label, tetapi isi list_hyp berbeda: satu label per sekuens (utils/forward_fn.py:8-4025), daftar label per kata yang berhenti pada nilai -100 (utils/forward_fn.py:43-8526), dan satu daftar per kelas untuk multi-label (utils/forward_fn.py:88-117). Perbedaan itu yang menentukan pilihan metrics_fn: akurasi dan F1 macro untuk klasifikasi sekuens (utils/metrics.py:5-11), conll_evaluation untuk tugas tingkat kata (utils/metrics.py:13-20), dan pemerataan daftar label untuk ABSA (utils/metrics.py:74-84). Rincian tiap fungsi ada di Forward Pass dan Metrik Evaluasi.
Paket modules: dua keluarga kepala klasifikasi
modules/ hanya berisi kepala untuk klasifikasi tingkat kata dan multi-label; untuk sequence_classification kode memakai kelas bawaan transformers (utils/functions.py:300-30523).
| Berkas | Kelas | Kepala | Loss |
|---|---|---|---|
| modules/word_classification.py | BertForWordClassification dengan kembaran Albert, XLM, dan XLMRoberta (modules/word_classification.py:35-4431) | subword dirata-rata menjadi vektor kata lewat subword_to_word_ids, lalu satu nn.Linear (modules/word_classification.py:90-10732) | CrossEntropyLoss |
| modules/multi_label_classification.py | BertForMultiLabelClassification dengan kembaran Albert, XLM, dan XLMRoberta (modules/multi_label_classification.py:34-4133) | nn.ModuleList berisi satu nn.Linear per label (modules/multi_label_classification.py:34-4133) | total loss dijumlah per label (modules/multi_label_classification.py:89-10334) |
Pemilihan kelas di antara kedelapan kelas itu dan perilaku forward masing-masing dibahas di Modul Kepala Klasifikasi.
Direktori pendukung
Direktori dataset/ berisi satu folder per task, dan append_dataset_args menuliskan jalur berkasnya secara eksplisit, misalnya ./dataset/emot_emotion-twitter/train_preprocess.csv (utils/args_helper.py:92-9535). Setiap Dataset menyimpan peta label sebagai konstanta kelas — LABEL2INDEX, INDEX2LABEL, NUM_LABELS (utils/data_utils.py:12-1636) — dan setiap DataLoader menimpa collate_fn dengan _collate_fn untuk menyusun batch beserta padding (utils/data_utils.py:67-9637). Rincian bentuk berkas ada di Struktur Berkas Dataset dan Submission, dan perilaku loader di Data Utils dan Dataloader.
Dua skrip shell menyambungkan entry point ke eksperimen massal. run_single_task.sh menjalankan main.py dengan kombinasi --model_checkpoint, --dataset, dan --num_layers (run_single_task.sh:238), sedangkan predict.sh menyusuri ./save/* dan menurunkan --model_type dari potongan pertama nama eksperimen (predict.sh:1-1439).
Direktori examples/ dan tutorial/ berisi notebook finetune, di antaranya finetune_casa.ipynb dan finetune_smsa_tutorial.ipynb, yang dijelaskan di Contoh Finetune dan Tutorial.