Hola, hoy vamos a aprender cómo podemos desplegar llama-2 en un servidor con entorno ARM64 como por ejemplo un Ampere 1 de los que ofrece Oracle Cloud, hay que destacar que también es compatible con AMD64.
El programa en cuestión tiene de nombre LlaMA C++ y está disponible para múltiples entornos:
- Python: abetlen/llama-cpp-python
- Go: go-skynet/go-llama.cpp
- Node.js: withcatai/node-llama-cpp, hlhr202/llama-node
- Ruby: yoshoku/llama_cpp.rb
- Rust: mdrokz/rust-llama.cpp
- C#/.NET: SciSharp/LLamaSharp
- Scala 3: donderom/llm4s
- Clojure: phronmophobic/llama.clj
- React Native: mybigday/llama.rn
- Java: kherud/java-llama.cpp
En nuestro caso vamos a usar el de Python: https://github.com/abetlen/llama-cpp-python
Primero hemos generado un Docker Compose con la siguiente configuración:
Carpetas:
- app
- config
- models
- Dockerfile
Con esta estructura de carpetas creada, vamos a añadir el fichero en raíz llamado docker-compose.yml con este contenido:
version: "3.1" services: llama2: build: context: ./Dockerfile dockerfile: container_python restart: unless-stopped container_name: llama2 working_dir: /app volumes: - ./app:/app/code - ./config/models:/app/models
Una vez creado, añadiremos el fichero llamado container_python dentro de la carpeta Dockerfile con este contenido:
# syntax=docker/dockerfile:1 FROM python:3.11.3 RUN apt-get update -y RUN apt install python3-pip -y RUN pip install --upgrade pip RUN pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir # Ejecutar un comando que mantenga el contenedor en ejecución CMD tail -f /dev/null
Instalamos un entorno de Python 3.11.3 y la librería llama-cpp-python con las opciones de actualizar forzosamente cuando ejecutemos el contenedor.
Ahora vamos a crear el script Python en el directorio app, lo llamaremos code.py
from llama_cpp import Llama llm = Llama(model_path="./../models/7b.Q4_K_S.gguf") output = llm("Q: Que es un perro? A: ", max_tokens=32, stop=["Q:", "\n"], echo=True) print(output)
En mi caso, estoy indicando el modelo 7b.Q4_K_S.gguf que he descargado en el siguiente paso. Le pregunto que es un perro?
También se puede modificar e indicar de la siguiente manera:
output = llm("¿Qué es un perro?")
Ahora vamos a descargar este modelo, hay que indicar que con la última actualización de llama-2 solo admite modelos .gguf, podemos descargar los que sean compatibles desde la propia página de https://huggingface.co
Aquí encontraremos el modelo que yo he usado: https://huggingface.co/TheBloke/Llama-2-Coder-7B-GGUF/tree/main
En concreto el modelo llama-2-coder-7b.Q4_K_S.gguf
Se descarga y debemos añadirlo dentro de la carpeta config/models además hay que renombrarlo a 7b.Q4_K_S.gguf para que lo cargue correctamente.
Finalmente, la estructura de carpetas queda de la siguiente forma:
- app
- code.py
- config
- models
- 7b.Q4_K_S.gguf
- models
- Dockerfile
- container_python
- docker-compose.yml
Ahora ya podemos ejecutar nuestro contenedor:
docker compose up -d
Una vez levantado, el contenedor no hará nada. Tenemos que acceder a él y ejecutar el código manualmente.
Para ello podemos poner:
docker exec -it llama2 /bin/bash
Ahora accederemos al contenedor, pondremos:
cd code
Y ejecutaremos el script:
python code.py
Tarda un rato, a mí me ha dado este resultado:
Me ha respondido con el emoji de un perro.
Si no nos gusta este modelo, podemos buscar otros modelos que sean compatibles y probar.
Aquí se indican todos los modelos compatibles: https://github.com/ggerganov/llama.cpp
Espero que os sirva.
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.