Exécuter un grand modèle de langage GGUF quantifié sur une grappe Ampere A2
Architecture
Cette architecture basée sur ARM offre une mise en œuvre de LLM à une valeur exceptionnelle, fonctionnant à une fraction du coût de l'infrastructure d'IA traditionnelle. Utilisez cette architecture pour adopter une approche conviviale et économique en matière d'IA.
Un équilibreur de charge public OCI se trouve à l'avant, répartissant le trafic entrant vers un groupe d'instances de calcul. Il existe un groupe d'instances de noeuds Ampere A2. Chaque noeud est une instance de calcul basée sur ARM à 2 coeurs exécutant Ubuntu. Les noeuds sont gérés dans un groupe d'instances OCI, ce qui facilite l'évolutivité horizontale à mesure que le trafic augmente. Une passerelle Internet permet un accès public à la fois à l'équilibreur de charge et aux instances dorsales, si nécessaire.
Chaque instance de calcul Ampere A2 exécute Ubuntu 22.04 (Arm), un LLM quantifié GPT-Generated Unified Format (GGUF) (comme TinyLlama ou Phi-2) servi localement à l'aide de llama.cpp, une simple page de renvoi HTML/JS servie via NGINX et un serveur dorsal basé sur Python câblé dans llama-cpp-python qui traite les invites de l'interface utilisateur et transmet le modèle de sortie à la page.
Chaque noeud de calcul du groupe est conçu pour être léger, mais totalement autonome. Lors du lancement, il s'amorcera à l'aide d'un script d'initialisation en nuage qui installe et exécute tout ce qui est nécessaire pour servir un LLM de A à Z. Les noeuds sont configurés comme suit :
- Installe les dépendances : Les dépendances telles que build-essential, cmake, git, NGINX et python3-pip sont installées automatiquement. llama-cpp-python est compilé à partir de la source pour assurer la compatibilité ARM64 complète.
- Créations : Les noeuds extraient la dernière version de llama.cpp à partir de GitHub et la créent à l'aide de OpenBLAS pour une inférence d'UC optimisée, tout en gardant tout local. Il n'y a aucune dépendance d'exécution externe à l'égard des GPU ou des API d'inférence.
- Télécharge le modèle : Un modèle GGUF quantifié (TinyLlama ou similaire) est extrait directement de Hugging Face et placé dans le répertoire
models
. - Réserve une page de renvoi : Une interface utilisateur HTML/JavaScript minimale est utilisée par NGINX sur le port 80. L'interface utilisateur permet aux utilisateurs de soumettre des invites et de voir les réponses du GML directement à partir de leur navigateur.
- Traite l'inférence au moyen de Python : Un petit serveur dorsal Python utilise llama-cpp-python pour interagir avec le modèle local. Il expose un point d'extrémité
/generate
auquel la page de renvoi envoie une demande POST lorsqu'un utilisateur soumet une question. - Commence au démarrage : Tout est encapsulé dans un service
systemd
, de sorte que l'inférence redémarre automatiquement lors du redémarrage ou de la défaillance de l'instance - aucune intervention manuelle n'est requise.
Le diagramme suivant illustre cette architecture de référence.
gen-ai-ampere-gguf-llm-arch.zip
L'architecture comporte les composants suivants :
- Région
Une région OCI est une zone géographique localisée qui contient un ou plusieurs centres de données, des domaines de disponibilité d'hébergement. Les régions sont indépendantes les unes des autres, et de grandes distances peuvent les séparer (à travers les pays ou même les continents).
- Domaines de disponibilité
Les domaines de disponibilité sont des centres de données indépendants et autonomes dans une région. Les ressources physiques de chaque domaine de disponibilité sont isolées des ressources des autres domaines de disponibilité, ce qui garantit la tolérance aux pannes. Les domaines de disponibilité ne partagent pas les éléments d'infrastructure (alimentation ou refroidissement, par exemple) ni le réseau de domaines de disponibilité interne. Ainsi, une défaillance d'un domaine de disponibilité ne doit pas avoir d'incidence sur les autres domaines de disponibilité de la région.
- Domaines d'erreur
Un domaine d'erreur est un regroupement de matériel et d'infrastructure au sein d'un domaine de disponibilité. Chaque domaine de disponibilité comporte trois domaines d'erreur dotés d'une alimentation électrique et d'un matériel indépendants. Lorsque vous répartissez des ressources sur plusieurs domaines d'erreur, vos applications peuvent tolérer la défaillance physique de serveur, la maintenance du système et les pannes de courant dans un domaine d'erreur.
- Réseau en nuage virtuel (VCN) et sous-réseaux
Un VCN est un réseau défini par logiciel personnalisable que vous configurez dans une région OCI. Comme les réseaux de centre de données traditionnels, les réseaux en nuage virtuels vous permettent de contrôler votre environnement de réseau. Un VCN peut disposer de plusieurs blocs de routage inter-domaine (CIDR) sans chevauchement que vous pouvez modifier après avoir créé le VCN. Vous pouvez segmenter un VCN en sous-réseaux, dont la portée peut concerner une région ou un domaine de disponibilité. Un sous-réseau est constitué d'un intervalle contigu d'adresses qui ne chevauchent pas les autres sous-réseaux dans le réseau en nuage virtuel. Vous pouvez modifier la taille d'un sous-réseau après sa création. Un sous-réseau peut être public ou privé.
- Équilibreur de charge
Oracle Cloud Infrastructure Load Balancing assure la répartition automatisée du trafic d'un point d'entrée unique vers plusieurs serveurs.
- Passerelle Internet
Une passerelle Internet permet le trafic entre les sous-réseaux publics d'un VCN et le réseau Internet public.
- Groupe d'instances
Un groupe d'instances comprend des instances dans une région créées à partir d'une même configuration d'instance et gérées ensemble.
Points à considérer
Avant d'implémenter cette architecture, tenez compte des éléments suivants.
- Coûts des instances de calcul Ampere A2
Chaque noeud exécute Ampere A2 avec 2 OCPU et 16 Go de mémoire vive. Le prix de cette OCPU est actuellement de 0,01 $ par OCPU par heure. Le coût mensuel fonctionne à 14,40 $ avec 1 nœud toujours activé.
- Coûts de l'équilibreur de charge
Le prix d'un équilibreur de charge public (petite forme) est actuellement d'environ 0,029 $ l'heure. Le coût mensuel est d'environ 21 $. Vous pouvez réduire davantage les coûts en configurant un équilibreur de charge personnalisé sur une autre instance Ampere.
- Coûts de stockage
Chaque noeud stocke le système d'exploitation, llama.cpp et le modèle, qui est d'environ 5 à 6 Go. Le volume de démarrage par défaut est d'environ 50 Go. Notez que les 200 premiers Go par mois sont gratuits.