L’argomento di questo post è il chip AI sviluppato internamente da AWS, AWS Inferenziale — più specificamente, AWS Inferentia2 di seconda generazione. Questo è il seguito di la nostra postazione dallo scorso anno in poi AWSTrainium e si unisce a una serie di post sul tema degli acceleratori AI dedicati. Contrariamente ai chip che abbiamo esplorato nei nostri post precedenti della serie, AWS Inferentia è stato progettato per il modello AI inferenza ed è preso di mira specificamente per applicazioni di inferenza di deep learning. Tuttavia, il fatto che AWS Inferentia2 e AWS Trainium condividano entrambi lo stesso sottostante NeuronCore-v2 architettura e lo stesso stack software (the Kit SDK AWS Neuron), sorge spontanea la domanda: AWS Inferentia può essere utilizzato anche per carichi di lavoro di formazione sull’intelligenza artificiale?
Certo, ci sono alcuni elementi del Istanza Inf2 di Amazon EC2 specifiche della famiglia (che sono basate sugli acceleratori AWS Inferentia) che potrebbero renderli meno adatti per alcuni carichi di lavoro di formazione rispetto ai Istanza Trn1 di Amazon EC2 famiglia. Ad esempio, sebbene sia Inf2 che Supportano l’interconnessione da dispositivo a dispositivo NeuronLink-v2 a larghezza di banda elevata e bassa latenza, i dispositivi Trainium sono collegati in un Topologia del toro 2D piuttosto che a topologia ad anello che possono potenzialmente impattare sulle performance degli operatori di Comunicazione Collettiva (cfr Qui per ulteriori dettagli). Tuttavia, alcuni carichi di lavoro di addestramento potrebbero non richiedere le funzionalità uniche dell’architettura Trn1 e potrebbero funzionare altrettanto bene sulle architetture Inf1 e Inf2.
Infatti, la possibilità di allenarsi sia su Trainium E Gli acceleratori Inferentia aumenterebbero notevolmente la varietà di istanze di formazione a nostra disposizione e la nostra capacità di adattare la scelta dell’istanza di formazione alle esigenze specifiche di ciascun progetto DL. Nel nostro recente post, Selezione delle istanze per il deep learningabbiamo approfondito l’importanza di disporre di un’ampia varietà di tipi di istanze diverse per la formazione DL. Sebbene la famiglia Trn1 includa solo due tipi di istanze, l’abilitazione dell’addestramento su Inf2 aggiungerebbe quattro tipi di istanze aggiuntivi. Includere Inf1 nel mix ne aggiungerebbe altri quattro.
La nostra intenzione in questo post è dimostrare l’opportunità della formazione su AWS Inferentia. Definiremo un modello di visione del giocattolo e confronteremo le prestazioni del suo addestramento sulle famiglie di istanze Amazon EC2 Trn1 e Amazon EC2 Inf2. Molte grazie a Ohad Klein E Yitzhak Levi per il loro contributo a questo post.
Disclaimer
- Tieni presente che, al momento della stesura di questo articolo, alcune architetture di modelli DL non sono ancora supportate da Neuron SDK. Ad esempio, mentre è supportata l’inferenza del modello dei modelli CNN, lo è l’addestramento dei modelli CNN ancora non supportato. La documentazione dell’SDK include a matrice di supporto del modello dettagliando le funzionalità supportate per architettura del modello, framework di training (ad esempio, TensorFlow e PyTorch) e versione dell’architettura Neuron.
- Gli esperimenti che descriveremo sono stati eseguiti su Amazon EC2 con la versione più recente del AMI di deep learning per Neuron disponibile al momento della stesura di questo articolo, “Deep Learning AMI Neuron PyTorch 1.13 (Ubuntu 20.04) 20230720”, che include la versione 2.8 di Neuron SDK. Dato che Neuron SDK è ancora in fase di sviluppo attivo, è probabile che i risultati comparativi che abbiamo ottenuto cambieranno nel tempo. Si consiglia vivamente di rivalutare i risultati di questo post con le versioni più aggiornate delle librerie sottostanti.
- La nostra intenzione in questo post è dimostrare il potenziale della formazione sulle istanze basate su AWS Inferentia. Per favore fallo non considera questo post come un’approvazione per l’uso di queste istanze o di qualsiasi altro prodotto che potremmo menzionare. Ci sono molte variabili che influiscono sulla scelta di un ambiente di formazione che può variare notevolmente in base ai dettagli del tuo progetto. In particolare, modelli diversi potrebbero mostrare risultati relativi in termini di rapporto prezzo-prestazioni completamente diversi quando vengono eseguiti su due diversi tipi di istanza.
Simile agli esperimenti che abbiamo descritto in il nostro post precedentedefiniamo semplice Trasformatore di visione Modello di classificazione supportato da (ViT) (utilizzando il timm Pacchetto Python versione 0.9.5) insieme a un set di dati generato casualmente.
from torch.utils.data import Dataset
import time, os
import torch
import torch_xla.core.xla_model as xm
import torch_xla.distributed.parallel_loader as pl
from timm.models.vision_transformer import VisionTransformer
# use random data
class FakeDataset(Dataset):
def __len__(self):
return 1000000 def __getitem__(self, index):
rand_image = torch.randn((3, 224, 224), dtype=torch.float32)
label = torch.tensor(data=(index % 1000), dtype=torch.int64)
return rand_image, label
def train(batch_size=16, num_workers=4):
# Initialize XLA process group for torchrun
import torch_xla.distributed.xla_backend
torch.distributed.init_process_group('xla') # multi-processing: ensure each worker has same initial weights
torch.manual_seed(0) dataset = FakeDataset()
model = VisionTransformer() # load model to XLA device
device = xm.xla_device()
model = model.to(device) optimizer = torch.optim.Adam(model.parameters())
data_loader = torch.utils.data.DataLoader(dataset,
batch_size=batch_size, num_workers=num_workers) data_loader = pl.MpDeviceLoader(data_loader, device)
loss_function = torch.nn.CrossEntropyLoss()
summ, tsumm = 0, 0
count = 0 for step, (inputs, target) in enumerate(data_loader, start=1):
t0 = time.perf_counter()
inputs = inputs.to(device)
targets = torch.squeeze(target.to(device), -1)
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_function(outputs, targets)
loss.backward()
xm.optimizer_step(optimizer)
batch_time = time.perf_counter() - t0
if idx > 10: # skip first steps
summ += batch_time
count += 1
t0 = time.perf_counter()
if idx > 500:
break
print(f'average step time: {summ/count}')
if __name__ == '__main__':
os.environ('XLA_USE_BF16') = '1'
# set the number of dataloader workers according to the number of vCPUs
# e.g. 4 for trn1, 2 for inf2.xlarge, 8 for inf2.12xlarge and inf2.48xlarge
train(num_workers=4)# Initialization command:
# torchrun --nproc_per_node=2 train.py
Nella tabella seguente confrontiamo la velocità e il rapporto prezzo/prestazioni di vari tipi di istanze Amazon EC2 Trn1 e Amazon EC2 Inf2.
Sebbene sia chiaro che i tipi di istanze basate su Trainium supportano prestazioni assolute migliori (ovvero, velocità di addestramento maggiori), l’addestramento sulle istanze basate su Inferentia ha prodotto risultati migliori del 39% circa prezzo prestazioni (per i tipi di istanza a due core) e superiori (per i tipi di istanza più grandi).
Ancora una volta, mettiamo in guardia dal prendere qualsiasi decisione progettuale basata esclusivamente su questi risultati. Alcune architetture del modello potrebbero essere eseguite correttamente sulle istanze Trn1 ma non funzionare su Inf2. Altri potrebbero avere successo in entrambi, ma mostrare risultati comparativi di prestazioni molto diversi da quelli mostrati qui.
Si noti che abbiamo omesso il tempo richiesto per la compilazione del modello DL. Sebbene ciò sia richiesto solo la prima volta che il modello viene eseguito, i tempi di compilazione possono essere piuttosto elevati (ad esempio, fino a dieci minuti per il nostro modello giocattolo). Esistono due modi per ridurre il sovraccarico della compilazione del modello compilazione parallela E compilazione offline. È importante sottolineare che assicurati che lo script non includa operazioni (o modifiche al grafico) che attivano ricompilazioni frequenti. Vedi il Documentazione dell’SDK Neuron per ulteriori dettagli.
Sebbene commercializzato come AI inferenza chip, sembra che AWS Inferentia offra ancora un’altra opzione per formazione modelli di apprendimento profondo. Nel nostro messaggio precedente su AWS Trainium abbiamo evidenziato alcune delle sfide che potresti incontrare quando adatti i tuoi modelli per l’addestramento su un nuovo ASIC AI. La possibilità di addestrare gli stessi modelli anche su tipi di istanze basate su AWS Inferentia potrebbe aumentare la potenziale ricompensa dei tuoi sforzi.