Оценка моделей с Accelerator

Эффективное обучение моделей ИИ с PyTorch

Dennis Lee

Data Engineer, Amazon

Зачем переводить модель в режим оценки?

  • Режим обучения
    • Dropout: обнуление нейронов
    • Батч-нормализация

Dropout и батч-нормализация Схема нейронной сети с несколькими слоями: входным, скрытыми и выходным. К скрытым слоям применяется dropout для предотвращения переобучения, а батч-нормализация используется для нормализации выхода каждого слоя перед активацией.

Эффективное обучение моделей ИИ с PyTorch

Зачем переводить модель в режим оценки?

  • Режим обучения
    • Dropout: обнуление нейронов
    • Батч-нормализация
  • Режим оценки отключает эти слои
  • model.eval() активирует режим оценки

Dropout и батч-нормализация Схема нейронной сети с несколькими слоями: входным, скрытыми и выходным. К скрытым слоям применяется dropout для предотвращения переобучения, а батч-нормализация используется для нормализации выхода каждого слоя перед активацией.

Эффективное обучение моделей ИИ с PyTorch

Отключение градиентов с torch.no_grad()

  • Обучение требует вычисления градиентов
  • torch.no_grad() отключает градиенты
  • Использовать model.eval и torch.no_grad вместе:
model.eval()
with torch.no_grad():
    outputs = model(**inputs)

Вычисление градиентов при обратном распространении Схема нейронной сети, иллюстрирующая процесс обратного распространения ошибки: градиенты вычисляются на каждом слое для корректировки весов. Показано, как ошибки распространяются от выходного слоя через скрытые слои для обновления весов с помощью градиентного спуска.

Эффективное обучение моделей ИИ с PyTorch

Подготовка валидационного датасета

  • Загрузить валидационный сплит датасета MRPC
validation_dataset = load_dataset("glue", "mrpc", split="validation")
  • Токенизировать валидационный датасет
def encode(examples):
    return tokenizer(examples["sentence1"], 
                      examples["sentence2"],
                      truncation=True,
                      padding="max_length")

validation_dataset = validation_dataset.map(encode, batched=True)
Эффективное обучение моделей ИИ с PyTorch

Жизнь эпохи: циклы обучения и оценки

  • На каждой эпохе выполнять итерацию по обучающему и валидационному датасетам
  • Сначала запустить модель в режиме обучения
  • Затем запустить модель в режиме оценки и записать метрики
for epoch in range(num_epochs):

model.train() for step, batch in enumerate(train_dataloader): # Perform training step
model.eval() for step, batch in enumerate(eval_dataloader): # Perform evaluation step
# Log evaluation metrics
Эффективное обучение моделей ИИ с PyTorch

Внутри цикла оценки

metric = evaluate.load("glue", "mrpc")
model.eval()
for step, batch in enumerate(eval_dataloader):

with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1)
predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"]))
metric.add_batch(predictions=predictions, references=references)
eval_metric = metric.compute() print(f"Eval metrics: \n{eval_metric}")
Eval metrics: 
{'accuracy': 0.81, 'f1': 0.77}
Эффективное обучение моделей ИИ с PyTorch

Запись метрик после оценки

  • Инструменты трекинга: журналируют метрики; примеры — TensorBoard и MLflow
  • log_with: использовать все инструменты трекинга экспериментов
  • .init_trackers(): инициализировать инструменты трекинга
  • .log(): отслеживать accuracy, f1, epoch
  • .end_training(): завершить трекинг
accelerator = Accelerator(project_dir=".",
                          log_with="all")

accelerator.init_trackers("my_project")
for epoch in range(num_epochs): # Training loop is here # Evaluation loop is here accelerator.log({
"accuracy": eval_metric["accuracy"], "f1": eval_metric["f1"],
}, step=epoch)
accelerator.end_training()
Эффективное обучение моделей ИИ с PyTorch

Давайте практиковаться!

Эффективное обучение моделей ИИ с PyTorch

Preparing Video For Download...