AWS Inferentia2 s’appuie sur AWS Inferentia1 en offrant un débit 4 fois supérieur et une latence 10 fois inférieure.

AWS Inferentia2 has 4 times higher throughput and 10 times lower latency compared to AWS Inferentia1.

La taille des modèles d’apprentissage automatique (ML) – les grands modèles de langage (LLMs) et les modèles de base (FMs) – augmente rapidement d’année en année, et ces modèles ont besoin d’accélérateurs plus rapides et plus puissants, en particulier pour l’IA générative. AWS Inferentia2 a été conçu dès le départ pour offrir des performances supérieures tout en réduisant le coût des inférences LLMs et de l’IA générative.

Dans ce post, nous montrons comment la deuxième génération d’AWS Inferentia s’appuie sur les capacités introduites avec AWS Inferentia1 et répond aux demandes uniques de déploiement et d’exécution de LLMs et FMs.

La première génération d’AWS Inferentia, un accélérateur conçu à cet effet lancé en 2019, est optimisée pour accélérer l’inférence d’apprentissage profond. AWS Inferentia a aidé les utilisateurs de ML à réduire leurs coûts d’inférence et à améliorer leur débit et leur latence de prédiction. Avec AWS Inferentia1, les clients ont vu jusqu’à 2,3 fois plus de débit et jusqu’à 70% de coût d’inférence inférieur par rapport aux instances Amazon Elastic Compute Cloud (Amazon EC2) optimisées pour l’inférence comparables.

AWS Inferentia2, présenté dans les nouvelles instances Amazon EC2 Inf2 et pris en charge dans Amazon SageMaker, est optimisé pour l’inférence d’IA générative à grande échelle et est la première instance axée sur l’inférence d’AWS optimisée pour l’inférence distribuée, avec une connectivité haute vitesse et à faible latence entre les accélérateurs.

Vous pouvez maintenant déployer efficacement un modèle de 175 milliards de paramètres pour l’inférence sur plusieurs accélérateurs sur une seule instance Inf2 sans nécessiter d’instances d’entraînement coûteuses. Jusqu’à présent, les clients qui disposaient de grands modèles ne pouvaient utiliser que des instances conçues pour la formation, mais il s’agit d’un gaspillage de ressources étant donné qu’elles sont plus coûteuses, consomment plus d’énergie et que leur charge de travail n’utilise pas toutes les ressources disponibles (comme le réseau et le stockage plus rapides). Avec AWS Inferentia2, vous pouvez obtenir un débit 4 fois plus élevé et une latence jusqu’à 10 fois plus faible par rapport à AWS Inferentia1. De plus, la deuxième génération d’AWS Inferentia ajoute une prise en charge améliorée pour plus de types de données, d’opérateurs personnalisés, de tenseurs dynamiques, et plus encore.

AWS Inferentia2 dispose de 4 fois plus de capacité mémoire, d’une bande passante mémoire 16,4 fois supérieure à celle d’AWS Inferentia1 et d’une prise en charge native pour le sharding de grands modèles sur plusieurs accélérateurs. Les accélérateurs utilisent NeuronLink et Neuron Collective Communication pour maximiser la vitesse de transfert de données entre eux ou entre un accélérateur et l’adaptateur réseau. AWS Inferentia2 convient mieux aux modèles plus grands, qui nécessitent un sharding sur plusieurs accélérateurs, bien qu’AWS Inferentia1 soit toujours une excellente option pour les modèles plus petits car il offre une meilleure performance-prix par rapport aux alternatives.

Évolution de l’architecture

Pour comparer les deux générations d’AWS Inferentia, examinons l’architecture d’AWS Inferentia1. Il dispose de quatre NeuronCores v1 par puce, comme le montre le schéma suivant.

Spécifications par puce :

  • Calcul – Quatre cœurs fournissant au total 128 INT8 TOPS et 64FP16/BF16 TFLOPS
  • Mémoire – 8 Go de DRAM (50 Go/sec de bande passante), partagé par les quatre cœurs
  • NeuronLink – Lien entre les cœurs pour sharding de modèles sur deux ou plusieurs cœurs

