Despliegue y ejecución de modelos de lenguaje locales mediante Ollama

Instalación y configuración inicial

Para ejecutar modelos de lenguaje de gran tamaño (LLM) en un entorno local, es necesario instalar el gestor de modelos. Tras descargar el paquete desde el repositorio oficial o la página web del proyecto, la instalación se verifica ejecutando el comando principal en la terminal del sistema operativo.

ollama

Una vez que el servicio está operativo, se puede descargar e instanciar un modelo. Por ejemplo, para utilizar la arquitectura Qwen en su versión 2.5, se ejecuta el siguiente comando. El sistema descargará automáticamente los pesos del modelo si no se encuentran en el almacenamiento local.

ollama run qwen2.5

Gestión de rutas y comandos básicos

Por defecto, los archivos de los modelos se almacenan en el directorio de usuario, como ~/.ollama en sistemas basados en Unix o C:\Users\<usuario>\.ollama en Windows. El servicio REST queda escuchando en el puerto 11434, accesible mediante http://127.0.0.1:11434.

Para administrar los recursos descargados, se utilizan los siguientes comandos en la CLI:

  • Listar modelos disponibles: ollama list
  • Eliminar un modelo específico: ollama rm <nombre_del_modelo>

Despliegue en contenedores con Docker

Para entornos aislados o de producción, es recomendable conteneriazr el servicio. La imagen oficial se obtiene directamente desde Docker Hub.

docker pull ollama/ollama:latest

Instanciación del contenedor

Al crear el contenedor, es fundamental mapear los puertos y configurar volúmenes para persistir los datos de los modelos. A continuación, se detallan las configuraciones para ejecución en CPU y con aceleración por GPU.

Ejecución exclusiva en CPU:

docker run -d --name ollama_cpu -v /opt/ollama_data:/root/.ollama -p 11434:11434 ollama/ollama

Ejecución con aceleración NVIDIA GPU:

docker run -d --gpus all --name ollama_gpu -v ollama_storage:/root/.ollama -p 11434:11434 ollama/ollama

Interacción y redes en Docker

Para ejecutar comandos de la CLI directamente dentro del contenedor, se utiliza docker exec. Por ejemplo, para descargar y correr un modelo de programación:

docker exec -it ollama_gpu ollama run qwen2.5-coder:3b

Si otras aplicaciones contenerizadas necesitan comunicarse con el servicio de inferencia, deben utilizar la dirección http://host.docker.internal:11434 o la IP local de la máquina anfitriona.

Integración programática mediante API

La interacción con el modelo se realiza a través de endpoints REST. A continuación, se presenta una implementación en Python orientada a objetos para gestionar conversaciones de múltiples turnos con respuesta en tiempo real (streaming).

import requests
import json

class LocalLLMClient:
    def __init__(self, base_url="http://localhost:11434", model_name="qwen2.5:latest"):
        self.api_endpoint = f"{base_url}/api/chat"
        self.model = model_name
        self.conversation_context = []

    def start_interactive_session(self):
        print(f"Iniciando sesión interactiva con {self.model}. Escriba 'salir' para terminar.")
        
        while True:
            prompt_text = input("Usuario: ")
            
            if prompt_text.strip().lower() in ['salir', 'exit']:
                print("Finalizando sesión...")
                break
            
            self.conversation_context.append({"role": "user", "content": prompt_text})
            self._process_streaming_response()

    def _process_streaming_response(self):
        payload = {
            "model": self.model,
            "messages": self.conversation_context,
            "stream": True
        }
        
        accumulated_response = ""
        
        try:
            with requests.post(self.api_endpoint, json=payload, stream=True, timeout=120) as http_response:
                print("Asistente: ", end="", flush=True)
                
                for raw_chunk in http_response.iter_lines():
                    if raw_chunk:
                        decoded_chunk = raw_chunk.decode('utf-8')
                        try:
                            json_data = json.loads(decoded_chunk)
                            if 'message' in json_data and 'content' in json_data['message']:
                                token = json_data['message']['content']
                                print(token, end="", flush=True)
                                accumulated_response += token
                        except json.JSONDecodeError:
                            continue
                            
                print("\n")
                self.conversation_context.append({"role": "assistant", "content": accumulated_response})
                
        except requests.exceptions.RequestException as err:
            print(f"\nError de conexión: {err}")
            if self.conversation_context and self.conversation_context[-1]['role'] == 'user':
                self.conversation_context.pop()

if __name__ == "__main__":
    client = LocalLLMClient(model_name="qwen2.5-coder:3b")
    client.start_interactive_session()

Etiquetas: ollama Docker Python large-language-models API-REST

Publicado el 7-20 02:46