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.
- 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.
- 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
- 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
- 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.
- 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"
- 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)
- 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.
- 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.