Examinons maintenant comment AWS Inferentia2 est organisé. Chaque puce AWS Inferentia2 dispose de deux cœurs améliorés basés sur l’architecture NeuronCore-v2. Comme AWS Inferentia1, vous pouvez exécuter différents modèles sur chaque NeuronCore ou combiner plusieurs cœurs pour sharding de grands modèles.

Spécifications par puce :

  • Calcul – Deux cœurs fournissant au total 380 INT8 TOPS, 190 FP16/BF16/cFP8/TF32 TFLOPS, et 47,5 FP32 TFLOPS
  • Mémoire – 32 Go de HBM, partagé par les deux cœurs
  • NeuronLink – Lien entre les puces (384 Go/sec par dispositif) pour sharding de modèles sur deux ou plusieurs cœurs

NeuronCore-v2 a une conception modulaire avec quatre moteurs indépendants :

  • ScalarEngine (3 fois plus rapide que v1) – Fonctionne sur des nombres à virgule flottante—-1600 (BF16/FP16) FLOPS
  • VectorEngine (10 fois plus rapide que v1) – Fonctionne sur des vecteurs de nombres avec une seule opération pour les calculs tels que la normalisation, le pooling, et autres.
  • TensorEngine (6 fois plus rapide que v1) – Effectue des calculs de tenseur tels que Conv, Reshape, Transpose, et autres.
  • GPSIMD-Engine – Possède huit processeurs généraux programmables de 512 bits de largeur pour que vous puissiez créer vos opérateurs personnalisés avec l’API standard des opérateurs C++ personnalisés PyTorch. Il s’agit d’une nouvelle fonctionnalité introduite dans NeuronCore-v2.

AWS Inferentia2 NeuronCore-v2 est plus rapide et plus optimisé. De plus, il est capable d’accélérer différents types et tailles de modèles, allant des modèles simples tels que ResNet 50 aux grands modèles de langage ou de modèles de base avec des milliards de paramètres tels que GPT-3 (175 milliards de paramètres). AWS Inferentia2 dispose également d’une mémoire interne plus grande et plus rapide, comparée à AWS Inferentia1, comme le montre le tableau suivant.

Puce Cœurs de neurones Type de mémoire Taille de la mémoire Bande passante de la mémoire
AWS Inferentia x4 (v1) DDR4 8Go 50Go/s
AWS Inferentia 2 x2 (v2) HBM 32Go 820Go/s

La mémoire que vous trouverez dans AWS Inferentia2 est du type mémoire à haute bande passante (HBM). Chaque puce AWS Inferentia2 dispose de 32 Go et peut être combinée avec d’autres puces pour distribuer des modèles très volumineux à l’aide de NeuronLink (interconnexion de périphérique à périphérique). Un inf2.48xlarge, par exemple, dispose de 12 accélérateurs AWS Inferentia2 avec un total de 384 Go de mémoire accélérée. La vitesse de la mémoire AWS Inferentia2 est 16,4 fois plus rapide que AWS Inferentia1, comme le montre le tableau précédent.

Autres caractéristiques

AWS Inferentia2 offre les fonctionnalités supplémentaires suivantes :

  • Matériel pris en charge – cFP8 (nouveau, FP8 configurable), FP16, BF16, TF32, FP32, INT8, INT16 et INT32. Pour plus d’informations, consultez Types de données.
  • Inference Lazy Tensor – Nous discutons de l’Inference Lazy Tensor plus tard dans ce post.
  • Opérateurs personnalisés – Les développeurs peuvent utiliser les interfaces de programmation d’opérateurs personnalisés standard PyTorch pour utiliser la fonctionnalité d’opérateurs C++ personnalisés. Un opérateur personnalisé est composé de primitives de bas niveau disponibles dans les fonctions de la fabrique de tenseurs et accéléré par GPSIMD-Engine.
  • Flux de contrôle (bientôt disponible) – Cela concerne le flux de contrôle du langage de programmation natif à l’intérieur du modèle pour éventuellement prétraiter et post-traiter les données d’une couche à l’autre.
  • Formes dynamiques (bientôt disponible) – Cela est utile lorsque votre modèle modifie dynamiquement la forme de la sortie de n’importe quelle couche interne. Par exemple : un filtre qui réduit la taille ou la forme du tenseur de sortie à l’intérieur du modèle, en fonction des données d’entrée.

