# Доработка

Дообучение продолжает обучение большой предобученной модели на более маленьком наборе данных, специфичном для конкретной задачи или области. Например, дообучение на наборе данных с примерами кода помогает модели лучше справляться с написанием кода. Дообучение идентично предобучению, за исключением того, что вы не начинаете с случайных весов. Кроме того, оно требует значительно меньше вычислительных ресурсов, данных и времени.

В приведённом ниже руководстве показано, как выполнять дообучение большой языковой модели с помощью [Trainer](/docs/transformers/main/ru/main_classes/trainer#transformers.Trainer).

Войдите в свой аккаунт Hugging Face с помощью пользовательского токена, чтобы загрузить дообученную модель на Hub.

```py
from huggingface_hub import login

login()
```

## Токенизация

Загрузите набор данных и [токенизируйте](./fast_tokenizers) текстовую колонку, на которой обучается модель (`horoscope` в наборе данных ниже).

<iframe src="https://huggingface.co/datasets/karthiksagarn/astro_horoscope/embed/viewer/default/train" frameborder="0" width="100%" height="560px"
>

Токенизатор создаёт входные данные модели, `input_ids` и `attention_mask`. Метод forward модели принимает только `input_ids` и `attention_mask`, поэтому установите `remove_columns`, чтобы удалить столбцы, такие как `horoscope`, после токенизации.

- Установите `truncation=True` и укажите `max_length`, чтобы обрезать более длинные последовательности до заданной максимальной длины.
- Используйте метод `train_test_split`, чтобы создать тестовую выборку для оценки модели.

```py
from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorForLanguageModeling

model_name = "Qwen/Qwen3-0.6B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
dataset = load_dataset("karthiksagarn/astro_horoscope", split="train")

def tokenize(batch):
    return tokenizer(
        batch["horoscope"],
        truncation=True,
        max_length=512,
    )

dataset = dataset.map(tokenize, batched=True, remove_columns=dataset.column_names)
dataset = dataset.train_test_split(test_size=0.1)
```

Коллатор данных собирает примеры из набора данных в батчи для обработки моделью. [DataCollatorForLanguageModeling](/docs/transformers/main/ru/main_classes/data_collator#transformers.DataCollatorForLanguageModeling) *динамически* дополняет каждый батч до длины самой длинной последовательности в этом батче, а не дополняет все последовательности в наборе данных до одинаковой длины. Это экономит вычислительные ресурсы и память, так как исключает вычисление лишних токенов дополнения.

- Установите `mlm=False`, чтобы избежать случайного маскирования токенов.

```py
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)
```

## Загрузка модели

Загрузите предобученную контрольную точку для дообучения (см. руководство [Загрузка моделей](./models) для получения подробной информации о загрузке моделей).

- Установите `dtype="auto"`, чтобы загрузить веса в том типе данных, в котором они сохранены. Без этого параметра PyTorch загружает веса в `torch.float32`, что удваивает потребление памяти, если исходный тип весов — `torch.bfloat16`.

```py
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer

model_name = "Qwen/Qwen3-0.6B"
model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto")
```

## Конфигурация обучения

[TrainingArguments](/docs/transformers/main/ru/main_classes/trainer#transformers.TrainingArguments) предоставляет все параметры для настройки процесса обучения. Здесь описаны только наиболее часто используемые аргументы. Для остальных параметров заданы разумные значения по умолчанию, либо они актуальны только для специфических сценариев, таких как распределённое обучение. Полный список аргументов см. в документации API [TrainingArguments](/docs/transformers/main/ru/main_classes/trainer#transformers.TrainingArguments).

- `num_train_epochs` и `per_device_train_batch_size` управляют длительностью обучения и размером батча. `learning_rate` задаёт начальную скорость обучения для оптимизатора.

- Установите `bf16=True` для быстрого обучения с смешанной точностью, если ваше оборудование это поддерживает (GPU Ampere и новее). В противном случае используйте `fp16=True` на более старом оборудовании.
- `gradient_accumulation_steps` имитирует более крупный эффективный размер батча, накапливая градиенты на протяжении нескольких проходов вперёд перед обновлением весов.
- `gradient_checkpointing` экономит память за счёт вычислений, пересчитывая промежуточные активации на этапе обратного распространения вместо их хранения. Для компромисса между памятью и скоростью см. [частичное checkpointing](./grad_checkpointing#partial-checkpointing).
- Если `gradient_checkpointing=True`, установите `gradient_checkpointing_kwargs={"offload": True}`, чтобы сохранять активации в закреплённой памяти хоста и снижать потребление памяти GPU для длинных последовательностей. См. [выгрузка сохранённых активаций](./grad_checkpointing#offloading-the-saved-activations) для описания компромиссов.
- Установите `train_sampling_strategy="group_by_length"`, чтобы группировать примеры с близкой длиной и уменьшать количество padding. См. [group samples by length](./trainer_recipes#group-samples-by-length) для мультимодальных наборов данных на основе процессоров и предвычисленных длин.

- `eval_strategy` и `save_strategy` определяют, когда во время обучения оценивать модель и когда сохранять контрольную точку.
- `load_best_model_at_end` загружает лучшую контрольную точку по завершении обучения. Для этого необходимо установить `eval_strategy`.

- `logging_steps` управляет частотой обновления и возврата значения loss во время обучения.

```py
training_args = TrainingArguments(
    output_dir="qwen3-finetuned",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"every_n_layers": 4},
    bf16=True,
    learning_rate=2e-5,
    logging_steps=10,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)
```

## Обучение

Создайте экземпляр [Trainer](/docs/transformers/main/ru/main_classes/trainer#transformers.Trainer) со всеми необходимыми компонентами, затем вызовите [train()](/docs/transformers/main/ru/main_classes/trainer#transformers.Trainer.train), чтобы начать обучение.

```py
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    processing_class=tokenizer,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)

trainer.train()
trainer.push_to_hub()
```

[push_to_hub()](/docs/transformers/main/ru/main_classes/trainer#transformers.Trainer.push_to_hub) загружает дообученные веса, конфигурацию генерации, токенизатор и конфигурацию модели в Hub.

## Дальнейшие шаги

- Ознакомьтесь с руководством [Возможности Trainer](./trainer_recipes), где приведены минимальные рабочие примеры использования распространённых функций Trainer, таких как пользовательские функции потерь, оценка с эффективным использованием памяти, создание контрольных точек и многое другое.
- Ознакомьтесь с руководством [Наследование методов Trainer](./trainer_customize), чтобы узнать, как наследовать методы [Trainer](/docs/transformers/main/ru/main_classes/trainer#transformers.Trainer) для поддержки новых и пользовательских функций.
- Ознакомьтесь с руководством [Callbacks](./trainer_callbacks), чтобы узнать, как подключаться к событиям обучения для ведения журнала, ранней остановки и реализации других пользовательских действий.
- Ознакомьтесь с руководством [Data collators](./data_collators), чтобы узнать, как настроить способ сборки выборок в батчи.
- Запустите скрипт обучения на арендованном GPU с помощью [Hugging Face Jobs](https://huggingface.co/docs/hub/jobs-training).
- Просмотрите [ноутбуки](./notebooks) или раздел **Resources > Task Recipes**, чтобы найти дополнительные примеры обучения для различных задач в области текста, аудио, зрения и мультимодальности.

