Ejecución de un modelo de lenguaje grande de GGUF cuantitativo en un cluster A2 de Ampere
Arquitectura
Esta arquitectura basada en Arm ofrece una implementación de LLM a un valor excepcional, que se ejecuta a una fracción del costo de infraestructura de IA tradicional. Utilice esta arquitectura para un enfoque económico para empezar a utilizar la IA.
Un equilibrador de carga público de OCI se sienta al frente, distribuyendo el tráfico entrante a un pool de instancias informáticas. Hay un pool de instancias de nodos A2 de Ampere. Cada nodo es una instancia informática basada en Arm de 2 núcleos que ejecuta Ubuntu. Los nodos se gestionan en un pool de instancias de OCI, lo que facilita la ampliación horizontal a medida que aumenta el tráfico. Un gateway de Internet permite el acceso público tanto al equilibrador de carga como a las instancias backend cuando sea necesario.
Cada instancia informática A2 de Ampere ejecuta Ubuntu 22.04 (Arm), un LLM de formato unificado generado por GPT (GGUF) cuantificado (como TinyLlama o Phi-2) servido localmente mediante llama.cpp, una página de llegada de HTML/JS simple servida a través de NGINX y un backend basado en Python conectado a llama-cpp-python que maneja peticiones de datos desde la interfaz de usuario y transmite la salida del modelo de vuelta a la página.
Cada nodo de cálculo del pool está diseñado para ser ligero pero completamente autosuficiente. Al iniciarse, se inicia mediante un script cloud-init que instala y ejecuta todo lo necesario para servir un LLM desde cero. Los nodos se configuran de la siguiente manera:
- Instala dependencias: las dependencias como build-essential, cmake, git, NGINX y python3-pip se instalan automáticamente. llama-cpp-python se compila desde el origen para garantizar la compatibilidad total con ARM64.
- Creaciones: los nodos extraen la última versión de llama.cpp de GitHub y la crean mediante OpenBLAS para optimizar la inferencia de CPU, al tiempo que mantienen todo lo local, sin dependencia de tiempo de ejecución externa en GPU ni API de inferencia.
- Descarga el modelo: un modelo de GGUF cuantificado (TinyLlama o similar) se recupera directamente de Hugging Face y se coloca en el directorio
models
. - Sirve a una página de llegada: se proporciona una interfaz de usuario HTML/JavaScript mínima mediante NGINX en el puerto 80. La interfaz de usuario permite a los usuarios enviar peticiones de datos y ver las respuestas del LLM directamente desde su explorador.
- Maneja la inferencia a través de Python: un pequeño backend de Python utiliza llama-cpp-python para interactuar con el modelo local. Expone un punto final
/generate
al que la página de llegada envía una solicitud POST cuando un usuario envía una pregunta. - Empieza en el inicio: todo se envuelve en un servicio
systemd
, por lo que la inferencia se reinicia automáticamente al reiniciar la instancia o al producirse un fallo, sin necesidad de tocar manualmente.
El siguiente diagrama ilustra esta arquitectura de referencia.
gen-ai-ampere-gguf-llm-arch.zip
La arquitectura tiene los siguientes componentes:
- Región
Una región de OCI es un área geográfica localizada que contiene uno o más centros, denominados dominios de disponibilidad. Las regiones son independientes de otras regiones y pueden haber grandes distancias que las separan (entre países o incluso continentes).
- Dominios de disponibilidad
Los dominios de disponibilidad son centros de datos independientes dentro de una región. Los recursos físicos de cada dominio de disponibilidad están aislados de los recursos de los otros dominios de disponibilidad, lo que proporciona tolerancia a fallos. Los dominios de disponibilidad no comparten infraestructura, como la alimentación o la refrigeración, ni la red interna del dominio de disponibilidad. Por lo tanto, un fallo en un dominio de disponibilidad no debería afectar a los demás dominios de disponibilidad de la región.
- Dominios de errores
Un dominio de errores es una agrupación de hardware e infraestructura dentro de un dominio de disponibilidad. Cada dominio de disponibilidad tiene tres dominios de errores con hardware y energía independientes. Al distribuir recursos entre varios dominios de errores, las aplicaciones pueden tolerar fallos físicos en el servidor, mantenimiento del sistema y fallos de energía en un dominio de errores.
- Red virtual en la nube (VCN) y subredes
Una VCN es una red personalizable y definida por software que se configura en una región de OCI. Al igual que las Redes de los Centros de Datos Tradicionales, las Redes Virtuales le proporcionan el control sobre su entorno de red. Una VCN puede tener varios bloques de CIDR no superpuestos que puede cambiar después de crear la VCN. Puede segmentar una VCN en subredes, las cuales se pueden acotar a una región o a un dominio de disponibilidad. Cada subred está formada por un rango contiguo de direcciones que no se solapan con las demás subredes de la VCN. Puede cambiar el tamaño de una subred después de la creación. Una subred puede ser pública o privada.
- Equilibrador de carga
Oracle Cloud Infrastructure Load Balancing proporciona la distribución automatizada de tráfico desde un único punto a varios servidores.
- Gateway de Internet
Un gateway de Internet permite el tráfico entre las subredes públicas de una VCN y la red pública de Internet.
- Pool de instancia
Un pool de instancia es un grupo de instancias dentro de una región que se crean a partir de la misma configuración que se gestionan como un grupo.
Consideraciones
Antes de implementar esta arquitectura, considere lo siguiente.
- Costos de la instancia informática A2 de Ampere
Cada nodo ejecuta Ampere A2 con 2 OCPU y 16 GB de RAM. Los precios de esta OCPU son actualmente $0.01 por OCPU por hora. El costo mensual es de $14.40 con 1 nodo siempre activado.
- Costos del equilibrador de carga
Un equilibrador de carga público (unidad pequeña) tiene un precio actualmente aproximado de $0.029 por hora. El costo mensual es de aproximadamente $21. Puede reducir aún más los costos mediante la configuración de un equilibrador de carga personalizado en otra instancia de Ampere.
- Costes de almacenamiento
Cada nodo almacena el sistema operativo, llama.cpp y el modelo, que es aproximadamente de 5 a 6 GB. El volumen de inicio predeterminado es de aproximadamente 50 GB. Tenga en cuenta que los primeros 200 GB al mes son gratuitos.