Accélération de modèles sur AWS Inferentia1 et AWS Inferentia2

Le kit de développement logiciel AWS Neuron est utilisé pour compiler et exécuter votre modèle. Il est intégré nativement à PyTorch et TensorFlow. De cette façon, vous n’avez pas besoin d’exécuter un outil supplémentaire. Utilisez votre code d’origine, écrit dans l’un de ces frameworks ML, et avec quelques lignes de changements de code, vous êtes prêt à utiliser AWS Inferentia.

Examinons comment compiler et exécuter un modèle sur AWS Inferentia1 et AWS Inferentia2 en utilisant PyTorch.

Charger un modèle pré-entraîné (ResNet 50) à partir de torchvision

Chargez un modèle pré-entraîné et exécutez-le une fois pour le préchauffer :

import torch
import torchvision

model = torchvision.models.resnet50(weights='IMAGENET1K_V1').eval().cpu()
x = torch.rand(1,3,224,224).float().cpu() # entrée fictive
y = model(x) # préchauffez le modèle

Tracer et déployer le modèle accéléré sur Inferentia1

Pour tracer le modèle vers AWS Inferentia, importez torch_neuron et appelez la fonction de traçage. Gardez à l’esprit que le modèle doit être traçable PyTorch Jit pour fonctionner.

À la fin du processus de traçage, sauvegardez le modèle sous forme de modèle PyTorch normal. Compilez le modèle une fois et chargez-le autant de fois que vous en avez besoin. Le runtime Neuron SDK est déjà intégré à PyTorch et est responsable de l’envoi automatique des opérateurs à la puce AWS Inferentia1 pour accélérer votre modèle.

Dans votre code d’inférence, vous devez toujours importer torch_neuron pour activer le runtime intégré.

Vous pouvez passer des paramètres supplémentaires au compilateur pour personnaliser la façon dont il optimise le modèle ou pour activer des fonctionnalités spéciales telles que les neuron-pipeline-cores. Fragmentez votre modèle sur plusieurs cœurs pour augmenter le débit.

import torch_neuron

# Traçage du modèle en utilisant AWS NeuronSDK
neuron_model = torch_neuron.trace(model,x) # tracer le modèle vers Inferentia
# Sauvegarde pour une utilisation future
neuron_model.save('neuron_resnet50.pt')

# La prochaine fois, vous n'avez pas besoin de retracer le modèle
# il suffit de le charger et AWS NeuronSDK l'envoie automatiquement à Inferentia
neuron_model = torch.jit.load('neuron_resnet50.pt')

# inférence accélérée sur Inferentia
y = neuron_model(x)

Tracer et déployer le modèle accéléré sur Inferentia2

Pour AWS Inferentia2, le processus est similaire. La seule différence est que le package que vous importez se termine par x : torch_neuronx. Le Neuron SDK se charge de la compilation et de l’exécution du modèle pour vous de manière transparente. Vous pouvez également passer des paramètres supplémentaires au compilateur pour affiner l’opération ou activer des fonctionnalités spécifiques.

import torch_neuronx

# Traçage du modèle en utilisant NeuronSDK
neuron_model = torch_neuronx.trace(model,x) # tracer le modèle vers Inferentia
# Sauvegarde pour une utilisation future
neuron_model.save('neuron_resnet50.pt')

# La prochaine fois, vous n'avez pas besoin de retracer le modèle
# il suffit de le charger et NeuronSDK l'envoie automatiquement à Inferentia
neuron_model = torch.jit.load('neuron_resnet50.pt')

# inférence accélérée sur Inferentia
y = neuron_model(x)

AWS Inferentia2 offre également une deuxième approche pour exécuter un modèle appelée Lazy Tensor inference. Dans ce mode, vous ne tracez ni ne compilez le modèle préalablement ; au lieu de cela, le compilateur s’exécute à la volée chaque fois que vous exécutez votre code. Il n’est pas recommandé pour la production, étant donné que le mode traçé présente de nombreux avantages par rapport à la Lazy Tensor inference. Cependant, si vous êtes toujours en train de développer votre modèle et avez besoin de le tester plus rapidement, Lazy Tensor inference peut être une bonne alternative. Voici comment compiler et exécuter un modèle en utilisant Lazy Tensor :

