Treine modelos com o Accelerator

Treinamento Eficiente de Modelos de IA com PyTorch

Dennis Lee

Data Engineer, Amazon

Trainer e Accelerator

Gráfico comparando facilidade de uso vs. capacidade de personalização para Accelerator e Trainer.

Treinamento Eficiente de Modelos de IA com PyTorch

Loops de treino customizados

  • Trainer: sem loops de treino customizados
  • Algumas tarefas avançadas em IA generativa exigem duas redes

Imagem de uma generative adversarial network.

1 https://www.aitude.com/basics-of-generative-adversarial-network-model/
Treinamento Eficiente de Modelos de IA com PyTorch

Trainer e Accelerator

Gráfico comparando facilidade de uso vs. capacidade de personalização para Accelerator e Trainer.

Treinamento Eficiente de Modelos de IA com PyTorch

Modificando um loop de treino básico

for batch in dataloader:

optimizer.zero_grad()
inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device)
outputs = model(inputs)
loss = outputs.loss
loss.backward()
optimizer.step() scheduler.step()

 

  • Zere os gradientes
  • Mova dados para o dispositivo: .to(device)
  • Faça o forward pass
  • Calcule a loss de entropia cruzada
  • Calcule gradientes no backward pass
  • Atualize parâmetros e taxa de aprendizado
Treinamento Eficiente de Modelos de IA com PyTorch

Crie um objeto Accelerator

  • Accelerator oferece uma interface para treino distribuído
from accelerate import Accelerator
accelerator = Accelerator(
    device_placement=True
)
  • device_placement (bool, padrão True): gerencia a alocação de dispositivos
Treinamento Eficiente de Modelos de IA com PyTorch

Defina o modelo e o otimizador

  • Carregue um modelo pré-treinado
from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(
    "distilbert-base-cased", return_dict=True)
  • Otimize os parâmetros com Adam
from torch.optim import Adam

optimizer = Adam(params=model.parameters(), lr=2e-5)
Treinamento Eficiente de Modelos de IA com PyTorch

Defina o scheduler

from transformers import get_linear_schedule_with_warmup

lr_scheduler = get_linear_schedule_with_warmup(
      optimizer=optimizer,

num_warmup_steps=num_warmup_steps,
num_training_steps=num_training_steps)
  • optimizer (obj): otimizador do PyTorch, como Adam
  • num_warmup_steps (int): passos para aumentar lr linearmente; use int(num_training_steps * 0.1)
  • num_training_steps (int): passos totais de treino; use len(train_dataloader) * num_epochs
Treinamento Eficiente de Modelos de IA com PyTorch

Prepare o modelo para treino eficiente

  • O método prepare cuida da alocação de dispositivos
model, optimizer, dataloader, lr_scheduler = \
    accelerator.prepare(model,

optimizer,
dataloader,
lr_scheduler)
Treinamento Eficiente de Modelos de IA com PyTorch

Construindo um loop de treino com o Accelerator

for batch in dataloader:

optimizer.zero_grad()
inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device)
  • Zere os gradientes
  • Antes, movíamos os dados para o dispositivo
Treinamento Eficiente de Modelos de IA com PyTorch

Construindo um loop de treino com o Accelerator

for batch in dataloader:

optimizer.zero_grad()
inputs, targets = batch
  • Zere os gradientes
  • Antes, movíamos os dados para o dispositivo
  • Remova linhas que movem dados manualmente
Treinamento Eficiente de Modelos de IA com PyTorch

Construindo um loop de treino com o Accelerator

for batch in dataloader:

optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = outputs.loss loss.backward()
  • Zere os gradientes
  • Antes, movíamos os dados para o dispositivo
  • Remova linhas que movem dados manualmente
  • Faça o forward pass
  • Calcule a loss de entropia cruzada e os gradientes
Treinamento Eficiente de Modelos de IA com PyTorch

Construindo um loop de treino com o Accelerator

for batch in dataloader:

optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs) loss = outputs.loss
accelerator.backward(loss)
optimizer.step() scheduler.step()
  • Zere os gradientes
  • Antes, movíamos os dados para o dispositivo
  • Remova linhas que movem dados manualmente
  • Faça o forward pass
  • Calcule a loss de entropia cruzada e os gradientes
  • Troque loss.backward por accelerator
  • Atualize parâmetros e taxa de aprendizado
Treinamento Eficiente de Modelos de IA com PyTorch

Resumo das mudanças

Antes do Accelerator

  • Precisava mover dados manualmente para os dispositivos
    • inputs.to(device)
    • targets.to(device)
  • Gradientes com loss.backward()

Depois do Accelerator

  • Alocação automática e paralelismo de dados
    • accelerator.prepare(model)
    • accelerator.prepare(dataloader)
  • Sincroniza gradientes com accelerator.backward(loss)
  • Loop personalizável
  • Amigável, independente de hardware, escalável e fácil de manter
Treinamento Eficiente de Modelos de IA com PyTorch

Vamos praticar!

Treinamento Eficiente de Modelos de IA com PyTorch

Preparing Video For Download...