TRL documentation

Distilasi Asinkron

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Distilasi Asinkron

Trainer ini membutuhkan vllm, transformers>=5.2.0 dan kernels (pelatihan memuat FlashAttention dari Hub melalui modul ini). Untuk pelatihan terdistribusi, hanya FSDP2 yang didukung (DeepSpeed ZeRO tidak).

Saat ini, vllm dan transformers memiliki batasan dependensi yang saling bertentangan. Untuk mengatasinya, instal vLLM terlebih dahulu, lalu paksa instal transformers, kemudian tambahkan kernels melalui extra TRL, yang menetapkan versi yang diterima oleh transformers:

pip install vllm
pip install 'transformers>=5.2.0' --no-deps
pip install 'trl[kernels]'

Ikhtisar

experimental.async_distillation.AsyncDistillationTrainer adalah padanan asinkron dari DistillationTrainer, yang dirancang seperti experimental.async_grpo.AsyncGRPOTrainer: pekerja rollout latar belakang menghasilkan kelengkapan on-policy milik sendiri dari model siswa dan memberikan skor terhadap guru, sementara pelatihan berlangsung secara bersamaan alih-alih bergantian antara generasi dan pembaruan gradien. Berbeda dengan trainer sinkron, guru tidak pernah dimuat secara lokal — hanya URL server vLLM yang diperlukan, sehingga guru dapat berjalan di perangkat keras yang sepenuhnya terpisah dari siswa dan trainer, atau bahkan menjadi model yang jauh lebih besar daripada yang biasanya muat berdampingan dengan siswa.

compute_loss meminimalkan Jensen-Shannon Divergence yang digeneralisasi antara distribusi token per posisi dari student dan teacher (beta=0.0 adalah forward KL, beta=1.0 adalah reverse KL, nilai di antaranya melakukan interpolasi), yaitu tujuan yang sama yang digunakan oleh DistillationTrainer dan ServerDistillationTrainer. Pelatihan selalu on-policy: student menghasilkan setiap completion yang dilatihinya.

Distilasi on-policy multi-guru (MOPD)

MOPD bukan bagian dari makalah 2306.13649 yang menjadi dasar tujuan inti trainer ini (yang menggambarkan pengaturan sinkron dengan satu guru); ini adalah metode terpisah, yang dijelaskan dalam MOPD: Multi-Teacher On-Policy Distillation for Capability Integration in LLM Post-Training. Di sana, MOPD adalah tahap ketiga dari tiga tahap — SFT umum, kemudian pelatihan RL per-domain independen untuk satu ahli per domain, lalu MOPD menggabungkan ahli-ahli beku tersebut menjadi satu siswa. AsyncDistillationTrainer hanya mengimplementasikan tahap ketiga, yaitu tahap fusi: guru-guru ahli per-domain harus sudah ada (misalnya dilatih secara terpisah dengan GRPOTrainer/RLOOTrainer) dan disajikan melalui HTTP sebelum Anda mengarahkan teacher_server_urls ke mereka. Tahap 3 dari makalah itu sendiri menggunakan reverse KL (beta=1.0), bukan default trainer ini beta=0.0 (forward KL).

teacher_server_urls menerima lebih dari satu entri. Dengan satu entri, setiap sampel dinilai oleh satu guru tersebut (distilasi on-policy biasa). Dengan beberapa entri, kolom teacher_id dari setiap sampel pelatihan memilih guru mana yang akan menilainya — misalnya, merutekan prompt matematika ke guru spesialis matematika dan prompt kode ke guru spesialis kode, masing-masing disajikan secara independen. Setiap sampel dikirim ke satu guru yang cocok, tidak pernah dirata-rata atau di-ensemble antar guru. Sampel dengan teacher_id yang hilang atau tidak terpetakan akan memicu error alih-alih secara diam-diam kembali ke guru yang salah. Lihat examples/async_distillation_mopd/async_distillation_mopd.py untuk contoh yang dapat dijalankan yang menggabungkan ahli matematika, kode, dan mengikuti instruksi yang dirilis bersama Open-MOPD ke checkpoint SFT bersama mereka, dan examples/async_distillation_mopd/launcher.py untuk menjalankannya di 4 GPU dengan satu perintah Hugging Face Jobs.

Setiap guru harus membagikan tokenizer milik siswa. Kelengkapan dikirim ke para guru sebagai id token mentah, dan id kandidat yang dilaporkan kembali oleh seorang guru mengindeks langsung ke dalam kosakata siswa sendiri di compute_loss. Guru dari keluarga model yang sama dengan siswa (seperti dalam contoh MOPD, di mana siswa SmolLM3 difusi dari para ahli SmolLM3 yang dilatih dari checkpoint yang sama) memenuhi syarat ini; guru dengan kosakata yang berbeda akan melatih siswa terhadap token yang salah, secara diam-diam kecuali kosakatanya lebih besar daripada kosakata siswa.

Checkpoint dan resume: ignore_data_skip secara default bernilai True; loop skip-and-replay dari Trainer dasar tidak berlaku untuk antrean rollout live. Sebagai gantinya, indeks prompt pertama yang belum dilatih disimpan ke rollout_state.json bersama setiap checkpoint dan dipulihkan saat resume, sehingga worker melakukan fast-forward ke prompt tersebut tanpa memutar ulang sampel. Ini adalah posisi terlatih, bukan posisi generator: worker berjalan di depan pelatihan sebesar kedalaman antrean rollout, dan sampel yang dibuffer tersebut hilang saat run berakhir, sehingga resume dari posisi generator akan melewati prompt yang telah dihasilkan tetapi tidak pernah dilatih. Dataset streaming (IterableDataset) tidak dapat diposisikan ulang; worker-nya dimulai ulang dari prompt 0 saat resume. Di bawah FSDP dengan bf16=True (default) atau fp16=True, model.safetensors ditulis dalam dtype tersebut meskipun master weights adalah fp32, sehingga checkpoint yang di-push berukuran sama dengan model yang disajikan, bukan dua kali lipat; master weights fp32 dan state optimizer tetap masuk ke file resume (pytorch_model_fsdp.bin, optimizer.bin), yang merupakan file yang dibaca saat resume, sehingga proses resume tidak terpengaruh. Tanpa FSDP, checkpoint juga merupakan file resume, sehingga mempertahankan dtype master.