import torch
import torchvision
import torch_neuronx
import torch_xla.core.xla_model as xm

device = xm.xla_device() # Créer un périphérique XLA
model = torchvision.models.resnet50(weights='IMAGENET1K_V1').eval().cpu()
model.to(device)

x = torch.rand((1,3,224,224), device=device) # entrée fictive
with torch.no_grad():
  y = model(x)
  xm.mark_step() # La compilation se produit ici

Maintenant que vous êtes familiarisé avec AWS Inferentia2, une bonne prochaine étape consiste à commencer avec PyTorch ou Tensorflow et apprendre à configurer un environnement de développement et à exécuter des didacticiels et des exemples. Vérifiez également le référentiel GitHub AWS Neuron Samples, où vous pouvez trouver plusieurs exemples de la façon de préparer des modèles pour fonctionner sur Inf2, Inf1, et Trn1.

Résumé de la comparaison des fonctionnalités entre AWS Inferentia1 et AWS Inferentia2

Le compilateur AWS Inferentia2 est basé sur XLA et AWS fait partie de l’initiative OpenXLA. C’est la plus grande différence par rapport à AWS Inferentia1, et c’est important car PyTorch, TensorFlow et JAX ont des intégrations XLA natives. XLA apporte de nombreuses améliorations de performances, car il optimise le graphique pour calculer les résultats dans un seul lancement de noyau. Il fusionne les opérations de tenseurs successives et produit un code machine optimal pour accélérer l’exécution des modèles sur AWS Inferentia2. D’autres parties du kit de développement logiciel Neuron ont également été améliorées dans AWS Inferentia2, tout en maintenant une expérience utilisateur aussi simple que possible lors de la trace et de l’exécution des modèles. Le tableau suivant montre les fonctionnalités disponibles dans les deux versions du compilateur et de l’exécution.

Fonctionnalité torch-neuron torch-neuronx
Tensorboard Oui Oui
Instances prises en charge Inf1 Inf2 et Trn1
Prise en charge de l’inférence Oui Oui
Prise en charge de la formation Non Oui
Architecture NeuronCore-v1 NeuronCore-v2
API de trace torch_neuron.trace() torch_neuronx.trace()
Inférence distribuée Pipeline NeuronCore Communications collectives
IR GraphDef HLO
Compilateur neuron-cc neuronx-cc
Surveillance neuron-monitor / monitor-top neuron-monitor / monitor-top

Pour une comparaison plus détaillée entre torch-neuron (Inf1) et torch-neuronx (Inf2 et Trn1), consultez la comparaison de torch-neuron (Inf1) versus torch-neuronx (Inf2 et Trn1) pour l’inférence.

Service de modèle

Après avoir tracé un modèle pour le déployer sur Inf2, vous avez de nombreuses options de déploiement. Vous pouvez exécuter des prédictions en temps réel ou des prédictions par lots de différentes manières. Inf2 est disponible car les instances EC2 sont intégrées de manière native à d’autres services AWS qui utilisent des conteneurs d’apprentissage en profondeur (DLC) tels que Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) et SageMaker.

AWS Inferentia2 est compatible avec les technologies de déploiement les plus populaires. Voici une liste de certaines des options dont vous disposez pour déployer des modèles en utilisant AWS Inferentia2 :

  • SageMaker – Service entièrement géré pour préparer les données et construire, entraîner et déployer des modèles ML
  • TorchServe – Mécanisme de déploiement intégré PyTorch
  • TensorFlow Serving – Mécanisme de déploiement intégré TensorFlow
  • Deep Java Library – Mécanisme Java open-source pour le déploiement et la formation de modèles
  • Triton – Service open-source NVIDIA pour le déploiement de modèles

Banc d’essai

