Despliegue de LightOnOCR-2-1B: Configuración del Entorno en CentOS 7 con Python 3.10 y vLLM 0.6.3

Implementación de LightOnOCR-2-1B: Guía Paso a Paso para CentOS 7

LightOnOCR-2-1B es un modelo de OCR multilingüe con capacidad para 11 idiomas. Este artículo detalla cómo establecer el entorno completo para su despliegue.

  1. Requisitos Previos del Sistema

Antes de iniciar, asegúrese de que su sistema cumple con los requisitos básicos. Como modelo de gran escala con mil millones de parámetros, LightOnOCR-2-1B demanda recursos significativos.

1.1 Necesidades de Hardwrae

  • GPU: Tarjeta NVIDIA con al menos 16 GB de memoria (ej. RTX 4090, A100).
  • RAM: Mínimo 32 GB de memoria del sistema.
  • Almacenamiento: 50 GB de espacio libre para archivos del modelo y dependencias.

1.2 Requisitos de Software

  • Sistema Operativo: CentOS 7.x (versión 7.9 utilizada en esta guía).
  • Python: Versión 3.10.x.
  • CUDA: Versión 11.8 o superior.
  • vLLM: Versión 0.6.3.
  1. Configuración del Entorno Base

Comenzamos preparando el sistema operativo y las herramientas esenciales.

2.1 Actualización del Sistema e Instalación de Dependencias

Actualice los paquetes del sistema y instale las herramientas necesarias:

# Actualización de repositorios y paquetes
sudo yum refresh -y
sudo yum install -y groupinstall "Development Tools"
sudo yum install -y epel-release wget curl git openssl-devel bzip2-devel libffi-devel zlib-devel

2.2 Instalación de Python 3.10

Dado que CentOS 7 incluye una versión anterior de Python, procedemos con una instalación manual:

# Obtención y compilación de Python 3.10
cd /tmp
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz
tar -xzf Python-3.10.13.tgz
cd Python-3.10.13
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall
# Verificación
python3.10 --version

2.3 Configuarción de CUDA

Instale CUDA después de verificar los controladores de NVIDIA existentes:

# Descarga e instalación de CUDA 11.8
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
# Configuración de variables de entorno
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
  1. Preparación del Entorno Python

Creamos un entorno aislado para gestionar las dependencias del proyecto.

3.1 Creación del Entorno Virtual

# Instalación de virtualenv y creación del entorno
python3.10 -m pip install --upgrade pip
python3.10 -m pip install virtualenv
cd ~
python3.10 -m virtualenv mi_entorno_ocr
source ~/mi_entorno_ocr/bin/activate

3.2 Instalación de vLLM y Librerías

# Instalación de vLLM y dependencias adicionales
pip install vllm==0.6.3
pip install gradio==4.19.0 Pillow==10.0.0 requests==2.31.0 transformers==4.37.0
  1. Despliegue de LightOnOCR-2-1B

Con el entorno listo, procedemos a configurar el modelo y la interfaz de usuario.

4.1 Estructura del Proyecto

# Creación del directorio principal
mkdir -p ~/proyecto_ocr
cd ~/proyecto_ocr

4.2 Obtención del Modelo

El modelo requiere aproximadamente 2 GB de espacio. Descárguelo de una fuente autorizada y colóquelo en el directorio adecuado:

# Preparación del directorio para el modelo
mkdir -p ~/modelos_ai/lightonai/LightOnOCR-2-1B
# Nota: Descargue los archivos del modelo y muévalos a ~/modelos_ai/lightonai/LightOnOCR-2-1B

4.3 Interfaz Web con Gradio

Cree un archivo app.py para la interfaz de usuario:

import gradio as gr
import requests
import base64
from PIL import Image
import io

API_ENDPOINT = "http://localhost:8000/v1/chat/completions"

def procesar_imagen(imagen_entrada):
    """Extrae texto de una imagen proporcionada."""
    try:
        # Codificación de la imagen a base64
        buffer_memoria = io.BytesIO()
        imagen_entrada.save(buffer_memoria, format="PNG")
        imagen_codificada = base64.b64encode(buffer_memoria.getvalue()).decode()
        
        # Solicitud al servidor
        datos_solicitud = {
            "model": "/home/usuario/modelos_ai/lightonai/LightOnOCR-2-1B",
            "messages": [{
                "role": "user",
                "content": [{
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{imagen_codificada}"}
                }]
            }],
            "max_tokens": 4096
        }
        
        respuesta = requests.post(API_ENDPOINT, json=datos_solicitud)
        respuesta.raise_for_status()
        
        # Extracción del texto
        resultado = respuesta.json()
        texto_detectado = resultado['choices'][0]['message']['content']
        return texto_detectado
    except Exception as error:
        return f"Se produjo un error: {str(error)}"

