OLLAMA API
Introducción
En el contexto del NLHPC, se ofrecen dos herramientas principales para desplegar y realizar inferencia con LLMs: Ollama y vLLM. La elección entre ambas dependerá del formato del modelo y de los requisitos específicos de la implementación:
- Ollama: Recomendado para utilizar modelos cuantizados, lo que permite una inferencia más rápida y eficiente.
- vLLM: Ideal para ejecutar modelos descargados desde Hugging Face en formato .safetensors, ofreciendo un alto rendimiento y eficiencia en el manejo de múltiples solicitudes simultáneas.
Ollama es una herramienta diseñada para ejecutar y utilizar grandes modelos de lenguaje (LLMs) de forma eficiente y accesible. Su enfoque se centra en la facilidad de uso y se destaca por su soporte con modelos cuantizados.
En el siguiente artículo se le enseñará a:
- Desplegar el servicio de Ollama en el cluster.
- Conectarse a la API del servicio desplegado desde su computadora local.
- Utilizar la API para realizar cargas de trabajo de inferencia.
Cargar ollama
Para obtener Ollama con compatibilidad AMD debe cargar el módulo:
export MODULEPATH=/home/lmod/modules/all/spack/linux-rocky9-x86_64/openmpi/5.0.6-54a6qv3/aocc/5.0.0:/home/lmod/modules/all/spack/linux-rocky9-x86_64/aocc/5.0.0 ml ai-inference
El cual contiene todos paquetes de software necesarios para realizar inferencia con modelos de deep learning como diffusers y LLM’s.
Entre los paquetes se encuentran:
- Pytorch,
- Ollama,
- vLLM,
- diffusers,
- huggingface-cli,
- transformers,
- etc.
Lanzar el servicio Ollama
Para poder utilizar el servicio de ollama, primero hay que lanzarlo, esto se puede realizar con el siguiente script sbatch de ejemplo:
#!/bin/bash #---------------Script SBATCH - NLHPC ---------------- #SBATCH -J ollama_serve #SBATCH -p mi210 #SBATCH --gres=gpu:1 #SBATCH -n 1 #SBATCH --ntasks-per-node=1 #SBATCH -c 8 #SBATCH -t 0:10:00 #SBATCH --mem=30354MB #SBATCH -o logs/ollama_serve_%j.out #SBATCH -e logs/ollama_serve_%j.err #-----------------Toolchain-------------------------- ml purge # ----------------Modulos---------------------------- ml ai-inference # ----------------Comando-------------------------- export OLLAMA_HOST=0.0.0.0:11434 ollama serve &
⚠️ Consideraciones importantes:
Terminar el servicio de Ollama:
El servicio de Ollama no termina automáticamente, recuerde siempre cancelar la tarea con scancel
para evitar subutilización de los recursos de cómputo.
Memoria RAM:
La cantidad de RAM que se está reservando debe ser acorde a la cantidad de memoria que necesita el modelo a lanzar. Se puede utilizar la siguiente fórmula para estimar el peso en GB
<cantidad de parámetros> * <cantidad de bits> / (8 * 10 ^ 9)
Por ejemplo, si su modelo tiene 14 billones de parámetros y está cuantizado a 4 bits, entonces requerirá 7GB de memoria para lanzarse, por tanto debe reservar siete o más gigabytes de memoria.
Reserva de GPU’s:
Cada GPU MI210 tiene 64 GB de memoria VRAM. Si su modelo utiliza más memoria, entonces solicitar más GPU’s adicionales con --gres
.
Notar que, al solicitar más GPU’s el rendimiento en tokens/s no mejora. Además, se recomienda pedir 8 CPU’s por GPU solicitada.
Puerto de escucha:
Por defecto, el puerto de escucha de ollama es 11434, considere cambiarlo en el archivo .job
para que su puerto no choque con el de otros usuarios.
export OLLAMA_HOST=0.0.0.0:<puerto>
Usar Modelos en una Ubicación Personalizada:
Por defecto, el directorio de descarga de modelos es /home/ai_inference_db/models
. Si el
modelo que se quiere utilizar no se encuentra en esta ubicación. Entonces:
- Solicitar el grupo
<practica-gpu>
a soporte NLHPC - Cambiar el directorio OLLAMA_MODELS con:
unset OLLAMA_MODELS
Identificar en qué Nodo ejecutó Ollama
Una vez lanzado el servicio de Ollama, debemos saber qué nodo se asignó. Para esto, utilizar squeue
[intern02@leftraru2 ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 38922125 mi210 ollama_s intern02 R 0:03 1 gn004
Recordar el nodo donde está ejecutando nuestra tarea, en este caso gn004.
Creación de túnel de acceso
Sabiendo el nodo donde ejecutó nuestra tarea, podemos crear un túnel de acceso utilizando ssh
ssh <usuario>@leftraru.nlhpc.cl -p 4603 -L <puerto local>:<nodo>:<puerto en que se abrió el proceso>
por ejemplo:
ssh intern02@leftraru.nlhpc.cl -p 4603 -L 4466:gn004:11434
Con esto, podremos usar el “puerto local” para acceder a la API de ollama y por tanto, utilizarla. Ejemplo de uso
Una vez realizado el túnel de acceso con el nodo, es posible utilizar herramientas como curl o la librería requests de python para realizar consultas a la API de ollama de manera local Guia de uso de la API de ollama.
Por ejemplo:
import requests, json url = f"<http://127.0.0.1:{port}/api/generate>" headers = { "Content-Type": "application/json", } payload = { "model": <modelo>, "prompt": <prompt>, "stream": False } response = requests.post(url, json=payload, headers=headers) data = response.json() response = data.get(“response”, “”) print(response)
o con curl:
curl -X POST "<http://127.0.0.1:<port>>/api/generate" -H "Content-Type: application/json" -d '{ "model": "<modelo>", "prompt": "<prompt>", "stream": false }'
Rendimiento:
Si se utiliza Ollama en las GPU’s MI210, se espera obtener el siguiente rendimiento:
Troubleshooting:
¿Cómo puedo cargar mi modelo de lenguaje propio y/o finetuned?
- Copiar el modelo en formato
.gguf
desde su computadora local al cluster utilizandorsync
o filezilla. Notar que Ollama sólo acepta un archivo.gguf
. - Crear un modelfile de ollama, puede seguir la siguiente documentación.
Un modelfile típico es:
FROM ruta/a/tu/modelo.gguf TEMPLATE """ Plantilla:If .System<|im_start|>system Plantilla:.System<|im_end|> Plantilla:End Plantilla:If .Prompt<|im_start|>user Plantilla:.Prompt<|im_end|> Plantilla:End <|im_start|>assistant """
- Lanzar un script sbatch cargando el modelo con:
ollama serve &
yollama create <model_name> -f /ruta/al/model_file
.
Ejemplo:
#!/bin/bash #---------------Script SBATCH - NLHPC ---------------- #SBATCH -J ollama_serve #SBATCH -p mi210 #SBATCH --gres=gpu:1 #SBATCH -n 1 #SBATCH --ntasks-per-node=1 #SBATCH -c 6 #SBATCH -t 0:10:00 #SBATCH --mem=4090MB #SBATCH -o logs/ollama_serve_%j.out #SBATCH -e logs/ollama_serve_%j.err #-----------------Toolchain-------------------------- ml purge # ----------------Modulos---------------------------- ml ai-inference # ----------------Comando-------------------------- export OLLAMA_HOST=0.0.0.0:11434 ollama serve & sleep 5 ollama create Hermes-3:405b-Q4_L -f /home/intern02/test/ollama_test/Modelfile
- Posterior a este paso, puede realizar inferencia con su modelo con:
ollama run <model_name>
¿Por qué falla al cargar el modelo?
Si el modelo no carga, es probable que no esté disponible en directorio compartido /home/ai_inference_db/models
, ante esto hay dos soluciones.
- Comunicarse con el equipo NLHPC mediante Ticket a soporte para ser agregado al grupo
<practica-gpu\>
, el cual puede descargar modelos en la carpeta compartida. - Cambiar la variable de entorno
OLLAMA_MODELS
a un directorio con permisos.
unset OLLAMA_MODELS
Con esto podrá descargar modelos en su directorio local y por tanto, ejecutarlos.
¿Es posible utilizar modelos desde hugging face?
Si, si el modelo está en formato .gguf
, es posible que exista compatibilidad directa con el servicio de ollama. Por ejemplo:
ollama run hf.co/unsloth/DeepSeek-R1-GGUF:Q4_K_M
Por lo general, puede encontrar las instrucciones de ejecución en la página de Hugging Face, específicamente en la sección "Use this model" del modelo.