Utilizar llama-2 con Python y entorno ARM64 o AMD64 en un contenedor Docker Compose

Tiempo de lectura: 3 minutos

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:

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
  • 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.

Deja un comentario