Bagaimana perbedaannya dengan DistillationTrainer

Di DistillationTrainer, model guru dimuat secara lokal: generasi, forward pass guru, dan pembaruan gradien semuanya terjadi secara berurutan dalam proses yang sama. experimental.async_distillation.AsyncDistillationTrainer memisahkan kekhawatiran ini dengan cara yang sama seperti experimental.async_grpo.AsyncGRPOTrainer memisahkan rollout GRPO dari pembaruannya:

  • Worker rollout (proses latar belakang) — menghasilkan kelengkapan dari server vLLM siswa, mengirimkan urutan lengkap kembali ke /v1/completions dari guru yang telah dipecahkan dengan prompt_logprobs untuk penilaian yang dipaksa oleh guru (tidak ada token baru yang dihasilkan oleh guru), dan mendorong sampel yang siap dilatih ke dalam antrean.
  • Loop pelatihan (proses utama) — mengambil sampel dari antrean, menghitung kerugian generalized-JSD, dan memperbarui bobot siswa.

Karena guru dinilai melalui HTTP alih-alih forward pass lokal, hanya potongan top-k yang jarang dari distribusinya yang dikirimkan (teacher_top_k), bukan seluruh kosakata — lihat dokumentasi beta dan teacher_top_k dari experimental.async_distillation.AsyncDistillationConfig untuk mengetahui kandidat mana yang protokol wire menjamin logprob guru untuknya pada setiap rezim beta.

Setiap weight_sync_steps langkah pelatihan, bobot siswa yang diperbarui ditransfer ke server vLLM-nya melalui NCCL. Sama seperti experimental.async_grpo.AsyncGRPOTrainer, proses generasi berjalan di depan pelatihan, sehingga sampel mungkin mencerminkan kebijakan yang sedikit usang; max_staleness mengontrol berapa banyak pembaruan bobot yang boleh tertinggal oleh sebuah sampel sebelum sampel tersebut dibuang.

Mulai cepat

# train_async_distillation.py
from datasets import load_dataset
from trl.experimental.async_distillation import AsyncDistillationTrainer

dataset = load_dataset("trl-lib/DeepMath-103K", split="train")

trainer = AsyncDistillationTrainer(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    train_dataset=dataset,
)
trainer.train()

Server guru, server vLLM siswa, dan trainer harus dijalankan di GPU yang terpisah. Keduanya adalah instance vllm serve biasa, tetapi membutuhkan flag yang berbeda: guru hanya dinilai (--logprobs-mode processed_logprobs agar teacher_temperature mencapai logprobs yang dikembalikan, --max-logprobs -1 agar teacher_top_k dapat melebihi batas default vLLM sebesar 20), sedangkan siswa hanya digunakan untuk menghasilkan teks dan membutuhkan transfer bobot NCCL diaktifkan agar trainer dapat mendorong bobot yang diperbarui ke dalamnya. Penilaian mengirimkan seluruh urutan siswa dan meminta satu token lagi dari guru, sehingga --max-model-len guru (atau default-nya) harus lebih besar dari milik siswa:

# Terminal 1: teacher server on GPU 0 (static, never updated)
CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen2.5-1.5B-Instruct \
    --port 8001 \
    --logprobs-mode processed_logprobs \
    --max-logprobs -1
# Terminal 2: student's vLLM server on GPU 1 (dev mode + NCCL weight transfer are required)
CUDA_VISIBLE_DEVICES=1 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-0.5B-Instruct \
    --port 8000 \
    --weight-transfer-config '{"backend":"nccl"}'
# Terminal 3: training on GPU 2
CUDA_VISIBLE_DEVICES=2 accelerate launch train_async_distillation.py

LoRA

Lewati peft_config untuk melatih adapter LoRA pada student alih-alih model penuh:

from peft import LoraConfig

trainer = AsyncDistillationTrainer(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    train_dataset=dataset,
    peft_config=LoraConfig(r=32, lora_alpha=64, target_modules="all-linear"),
)

Setiap sinkronisasi bobot harus mengirimkan model student yang diperbarui ke servernya. Secara default, trainer menggabungkan adapter ke dalam model dasar dan mengirimkan bobot gabungan penuh, yang ukurannya sekitar 15 GB untuk model 7B pada setiap sinkronisasi. Jalankan server vLLM student dengan --enable-lora dan server tersebut hanya akan mengirimkan adapter, sekitar 160 MB pada r=32:

CUDA_VISIBLE_DEVICES=1 VLLM_SERVER_DEV_MODE=1 VLLM_ALLOW_RUNTIME_LORA_UPDATING=1 vllm serve Qwen/Qwen2.5-0.5B-Instruct \
    --port 8000 \
    --weight-transfer-config '{"backend":"nccl"}' \
    --enable-lora \
    --max-lora-rank 32 \
    --max-loras 6

VLLM_ALLOW_RUNTIME_LORA_UPDATING=1 membuka endpoint yang digunakan trainer untuk mengirim setiap adapter baru. Tambahkan VLLM_WORKER_MULTIPROC_METHOD=spawn jika Anda menyajikan tensor-parallel, dan pertahankan --weight-transfer-config dalam kondisi apa pun: trainer hanya memilih mode sinkronisasi saat dimulai, pada titik tersebut server sudah berjalan, dan merged sync adalah fallback. Server teacher tidak terpengaruh: ia tidak pernah diperbarui.

--max-lora-rank harus salah satu dari 1, 8, 16, 32, 64, 128, 256, 320, 512. Parameter ini mengatur rank tertinggi yang dapat dilayani oleh server, bukan rank yang akan dilayani, sehingga adapter r=4 tetap berfungsi dengan baik di bawah 8. --max-loras harus setidaknya max_staleness + 2: trainer mempertahankan max_staleness + 1 versi adapter yang terdaftar agar rollout yang dimulai di bawah kebijakan yang lebih lama dapat diselesaikan di bawah kebijakan tersebut, bukan beralih kebijakan di tengah generasi, dan setiap sinkronisasi memuat versi berikutnya sebelum memuat ulang yang tertua. Trainer memeriksa kedua nilai ini saat dimulai dan memberi tahu Anda dengan nilai apa server harus di-restart.

