Exécuter un grand modèle de langage GGUF quantifié sur une grappe Ampere A2

Il y a une fracture régionale croissante de l'IA causée par un manque d'infrastructure informatique. La plupart des grands modèles de langage modernes nécessitent un nombre important de processeurs graphiques spécialisés et haute performance pour s'entraîner efficacement. Chaque serveur ayant potentiellement un prix à six chiffres et les chaînes d'approvisionnement mondiales sous pression, ces ressources essentielles restent inaccessibles à beaucoup. Tout en explorant des solutions à la fracture croissante de l'IA, une alternative prometteuse au goulot d'étranglement des processeurs graphiques a émergé - le remarquable processeur Ampere A2. Intrigué par le potentiel, nous avons conçu une mise en œuvre de LLM entièrement basée sur des grappes Ampere A2. Les résultats ont été remarquables. Bien que ne correspondant pas à la puissance brute des baies de processeurs graphiques de pointe, ces systèmes peuvent alimenter avec succès des applications pratiques de génération augmentée par récupération (RAG) pour seulement quelques centimes par heure de fonctionnement.

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.

Informations complémentaires

Pour en savoir plus sur l'exécution d'un LLM GGUF sur une grappe Ampere A2 dans Oracle Cloud Infrastructure.

Vérifiez ces ressources supplémentaires :

Remerciements

  • Auteur : Badr Tharwat