TRL documentation
Pelatih General Online Logit Distillation (GOLD)
Pelatih General Online Logit Distillation (GOLD)
Ikhtisar
General Online Logit Distillation (GOLD) adalah ekstensi dari Universal Logit Distillation (ULD) yang mendukung pasangan student/teacher dengan tokenizer yang berbeda. Metode ini menyelaraskan span teks yang dihasilkan oleh kedua tokenizer dan menggabungkan logits terkait sehingga tidak ada token penyelesaian yang terlewat. Hal ini memungkinkan knowledge distillation lintas tokenizer, termasuk keluarga model campuran (misalnya, student LLaMA dengan teacher Qwen).
Kemampuan utama:
- Penyelarasan lintas tokenizer – GOLD secara bertahap mendekode token siswa dan guru, mengelompokkan cuplikan dengan teks yang terlihat sama, dan menggabungkan probabilitas di dalam setiap kelompok. Hal ini menjamin bahwa istilah kerugian dihitung di atas penyelesaian penuh meskipun batas token berbeda.
- Hybrid ULD loss – ketika
uld_use_hybrid_lossdiaktifkan, GOLD membandingkan kecocokan persis kosakata secara langsung dan kembali ke kerugian ULD probabilitas terurut asli untuk token yang tidak cocok. Hal ini meningkatkan stabilitas bagi siswa yang kosakatanya hanya sebagian tumpang tindih dengan guru. - Integrasi mulus dengan GKD – GOLD mewarisi penjadwalan on-policy vs. off-policy dari experimental.gkd.GKDTrainer, sehingga Anda dapat menggabungkan KD tingkat sekuens, JSD yang digeneralisasi, dan distilasi lintas tokenizer dalam satu sesi pelatihan.
GOLD saat ini merupakan bagian dari namespace
trl.experimental. API dapat berubah tanpa pemberitahuan selama fitur ini masih dalam tahap iterasi.
Tips penggunaan
experimental.gold.GOLDTrainer merupakan subkelas dari SFTTrainer dan menerima dataset yang sama seperti trainer TRL lainnya (daftar pesan bergaya ChatML). Flag konfigurasi penting pada experimental.gold.GOLDConfig meliputi:
use_uld_loss– mengaktifkan Universal Logit Distillation. Atur ini keTrueuntuk setup cross-tokenizer.teacher_tokenizer_name_or_path– wajib diisi saatuse_uld_loss=True; GOLD menggunakan tokenizer guru untuk menyelaraskan token.uld_use_hybrid_loss,uld_hybrid_matched_weight,uld_hybrid_unmatched_weight– mengaktifkan dan memberi bobot pada loss hybrid matched/unmatched.beta,lmbda,seq_kd– diwarisi dari experimental.gkd.GKDConfig, mengontrol interpolasi JSD umum dan rasio sampling on-policy.use_privileged_context,teacher_prompt_template,privileged_context_column– memungkinkan teacher melihat konteks tambahan per-contoh sementara prompt student tetap tidak berubah. Saat ini, fitur ini terbatas pada pelatihan teks, off-policy, dan standard-JSD.num_generations,generation_batch_size– mengontrol pembuatan rollout yang dibuffer di seluruh jendela akumulasi gradien.generation_batch_sizeadalah jumlah prompt unik per worker per langkah optimizer.
A minimal end-to-end example:
from datasets import load_dataset
from trl.experimental.gold import GOLDConfig, GOLDTrainer
train_dataset = load_dataset(
"HuggingFaceTB/OpenR1-Math-220k-default-verified",
"all",
split="train[:1024]",
)
trainer = GOLDTrainer(
model="meta-llama/Llama-3.2-1B-Instruct",
teacher_model="Qwen/Qwen2.5-0.5B-Instruct",
args=GOLDConfig(output_dir="gold-model", use_uld_loss=True, teacher_tokenizer_name_or_path="Qwen/Qwen2.5-0.5B-Instruct"),
train_dataset=train_dataset,
)
trainer.train()Untuk alur kerja cepat, Anda dapat mengandalkan pengidentifikasi string seperti yang ditunjukkan di atas—pelatih akan memuat model dan tokenizer untuk Anda. Instansiasi eksplisit AutoModelForCausalLM, AutoTokenizer, atau pengisian GOLDConfig hanya disarankan untuk kasus penggunaan lanjutan di mana Anda memerlukan kontrol terperinci atas inisialisasi.
Setup yang lebih eksplisit mungkin terlihat seperti ini ketika Anda perlu menyesuaikan pemuatan model, pengaturan tokenizer, atau argumen pelatihan:
from datasets import load_dataset
from trl.experimental.gold import GOLDConfig, GOLDTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
student_name = "meta-llama/Llama-3.2-1B-Instruct"
teacher_name = "Qwen/Qwen2.5-0.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(student_name)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(student_name)
teacher_model = AutoModelForCausalLM.from_pretrained(teacher_name)
train_dataset = load_dataset(
"HuggingFaceTB/Countdown-Task-GOLD",
"verified_Qwen2.5-0.5B-Instruct",
split="train",
)
training_args = GOLDConfig(
output_dir="gold-model",
per_device_train_batch_size=1,
teacher_model_name_or_path=teacher_name,
teacher_tokenizer_name_or_path=teacher_name,
use_uld_loss=True,
uld_use_hybrid_loss=True,
)
trainer = GOLDTrainer(
model=model,
teacher_model=teacher_model,
args=training_args,
processing_class=tokenizer,
train_dataset=train_dataset,
)
trainer.train()GOLD menyangga satu batch generasi penuh untuk jendela optimizer (
per_device_train_batch_size * gradient_accumulation_steps) dan memakainya kembali di seluruh langkah akumulasi. Jika batch terakhir berukuran kurang, GOLD akan memperingatkan dan membuang batch terakhir tersebut (Dropping last batch due to unexpected batch size). Aturdataloader_drop_last=Trueuntuk menghindari peringatan ini.
Jenis dataset yang diharapkan
GOLD memerlukan dataset percakapan modeling bahasa, misalnya:
{"messages": [{"role": "user", "content": "What color is the sky?"},
{"role": "assistant", "content": "It is blue."}]}GOLDTrainer menyimpan pesan mentah agar collator ChatML dapat menyusun prompt dan completion dengan batas yang benar.
Konteks Khusus
Privileged-context distillation memberikan informasi tambahan kepada teacher yang tidak tersedia bagi student pada saat inference. Tambahkan kolom context ke dataset prompt/completion biasa, lalu aktifkan fitur ini secara eksplisit:
from datasets import Dataset
dataset = Dataset.from_list(
[
{
"prompt": [{"role": "user", "content": "What caused the outage?"}],
"completion": [{"role": "assistant", "content": "A timeout change caused the outage."}],
"privileged_context": "The deployment changed the timeout immediately before errors began.",
}
]
)
args = GOLDConfig(
output_dir="gold-model",
lmbda=0.0,
use_privileged_context=True,
)Student dilatih pada prompt dan completion asli. Teacher menerima prompt terpisah yang secara default dibangun dari "{prompt}\n\n{privileged_context}", kemudian menilai completion yang persis sama. Untuk data percakapan,
GOLD hanya menulis ulang giliran user terakhir sebelum menerapkan ulang chat template; giliran system, tool, dan assistant tetap
tidak berubah. Atur teacher_prompt_template untuk menyesuaikan prompt ini, dan privileged_context_column untuk menggunakan kolom
selain "privileged_context".
Prompt guru tidak pernah dipotong, sehingga pastikan prompt tersebut muat dalam jendela konteks model guru. Dukungan awal ini sengaja dibatasi pada teks dan distilasi JSD standar off-policy: lmbda harus 0, dan seq_kd=True, use_uld_loss=True, X-Token KD (xtoken_loss_type selain "none"), packing, VLM, serta Liger Kernel tidak didukung dengan konteks istimewa.
Cara Kerja Penggabungan Token
Ketika siswa dan guru menggunakan tokenizer yang berbeda, teks yang sama mungkin dipecah dengan cara yang berbeda:
- Mahasiswa:
"Hugging Face"→ 1 token - Guru:
"Hugging"," Face"→ 2 token
GOLD menyelaraskan sekuens-sekuens ini dan menggabungkan probabilitas multi-token dari teacher menjadi satu distribusi tunggal yang dapat dibandingkan dengan distribusi single-token dari student.
Menggabungkan Probabilitas
Untuk sekuens token guru [token₀, token₁, ..., tokenₖ] yang dipetakan ke satu token siswa, GOLD menghitung:
P_merged(y) = P(y | context) × P(token₁ | token₀, context) × ... × P(tokenₖ | ..., context)di mana:
P(y | context)adalah distribusi probabilitas marginal atas semua token kosakata pada posisi pertamaP(tokenᵢ | ..., context)adalah probabilitas kondisional skalar dari token aktual yang dihasilkan
Insight utama: Hanya probabilitas kondisional dari token kelanjutan aktual yang diekstrak sebagai skalar. Distribusi marginal penuh pada posisi pertama kemudian diskalakan dengan mengalikan probabilitas skalar tersebut.
Hal ini memastikan:
- Probabilitas gabungan yang benar untuk urutan yang dihasilkan sebenarnya (dengan aturan rantai)
- Approximasi yang wajar untuk token kontrafaktual (diskalakan dengan kemungkinan kelanjutan yang sama)
- Distribusi tidak ternormalisasi yang mempertahankan probabilitas relatif yang benar untuk perhitungan kerugian ULD
Contoh
Diberikan:
P(x₀): ["HF": 0.6, "is": 0.3, "cool": 0.1]
P(x₁ | "HF"): ["HF": 0.05, "is": 0.9, "cool": 0.05]Jika token 0 dan 1 digabungkan, dan urutan sebenarnya adalah ["HF", "is"]:
P_merged("HF") = 0.6 × 0.9 = 0.54 ✓ (correct joint probability)
P_merged("is") = 0.3 × 0.9 = 0.27
P_merged("cool") = 0.1 × 0.9 = 0.09Distribusi gabungan tidak ternormalisasi (menjumlahkan menjadi 0.81), tetapi ini disengaja dan benar untuk komputasi kerugian ULD, yang menggunakan pengurutan dan jarak L1.
Skrip contoh
Gunakan examples/gold_chatbot_arena/gold_chatbot_arena.py untuk meluncurkan pelatihan GOLD dari command line. Skrip ini mendukung pelatihan penuh dan LoRA melalui flag standar ModelConfig.
python examples/gold_chatbot_arena/gold_chatbot_arena.py \
--model_name_or_path meta-llama/Llama-3.2-1B-Instruct \
--teacher_model_name_or_path Qwen/Qwen2-1.5B-Instruct \
--dataset_name trl-lib/chatbot_arena_completions \
--learning_rate 2e-5 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--output_dir gold-model \
--num_train_epochs 1 \
--push_to_hubPelatihan Model Bahasa Visual
experimental.gold.GOLDTrainer mendukung distilasi VLM-ke-VLM. Baik model siswa maupun guru harus berupa model bahasa-visi. Untuk melatih VLM, sediakan dataset dengan kolom image (satu gambar per sampel) atau kolom images (daftar gambar per sampel). Untuk informasi lebih lanjut tentang struktur dataset yang diharapkan, lihat bagian Dataset Format — Vision datasets.
Ketika model siswa dan guru berbagi arsitektur dan tokenizer yang sama (misalnya Qwen3-VL-8B ke Qwen3-VL-2B), kerugian JSD umum standar diterapkan secara langsung. Ketika mereka memiliki model_type yang berbeda (misalnya Qwen3-VL ke LFM2.5-VL), atur use_uld_loss=True untuk mengaktifkan penyesuaian lintas-tokenizer melalui Universal Logit Distillation. Gambar diproses secara terpisah melalui prosesor masing-masing model.
from datasets import load_dataset
import torch
from transformers import AutoModelForImageTextToText, AutoProcessor
from trl.experimental.gold import GOLDConfig, GOLDTrainer
student_name = "Qwen/Qwen3-VL-2B-Instruct"
teacher_name = "Qwen/Qwen3-VL-8B-Instruct"
processor = AutoProcessor.from_pretrained(student_name, padding_side="left")
student_model = AutoModelForImageTextToText.from_pretrained(student_name, dtype=torch.bfloat16)
teacher_model = AutoModelForImageTextToText.from_pretrained(teacher_name, dtype=torch.bfloat16)
train_dataset = load_dataset("trl-lib/llava-instruct-mix", split="train")
trainer = GOLDTrainer(
model=student_model,
teacher_model=teacher_model,
args=GOLDConfig(
output_dir="gold-vlm-model",
max_length=None,
teacher_model_name_or_path=teacher_name,
use_uld_loss=False,
),
train_dataset=train_dataset,
processing_class=processor,
)
trainer.train()Untuk distilasi lintas keluarga, atur use_uld_loss=True dan teacher_tokenizer_name_or_path ke nama model guru.
Gunakan examples/gold_qwen3_vl/gold_qwen3_vl.py untuk meluncurkan pelatihan GOLD VLM dari baris perintah:
# Same-family distillation (JSD loss, vLLM enabled)
torchrun --nproc_per_node 8 examples/gold_qwen3_vl/gold_qwen3_vl.py \
--student_model_name Qwen/Qwen3-VL-2B-Instruct \
--teacher_model_name Qwen/Qwen3-VL-8B-Instruct
# Cross-family distillation (ULD loss, local generation)
torchrun --nproc_per_node 8 examples/gold_qwen3_vl/gold_qwen3_vl.py \
--student_model_name LiquidAI/LFM2.5-VL-1.6B \
--teacher_model_name Qwen/Qwen3-VL-8B-Instruct \
--use_uld_loss \
--no-use_vllmUntuk VLM,
truncation_mode='keep_end'tidak didukung karena token gambar berada di bagian prompt dari urutan dan dapat dihapus secara diam-diam. Gunakantruncation_mode='keep_start'(default) atau aturmax_length=Nonedi experimental.gold.GOLDConfig. Ini memungkinkan model memproses panjang urutan penuh tanpa memotong token gambar.GOLDConfig(max_length=None, ...)Gunakan
max_lengthhanya jika Anda telah memverifikasi bahwa pemotongan (truncation) tidak akan menghapus token gambar untuk seluruh dataset.
Distilasi VLM lintas arsitektur memerlukan
use_uld_loss=True. Trainer akan menampilkan error jika Anda mencoba distilasi lintas arsitektur tanpa ULD loss.
GOLDTrainer
kelas trl.experimental.gold.GOLDTrainer
< source >( model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str, NoneType] = Noneteacher_model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str] = Noneargs: trl.experimental.gold.gold_config.GOLDConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | dict[str, datasets.arrow_dataset.Dataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.image_processing_utils.BaseImageProcessor | transformers.feature_extraction_utils.FeatureExtractionMixin | transformers.processing_utils.ProcessorMixin | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None)preprocess_logits_for_metrics: collections.abc.Callable[[torch.Tensor, torch.Tensor], torch.Tensor] | None = Nonepeft_config: typing.Optional[ForwardRef('PeftConfig')] = None )
latih
< source >( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput
Parameter
- resume_from_checkpoint (
strataubool, opsional) — Jika berupastr, jalur lokal ke checkpoint yang disimpan oleh instanceTrainersebelumnya. Jika berupabooldan bernilaiTrue, muat checkpoint terakhir di args.output_dir yang disimpan oleh instanceTrainersebelumnya. Jika ada, pelatihan akan dilanjutkan dari status model/optimizer/scheduler yang dimuat di sini. - trial (
optuna.Trialataudict[str, Any], opsional) — Jalankan trial atau kamus hiperparameter untuk pencarian hiperparameter. - ignore_keys_for_eval (
list[str], opsional) — Daftar kunci dalam output model Anda (jika berupa dictionary) yang harus diabaikan saat mengumpulkan prediksi untuk evaluasi selama pelatihan.
Mengembalikan
~trainer_utils.TrainOutput
Objek yang berisi jumlah langkah global, kerugian pelatihan, dan metrik.
Titik masuk utama pelatihan.
Akan menyimpan model, sehingga Anda dapat memuatnya kembali menggunakan from_pretrained().
Hanya akan menyimpan dari proses utama.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = Noneprivate: bool | None = None**kwargs )
Parameter
- commit_message (
str, opsional, default"End of training") — Pesan untuk commit saat melakukan push. - blocking (
bool, opsional, defaultTrue) — Apakah fungsi harus hanya mengembalikan nilai setelahgit pushselesai. - token (
str, opsional, defaultnyaNone) — Token dengan izin tulis untuk menimpa argumen asli Trainer. - revision (
str, opsional) — Revisi git untuk di-commit. Secara default menggunakan head dari branch “main”. - private (
bool, opsional) — Apakah membuat repo menjadi privat saat dibuat. Defaultnya adalahargs.hub_private_repo. Tidak berpengaruh jika repo sudah ada. - kwargs (
dict[str, Any], opsional) — Argumen kata kunci tambahan yang diteruskan ke~Trainer.create_model_card.
Unggah self.model dan self.processing_class ke 🤗 model hub di repo self.args.hub_model_id.
GOLDConfig
kelas trl.experimental.gold.GOLDConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-07lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Noneactivation_checkpointing: bool | None = Noneactivation_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonechat_template_path: str | None = Nonedataset_text_field: str = 'text'dataset_kwargs: dict[str, typing.Any] | str | None = Nonedataset_num_proc: int | None = Noneeos_token: str | None = Nonemax_length: int | None = 1024truncation_mode: str = 'keep_start'shuffle_dataset: bool = Falsepacking: bool = Falsepacking_strategy: str = 'bfd'padding_free: bool = Falsepad_to_multiple_of: int | str | None = 'auto'eval_packing: bool | None = Nonecompletion_only_loss: bool | None = Noneassistant_only_loss: bool = Falseloss_type: str = 'nll'activation_offloading: bool = Falsepad_token: str | None = Nonetemperature: float = 0.9top_p: float = 0.95top_k: int = 0lmbda: float = 0.5beta: float = 0.5max_completion_length: int = 128teacher_model_name_or_path: str | None = Noneteacher_model_revision: str | None = Noneteacher_model_init_kwargs: dict[str, typing.Any] | str | None = Noneteacher_tokenizer_name_or_path: str | None = Nonedisable_dropout: bool = Trueseq_kd: bool = Falseuse_privileged_context: bool = Falseteacher_prompt_template: str | None = Noneprivileged_context_column: str = 'privileged_context'num_generations: int = 1generation_batch_size: int | None = Noneuse_uld_loss: bool = Falseuld_token_merge_strategy: str = 'observed'use_extended_uld: bool = Trueuld_use_hybrid_loss: bool = Falseuld_hybrid_matched_weight: float | None = Noneuld_hybrid_unmatched_weight: float | None = Noneuld_crossentropy_weight: float = 0.0uld_distillation_weight: float = 1.0uld_student_temperature: float = 1.0uld_teacher_temperature: float = 1.0uld_skip_student_eos: bool = Trueuld_skip_teacher_eos: bool = Truextoken_loss_type: str = 'none'xtoken_projection_matrix_path: str | None = Nonextoken_temperature: float = 1.0xtoken_dynamic_scaling: bool = Truextoken_uncommon_topk: int = 8192xtoken_vocab_topk: int = 8192xtoken_kl_weight: float = 1.0xtoken_ce_scale: float = 0.1use_vllm: bool = Falsevllm_mode: str = 'colocate'vllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8001vllm_server_timeout: float = 240.0vllm_group_port: int = 51216vllm_gpu_memory_utilization: float = 0.9vllm_tensor_parallel_size: int = 1vllm_max_model_length: int | None = Nonevllm_model_impl: str = 'vllm'vllm_structured_outputs_regex: str | None = Nonevllm_sync_frequency: int = 1vllm_enable_sleep_mode: bool = Falselog_completions: bool = Falselog_completions_steps: int = 100num_completions_to_print: int | None = Nonewandb_log_unique_prompts: bool = Truecallbacks: list[str] = <factory> )
Parameter yang mengontrol generasi dan loop pelatihan
- temperature (
float, opsional, default0.9) — Suhu untuk sampling. Semakin tinggi suhu, semakin acak hasil pelengkapannya. - top_p (
float, opsional, default0.95) — Jika diatur ke float < 1, hanya kumpulan token paling probabel terkecil dengan probabilitas yang berjumlahtop_patau lebih tinggi yang dipertahankan untuk generasi. - top_k (
int, opsional, default0) — Jumlah token kosakata dengan probabilitas tertinggi yang dipertahankan untuk top-k-filtering. Jika0, top-k-filtering dinonaktifkan dan semua token dipertimbangkan. - lmbda (
float, opsional, default0.5) — Parameter Lambda yang mengontrol fraksi data student (yaitu, proporsi output yang dihasilkan student secara on-policy). - beta (
float, opsional, default0.5) — Koefisien interpolasi antara0.0dan1.0untuk loss Generalized Jensen-Shannon Divergence. Ketika beta adalah0.0, loss-nya adalah KL divergence. Ketika beta adalah1.0, loss-nya adalah Inverse KL Divergence. - max_completion_length (
int, opsional, defaultnya128) — Jumlah maksimum token yang akan dihasilkan per completion. - teacher_model_name_or_path (
str, opsional) — Nama atau path dari model teacher. JikaNone, model teacher akan sama dengan model yang sedang dilatih. - teacher_model_revision (
stratauNone, opsional, defaultnyaNone) — Revisi model dari model teacher (misalnya, nama branch, tag, atau hash commit). JikaNone, revisi default yang digunakan. - teacher_model_init_kwargs (
dict[str, Any], opsional) — Argumen kata kunci untuk diteruskan keAutoModelForCausalLM.from_pretrainedsaat menginstansiasi model teacher dari string. Nilairevisionjuga digunakan saat memuat kelas pemrosesan teacher. - teacher_tokenizer_name_or_path (
str, opsional) — Nama atau path tokenizer untuk model teacher. Jika None saat menggunakan ULD loss, akan menggunakan tokenizer yang sama dengan model student (tidak direkomendasikan untuk distilasi lintas-tokenizer). - disable_dropout (
bool, opsional, defaultTrue) — Apakah akan menonaktifkan dropout pada model. - seq_kd (
bool, opsional, defaultFalse) — Parameter seq_kd yang mengontrol apakah akan melakukan Sequence-Level KD (dapat dipandang sebagai supervised FT pada output yang dihasilkan teacher). - use_privileged_context (
bool, opsional, defaultFalse) — Apakah akan mengondisikan teacher pada konteks istimewa per-contoh sambil tetap mempertahankan prompt student tanpa perubahan. Fitur ini hanya didukung untuk teks, distilasi JSD standar off-policy. - teacher_prompt_template (
str, opsional) — Template yang digunakan untuk menyusun prompt guru. Harus berisi{prompt}dan boleh berisi{privileged_context}. JikaNone, defaultnya adalah"{prompt}\n\n{privileged_context}". - privileged_context_column (
str, opsional, default"privileged_context") — Kolom dataset yang berisi konteks istimewa per contoh yang digunakan untuk menyusun prompt guru. - num_generations (
int, opsional, default1) — Jumlah generasi per prompt. Setiap prompt diulang sebanyak ini dalam batch generasi. - generation_batch_size (
intatauNone, opsional, defaultnyaNone) — Jumlah prompt unik per worker per langkah optimizer. JikaNone, nilainya dihitung dari(per_device_train_batch_size * gradient_accumulation_steps) // num_generations.
Parameter yang mengontrol loss ULD
- use_uld_loss (
bool, opsional, defaultFalse) — Apakah akan menggunakan loss Universal Logit Distillation (ULD) alih-alih loss Generalized Jensen-Shannon Divergence. - use_extended_uld (
bool, opsional, defaultTrue) — Apakah akan mengaktifkan perataan ULD yang diperluas yang menggunakan tokenizer untuk meratakan dan menggabungkan probabilitas token di antara tokenisasi student dan teacher. KetikaTrue, trainer akan menghitung pemetaan token dan menggabungkan probabilitas untuk token yang dipecah; ketikaFalse, ULD akan menggunakan pemotongan posisional sederhana seperti pada paper ULD asli. Atur keFalseuntuk tokenizer yang bukan ByteLevel maupun BPE dengan fallback byte (mis. Llama 2). - uld_token_merge_strategy (
str, opsional, default"observed") — Strategi yang digunakan untuk menyelaraskan logit jawaban dan menggabungkan probabilitas token dalam kerugian ULD. Dengan"observed", logit jawaban dipotong pada posisi jawaban dan token yang terpecah (ketikause_extended_uld=True) digabungkan dengan mengalikan distribusi marginal pada posisi pertama dengan probabilitas kondisional skalar dari token aktual yang lebih akhir. Dengan"bayesian", potongan logit jawaban digeser satu posisi lebih awal sehinggaprobs[k]memprediksitoken_ids[k](aturan rantai), dan token yang terpecah digabungkan menggunakan distribusi penuh dari posisi terakhir, dikondisikan pada token prefiks aktual, dikalikan dengan probabilitas skalar dari token yang lebih awal. Pergeseran penyelarasan logit berlaku terlepas dari apakahuse_extended_ulddiaktifkan atau tidak. - uld_use_hybrid_loss (
bool, opsional, defaultFalse) — Apakah akan menggunakan hybrid loss yang menggabungkan ULD loss dan JSD loss. KetikaTrue, loss akhir adalah kombinasi JSD untuk pemetaan token yang diketahui dan ULD untuk pemetaan token yang tidak diketahui. - uld_hybrid_matched_weight (
floatatauNone, opsional) — Bobot untuk komponen kerugian token yang cocok saat menggunakan kerugian hybrid ULD + JSD. Bobot ini menskalakan kerugian JSD yang dihitung atas token yang memiliki pemetaan langsung antara tokenisasi siswa dan guru. JikaNone, menggunakan pembobotan adaptif berdasarkan tumpang tindih kosakata. Harus disetel bersama denganuld_hybrid_unmatched_weight(keduanyaNoneatau keduanyafloat). - uld_hybrid_unmatched_weight (
floatatauNone, opsional) — Bobot untuk komponen kerugian token yang tidak cocok saat menggunakan kerugian hybrid ULD + JSD. Bobot ini menskalakan kerugian ULD yang dihitung atas token yang tidak memiliki pemetaan langsung antara tokenisasi siswa dan guru. JikaNone, menggunakan pembobotan adaptif berdasarkan tumpang tindih kosakata. Harus disetel bersama denganuld_hybrid_matched_weight(keduanyaNoneatau keduanyafloat). - uld_crossentropy_weight (
float, opsional, default0.0) — Bobot untuk komponen cross-entropy loss dalam ULD loss. Jika 0, hanya ULD distillation loss yang digunakan. - uld_distillation_weight (
float, opsional, default1.0) — Bobot untuk komponen distillation loss dalam ULD loss. - uld_student_temperature (
float, opsional, default1.0) — Suhu untuk logits siswa dalam perhitungan loss ULD. - uld_teacher_temperature (
float, opsional, default1.0) — Suhu untuk logits guru dalam perhitungan loss ULD. - uld_skip_student_eos (
bool, opsional, defaultTrue) — Apakah token EOS untuk student akan dilewati dalam perhitungan loss ULD. - uld_skip_teacher_eos (
bool, opsional, defaultTrue) — Apakah akan melewati token EOS untuk teacher dalam perhitungan loss ULD.
Parameter untuk KD cross-tokenizer X-Token (https
- xtoken_loss_type (
str, opsional, default"none") — Varian KD lintas-tokenizer:"none"(nonaktif),"p_kl"(KL proyeksi), atau"h_kl"(KL hibrida dengan set umum yang dilonggarkan). Memerlukanteacher_tokenizer_name_or_pathdanxtoken_projection_matrix_path. - xtoken_projection_matrix_path (
str, opsional) — Path ke file matriks proyeksi yang sudah dihitung sebelumnya. Wajib diisi ketikaxtoken_loss_type != "none". - xtoken_temperature (
float, opsional, default1.0) — Suhu T untuk loss X-Token KD; loss dikalikan dengan T² (Hinton 2015). - xtoken_dynamic_scaling (
bool, opsional, defaultTrue) — Skala KD denganstop_gradient(abs(CE) / abs(KD))per microbatch untuk menyeimbangkan magnitudo loss (persamaan 7 di paper). - xtoken_uncommon_topk (
int, opsional, default8192) — H-KL: batasi perbandingan L1 yang diurutkan untuk token yang tidak umum hingga top-k token di setiap sisi. - xtoken_vocab_topk (
int, opsional, default8192) — P-KL: batasi KL ke top-k token guru global berdasarkan logit maksimum. Berinteraksi dengan matriks proyeksi--top-k: token guru di luar jangkauan matriks tersebut mendapatkan massa siswa yang diproyeksikan mendekati nol dan mendominasi KL, sehingga nilai yang lebih kecil memusatkan loss pada token yang dapat dicocokkan oleh siswa. - xtoken_kl_weight (
float, opsional, default1.0) — Bobot untuk istilah X-Token KD ketikaxtoken_dynamic_scaling=False. - xtoken_ce_scale (
float, opsional, default0.1) — Faktor skala untuk suku CE dalam X-Token loss ketikaxtoken_dynamic_scaling=False.
Parameter yang mengontrol integrasi vLLM
- use_vllm (
bool, opsional, defaultFalse) — Apakah akan menggunakan vLLM untuk menghasilkan kelengkapan dari model siswa. Memerlukanvllmterinstal. - vllm_mode (
str, opsional, default"colocate") — Mode untuk integrasi vLLM student. Bisa"server"(menghubungkan ke server vLLM yang sedang berjalan) atau"colocate"(menjalankan vLLM dalam proses yang sama). - vllm_server_host (
str, opsional, default"0.0.0.0") — Host dari server vLLM untuk model student (jikavllm_mode="server"). - vllm_server_port (
int, opsional, default8001) — Port server vLLM untuk model student (jikavllm_mode="server"). - vllm_server_timeout (
float, opsional, default240.0) — Timeout untuk terhubung ke server vLLM student (jikavllm_mode="server"). - vllm_gpu_memory_utilization (
float, opsional, default0.9) — Utilisasi memori GPU untuk mesin vLLM student yang dikolokasi (jikavllm_mode="colocate"). Disarankan untuk mengatur nilai ini ke angka rendah jika model student dan teacher berbagi GPU yang sama. - vllm_tensor_parallel_size (
int, opsional, default1) — Ukuran paralel tensor untuk mesin vLLM siswa yang terkolokasi (jikavllm_mode="colocate"). - vllm_structured_outputs_regex (
str, opsional) — Regex untuk structured outputs vLLM pada model student. - vllm_server_base_url (
str, opsional) — URL dasar untuk server vLLM (misalnya,"http://localhost:8001"). Jika disediakan,vllm_server_hostdanvllm_server_portdiabaikan. - vllm_group_port (
int, opsional, default51216) — Port untuk grup pembaruan bobot vLLM (komunikator NCCL). Selama port tidak terisi, tidak perlu diubah. - vllm_max_model_length (
int, opsional) — Panjang urutan maksimum model untuk mesin vLLM yang terkolokasi ketikavllm_mode="colocate". Nilainya secara default adalah panjang konteks maksimum model. - vllm_model_impl (
str, opsional, default"vllm") — Backend implementasi model yang akan digunakan di vLLM. Gunakan"vllm"(default) atau"transformers". - vllm_sync_frequency (
int, opsional, default1) — Frekuensi (dalam langkah pelatihan) untuk menyinkronkan bobot model siswa ke mesin vLLM. Atur ke 1 untuk menyinkronkan setelah setiap langkah. - vllm_enable_sleep_mode (
bool, opsional, defaultFalse) — Aktifkan mode tidur vLLM untuk mengoffload bobot/kache siswa selama langkah optimizer. Menjaga penggunaan memori GPU tetap rendah, tetapi membangunkan mesin menambah latensi transfer host–perangkat.
Parameter yang mengontrol logging
- log_completions (
bool, opsional, defaultFalse) — Apakah akan mencatat sampel pasangan (prompt, completion) setiaplogging_stepslangkah. Jikarichterinstal, sampel tersebut akan dicetak. Jika loggingwandbdiaktifkan, sampel akan dicatat kewandb. - log_completions_steps (
int, opsional, defaultnya100) — Jumlah langkah antara pencatatan pasangan (prompt, completion). Hanya digunakan jikalog_completionsdiatur keTrue. - num_completions_to_print (
intatauNone, opsional) — Jumlah completion yang dicetak denganrich. JikaNone, semua completion dicatat. - wandb_log_unique_prompts (
bool, opsional, defaultnyaTrue) — Apakah akan mencatat prompt unik ke wandb. Hal ini akan membuat run baru untuk setiap prompt unik. - callbacks (
list[str], opsional, defaultnya[]) — Callback yang akan dijalankan selama pelatihan.
Kelas konfigurasi untuk experimental.gold.GOLDTrainer.
Kelas ini hanya mencakup parameter yang spesifik untuk pelatihan GOLD. Untuk daftar lengkap argumen pelatihan, silakan merujuk ke dokumentasi TrainingArguments dan SFTConfig.
Parameter-parameter ini memiliki nilai default yang berbeda dari TrainingArguments:
learning_rate: Bawaan adalah1e-7alih-alih5e-5.