please ONNX demo of smolVLM

#1
by usuario101 - opened

the safetensor model with this inference work perfect amazing work , but please add a onnx inference example in the smolvlm page ,thanks

import os
import torch
from PIL import Image
from transformers import AutoProcessor, AutoModelForVision2Seq
from transformers.image_utils import load_image
import time

DEVICE = "cpu" # Forzar el uso de CPU

Obtener la ruta del directorio actual del script

script_dir = os.path.dirname(os.path.abspath(file))

Rutas para el modelo y el procesador

model_path = os.path.join(script_dir, "SmolVLM-256M-Instruct")
processor_path = os.path.join(script_dir, "SmolVLM-256M-Instruct")

Imprimir los archivos en la carpeta del procesador

print(f"Archivos en la carpeta del procesador ({processor_path}):")
if os.path.exists(processor_path):
for filename in os.listdir(processor_path):
print(f" - {filename}")
else:
print(f" - La ruta {processor_path} no existe.")
exit()

Lista para almacenar las imágenes

images = []

Intentar cargar hasta dos imágenes (ajustar según la necesidad)

try:
# Construir rutas completas para las imágenes (reemplaza con tus nombres de archivo)
image_path1 = os.path.join(script_dir, "imagen.png")
image_path2 = os.path.join(script_dir, "image2.png") # ejemplo de otro formato

if os.path.exists(image_path1):
    image1 = load_image(image_path1)
    images.append(image1)

if os.path.exists(image_path2):
    image2 = load_image(image_path2)
    images.append(image2)

except FileNotFoundError:
print("Error: No se pudo encontrar una o ambas imágenes en la carpeta del script.")
exit()

if not images:
print("No se encontraron imagenes")
exit()

start_time = time.time()

Initialize processor and model from local paths

try:

processor = AutoProcessor.from_pretrained(processor_path)
print("Auto Processor creado correctamente")

except Exception as e:
print(f"Error al construir el auto processor: {e}")

try:
model = AutoModelForVision2Seq.from_pretrained(
model_path,
).to(DEVICE) #Usamos AutoModelForVision2Seq sin forzar el tipo de arquitectura
print("Modelo cargado correctamente con AutoModelForVision2Seq")
except Exception as e:
print(f"Error al cargar el modelo con AutoModelForVision2Seq: {e}")
load_time = time.time()-start_time

#compilacion con torch.compile

try:
model = torch.compile(model)
print("Modelo compilado con torch.compile")
except Exception as e:
print(f"Error al compilar el modelo con torch.compile: {e}")

Crear el mensaje

messages = [
{
"role": "user",
"content": [
{"type": "image"} if len(images) == 1 else {"type": "image"}, # si hay solo una no mostramos mas
]
+ [{"type": "image"}] * (len(images) - 1) # solo añadimos el elemento image si hay mas de una
+ [
{"type": "text", "text": f"Can you describe the {'image' if len(images) == 1 else 'images'}?"}
], # mensaje con un if por si hay una o dos
},
]

Preparar los inputs

try:
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=prompt, images=images, return_tensors="pt")
inputs = inputs.to(DEVICE)
except Exception as e:
print(f"Error al crear la plantilla para el auto processor local: {e}")
start_time = time.time()

Generar las salidas

try:
generated_ids = model.generate(**inputs, max_new_tokens=500)
generated_texts = processor.batch_decode(
generated_ids,
skip_special_tokens=True,
)

print(generated_texts[0])

except Exception as e:
print(f"Error al generar texto con modelo local usando AutoModelForVision2Seq: {e}")

gen_time = time.time()-start_time

print(f"Tiempo de carga del modelo: {load_time:.2f} segundos")
print(f"Tiempo de generación de texto: {gen_time:.2f} segundos")

Sign up or log in to comment