vLLM memuat adapter dari disk, bukan melalui jaringan, sehingga trainer menulis setiap versi di bawah <output_dir>/.vllm_lora/ dan memberikan path tersebut ke server. Jika server berjalan di mesin yang berbeda, direktori tersebut harus berada pada filesystem yang dapat diakses oleh keduanya.

<output_dir>/.vllm_lora/ adalah cache untuk serving, bukan tempat adapter yang Anda latih disimpan. Direktori ini hanya menyimpan versi-versi terbaru, dan masing-masing akan dihapus segera setelah keluar dari jendela keusangan (staleness window). Checkpoint-lah yang melestarikan adapter yang Anda latih, jadi jangan nonaktifkan fitur ini: dengan save_strategy="no", eksekusi berdurasi beberapa jam akan selesai tanpa meninggalkan apa pun. output_dir juga harus dapat dibaca oleh server dan harus bertahan lebih lama dari job, sehingga scratch node-lokal tidak akan berfungsi, meskipun hal itu akan menjaga sinkronisasi agar tidak membebani filesystem bersama yang lambat.

Sinkronisasi adapter tidak selalu lebih cepat. vLLM menghasilkan token sekitar 1,33–1,39x lebih lambat per token saat menyajikan adapter LoRA dibandingkan saat menyajikan bobot yang sudah digabungkan, dan proses generasi biasanya yang mendominasi waktu eksekusi. Sebagai gantinya, Anda mendapatkan jeda yang jauh lebih singkat di setiap sinkronisasi dan sekitar 1% dari pita lebar sinkronisasi. Jika throughput generasi adalah hambatan utama Anda, sinkronisasi gabungan sering kali tetap menjadi pilihan yang lebih baik.

Metrik yang dicatat

Sebuah rollout melewati beberapa tahap sebelum menjadi gradien. Mari kita lihat terlebih dahulu berbagai tahap tersebut, dari prompt hingga komposisi batch akhir kita:

