TRL documentation
IW-OPD
IW-OPD
В статье On the Position Bias of On-Policy Distillation авторы представляют Importance-Weighted On-Policy Distillation (IW-OPD). IW-OPD устраняет позиционное смещение в on-policy дистилляции, пересчитывая веса обновлений для сэмплированных токенов на основе накопленного расхождения префиксов между учителем и студентом. Ранние токены сохраняют более высокие веса, тогда как поздние токены после значительного дрейфа получают пониженные веса.
Для использования IW-OPD можно применить класс experimental.iw_opd.IWOPDTrainer из модуля trl.experimental.iw_opd.
IW-OPD в настоящее время входит в пространство имён
trl.experimental. API могут измениться без предварительного уведомления, пока над функцией ведётся работа.
Использование
from trl.experimental.iw_opd import IWOPDConfig, IWOPDTrainer
training_args = IWOPDConfig(
distillation_objective="iw_opd",
iw_opd_gamma=0.5,
)
trainer = IWOPDTrainer(
model="Qwen/Qwen3-0.6B",
teacher_model="...",
train_dataset=...,
args=training_args,
)
trainer.train()IW-OPD — это on-policy целевая функция: distillation_objective="iw_opd" требует lmbda=1.0 (значение по умолчанию). iw_opd_gamma — это усиление важности (importance-weight amplification) из Алгоритма 1 статьи.
IWOPDTrainer
класс trl.experimental.iw_opd.IWOPDTrainer
< 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.iw_opd.iw_opd_config.IWOPDConfig | 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 )
Trainer для дистилляции с важностным взвешиванием по текущей политике (IW-OPD).
IW-OPD (On the Position Bias of On-Policy Distillation) пересчитывает сигнал дистилляции для сэмплированных токенов, используя накопленное расхождение префиксов учителя и ученика, и снижает вес поздних токенов, чей сигнал обучения ушел за пределы распределения. Выберите его с помощью distillation_objective=“iw_opd”.
Этот тренажёр представляет собой замороженную копию
DistillationTrainerдо рефакторинга и служит местом для IW-OPD (метода политического градиента с наставником, который не вписывается в стабильныйDistillationTrainerс полным словарём). Он не поддерживается активно и не будет учитывать последующие улучшения того тренажёра.
Поддерживает:
- Обобщённая функция потерь JSD (прямая KL, обратная KL или интерполированная JSD через beta)
- Целевая функция IW-OPD для сэмплированных токенов (distillation_objective=“iw_opd”)
- Смешивание on-policy / off-policy через lmbda (буферизуется при накоплении градиентов)
- Локальная учительская модель или внешняя учительская модель через сервер vLLM
- Генерация студента по его собственной политике с помощью vLLM или model.generate()
обучение
< 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
Параметры
- resume_from_checkpoint (
strилиbool, необязательный) — Если передано значение типаstr, это локальный путь к сохранённой контрольной точке, созданной предыдущим экземпляромTrainer. Если передано значение типаboolи оно равноTrue, загружается последняя контрольная точка из args.output_dir, сохранённая предыдущим экземпляромTrainer. Если параметр указан, обучение возобновляется из состояний модели/оптимизатора/планировщика, загруженных из этой контрольной точки. - trial (
optuna.Trialилиdict[str, Any], необязательный) — Запуск испытания или словарь гиперпараметров для поиска гиперпараметров. - ignore_keys_for_eval (
list[str], необязательный) — Список ключей в выводе вашей модели (если он представляет собой словарь), которые следует игнорировать при сборе предсказаний для оценки во время обучения.
Возвращает
~trainer_utils.TrainOutput
Объект, содержащий количество глобальных шагов, потерю обучения и метрики.
Основная точка входа для обучения.
Сохранит модель, чтобы вы могли загрузить её снова с помощью from_pretrained().
Сохранение будет выполняться только из основного процесса.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )
Параметры
- commit_message (
str, необязательный, по умолчанию"End of training") — Сообщение для коммита при отправке. - blocking (
bool, необязательный, по умолчаниюTrue) — Определяет, должна ли функция возвращаться только после завершенияgit push. - token (
str, необязательный, по умолчаниюNone) — Токен с правом записи для перезаписи исходных аргументов Trainer. - revision (
str, необязательный) — Git-ревизия, от которой выполняется коммит. По умолчанию используется head ветки “main”. - kwargs (
dict[str, Any], необязательный) — Дополнительные именованные аргументы, передаваемые в~Trainer.create_model_card.
Загрузите self.model и self.processing_class в модельный хаб 🤗 в репозиторий self.args.hub_model_id.
IWOPDConfig
класс trl.experimental.iw_opd.IWOPDConfig
< source >( 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 = 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 = Falsemax_length: int | None = 1024temperature: float = 1.0lmbda: float = 1.0beta: float = 1.0distillation_objective: str = 'iw_opd'iw_opd_gamma: float = 0.5iw_opd_epsilon: float = 1e-08reverse_kl_top_1_mode: str = 'sampled'max_completion_length: int = 512max_prompt_length: int | None = Nonedisable_dropout: bool = Trueteacher_model_name_or_path: str | None = Noneteacher_model_revision: str | None = Noneteacher_model_init_kwargs: dict[str, typing.Any] | str | None = Noneuse_teacher_server: bool = Falseteacher_model_server_url: str | None = Noneloss_top_k: int = 1loss_add_tail: bool = Truenum_generations: int = 1generation_batch_size: int | None = Nonetop_p: float = 0.95top_k: int = 0use_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.3vllm_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 = None )
Параметры, управляющие моделью
- model_init_kwargs (
dict[str, Any], необязательный) — Параметры-ключи дляAutoModelForCausalLM.from_pretrained, используются, когда аргументmodelтренера передан в виде строки. Значениеrevisionтакже используется при загрузке класса обработки. - trust_remote_code (
bool, optional, defaults toFalse) — Whether to allow loading models and tokenizers that ship custom Python code from the Hub. Forwarded to from_pretrained and from_pretrained, for both the student and teacher. - max_length (
intилиNone, необязательный, по умолчанию1024) — Максимальная общая длина последовательности (запрос + завершение) для токенизации и усечения.
Параметры, управляющие дистилляцией
- temperature (
float, необязательный, по умолчанию1.0) — Температура для выборки при генерации и для вычисления потерь дистилляции. Более высокие значения приводят к более мягким распределениям вероятностей. - lmbda (
float, необязательный, по умолчанию1.0) — Вероятность использования on-policy (сгенерированных студентом) данных для каждого среза накопления градиентов. Значение0.0означает полностью off-policy (только завершения из набора данных),1.0— полностью on-policy. - beta (
float, необязательный, по умолчанию1.0) — Коэффициент интерполяции для функции потерь обобщённого расхождения Дженсена–Шаннона. При0.0функция потерь представляет собой прямое расхождение KL. При1.0функция потерь представляет собой обратное расхождение KL. При0.5это стандартное расхождение JSD. - distillation_objective (
str, необязательный, по умолчанию"iw_opd") — Целевая функция для оптимизации."iw_opd"использует целевую функцию Importance-Weighted On-Policy Distillation для сэмплированных токенов."jsd"сохраняет обобщённую целевую функцию JSD/KL. - iw_opd_gamma (
float, необязательный, по умолчанию0.5) — Усиление с весами важности дляdistillation_objective="iw_opd". - iw_opd_epsilon (
float, необязательный, по умолчанию1e-8) — Стабилизатор, используемый при нормализации весов префиксов IW-OPD. - reverse_kl_top_1_mode (
str, необязательный, по умолчанию"sampled") — Правило выбора токена top-1 для reverse-KL, еслиbeta > 0иloss_top_k == 1."sampled"использует фактический токен завершения в батче."argmax"использует токен с наибольшей вероятностью у ученика. Этот параметр не влияет на поддержку forward-KL, которая всегда использует токен top-1 учителя. Игнорируется, еслиbeta == 0илиloss_top_k != 1. - max_completion_length (
int, необязательный, по умолчанию512) — Максимальное количество токенов, генерируемых на каждое завершение во время on-policy генерации. - max_prompt_length (
intorNone, необязательный) — Максимальное количество токенов в промпте. ЕслиNone, значение вычисляется автоматически какmax_length - max_completion_length. Промпты обрезаются в соответствии с настройкойtruncation_sideтокенизатора. - disable_dropout (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли отключать dropout в модели-ученике во время обучения.
Параметры, управляющие моделью-учителем
- teacher_model_name_or_path (
strилиNone, необязательный) — Имя модели или путь к модели учителя. Используется, когда учитель загружается локально. - teacher_model_revision (
strorNone, необязательный) — Ревизия модели-учителя (например, имя ветки, тег или хеш коммита). - teacher_model_init_kwargs (
dict[str, Any]илиNone, необязательный) — Параметры, передаваемые вAutoModelForCausalLM.from_pretrainedпри создании модели-учителя из строки. - use_teacher_server (
bool, необязательный, по умолчаниюFalse) — Использовать ли внешний сервер vLLM teacher вместо локальной teacher-модели. - teacher_model_server_url (
strorNone, необязательный) — Базовый URL vLLM-сервера, на котором размещена teacher-модель (например,"http://localhost:8000"). Если задан, logprobs teacher-модели запрашиваются с сервера, а не вычисляются локальным forward-проходом, когдаuse_teacher_server=True. - loss_top_k (
int, необязательный, по умолчанию1) — Количество верхних токенов, используемых при вычислении потерь JSD/KL. Распределения как ученика, так и учителя ограничиваются этими K токенами и нормализуются заново перед вычислением расхождения. Если значение равно 0, используется весь словарь. Для локальных учителей общее правило поддержки: top-k учителя для прямого KL, top-k ученика для обратного KL и объединение для смешанного JSD. Еслиbeta > 0иloss_top_k == 1, прямая поддержка всё равно использует top-1 токен учителя, тогда как обратный top-1 токен контролируется параметромreverse_kl_top_1_mode. Еслиuse_teacher_server=True, чистый прямой путь (beta=0) требует, чтобы это значение было положительным, и использует top-k logprobs учителя для прямого слагаемого. Еслиbeta > 0, дистилляция с поддержкой сервера требуетloss_top_k == 1и поддерживает только"sampled"для обратных top-1 токенов. - loss_add_tail (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли добавлять хвостовое значение, представляющее оставшуюся вероятность вне выбранной top-k области определения, при вычислении функции потерь.
Параметры, управляющие генерацией on-policy
- num_generations (
int, необязательный, по умолчанию1) — Количество завершений, генерируемых для каждого промпта при on-policy генерации. - generation_batch_size (
intorNone, необязательный) — Количество уникальных промптов на каждый воркер за шаг оптимизатора. ЕслиNone, вычисляется как(per_device_train_batch_size * gradient_accumulation_steps) // num_generations. - top_p (
float, необязательный, по умолчанию0.95) — Параметр top-p (nucleus) выборки для генерации on-policy. - top_k (
int, необязательный, по умолчанию0) — Параметр top-k выборки для генерации on-policy.0отключает top-k фильтрацию.
Параметры, управляющие vLLM для генерации студентом
- use_vllm (
bool, необязательный, по умолчаниюFalse) — Использовать ли vLLM для генерации on-policy завершений от модели-ученика. - vllm_mode (
str, необязательный, по умолчанию"colocate") — Режим интеграции vLLM для student. Допустимые значения:"server"или"colocate". - vllm_server_base_url (
strилиNone, необязательный) — Базовый URL для сервера vLLM студента. Если указан,vllm_server_hostиvllm_server_portигнорируются. - vllm_server_host (
str, необязательный, по умолчанию"0.0.0.0") — Хост сервера vLLM студента. - vllm_server_port (
int, необязательный, по умолчанию8001) — Порт сервера vLLM студента. - vllm_server_timeout (
float, необязательный, по умолчанию240.0) — Время ожидания подключения к серверу vLLM студента. - vllm_group_port (
int, необязательный, по умолчанию51216) — Порт для группы обновления весов vLLM (коммутатор NCCL). - vllm_gpu_memory_utilization (
float, необязательный, по умолчанию0.3) — доля использования памяти GPU для движка vLLM студента, работающего на том же устройстве. - vllm_tensor_parallel_size (
int, необязательный, по умолчанию1) — Размер тензорного параллелизма для локального движка vLLM студента. - vllm_max_model_length (
intилиNone, необязательный) — Максимальная длина последовательности модели для совмещённого движка vLLM. - vllm_model_impl (
str, необязательный, по умолчанию"vllm") — Бэкенд реализации модели для vLLM. Используйте"vllm"или"transformers". - vllm_structured_outputs_regex (
strилиNone, необязательный) — Шаблон регулярного выражения для структурированных выходов vLLM. - vllm_sync_frequency (
int, необязательный, по умолчанию1) — Частота (в шагах обучения) синхронизации весов модели-ученика с движком vLLM. - vllm_enable_sleep_mode (
bool, необязательный, по умолчаниюFalse) — Включает режим сна vLLM для выгрузки весов ученика во время шага оптимизатора.
Параметры, управляющие ведением журнала
- log_completions (
bool, необязательный, по умолчаниюFalse) — Определяет, следует ли логировать выборку пар (prompt, completion) каждыеlog_completions_stepsшагов. Если установлен пакетrich, выборка выводится в консоль. Если включено логирование вwandbи/илиtrackio, данные записываются вwandbи/илиtrackio. - log_completions_steps (
int, необязательный, по умолчанию100) — Количество шагов между записью в журнал результатов генерации. Используется только еслиlog_completionsравноTrue. - num_completions_to_print (
intorNone, необязательный) — Количество завершений для вывода. ЕслиNone, в журнал записываются все завершения.
Класс конфигурации для experimental.iw_opd.IWOPDTrainer.
Расширяет TrainingArguments параметрами, специфичными для дистилляции знаний. Эта конфигурация не зависит от SFTConfig — все необходимые поля объявлены здесь.
С помощью HfArgumentParser мы можем превратить этот класс в аргументы argparse, которые можно указать в командной строке.