# Definición de la interfaz Gradio
with gr.Blocks(title="OCR con LightOnOCR-2-1B") as aplicacion:
    gr.Markdown("# Reconocimiento Multilingüe de Texto")
    gr.Markdown("Suba una imagen para extraer el contenido textual (soporta 11 idiomas).")
    
    with gr.Row():
        with gr.Column():
            entrada_imagen = gr.Image(label="Cargar imagen", type="pil")
            boton_procesar = gr.Button("Extraer texto", variant="primary")
        with gr.Column():
            salida_texto = gr.Textbox(label="Resultado", lines=10, interactive=False)
    
    boton_procesar.click(
        fn=procesar_imagen,
        inputs=entrada_imagen,
        outputs=salida_texto
    )

if __name__ == "__main__":
    aplicacion.launch(server_name="0.0.0.0", server_port=7860)

4.4 Script de Inicio

Genere un script iniciar.sh para lanzar los servicios:

#!/bin/bash
# Activación del entorno virtual
source ~/mi_entorno_ocr/bin/activate

# Inicio del servidor vLLM en segundo plano
vllm serve /home/usuario/modelos_ai/lightonai/LightOnOCR-2-1B \
    --host 0.0.0.0 \
    --port 8000 \
    --gpu-memory-utilization 0.9 \
    --max-model-len 4096 &

# Espera para la inicialización
sleep 30

# Lanzamiento de la interfaz web
cd ~/proyecto_ocr
python app.py &

echo "Servicios activados."
echo "Interfaz web: http://direccion_ip:7860"
echo "API del modelo: http://direccion_ip:8000/v1/chat/completions"

Hágalo ejecutable con chmod +x ~/proyecto_ocr/iniciar.sh.

  1. Gestión y Uso del Servicio

Administre el servicio una vez configurado.

5.1 Ejecución

cd ~/proyecto_ocr
bash iniciar.sh

5.2 Verificación del Estado

# Comprobación de puertos activos
ss -tlnp | grep -E "7860|8000"
# Listado de procesos relacionados
ps aux | grep -E "vllm|python app.py"

5.3 Detención de Servicios

# Terminación de procesos
pkill -f "vllm serve"
pkill -f "python app.py"
  1. Métodos de Uso

6.1 Interfaz Gráfica

Acceda a http://direccion_del_servidor:7860 desde un navegador, suba una imagen y obtenga el texto reconocido.

6.2 Llamadas a la API

Ejemplo con curl:

curl -X POST http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "/home/usuario/modelos_ai/lightonai/LightOnOCR-2-1B",
    "messages": [{
      "role": "user",
      "content": [{"type": "image_url", "image_url": {"url": "data:image/png;base64,<cadena_base64_de_imagen>"}}]
    }],
    "max_tokens": 4096
  }'</cadena_base64_de_imagen>

6.3 Cliente en Python

import requests
import base64
from PIL import Image
import io

def obtener_texto_de_imagen(ruta_imagen, url_api="http://localhost:8000/v1/chat/completions"):
    # Lectura y codificación de la imagen
    with open(ruta_imagen, "rb") as archivo:
        datos_imagen = base64.b64encode(archivo.read()).decode()
    
    # Construcción de la solicitud
    solicitud = {
        "model": "/home/usuario/modelos_ai/lightonai/LightOnOCR-2-1B",
        "messages": [{
            "role": "user",
            "content": [{
                "type": "image_url",
                "image_url": {"url": f"data:image/png;base64,{datos_imagen}"}
            }]
        }],
        "max_tokens": 4096
    }
    
    # Envío y procesamiento de la respuesta
    respuesta = requests.post(url_api, json=solicitud)
    resultado = respuesta.json()
    return resultado['choices'][0]['message']['content']

# Ejemplo de invocación
texto_extraido = obtener_texto_de_imagen("ejemplo.png")
print(texto_extraido)
  1. Recomendaciones de Optmiización

Para un rendimiento óptimo, considere las siguientes prácticas.

7.1 Preprocesamiento de Imágenes

  • Resolución recomendada: lado más largo de 1540 píxeles.
  • Formato preferido: PNG para mayor nitidez del texto.
  • Asegure condiciones de iluminación adecuadas.

7.2 Ajustes de Rendimiento

  • Implemente procesamiento por lotes para múltiples imágenes.
  • Monitoree el uso de memoria GPU para evitar sobrecargas.
  • Considere mecanismos de caché para imágenes repetitivas.
  1. Solución a Problemas Comunes

8.1 Conflictos de Puertos

# Identificación de procesos en puertos específicos
sudo lsof -i :7860
sudo lsof -i :8000
# Terminación forzada si es necesario
sudo kill -9 <pid_del_proceso></pid_del_proceso>

8.2 Errores de Memoria

# Modificación de parámetros de vLLM para reducir consumo
vllm serve /home/usuario/modelos_ai/lightonai/LightOnOCR-2-1B \
    --gpu-memory-utilization 0.8 \
    --swap-space 16 \
    --max-num-batched-tokens 2048

8.3 Fallos en la Carga del Modelo

Verifique la integridad de los archivos en ~/modelos_ai/lightonai/LightOnOCR-2-1B, asegurando la presencia de config.json y model.safetensors.

Etiquetas: centos7 Python3.10 vLLM LightOnOCR OCR

Publicado el 7-20 12:20