Dataset row = PROMPT (message list + optional `teacher_id`)
 └─ ROLLOUT            (1 prompt -> 1 student completion -> 1 teacher scoring call)
     ├─ generate       (student's vLLM /v1/completions, sampled)
     └─ score          (the routed teacher's /v1/completions with `prompt_logprobs`, teacher-forced)
         └─ SAMPLE     (prompt + completion + the teacher's sparse per-position distribution)

════════════ Trainer process boundary: `rollout_buffer` (mp.Queue) ════════════

         └─ SAMPLE (Pulled 1 at a time; dropped if staleness > `max_staleness`)
             └─ ROW            (Planner assigns it to one of `dp` rows, Σ Lᵢ²-balanced)
                 └─ MICRO-BATCH (`dp` rows, one per rank)
                     └─ PACKED ROW (1 concat sequence, `position_ids` reset per sample)
                         └─ FORWARD (`compute_loss`, bs=1, inter-rank padding stripped)
             └─ OPTIMIZER STEP (from `grad_accum` micro-batches)

Membacanya dari atas ke bawah:

  • a rollout adalah satu prompt yang dihasilkan sekali dan diberi skor sekali. Tidak ada grup: distilasi tidak memiliki baseline keuntungan untuk dihitung antar generasi, sehingga prompt tidak diulang dan satu rollout menghasilkan tepat satu sampel pelatihan.
  • a sample adalah completion tersebut ditambah kandidat top-teacher_top_k dari teacher untuk setiap posisi completion. Inilah yang melewati batas proses.
  • melewati batas, trainer merencanakan sampel ke dalam baris (satu per rank DP), mengemas setiap baris menjadi satu rangkaian yang digabungkan, dan mengakumulasi grad_accum mikro-batch menjadi satu langkah optimizer.

Jadi, kami membagi metrik kami berdasarkan tahap (atau entitas) yang menjadi fokusnya:

namespaceentitas yang dihitung
rollout/satu putaran generate-and-score: berapa lama waktu yang dibutuhkan, sejauh mana progresnya
completions/apa yang dihasilkan oleh siswa (vLLM) untuk satu prompt
sample/mewakili satu sampel pelatihan, saat tiba di antrean
batch/satu micro-batch atau satu langkah optimizer (dibangun dari satu atau beberapa sampel)
perf/detik dan FLOPs yang diukur

Semua yang diukur oleh loss itu sendiri dicatat tanpa awalan (jsd, entropy, teacher_entropy), dengan rincian teacher_*/<teacher_id> di bawah MOPD — lihat divergence di bawah.

Mari kita juga mendefinisikan beberapa istilah agar metrik token tidak ambigu:

  • token generated adalah yang dihasilkan oleh student (completions/*).
  • Token forwarded adalah setiap token yang diproses oleh jalur forward: prompt dan token yang dihasilkan.
  • token trained adalah subset tempat loss dihitung, yaitu di mana completion_mask == 1. Trained ≠ generated: posisi completion yang tidak memiliki kandidat yang diberi skor oleh teacher akan di-mask dari divergence, tetapi tetap diteruskan.

Bagaimana nomor batch disusun

Sebuah baris adalah apa yang satu rank DP teruskan dalam satu micro-batch: beberapa sampel yang digabungkan menjadi satu urutan, dengan position_ids dimulai ulang di setiap batas sampel. Perencana menentukan sampel mana yang masuk ke baris mana (menyeimbangkan Σ Lᵢ² agar tidak ada rank yang tertinggal), dan data collator melakukan penggabungan tersebut.

Pada semua metrik kami, “step” selalu berarti satu langkah optimizer PENUH, bukan micro-batch. gradient_accumulation_steps micro-batch membentuk satu step, dan setiap metrik bernama _per_step adalah per langkah optimizer, sesuai dengan global_step, logging_steps, dan sisa kosakata Trainer. Jika suatu metrik adalah per micro-batch, hal itu dinyatakan secara eksplisit (batch/microbatches_per_step) atau merupakan kuantitas per baris (batch/row_*, batch/samples_per_row).

Oleh karena itu, satu langkah memiliki jumlah row-slots yang tetap:

row-slots per step = gradient_accumulation_steps x world_size

yang membuat metrik batch tersusun menjadi tangga yang dapat Anda periksa satu sama lain:

sample                                     sample/forwarded_tokens_mean
  └─ packed into a ROW                     batch/samples_per_row, batch/row_tokens_mean
      └─ one row per DP rank               = one micro-batch
          └─ gradient_accumulation_steps micro-batches = one STEP
                                           batch/samples_per_step, batch/forwarded_tokens_per_step

Jadi batch/samples_per_step ≈ row-slots x batch/samples_per_row, dan hal yang sama berlaku untuk token. Kedua sisi hanya cocok hingga variasi antar micro-batch di dalam satu step — metrik per-step adalah jumlah, sedangkan metrik per-row adalah rata-rata — sehingga diharapkan selisihnya sekitar seperseperseratus persen, bukan kecocokan yang persis.

batch/row_fill_frac adalah metrik yang perlu diperhatikan ketika sampelnya panjang: sampel 10k token mengisi anggaran 32k dengan buruk (tiga muat, empat tidak pernah muat, sehingga packer sering hanya mendapatkan dua dan barisnya terisi sekitar 77%), sedangkan sampel 1k token mengisinya hampir sempurna. Itu adalah kuantisasi, bukan bug, dan token_budget adalah tuasnya — dengan mempertimbangkan bahwa attention adalah O(L²) per sekuens, sehingga baris yang lebih penuh berisi sekuens panjang tidak menambah memori secara linear.

Antrean rollout

Worker mendorong sampel yang telah diberi skor ke dalam antrean, dan trainer menarik darinya. Empat metrik menggambarkan antrean tunggal tersebut, dan mereka menjawab pertanyaan yang berbeda:

metrikpertanyaan
sample/rollout_queue_sizeberapa banyak sampel yang sedang menunggu saat ini
sample/time_in_queue_sseberapa lama sebuah sampel tunggal berada di sana sebelum dilatih — separuh detik dari sifat off-policy-nya
perf/rollout_wait_sberapa lama pelatihan terblokir karena antrean kosong
rollout/backpressure_sseberapa lama generasi (worker) terblokir karena antrean penuh

Dua metrik terakhir (perf/rollout_wait_s dan rollout/backpressure_s) adalah cermin satu sama lain dan tidak pernah keduanya besar! Membacanya bersama ukuran antrean memberi tahu sisi mana yang menjadi bottleneck:

  • antrean hampir kosong, perf/rollout_wait_s tinggi → generation-bound. Trainer sedang kelaparan; periksa rollout/generated_tok_s, rollout/concurrency dan rollout/score_s.
  • antrean hampir penuh, rollout/backpressure_s tinggi → trainer-bound. Proses generasi dibatasi dan keluarannya menua di dalam antrean, sehingga perhatikan sample/staleness_mean yang naik.
  • keduanya mendekati nol → seimbang!

Completions

completion adalah apa yang dihasilkan oleh server vLLM siswa untuk satu prompt.

metrikmakna
completions/mean_lengthtoken yang dihasilkan per rollout
completions/min_length, completions/max_lengthselesai terpendek dan terpanjang di dalam jendela
completions/clipped_ratiofraksi penyelesaian yang tidak berakhir pada EOS, yaitu yang dipotong oleh max_completion_length

Rollouts

Rollout adalah satu prompt yang diproses hingga tuntas: dihasilkan oleh student, kemudian di-teacher-force melalui teacher-nya. Karena panggilan teacher berada di jalur kritis setiap rollout (berbeda dengan GRPO, di mana scoring adalah loop terpisah atas grup yang telah selesai), teacher yang lambat akan langsung terlihat sebagai rollout/duration_s.

metrikmakna
rollout/duration_swaktu nyata untuk satu rollout, dari dispatch hingga sampel yang diberi skor: generasi dan panggilan teacher
rollout/score_sdari hal tersebut, waktu yang dibutuhkan oleh panggilan /v1/completions dari guru
teacher_score_s/<id>Hanya MOPD: hal yang sama, per guru. Satu ahli lambat hanya memperlambat rollout yang dialokasikan kepadanya, yang disembunyikan oleh rata-rata campuran
rollout/generated_tok_sthroughput generasi pada interval terakhir (berbasis jendela), sehingga kemacetan akan terlihat
rollout/concurrencyrollouts yang sedang berjalan, yaitu sedang menghasilkan atau sedang dinilai
rollout/vllm_retry_totalpermintaan vLLM yang dicoba ulang, ke server siswa atau ke server guru. Server yang degradasi jika tidak ditangani akan terlihat seperti perlambatan yang tidak jelas. Metrik ini ditempatkan di sini, bukan di completions/, karena menghitung permintaan ke server, bukan teks yang dihasilkan
rollout/backpressure_sseberapa lama generasi diblokir karena antrean rollout penuh. Lihat antrean rollout

Contoh yang tiba dari antrean

Setiap sampel adalah satu RolloutSample: sebuah prompt, penyelesaian dari student, dan penilaian spars dari teacher terhadapnya. Worker mendorong sampel-sampel tersebut ke dalam rollout_buffer; semua yang di bawah ini diukur di sisi trainer, saat menarik sampel-sampel tersebut untuk pelatihan.

metrikmakna
sample/forwarded_tokens_mean, sample/forwarded_tokens_maxtoken dalam satu sample: prompt + yang dihasilkan. Packing adalah masalah pada level baris, lihat batch/row_*
sample/trained_tokens_meandari jumlah tersebut, berapa banyak yang menjadi dasar perhitungan loss
sample/rollout_queue_sizesampel yang telah diberi skor dan menunggu di antrean
sample/time_in_queue_sseberapa lama sampel ini menunggu di antrean tersebut sebelum dilatih. Tidak sama dengan perf/rollout_wait_s — lihat antrean rollout
sample/staleness_mean, sample/staleness_maxseberapa jauh versi kebijakan di belakang data. jsd menunjukkan efek dari sifat off-policy terhadap loss; ini menunjukkan penyebabnya
sample/dropped_stale_totalsampel dihapus karena melebihi max_staleness

Batch

Satu micro-batch adalah world_size baris (ingat bahwa packing meratakan menjadi 1 sequence), sehingga satu per DP rank, sehingga rank i memproses baris i. gradient_accumulation_steps dari micro-batch tersebut membentuk satu langkah optimizer. Satu langkah kemudian mencakup total gradient_accumulation_steps × world_size baris. Setiap metrik _per_step di bawah ini adalah jumlahan atas seluruh langkah dan di semua rank; metrik batch/row_* adalah rata-rata atas baris-baris tersebut.

metrikmakna
batch/forwarded_tokens_per_step, batch/trained_tokens_per_steptoken dalam satu langkah optimizer, masing-masing untuk forward dan pelatihan
batch/samples_per_stepsampel pelatihan per langkah optimizer
batch/microbatches_per_stepdihitung, bukan dibaca dari konfigurasi
batch/masked_token_fractoken yang diteruskan dengan completion_mask == 0 — bagian dari forward yang tidak menghasilkan gradien
batch/samples_per_row, batch/row_tokens_mean, batch/row_tokens_maxseberapa rapat planner mengemas baris dari setiap rank
batch/row_fill_fractoken baris terhadap token_budget. Nilai rendah berarti anggaran tidak terpakai
batch/row_imbalancemax Σ Lᵢ² / mean Σ Lᵢ² di seluruh baris. Attention adalah O(L²), sehingga ini memprediksi rank mana yang akan menghambat all-reduce gradien. 1.0 adalah sempurna
batch/pad_fracpadding antar-rank. Hanya menguras byte broadcast; dihapus sebelum forward
batch/dropped_oversize_totalsampel dihapus karena melebihi token_budget

Divergensi

Apa yang diukur oleh objektif itu sendiri, dirata-ratakan di atas token yang dilatih dalam jendela. Inilah angka-angka yang perlu diperhatikan untuk pembelajaran, bukan untuk throughput.

metrikmakna
jsdJSD umum yang diminimalkan oleh loss, pada beta yang dikonfigurasi. Penurunan berarti distribusi student sedang konvergen ke distribusi teacher
entropyentropi prediktif milik siswa itu sendiri. Keruntuhan di sini dengan jsd yang menurun menunjukkan bahwa siswa menyempitkan, bukan belajar
teacher_entropyentropi guru atas kandidat yang dilaporkan. Terbatas di bawah nilai sebenarnya, karena hanya teacher_top_k kandidat yang dikirimkan
teacher_jsd/<id>Hanya MOPD: jsd dibatasi pada token yang diberi skor oleh teacher. Teacher di domain yang berbeda dapat menyimpang dengan laju yang sangat berbeda, yang dicampuradukkan oleh jsd yang dicampur
teacher_entropy/<id>Hanya MOPD: rincian yang sama dari teacher_entropy
teacher_token_frac/<id>Hanya MOPD: proporsi token yang dinilai yang diambil oleh teacher. Skew routing tidak terlihat secara lain: teacher yang kekurangan baris tetap melaporkan teacher_jsd/<id> yang sehat

Tidak ada entropy per-teacher: entropi siswa adalah properti dari kebijakan miliknya sendiri, bukan dari teacher mana yang memberi skor pada sampel, sehingga metrik gabungan sudah mencakupnya.

Kinerja

Throughput mengukur berapa banyak token yang diproses trainer per detik. Model FLOPs Utilization (MFU) memperkirakan persentase kapasitas komputasi teoretis perangkat pelatihan yang digunakan untuk jalur forward dan backward model. Kapasitas yang digunakan untuk estimasi ini bergantung pada perangkat keras dan presisi pelatihan.

Throughput dan MFU dilaporkan berdasarkan dua basis waktu:

  • _fwd_bwd mengukur kinerja selama proses maju dan mundur.
  • _wall_clock mengukur kinerja pada langkah optimizer lengkap, termasuk pembaruan optimizer, sinkronisasi bobot, dan waktu yang dihabiskan menunggu rollout.

Perbedaan ini membantu membedakan kinerja komputasi dari biaya menunggu dan koordinasi. Kedua metrik MFU hanya menggambarkan perangkat pelatihan: mereka tidak mencakup komputasi atau kapasitas perangkat keras dari server rollout atau teacher eksternal. Wall-clock MFU mencerminkan waktu yang dihabiskan trainer untuk menunggu layanan tersebut, bukan utilisasi layanan itu sendiri.

MFU hanya dilaporkan ketika kapasitas komputasi puncak diketahui untuk perangkat pelatihan lokal pada presisi yang dipilih. Jika tidak, MFU diabaikan; pelatihan tetap berlanjut dan metrik throughput serta waktu tetap tersedia.

metrikmakna
perf/step_swaktu nyata antara langkah optimizer: termasuk komputasi, optimizer, sinkronisasi bobot, dan antrean
perf/fwd_bwd_sforward + backward, dijumlahkan di seluruh micro-batch dari langkah tersebut. Ini adalah penyebut dari setiap metrik _fwd_bwd di bawah
perf/fwd_sbagian forward-nya. fwd_s / fwd_bwd_s mendekati 1/3 adalah pembagian yang umum; nilai yang lebih tinggi berarti backward murah atau recompute dibayar pada forward
perf/optimizer_soptimizer.step()
perf/rollout_wait_sseberapa lama trainer terblokir karena antrean kosong. Lihat antrean rollout
perf/weight_sync_ssinkronisasi penuh, ditambah _pause_s (menunggu vLLM), _barrier_s (rank skew) dan _transfer_s (byte-nya)
perf/forwarded_tok_s_fwd_bwd, perf/forwarded_tok_s_wall_clocktoken yang diteruskan per detik pada setiap basis
perf/trained_tok_s_wall_clocksama, hanya menghitung token yang dilihat oleh loss
perf/mfu_fwd_bwd, perf/mfu_wall_clockutilisasi FLOPs model pada setiap basis

Filsafat desain

Trainer ini sengaja dibuat minimal dan tidak dimaksudkan untuk berkembang menjadi solusi umum. Jika Anda membutuhkan fitur yang tidak didukung, kami merekomendasikan untuk mengkloning repositori dan menyesuaikan trainer sesuai kebutuhan Anda secara langsung. Fitur baru hanya akan dipertimbangkan ketika ada permintaan komunitas yang signifikan.

AsyncDistillationConfig

kelas trl.experimental.async_distillation.AsyncDistillationConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_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 = 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 = 1logging_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 = Truerestore_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 = Nonedtype: str = 'float32'trust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonemax_completion_length: int = 2048temperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonerepetition_penalty: float = 1.0chat_template_kwargs: dict | str | None = Nonevllm_server_base_url: str = 'http://localhost:8000'vllm_server_timeout: float = 1800.0teacher_server_urls: dict[str, str] | str | None = Nonebeta: float = 0.0teacher_temperature: float = 1.0teacher_top_k: int = 8add_tail_bucket: bool = Truetoken_budget: int | None = Nonemax_concurrent_rollouts: int | None = Nonemax_staleness: int = 4queue_maxsize: int = 1024weight_sync_steps: int = 1rollout_worker_timeout: float = 300.0log_completions: bool = Falselog_completions_steps: int = 100num_completions_to_print: int | None = None )

Parameter yang mengontrol model

  • model_init_kwargs (dict[str, Any] atau str, opsional) — Argumen kata kunci untuk from_pretrained, digunakan saat menginstansiasi model student dari sebuah path. Nilai revision juga digunakan saat memuat kelas pemrosesan.
  • dtype (str, opsional, defaultnya "float32") — Tipe data untuk memuat model student, salah satu dari "auto", "bfloat16", "float16" atau "float32". Defaultnya "float32" karena ketidakcocokan pelatihan-inferensi yang diukur oleh async trainersMengalahkan Ketidakcocokan Pelatihan-Inferensi melalui FP16, dijelaskan untuk mereka di Mengalahkan ketidakcocokan presisi trainer-generator di TRL) sangat sensitif terhadap presisi trainer itu sendiri. Menutup celah tersebut secara end-to-end juga memerlukan penyediaan server vLLM student dalam dtype yang sama (vllm serve --dtype). dtypevllm serve --dtype). A dtype di model_init_kwargs mengambil prioritas. Server teacher tidak terpengaruh: mereka tidak pernah diperbarui.

    Ini hanya mengatur dtype tempat bobot dimuat. Di bawah FSDP dengan presisi campuran (bf16=True adalah default), accelerate menaikkan setiap parameter yang dapat dilatih ke fp32 sebelum sharding, sehingga bobot master dan state optimizer adalah fp32 apa pun yang dikatakan dtype, sementara forward dan backward berjalan dalam bf16 atau fp16. Checkpoint kemudian ditulis dalam dtype presisi campuran tersebut, bukan dalam fp32. Tanpa FSDP, tidak ada yang menaikkan: dtype="bfloat16" dengan bf16=True mempertahankan bobot dan state optimizer dalam bf16, yang merupakan pelatihan bf16 murni.

  • trust_remote_code (bool, opsional, default False) — Apakah mengizinkan pemuatan model dan tokenizer yang menyertakan kode Python kustom dari Hub. Diteruskan ke from_pretrained dan from_pretrained.
  • router_aux_loss_coef (float, opsional) — Koefisien dari loss tambahan penyeimbangan beban untuk model Mixture-of-Experts (MoE), yang ditambahkan ke loss pelatihan dengan bobot ini. Jika tidak diatur, nilai yang dideklarasikan oleh konfigurasi model akan digunakan. Atur ke 0.0 untuk menonaktifkannya. Gagal jika digunakan dengan model non-MoE.

Parameter yang mengontrol generasi

  • max_completion_length (int, opsional, defaultnya 2048) — Jumlah maksimum token yang akan dihasilkan per completion.
  • temperature (float, opsional, default 1.0) — Suhu untuk pengambilan sampel (sampling) penyelesaian on-policy dari model siswa.
  • top_p (float, opsional, default 1.0) — Parameter sampling top-p (nucleus) untuk generasi on-policy.
  • top_k (int, opsional, default 0) — Parameter top-k sampling untuk generasi on-policy. 0 menonaktifkan penyaringan top-k.
  • min_p (float, opsional) — Probabilitas token minimum, yang akan diskalakan oleh probabilitas token yang paling mungkin. Nilainya harus berada di antara 0.0 dan 1.0. Nilai tipikal berada dalam rentang 0.01-0.2.
  • repetition_penalty (float, opsional, default 1.0) — Float yang menghukum token baru berdasarkan apakah token tersebut muncul dalam prompt dan teks yang telah dihasilkan sejauh ini. Nilai > 1.0 mendorong model untuk menggunakan token baru, sedangkan nilai < 1.0 mendorong model untuk mengulang token.
  • chat_template_kwargs (dict[str, Any], opsional) — Argumen kata kunci tambahan untuk diteruskan ke fungsi apply_chat_template saat menghasilkan kelengkapan.

Parameter yang mengontrol server vLLM

  • vllm_server_base_url (str, opsional, default "http --//localhost:8000"): URL dasar server vLLM siswa, digunakan baik untuk generasi maupun untuk pembaruan bobot secara streaming.
  • vllm_server_timeout (float, opsional, default 1800.0) — Timeout dalam detik untuk panggilan ke server vLLM: menunggu server student siap saat startup, setiap permintaan generation atau scoring, dan setiap panggilan weight-sync. Menunggu server dan panggilan weight-sync akan memicu error jika kehabisan waktu; permintaan generation atau scoring yang timeout akan dicoba ulang.
  • teacher_server_urls (dict[str, str], opsional, default {"default" -- "http://localhost:8001"}): Server vLLM teacher, masing-masing dimulai dengan vllm serve <teacher-model> --logprobs-mode processed_logprobs --max-logprobs -1. Setiap teacher bersifat statis: trainer ini tidak pernah mengalirkan pembaruan bobot ke salah satu dari mereka, sehingga teacher tidak memerlukan VLLM_SERVER_DEV_MODE maupun backend transfer bobot, hanya dua flag tersebut, yang membuat scoring-nya tepat (lihat teacher_temperature dan teacher_top_k). Setiap teacher harus berbagi tokenizer dengan student: completion dikirim sebagai token id mentah, dan id yang dilaporkan kembali oleh teacher digunakan langsung untuk mengindeks kosakata student sendiri di compute_loss. Teacher dengan kosakata yang berbeda akan melatih terhadap token yang salah, secara diam-diam jika kosakatanya tidak lebih besar dari kosakata student. Scoring adalah permintaan teacher-forced terhadap token completion student sendiri (max_tokens=1, prompt_logprobs=teacher_top_k, temperature=teacher_temperature), permintaan yang sama yang dikirim oleh get_sequence_logprobs() untuk trainer server-teacher sinkron. Karena token yang dibuang tersebut, teacher memerlukan --max-model-len yang lebih besar dari student, atau completion terpanjang tidak dapat di-score. Satu entri melakukan scoring untuk setiap sampel (distilasi on-policy single-teacher biasa, default). Beberapa entri mengaktifkan MOPD (distilasi on-policy multi-teacher, lihat MOPD): kolom teacher_id dari setiap baris pelatihan memilih entri mana yang melakukan scoring, misalnya {"math": "http://localhost:8002", "code": "http://localhost:8003"} dengan teacher_id berupa "math" atau "code" per baris.

Parameter yang mengontrol distillation loss

  • beta (float, opsional, default 0.0) — Koefisien interpolasi untuk Jensen-Shannon Divergence yang digeneralisasi. 0.0 adalah forward KL (mean-seeking), 1.0 adalah reverse KL (mode-seeking), dan nilai di antaranya melakukan interpolasi, mengikuti formulasi generalized-JSD yang sama yang dihitung secara internal oleh DistillationTrainer. Dukungan (support) tempat divergensi dihitung berbeda-beda tergantung rezim, mencerminkan ServerDistillationTrainer: pada beta=0.0, dukungan penuh selebar teacher_top_k yang dilaporkan oleh teacher (ditambah bucket ekor) digunakan, karena penimbangan forward KL tepat merupakan apa yang disediakan oleh dukungan tersebut. Pada beta != 0.0, dukungan dipersempit menjadi hanya dua kandidat — token top-1 milik teacher itu sendiri dan token aktual/realisasi dari completion — karena hanya dua identitas token tersebut yang protokol wire menjamin adanya logprob teacher-nya tanpa mentransmisikan kosakata yang lebih lebar (atau penuh); apa pun yang lebih lebar hanya akan menjadi aproksimasi probabilistik untuk mencakup token-token yang mungkin milik student, bukan jaminan.
  • teacher_temperature (float, opsional, default 1.0) — Suhu softmax dari divergensi, diterapkan pada kedua sisi: dikirim ke teacher agar vLLM menghitung logprobs-nya pada suhu ini di sisi server (eksak, bukan penskalaan ulang di sisi klien), dan diterapkan pada logits milik student di compute_loss, meniru satu temperature tunggal dari ServerDistillationTrainer. Tidak terkait dengan temperature, yang hanya mengontrol bagaimana student mengambil sampel (sampling) komplitnya. Server teacher harus dijalankan dengan --logprobs-mode processed_logprobs agar pengaturan ini sampai ke logprobs yang dikembalikannya; tanpanya, teacher akan melaporkan logprobs mentah secara diam-diam dan pengaturan ini hanya memengaruhi sisi student.
  • teacher_top_k (int, opsional, default 8) — Jumlah kandidat token per posisi yang diminta dari teacher melalui prompt_logprobs. Hanya kandidat ini (ditambah token yang terealisasi, yang selalu dilaporkan oleh vLLM meskipun berada di luar top-k, serta sebuah bucket ekor yang menangkap sisa massa probabilitas, lihat add_tail_bucket) yang digunakan untuk mengaproksimasi distribusi teacher; kosakata penuh tidak pernah ditransmisikan melalui HTTP. Sisi student dari divergensi bersifat eksak (dihitung secara lokal, bukan diaproksimasi), karena student adalah model yang sedang dilatih dan seluruh logits-nya sudah tersedia di compute_loss. 8 adalah default ringan untuk pengujian asap; setup distilasi on-policy produksi di framework RL yang berdekatan menggunakan dukungan teacher yang jarang dalam kisaran yang kurang lebih sama (miles default ke 16, EasyOPD ke 64), sehingga menaikkan nilai ini ke 16–64 adalah wajar setelah mulai melatih secara serius. Nilai apa pun di atas 20 mensyaratkan server teacher telah dimulai dengan --max-logprobs -1, yang mengangkat batas logprob per token default vLLM.
  • add_tail_bucket (bool, opsional, default True) — Apakah akan menambahkan tail bucket yang mewakili massa probabilitas sisa di luar teacher_top_k, untuk menghindari divergensi yang sangat kecil secara trivial ketika teacher_top_k kecil.
  • token_budget (int, opsional) — Jumlah maksimum token nyata yang dikemas ke dalam satu baris (satu forward dari satu DP rank) untuk micro-batching dengan token budget dinamis. Ketika > 0, sebuah TokenBudgetBatcher membentuk micro-batches yang seimbang berdasarkan Σ Lᵢ², di mana setiap barisnya tetap di dalam budget ini, sehingga membatasi memori puncak secara independen dari jumlah sampel (jumlah sampel per baris menjadi dinamis). Jika None (default), nilainya diatur ke max_model_len dari server vLLM student (ditanyakan saat pelatihan dimulai) — batas atas panjang prompt + completion — sehingga tidak ada sampel rollout yang bisa melebihi budget. Sampel yang lebih panjang dari token_budget tidak muat di baris mana pun dan akan dibuang dengan peringatan, dihitung sebagai batch/dropped_oversize_total. Atur <= 0 untuk menonaktifkan token budgeting dan sebaliknya mengemas jumlah sampel tetap per_device_train_batch_size × num_processes per micro-batch, yang seimbang berdasarkan Σ Lᵢ² di antara baris-barisnya.

Parameter yang mengontrol pipeline rollout asinkron

  • max_concurrent_rollouts (int, opsional) — Jumlah maksimum rollout yang sedang berjalan secara bersamaan terhadap server vLLM student dan teachers, baik sedang menghasilkan output maupun sedang dinilai. Jika None, nilainya diatur ke max(max_staleness, 1) * per_device_train_batch_size * gradient_accumulation_steps * num_processes.
  • max_staleness (int, opsional, default 4) — Jumlah maksimum langkah pembaran bobot yang boleh tertinggal oleh sampel rollout di belakang versi model saat ini sebelum sampel tersebut dibuang.
  • queue_maxsize (int, opsional, defaultnya 1024) — Jumlah maksimum sampel rollout yang dibuffer dalam antrean rollout.
  • weight_sync_steps (int, opsional, default 1) — Jumlah langkah pelatihan antara sinkronisasi bobot ke server vLLM siswa.
  • rollout_worker_timeout (float, opsional, default 300.0) — Detik sejak heartbeat terakhir dari rollout worker, setelahnya trainer menganggapnya macet dan membatalkan proses.

Parameter yang mengontrol logging

  • log_completions (bool, opsional, default False) — Apakah akan mencatat sampel dari pasangan (prompt, completion) setiap log_completions_steps sampel yang dinilai.
  • log_completions_steps (int, opsional, default 100) — Jumlah sampel yang dinilai di antara pencatatan completions. Hanya digunakan jika log_completions adalah True. Dihitung dalam sampel yang telah dinilai oleh worker rollout, bukan langkah optimizer: worker berjalan dalam proses terpisah dari trainer dan tidak memiliki visibilitas ke self.state.global_step.
  • num_completions_to_print (int, opsional) — Jumlah completion yang dicetak dengan rich. Jika None, semua completion dicatat.

Kelas konfigurasi untuk experimental.async_distillation.AsyncDistillationTrainer.

Kelas ini hanya mencakup parameter yang spesifik untuk distilasi on-policy asinkron. Untuk daftar lengkap argumen pelatihan, silakan merujuk ke dokumentasi TrainingArguments. Perhatikan bahwa nilai default dalam kelas ini mungkin berbeda dari yang ada di TrainingArguments. Strukturnya mencerminkan AsyncGRPOConfig (pipeline asinkron, server vLLM, dan bidang logging sama), dengan bidang clipping/group GRPO diganti oleh bidang loss distilasi guru di bawah ini.

Parameter-parameter ini memiliki nilai default yang berbeda dari TrainingArguments:

  • logging_steps: Bawaan adalah 1 alih-alih 500.
  • gradient_checkpointing: Beralih ke True sebagai nilai bawaan, bukan False.
  • bf16: Beralih ke True jika fp16 tidak diatur, alih-alih False.
  • learning_rate: Bawaan adalah 1e-6 alih-alih 5e-5.
  • ignore_data_skip: Bawaan menjadi True alih-alih False; loop lewati-dan-ulangi dari Trainer dasar tidak berlaku untuk antrean rollout asinkron.

AsyncDistillationTrainer

kelas trl.experimental.async_distillation.AsyncDistillationTrainer

< >

( model: str | PreTrainedModelargs: trl.experimental.async_distillation.async_distillation_config.AsyncDistillationConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)peft_config: PeftConfig | None = None )

Parameter

  • model (str atau PreTrainedModel) — Model student yang akan dilatih. Bisa berupa:
    • String, berupa model id dari model pretrained yang dihosting di dalam repo model di huggingface.co, atau path ke directory yang berisi bobot model yang disimpan menggunakan save_pretrained. Dimuat dengan from_pretrained.
    • Objek PreTrainedModel. Implementasi atensinya diganti menjadi backend FlashAttention dari trainer untuk pelatihan tanpa padding.

    Nama model dari config digunakan untuk mengidentifikasi model student pada server vLLM-nya.

  • args (experimental.async_distillation.AsyncDistillationConfig, opsional) — Konfigurasi untuk trainer ini. Jika None, konfigurasi default akan digunakan.
  • train_dataset (Dataset atau IterableDataset) — Dataset yang digunakan untuk pelatihan. Harus menyertakan kolom "prompt" (format conversational). Kolom tambahan lainnya diabaikan.
  • processing_class (PreTrainedTokenizerBase, opsional) — Kelas pemrosesan yang digunakan untuk memproses data. Jika None, kelas ini dimuat dari nama model dengan from_pretrained. Jika tidak memiliki token padding, tokenizer.eos_token akan digunakan.
  • callbacks (list of TrainerCallback, opsional) — Daftar callback untuk menyesuaikan loop pelatihan, ditambahkan ke callback bawaan (lihat di sini).
  • optimizers (tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None], opsional, defaultnya (None, None)) — Tuple yang berisi optimizer dan scheduler yang akan digunakan. Defaultnya adalah AdamW dan jadwal linear yang dikendalikan oleh args.
  • peft_config (PeftConfig, opsional) — Konfigurasi PEFT yang digunakan untuk membungkus model. Jika None, model tidak dibungkus. Ketika server vLLM dari student dimulai dengan --enable-lora, adapter LoRA disinkronkan ke server tersebut sebagai adapter, bukan sebagai bobot yang digabungkan; lihat bagian LoRA dari dokumentasi AsyncDistillation.

Padanan asinkron dari DistillationTrainer, yang dirancang persis seperti AsyncGRPOTrainer: pekerja rollout latar belakang menghasilkan kelengkapan on-policy dari student dan memetakannya terhadap server teacher sementara pelatihan berlangsung secara bersamaan, memisahkan rollout dari loop pembaruan gradien. Di mana kerugian gradien kebijakan terpotong GRPO membaca keuntungan relatif grup, compute_loss dari trainer ini membaca distribusi teacher per posisi yang jarang dan meminimalkan JSD umum terhadapnya (lihat AsyncDistillationConfig.beta), selalu on-policy: student menghasilkan setiap kelengkapan yang dilatihinya.

Berbeda dengan DistillationTrainer yang sinkron, trainer ini hanya mendukung scoring terhadap teacher yang disajikan melalui HTTP (server vLLM eksternal). Forward pass teacher lokal (in-process, GPU) tidak dapat dijalankan di dalam proses anak yang di-spawn dengan CUDA dinonaktifkan milik rollout worker seperti yang bisa dilakukan oleh fungsi reward GRPO, dan alih-alih perlu dijalankan kembali di proses pelatihan utama; jalur tersebut belum diimplementasikan.

Contoh:

>>> from trl.experimental.async_distillation import AsyncDistillationTrainer
>>> from datasets import load_dataset

>>> dataset = load_dataset("trl-lib/DeepMath-103K", split="train")

>>> trainer = AsyncDistillationTrainer(
...     model="Qwen/Qwen2.5-0.5B-Instruct",
...     train_dataset=dataset,
... )
>>> trainer.train()
Update on GitHub