Le tableau suivant met en évidence les améliorations apportées par AWS Inferentia2 par rapport à AWS Inferentia1. Plus précisément, nous mesurons la latence (la rapidité avec laquelle le modèle peut effectuer une prédiction à l’aide de chaque accélérateur), le débit (combien d’inférences par seconde) et le coût par inférence (combien coûte chaque inférence en dollars américains). Plus la latence en millisecondes et les coûts en dollars américains sont faibles, mieux c’est. Plus le débit est élevé, mieux c’est.

Deux modèles ont été utilisés dans ce processus – deux grands modèles de langage : ELECTRA grand discriminateur et BERT grand uncased. PyTorch (1.13.1) et Hugging Face transformers (v4.7.0), les principales bibliothèques utilisées dans cette expérience, ont été exécutés sur Python 3.8. Après avoir compilé les modèles pour une taille de batch = 1 et 10 (en utilisant le code de la section précédente comme référence), chaque modèle a été préchauffé (invoqué une fois pour initialiser le contexte) puis invoqué 10 fois de suite. Le tableau suivant montre les chiffres moyens collectés dans ce banc d’essai simple.

  • Grand discriminateur Electra (334,092,288 paramètres ~593 Mo)
  • Bert grand uncased (335,143,938 paramètres ~580 Mo)
  • OPT-66B (66 milliards de paramètres ~124 Go)
Nom du modèle Taille de batch Longueur de la phrase Latence (ms) Améliorations Inf2 sur Inf1 (x fois) Débit (Inférences par seconde) Coût par inférence (EC2 us-east-1) **
Inf1 Inf2 Inf1 Inf2 Inf1 Inf2
Grand discriminateur Electra 1 256 35,7 8,31 4,30 28,01 120,34 0,0000023 $ 0,0000018 $
Grand discriminateur Electra 10 256 343,7 72,9 4,71 2,91 13,72 0,0000022 $ 0,0000015 $
Bert grand uncased 1 128 28,2 3,1 9,10 35,46 322,58 0,0000018 $ 0,0000007 $
Bert grand uncased 10 128 121,1 23,6 5,13 8,26 42,37 0,0000008 $ 0,0000005 $

* c6a.8xlarge avec 32 processeurs AMD Epyc 7313 a été utilisé dans ce test de référence.

** Tarification publique EC2 en us-east-1 au 20 avril : inf2.xlarge : 0,7582 $/heure ; inf1.xlarge : 0,228 $/heure. Le coût par inférence prend en compte le coût par élément dans un lot. (Le coût par inférence équivaut au coût total de l’appel du modèle/taille du lot.)

Pour des informations supplémentaires sur les performances de formation et d’inférence, reportez-vous à Trn1/Trn1n Performance.

Conclusion

AWS Inferentia2 est une technologie puissante conçue pour améliorer les performances et réduire les coûts de l’inférence de modèles d’apprentissage en profondeur. Plus performant que AWS Inferentia1, il offre jusqu’à 4 fois plus de débit, jusqu’à 10 fois moins de latence et jusqu’à 50% de meilleures performances/watt que d’autres instances EC2 optimisées pour l’inférence comparables. En fin de compte, vous payez moins cher, avez une application plus rapide et atteignez vos objectifs de durabilité.

Il est simple et direct de migrer votre code d’inférence vers AWS Inferentia2, qui prend également en charge une plus grande variété de modèles, y compris les grands modèles de langage et les modèles de base pour l’IA générative.

Vous pouvez commencer en suivant la documentation AWS Neuron SDK pour configurer un environnement de développement et démarrer votre projet d’apprentissage en profondeur accéléré. Pour vous aider à démarrer, Hugging Face a ajouté la prise en charge de Neuron à leur bibliothèque Optimum, qui optimise les modèles pour une formation et une inférence plus rapides, et ils ont de nombreuses tâches d’exemples prêtes à fonctionner sur Inf2. Consultez également notre guide Deploy large language models on AWS Inferentia2 using large model inference containers pour apprendre à déployer des LLM sur AWS Inferentia2 à l’aide de conteneurs d’inférence de modèles. Pour des exemples supplémentaires, consultez le dépôt GitHub AWS Neuron Samples.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Related articles

    Discover more