Accumulo dei gradienti

Efficient AI Model Training with PyTorch

Dennis Lee

Data Engineer, Amazon

Training distribuito

 

 

Diagramma di flusso dei temi del corso: preparazione dati, training distribuito, training efficiente e ottimizzatori.

Efficient AI Model Training with PyTorch

Training efficiente

 

 

Diagramma di flusso dei temi del corso: preparazione dati, training distribuito, training efficiente e ottimizzatori.

Efficient AI Model Training with PyTorch

Migliorare l'efficienza del training

 

 

Icone per efficienza di memoria, comunicazione e calcolo.

Efficient AI Model Training with PyTorch

Migliorare l'efficienza del training

 

 

Icone per efficienza di memoria, comunicazione e calcolo.

Efficient AI Model Training with PyTorch

Migliorare l'efficienza del training

 

 

Icone per efficienza di memoria, comunicazione e calcolo.

Efficient AI Model Training with PyTorch

L'accumulo dei gradienti migliora l'uso della memoria

 

 

Icone per efficienza di memoria, comunicazione e calcolo.

Efficient AI Model Training with PyTorch

Il problema dei batch grandi

  • Batch grandi: stime del gradiente più stabili, apprendimento più rapido
  • La memoria GPU limita la dimensione del batch

 

 

Diagramma: batch grandi causano errori di memoria; batch piccoli permettono di completare l'addestramento.

Efficient AI Model Training with PyTorch

Come funziona l'accumulo dei gradienti?

Diagramma: un batch grande suddiviso in batch piccoli.

  • Accumulo dei gradienti: somma i gradienti su batch piccoli
  • Allena come con un batch grande effettivo
  • Aggiorna i parametri dopo la somma

Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

PyTorch, Accelerator e Trainer

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

PyTorch, Accelerator e Trainer

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

PyTorch, Accelerator e Trainer

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))









Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))
    outputs = model(inputs, labels=targets)
    loss = outputs.loss







Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))
    outputs = model(inputs, labels=targets)
    loss = outputs.loss
    loss = loss / gradient_accumulation_steps







Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))
    outputs = model(inputs, labels=targets)
    loss = outputs.loss
    loss = loss / gradient_accumulation_steps
    loss.backward()







Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))
    outputs = model(inputs, labels=targets)
    loss = outputs.loss
    loss = loss / gradient_accumulation_steps
    loss.backward()
    if ((index + 1) 
        % gradient_accumulation_steps == 0):





Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con PyTorch

for index, batch in enumerate(dataloader):
    inputs, targets = (batch["input_ids"], 
                       batch["labels"])
    inputs, targets = (inputs.to(device), 
                       targets.to(device))
    outputs = model(inputs, labels=targets)
    loss = outputs.loss
    loss = loss / gradient_accumulation_steps
    loss.backward()
    if ((index + 1) 
        % gradient_accumulation_steps == 0):
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Da PyTorch ad Accelerator

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

Da PyTorch ad Accelerator

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader): inputs, targets = (batch["input_ids"], batch["labels"])

Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader):

        inputs, targets = (batch["input_ids"],
                           batch["labels"])
        outputs = model(inputs, 
                        labels=targets)
        loss = outputs.loss





Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader):
    with accelerator.accumulate(model):
        inputs, targets = (batch["input_ids"],
                           batch["labels"])
        outputs = model(inputs, 
                        labels=targets)
        loss = outputs.loss




Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader):
    with accelerator.accumulate(model):
        inputs, targets = (batch["input_ids"],
                           batch["labels"])
        outputs = model(inputs, 
                        labels=targets)
        loss = outputs.loss
        accelerator.backward(loss)



Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader):
    with accelerator.accumulate(model):
        inputs, targets = (batch["input_ids"],
                           batch["labels"])
        outputs = model(inputs, 
                        labels=targets)
        loss = outputs.loss
        accelerator.backward(loss)



Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Accelerator

accelerator = \
    Accelerator(gradient_accumulation_steps=2)

for index, batch in enumerate(dataloader):
    with accelerator.accumulate(model):
        inputs, targets = (batch["input_ids"],
                           batch["labels"])
        outputs = model(inputs, 
                        labels=targets)
        loss = outputs.loss
        accelerator.backward(loss)
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

Diagramma dell'accumulo: somma dei gradienti da più batch.

Efficient AI Model Training with PyTorch

Da Accelerator a Trainer

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

Da Accelerator a Trainer

Grafico: facilità d'uso vs. personalizzazione per PyTorch, Accelerator e Trainer.

Efficient AI Model Training with PyTorch

Accumulo dei gradienti con Trainer

training_args = TrainingArguments(output_dir="./results",
                                  evaluation_strategy="epoch",
                                  gradient_accumulation_steps=2)

trainer = Trainer(model=model, args=training_args, train_dataset=dataset["train"], eval_dataset=dataset["validation"], compute_metrics=compute_metrics)
trainer.train()
{'epoch': 1.0, 'eval_loss': 0.73, 'eval_accuracy': 0.03, 'eval_f1': 0.05}
{'epoch': 2.0, 'eval_loss': 0.68, 'eval_accuracy': 0.19, 'eval_f1': 0.25}
Efficient AI Model Training with PyTorch

Andiamo a fare pratica!

Efficient AI Model Training with PyTorch

Preparing Video For Download...