WeVisOne-VL-4B encuentra, cuenta y recorta objetos con un solo modelo, y todas las tareas funcionaron en una tarjeta real de 16 GB

WeVisOne-VL-4B de Tencent en nuestra nube: cajas, conteos, OCR y recortes hasta el pelo con un modelo, un recorte en 1 s en una RTX 4090, las 7 tareas en 16 GB.

El tablero de ajedrez de la carpeta de ejemplos de la propia Tencent tiene dieciséis piezas blancas. WeVisOne-VL-4B, ejecutado dos veces en una RTX 4090 con el mismo prompt, respondió 15 en 1,35 segundos y 16 en 3,87 segundos. La respuesta rápida se saltó el caballo de g5. El mismo modelo, dos formas de ejecutarlo, y esa diferencia es la decisión que tienes delante antes de ponerlo detrás de un producto. O te quedas con la rápida y revisas sus conteos, o con la lenta, que además entra en una tarjeta de 16 GB. En cualquier caso, un único modelo abierto de 4B de parámetros encontró objetos por su nombre, los contó, señaló puntos, leyó texto y recortó a una persona de una foto hasta el pelo. Sus autores lo venden como todo en uno. Servirlo detrás de una API exige un backend a medida, y el que escribimos está enlazado al final.

La foto de ajedrez de los autores contada dos veces por WeVisOne-VL-4B en una RTX 4090 con el prompt 'count the white chess pieces', con 16 en el tablero. A la izquierda, motor rápido, 1,35 segundos, respuesta 15, incorrecta: una caja roja y una flecha con el rótulo 'missed: white knight' marcan el caballo blanco de g5, que no tiene caja. A la derecha, motor de referencia, 3,87 segundos, respuesta 16, correcta: una caja verde marca el mismo caballo, ahora detectado

Mismo modelo, misma foto y mismo prompt. El motor rápido (izquierda) es unas tres veces más veloz aquí, y se dejó una pieza. El motor de referencia está a la derecha.

Tres cifras de nuestra prueba de WeVisOne-VL-4B en InferenceKey Cloud: 1,0 segundo para una máscara alfa a resolución completa de una foto de 1620 por 1080 en una RTX 4090; 12,8 GiB de pico de memoria de la tarjeta con 14 de 14 peticiones en una RTX 5080 real de 16 GB; 12 GB, donde se acaban los recortes, ya que todas las máscaras fallaron con un límite estricto emulado de 12 GB

Un modelo de 4B hace el trabajo de un detector, un segmentador y una herramienta de recorte

WeVisOne-VL ("WeChat Vision All-in-One") mete en un solo modelo los trabajos que normalmente necesitan una cadena de tres. El primero dibuja cajas alrededor de las cosas que nombras, por ejemplo GroundingDINO, con el que se comparan los autores. Un segundo, como SAM2, convierte cada caja en un contorno. Un tercero hace un recorte suave, el que conserva el pelo suelto y los bordes. Cada uno es su propia descarga, su propia memoria y su propia forma de romperse.

El equipo de WeChat Vision de Tencent lo construyó sobre un modelo abierto de Alibaba. Según la ficha del modelo, encuentra cualquier cosa que puedas nombrar, o una cosa concreta descrita como "el gato de la derecha". También cuenta, señala puntos, lee texto con su posición, dibuja contornos y hace recortes.

El modelo escribe, un pequeño recortador dibuja. WeVisOne-VL responde en texto, y una posición no es más que más texto. Los autores añadieron 1.001 palabras especiales, de <0> a <1000>, cada una una posición a lo ancho o a lo alto de la imagen. Una caja son cuatro de esas palabras, un punto son dos. Para contornos y recortes, etiqueta cada caja, y un programa aparte, diminuto, lee lo que el modelo ve en esa etiqueta y pinta los píxeles. Ese recortador tiene 9,6 millones de parámetros, unas 500 veces menos que el modelo al que acompaña. La página del proyecto dice que no hace falta una herramienta de contornos aparte, porque el recortador reutiliza lo que vio el modelo.

El equipo lo entrenó con unos 100 millones de imágenes, y usó SAM2 solo para dibujar los contornos de entrenamiento, no al ejecutarlo. Publicaron el 4B y un 2B, con un paquete de código que ejecuta los dos. Los repos de Hugging Face se crearon el 22 de octubre de 2026, y el commit de publicación del código tiene fecha del 23 de octubre. Lo vimos en el vídeo de noticias de AI Search del 25 de octubre.

Los autores afirman que el 4B va en cabeza en más de 30 benchmarks. En su prueba de encontrar objetos por su nombre, saca 55,3 sobre 100, y GroundingDINO 38,8. En recortes de retrato, su error es la mitad que el de un montaje basado en SAM2 (7,3 frente a 15,4). La idea de que "sustituye a tres modelos" se apoya en esas tablas, no en una comparación que hayamos hecho nosotros.

Los pesos en Hugging Face son Apache 2.0, que permite el uso comercial. La ficha del modelo añade que "the release is intended for research" y que "not intended to make autonomous high-impact decisions or to identify individuals". Nuestra lectura: la concesión Apache es la licencia, las líneas de uso previsto son orientaciones, y la de identificar personas importa si tu producto trabaja con caras.

La prueba: el modelo ocupa unos 10 GB, y el montaje rápido lo carga dos veces

El montaje rápido carga el modelo dos veces en una sola tarjeta. El fichero publicado pesa 19,3 GB porque guarda cada número a precisión completa. Lo cargamos a media precisión, la forma habitual de servir un modelo, lo que lo deja en unos 10 GB. El paquete de código puede ejecutarlo de dos maneras: un motor rápido pensado para servir y el motor de referencia, sin más. Incluso cuando el motor rápido escribe la respuesta, el paquete mantiene una segunda copia en el motor de referencia para alimentar al recortador.

Desplegamos el 4B a través de nuestra plataforma y le enviamos las mismas 14 peticiones, una imagen cada vez, en cada montaje. Cubren siete tipos de trabajo: encontrar varias cosas por su nombre, contar, encontrar una cosa descrita (y rechazar una que no está), señalar, leer texto, sacar contornos y recortar. Las imágenes son los ejemplos de los propios autores más fotos públicas. Casi todas las ejecuciones usaron una RTX 4090 con 24 GB de memoria, y una RTX 5080 real con 16 GB comprobó si una tarjeta más pequeña aguanta.

Resultados: un recorte a resolución completa en un segundo, y 'aquí no hay nada' cuando no hay nada

El recorte es lo más llamativo. Un retrato de 1620 por 1080 de los ejemplos de los autores volvió como recorte a resolución completa, y los mechones de pelo agitados por el viento se conservan.

Recorte de WeVisOne-VL-4B del retrato seabreeze de los autores en una RTX 4090. A la izquierda, la foto con la caja de la persona y la máscara en rosa. A la derecha, el recorte sobre un damero de transparencia, con los mechones de pelo agitados por el viento intactos

El resto, en los tiempos que nota una persona:

TrabajoRTX 4090, rápidoRTX 4090, referenciaRTX 5080 16 GB, referencia
Recortar a una persona, 1620 x 10801,0 s1,1 s2,1 s
Encontrar "el gato de la derecha"0,21 s0,55 s0,68 s
Contar 12 personas0,78 s2,7 s2,8 s
Leer un cartel de calle (palabras encontradas)3,7 s (29)9,1 s (21)9,5 s (22)
Encontrar 5 tipos de objeto en una cocina1,9 s7,4 s8,3 s
Pico de memoria de la tarjeta (GiB)23,012,312,8

Tiempo en la tarjeta, sacado de nuestros logs. Memoria en GiB, la unidad que usa la propia lectura de la tarjeta. Las palabras encontradas en el cartel varían según el montaje.

Pedimos "el perro" en una foto de gatos. El modelo respondió que no había ninguno en todos los montajes que probamos, en la única foto que probamos, en 0,11 segundos con el motor rápido. Un detector que se inventa un perro cuando no lo hay es el bug que hace que un equipo de producto deje de fiarse de la función.

En la foto de los autores de unos chicos con micrófonos, enmarcó a los dos cantantes. Las cajas de la cocina, el punto sobre el receptor de béisbol, el contorno de la bicicleta y los recortes del retrato y del gato estaban bien cuando los revisamos a ojo. No comprobamos el conteo de 12 tenistas contra una referencia verificada.

WeVisOne-VL-4B encontrando 'boys holding microphone' en la foto de ejemplo de los autores: dos cajas, una en cada cantante

El motor rápido es unas tres veces más veloz en tareas de objetos, y se equivocó con el tablero de ajedrez

En tareas de objetos, el motor rápido es entre una vez y media y cuatro veces más veloz, unas tres veces en la mayoría. En los recortes el panorama es mixto. El contorno de la bicicleta fue más lento con el motor rápido (de 1,2 a 1,8 segundos frente a 0,9).

Los dos motores usaron decodificación greedy, así que el fallo del ajedrez no es ruido de muestreo. La causa probable es que las operaciones de bajo nivel difieren un poco entre los dos programas, y una caja que estaba en el límite cayó del otro lado. También discreparon en el cartel de la calle (29 palabras frente a 21) y en las ollas y sartenes colgadas (19 frente a 20). Un fallo en 14 peticiones no es una tasa. Es un motivo para probar tus propias imágenes en el motor que vas a poner en producción, igual que haces la prueba de sonido con el equipo con el que vas a tocar de verdad.

Hay otra trampa de velocidad. Con el motor rápido, la primera petición tras un arranque tardó de 14,5 a 15,5 segundos en una detección que después tarda 1,9 segundos. Envía una petición de calentamiento antes del tráfico real.

Dónde no encaja: la ficha del modelo avisa de que los bordes finos de un recorte dependen de la resolución, las partes ocultas, la transparencia y la forma de pedirlo. Responde a una pregunta sobre una imagen, y el recortador rechaza el vídeo.

Qué GPU: todas las tareas en una tarjeta real de 16 GB, y los recortes necesitan más de 12 GB

La tarjeta más pequeña que pasó todas las tareas fue una RTX 5080 real con 16 GB, con el motor de referencia. Fue unas dos veces más lenta que el motor rápido de la 4090 en el recorte grande, y hasta unas cuatro veces en tareas de objetos. La tarjeta de 24 GB de nuestra ejecución principal es una elección por velocidad, no un requisito.

TarjetaMontajeResultado
RTX 4090 24 GB, real4B, motor rápido más copia de referencia14 de 14, el más rápido
RTX 5080 16 GB, real4B, solo referencia14 de 14
Unos 12,5 GB, emulada4B, solo referencia13 de 14: solo falla el recorte del retrato grande
12 GB, emulada de forma estricta4B, solo referenciaCajas, conteos, puntos y texto funcionan. Todos los contornos y recortes fallan

Los resultados de 12 GB y 8 GB salen de limitar la memoria en la 4090, no de tarjetas reales de esos tamaños. Por debajo de 16 GB, el recortador es el muro. Pide unos 0,8 GB de golpe, sea cual sea el tamaño de la foto, así que con el límite estricto falló incluso con una foto de 640 píxeles. El modelo 2B con un límite de 8 GB pasó 12 de 14: el recorte grande se quedó sin memoria y una respuesta de posición de texto salió mal formada. También encontró 25 cajas en la cocina donde el 4B encontró 32. Sus recortes pequeños y el contorno de la bicicleta funcionaron, pero no comparamos su calidad con la del 4B, así que no hemos probado si el 2B saca recortes igual de limpios.

En InferenceKey: un endpoint para siete trabajos, respondiendo 87 segundos después de un arranque en limpio con 16 GB

Una RTX 5080 recién arrancada que nunca había visto el modelo ya respondía a los 87 segundos, descarga incluida. En una 4090 con el modelo ya en disco, el motor rápido estuvo listo en 49 a 82 segundos, y el de referencia en 14 a 15.

Servir todos los trabajos, recortador incluido, exige un backend a medida. Es un pequeño programa en Python que nuestra plataforma ejecuta en tu máquina con GPU en lugar de un servidor de modelos estándar. Un servidor estándar solo devolvería el texto, las cajas y los puntos del modelo. El recortador queda fuera de eso, así que el nuestro usa directamente el paquete de los autores, escribe con un motor y pinta con el otro. Cada respuesta vuelve como una imagen con las cajas dibujadas y las coordenadas en bruto para tu código, y, en contornos y recortes, un recorte con fondo transparente.

Si ejecutas el paquete de los autores en una tarjeta de 24 GB, te vas a encontrar con esto. Su configuración por defecto del motor rápido reserva sitio para diez imágenes y diez vídeos por petición. No queda nada para la memoria de trabajo del modelo, y el motor rápido se niega a arrancar. Nuestro ejemplo lo arregla dimensionando el motor rápido para una imagen y peticiones más cortas. También elige el motor según el tamaño de la tarjeta: el rápido con 22 GiB o más, el de referencia por debajo. La versión actual del ejemplo solo convierte en valores por defecto los que probamos. Esa versión exacta todavía no se ha ejecutado en una GPU. Las anteriores sí, con los mismos valores puestos a mano. El resto de problemas están en el apéndice.

¿Deberías usarlo? Sí para funciones de visión en una tarjeta de 16 GB, y comprueba tus conteos

  • Ya ofreces detección, contornos o recortes: un modelo de 4B en una sola tarjeta los hizo todos en nuestra prueba. Revisa antes las líneas de uso previsto de la ficha del modelo.
  • Necesitas conteos correctos: usa el motor de referencia, o compara antes el motor rápido con tus propias imágenes. En nuestro tablero de ajedrez, el motor lento fue el que acertó.
  • Tienes una tarjeta de 16 GB: todas las tareas funcionaron en una RTX 5080 real. Con 12 GB, cuenta solo con cajas y texto.
  • Necesitas velocidad: una tarjeta de 24 GB con el motor rápido da recortes en un segundo y búsquedas de menos de un segundo. Enviamos una petición cada vez y no probamos varios usuarios a la vez. Envía antes una petición de calentamiento.

Ejecuta python publish.py y después python main.py desde nuestro ejemplo del SDK de WeVisOne-VL-4B para tener los mismos siete trabajos detrás de una API en tu propio worker de NVIDIA. Necesita un .env rellenado y una tarjeta de 16 GB (24 GB para el motor rápido), y borra el despliegue al salir.

Para ingenieros

Modelo y ficheros

  • tencent/WeVisOne-VL-4B, sha 4a7bed92750ac9d8b8a124cede14759036932dc2, creado el 2026-10-22T09:48Z, lastModified 2026-10-23, sin acceso restringido, licencia apache-2.0. model.safetensors de 19.322.413.240 bytes, todo F32 (4.830.581.248 parámetros); mask_decoder.pt de 38.534.741 bytes, 9.609.764 parámetros. Qwen3VLForConditionalGeneration. El LICENSE de HF lista Qwen3-VL-4B-Instruct (Alibaba Cloud, Apache-2.0, modificado por Tencent) como dependencia.
  • tencent/WeVisOne-VL-2B, sha 3dad9ce8bcb6fbe0aea945bf8860bd2cfc3663bf, creado el 2026-10-22T09:47Z: model.safetensors de 9.767.053.328 bytes F32 (2.441.744.384 parámetros); mask_decoder.pt de 38.141.525 bytes, 9.511.460 parámetros; Apache-2.0.
  • Código: Tencent/WeVisOne-VL en 40f735b8 (2026-10-23T10:35Z; publicación inicial 23447828 a las 08:14Z). Detección de licencia de GitHub: NOASSERTION, aunque el README declara el código de Tencent como Apache 2.0. Versiones fijadas: torch 2.11.0, transformers 5.12.1, vllm 0.23.0, triton 3.6.0, accelerate 1.14.0.
  • Demo alojada: https://huggingface.co/spaces/hugging-apps/wevisone-vl-4b

Cómo funciona la ruta de píxeles

  • Las coordenadas son tokens del vocabulario de <0> a <1000> (normalizadas). Caja = 4 tokens, punto = 2. None para un objetivo ausente. Las tareas densas emiten <OBJ> (token ID 152678) después de cada caja.
  • Decodificador de píxeles: un Visual Feature Adapter sobre las features del ViT de Qwen3-VL antes del merge, de las capas 5, 11, 17 y 23; un Box-Guided Query Decoder (6 bloques de cross-attention deformable, inicializados a partir del hidden state de <OBJ> más un prior de caja codificado con Fourier); un Instance-Conditioned Dense Head con FullCanvasAlphaCascadeHead que refina S/4, S/2 y S/1 hasta un alfa a resolución completa. La entrada del decodificador se redimensiona a 1024 x 1024 (cnn_image_size 1024).
  • API del paquete: WeVisOneVL(model, backend="transformers"|"vllm", dtype="bfloat16", gpu_memory_utilization=0.45, max_model_len=8192, max_pixels=2025*32*32). Con backend="vllm" crea vllm.LLM con limit_mm_per_prompt image 10 / video 10 y aun así carga el modelo completo de Transformers; decode_masks hace teacher forcing de la respuesta generada a través de él para capturar los hidden states de <OBJ> y las features del ViT. De ahí las dos copias de los pesos en la ruta de vLLM.
  • Tareas en prompts.py: detection, referring, point, count_box, count_point, ocr, ocr_grounding, segmentation, matting, más visual_prompt y freeform.
  • Limitaciones según la ficha: bordes alfa finos sensibles a la resolución, la oclusión, la transparencia y la redacción del prompt; sin chain-of-thought; percepción de imagen de un solo turno (el decodificador de píxeles rechaza las rejillas de vídeo). El paquete permite 10 imágenes por prompt; nuestro backend lo reduce a una.
  • Entrenamiento (página del proyecto): SFT con currículo en tres etapas (90,2M, 40,5M y 41,8M muestras), después RL multitarea con GRPO (178K muestras), unos 100M de imágenes. SAM2 extiende las cajas verificadas a máscaras en el motor de datos. En inferencia, la página del proyecto dice: "No SAM, no external segmentation backbone: the pixel decoder reuses the VLM's own multi-level ViT features."

Cifras principales del 4B según los autores frente a la mejor referencia abierta de sus tablas (no reproducidas por nosotros): LVIS F1 55,3 (50,7), Dense200 71,3 (58,7), RefCOCOg 81,8 (77,6), rechazo en WeRef-Bench 96,4 (73,0), PixMo-Count 89,6 (82,8), PointBench 71,9 (69,9), TotalText 52,0 (43,3), ReasonSeg gIoU 71,2 (65,0), P3M-500-NP MAD 7,3 (15,4), WeRefMat referring MAD 9,8 (22,4). GroundingDINO-T: COCO 56,6, LVIS 38,8 (4B: 57,1 y 55,3). El 2B supera al 4B en P3M-500-NP (6,6 frente a 7,3) y en PPM-100.

Nuestro montaje

  • GPU en nuestra nube: RTX 4090 de 24 GB (driver 595.91.07, CUDA 13.2) para las ejecuciones principales; RTX 5080 de 16 GB (driver 580.178.04, CUDA 13.0) para la comprobación con tarjeta real.
  • Un manager local de InferenceKey (nunca producción) arrancó los dos workers. El workload se ejecutó como el backend a medida en Python wevisone-vl-perception, llamado a través de /v1/images/generations y del probador de imágenes del panel.
  • Motores (el motor rápido del artículo es vLLM, el de referencia es Transformers): vLLM 0.23.0 para el texto más una copia de Transformers 5.12.1 que alimenta mask_decoder.pt, o Transformers solo. bf16 en todo.

Despliegue paso a paso

El ejemplo está en https://github.com/inferencekey/inferencekey-sdk/tree/main/examples/wevisone-vl-4b-perception-custom-backend-private-nvidia (commit e54c22cd22f710e981b22504031f57782c0a5a56): backend.py, requirements.txt, publish.py, main.py, README.md, .env.example.

Necesitas: INFERENCEKEY_SDK_TOKEN, INFERENCEKEY_API_KEY, INFERENCEKEY_PROJECT, IK_WORKER_ID (tu worker de NVIDIA) y, opcionalmente, INFERENCEKEY_TENANT_ID / INFERENCEKEY_USER_TOKEN para publish.py. En el worker: un driver de NVIDIA para CUDA 13.0 (580 o posterior), Python 3.12, 16 GB de VRAM para todas las tareas y 24 GB para el motor vLLM.

git clone https://github.com/inferencekey/inferencekey-sdk.git
cd inferencekey-sdk/examples/wevisone-vl-4b-perception-custom-backend-private-nvidia
cp .env.example .env          # fill in tokens, project and worker id
python3 -m venv .venv && . .venv/bin/activate
pip install maturin requests
(cd ../../bindings/python && maturin develop --release)
python publish.py             # packages and uploads the custom backend
python main.py                # ensure -> wait_until_ready -> 8 requests -> delete
IK_KEEP_ALIVE=1 python main.py   # same, but keeps the workload running

main.py despliega el workload WeVisOne-VL-4B con el slug del backend a medida, task_type text2image, ExecutionPolicy.FIXED con 1 réplica fijada a IK_WORKER_ID, ready_timeout_secs 2400, request_timeout_secs 600, y reenvía todas las variables WEVIS_* como env.

Para llamarlo (el ejemplo usa https://cloud.inferencekey.com por defecto cuando INFERENCEKEY_BASE_URL no está definida; el .env no se carga en tu shell, así que exporta lo que necesite la llamada):

set -a; . ./.env; set +a
export INFERENCEKEY_BASE_URL="${INFERENCEKEY_BASE_URL:-https://cloud.inferencekey.com}"
curl -s "$INFERENCEKEY_BASE_URL/endpoint/$INFERENCEKEY_PROJECT/wevisone-vl-4b/v1/images/generations" \
  -H "Authorization: Bearer $INFERENCEKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"task": "matting", "query": "person", "image": "https://example.com/photo.jpg"}'

image acepta una URL https, una data URL o base64. El probador del panel acepta un prompt con la forma task: query image_url, por ejemplo matting: person https://.../photo.jpg. La respuesta trae data[0] (JPEG anotado), data[1] (PNG RGBA del recorte, solo en segmentation y matting), predictions (cajas o puntos en píxeles por etiqueta), count, rejected, masks (máscaras alfa en PNG de escala de grises), timings y vram_peak_gib.

Entorno del backend (versión 0.1.3):

VariablePor defectoSignificado
WEVIS_ENGINEautovllm con 22 GiB o más de VRAM total, si no transformers
WEVIS_MODEL4B4B o 2B, revisiones fijadas
WEVIS_GPU_MEMORY_UTILIZATION(9,4 + 1,75) / total, 0,465 con 24 GBfracción de vLLM; 4,6 GiB de pesos para el 2B
WEVIS_MAX_MODEL_LEN3072contexto de vLLM
WEVIS_MAX_NUM_SEQS4concurrencia de vLLM
WEVIS_VRAM_LIMIT_GIBsin definirlímite de PyTorch para emular una tarjeta más pequeña
WEVIS_MAX_PIXELS20253232límite de la imagen de entrada

El backend también pone PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True. La versión 0.1.3 convierte en valores por defecto los que probamos por env; la 0.1.3 en sí no se ejecutó en una GPU (de la 0.1.0 a la 0.1.2 sí, con valores sobrescritos por env).

Tiempo hasta estar listo

  • RTX 4090, primer arranque (0.1.0): venv del backend en unos 67 s, descarga de 18,0 GiB en 14 s, carga de pesos en vLLM 7,0 s (9,37 GiB), torch.compile 36 s, profiling de CUDA graphs 93 s, y después el fallo de la caché KV (problema 1).
  • RTX 4090 en caliente, motor vLLM: 82 s, 82 s, 49 s; reciclado en caliente con un paquete nuevo, 58 s.
  • RTX 4090 en caliente, motor Transformers: de 14 a 15 s (carga 12,4 s). 2B: 21 s incluida su primera descarga de 9,8 GB.
  • RTX 5080 en una máquina nueva, motor Transformers: 87 s (descarga 38,0 s, carga 16,9 s).

Mediciones completas

Tiempo de GPU dentro del backend. Las idas y vueltas añaden de 0,9 a 2,5 s (descarga de la imagen en el worker más la plataforma). Los ids de imagen de COCO, entre paréntesis.

Petición4090 vLLM (util 0,465)4090 Transformers4090 TF, límite 11,5 GiB5080 16 GB TF2B TF, límite 7,2 GiB
detectar en cocina: person, pot, bottle, bowl, knife (397133)33 cajas; 14,5-15,5 s la primera llamada, 1,93 s en caliente32, 7,44 s32, 7,62 s32, 8,31 s25, 5,09 s
contar personas, tenis (1000)12, 0,78 s12, 2,68 s12, 2,68 s12, 2,77 s11, 1,97 s
referir: the cat on the right (39769)1 caja, 0,21 s0,55 s0,57 s0,68 s0,46 s
rechazar: the dog (misma foto)None, 0,11 sNone, 0,36 sNone, 0,34 sNone, 0,47 sNone, 0,29 s
señalar: catcher (46252)1 punto, 0,16 s0,38 s0,38 s0,50 s0,30 s
OCR cartel de calle (252219)29 palabras, 3,69 s21, 9,13 s21, 9,05 s22, 9,49 s25, 8,91 s
segmentar: the blue bicycle (174482, 640x388)1,20-1,84 s0,89 s0,91 s1,21 s0,78 s
recorte: person (seabreeze.jpg de los autores, 1620x1080)0,97-1,11 s1,11 sOOM2,05 sOOM
recorte: the cat on the right0,38 s0,76 s0,84 s1,13 s0,66 s
recorte: skier (785)0,36 s0,65 s0,69 s0,99 s0,58 s
referir: boys holding microphone (boys.jpg de los autores)2 cajas, 0,53 s0,80 s0,80 s1,18 s0,63 s
contar: white chess pieces (chess.jpg de los autores, 16 reales)15, 1,35 s16, 3,87 s16, 3,70 s16, 4,20 s16, 2,78 s
OCR con posición: PROCTER (11197)1 caja, 0,20 s0,50 s0,50 s0,60 smal formada
contar: pots and pans hanging (397133)19, 1,11 s20, 4,12 s20, 4,20 s19, 4,11 s19, 3,10 s
pico de la tarjeta (nvidia-smi)23.539 MiB, 23,0 GiB (20.329 en reposo)12.546 MiBunos 12,5 GB incl. contexto CUDA13.148 MiB7.242 MiB
  • La detección de 14,5 a 15,5 s es calentamiento: con el motor ya caliente y max_new_tokens 512 y 2048, las mismas 33 cajas tardaron 1,94 s y 1,93 s.
  • El tiempo de segmentación en vLLM se reparte en unos 0,19 s de texto y de 1,0 a 1,6 s de máscara; el recorte grande, en 0,53 a 0,64 s de texto y 0,44 a 0,48 s de máscara.
  • Revisado a ojo: cajas de la cocina, gato, punto del receptor, bicicleta y recortes del retrato correctos; rechazo correcto en todas las configuraciones; ajedrez contado a mano (16), vLLM se dejó el caballo blanco de g5. Sin comprobar contra una referencia verificada: tenis (12), ollas (19 o 20) y el OCR del cartel (29, 21, 22 o 25 palabras, según el montaje).
  • Idas y vueltas del probador del panel en la demo (motor vLLM): recorte 2.367 ms, conteo del ajedrez 2.140 ms, referring 1.087 ms.

Escalera de VRAM, cifras completas

GPU o límiteConfigPico¿Salida correcta?Real o emulada
RTX 4090 24 GB4B, vLLM util 0,5 + copia de Transformers (backend 0.1.1)OOM en el recorte de 1620x1080: Tried to allocate 768.00 MiB, 630,44 MiB libres (EngineCore 11,50 GiB + Transformers 11,39 GiB)no, las otras 7 peticiones de main.py bienreal
RTX 4090 24 GB4B, vLLM util 0,465, max_model_len 3072, max_num_seqs 4 + copia de Transformers23.539 MiBsí, 14/14 (ajedrez 15 de 16)real
RTX 4090 24 GB4B, solo Transformers12.546 MiBsí, 14/14real
RTX 5080 16 GB4B, solo Transformers13.148 MiBsí, 14/14real
12 GB (límite 11,5 GiB)4B, Transformers, WEVIS_VRAM_LIMIT_GIB=11.5unos 12,5 GB en la tarjeta incl. contexto CUDAno, 13/14: OOM en el recorte grande Tried to allocate 768.00 MiB ... 11.27 GiB allowedemulada, optimista
12 GB estricto (límite 10,8 GiB)4B, Transformers, WEVIS_VRAM_LIMIT_GIB=10.8, WEVIS_MAX_PIXELS=104857611.026 MiB al fallarno: tareas de objetos bien, OOM en la segmentación de una imagen de 640x388 (768 MiB), sin máscarasemulada
8 GB (límite 7,2 GiB)2B, Transformers, WEVIS_MODEL=tencent/WeVisOne-VL-2B7.242 MiBno, 12/14: OOM en el recorte grande, OCR con posición <ref>PROCTER</ref><box><368><0><1000></ref></box>; detección 25 frente a 32, tenis 11 frente a 12emulada

Los límites solo restringen las reservas de PyTorch; emulan la memoria, no el cómputo ni el ancho de banda de una tarjeta más pequeña, y el contexto CUDA queda fuera de ellos. Sin probar: tarjetas reales de 12 GB u 8 GB, fp8 o int8, descarga a CPU.

Problemas encontrados

  1. La configuración de vLLM de los autores no deja caché KV en 24 GB. Encoder cache will be initialized with a budget of 16384 tokens, después Available KV cache memory: -0.87 GiB y ValueError: No available memory for the cache blocks con util 0,471. Arreglado en el backend envolviendo vllm.LLM: limit_mm_per_prompt una imagen al límite de entrada, video 0, tamaño en mm_processor_kwargs, max_model_len, max_num_seqs 4.
  2. Dos copias de los pesos en 24 GB van justas. Con util 0,5 el recorte grande se quedó sin memoria (ver la escalera). Util 0,465 con max_model_len 4096 dio 0.56 GiB KV cache is needed, which is larger than the available KV cache memory (0.44 GiB); 3072 funciona. Arreglado con los valores por defecto.
  3. Los resultados de más de 8 MB se descartan y quien llama espera hasta un 504. Worker: job result refused by JetStream for good (code max_payload: ... exceeded by message size of 9145132); cliente: 504 ... inference_timeout. El worker vuelve a codificar en base64 el JSON del backend en la ruta de imágenes (x1,33). Arreglado en el backend (overlay en JPEG, recorte de 1280 px, presupuesto de 5,2 MB). Abierto en el lado de la plataforma: el worker sabe que el resultado se rechazó, pero el cliente sigue esperando el timeout completo.
  4. Los motores no coinciden en algunas respuestas. Ajedrez 15 frente a 16, OCR 29 frente a 21 palabras, ollas 19 frente a 20. Greedy en los dos. Abierto, inherente a los dos motores; elige el motor según el caso de uso.
  5. La primera petición de vLLM tras un arranque es lenta (de 14,5 a 15,5 s para una detección de 1,9 s). Envía una petición de calentamiento.
  6. El empaquetador del SDK no tiene image2image. PackagingError: unknown task_type 'image2image'; expected one of ('text2text', 'embedding', 'text2image', ...), aunque el manager lo acepta. El backend declara text2image, que solo selecciona la ruta de imágenes. Abierto.
  7. El probador del panel solo envía un prompt (más los campos de tamaño, pasos y guidance, que este modelo ignora), así que el backend extrae task: query url de él.
  8. Nuestros errores. La ejecución 3 falló porque main.py no reenviaba WEVIS_MAX_MODEL_LEN (arreglado).

Resto de muestras

Todas de la ejecución con vLLM en la RTX 4090. Usan fotos de COCO val2017 (Flickr, licencias Creative Commons variadas, algunas no comerciales).

Detección de person, pot, bottle, bowl y knife en una foto de cocina de COCO: 33 cajas

Conteo de personas en una pista de tenis en una foto de COCO: respuesta 12, una caja por persona

Segmentación de 'the blue bicycle' en una foto de COCO de 640 por 388, con la máscara superpuesta a la bici

Recorte de 'the cat on the right' en una foto de COCO, overlay y recorte transparente

Señalando al receptor en una foto de béisbol de COCO: un solo punto sobre el receptor

OCR de un cartel de calle en una foto de COCO: 29 palabras leídas, cada una con su caja

Vídeo de demo

Fotograma en el segundo 45 de la demo de despliegue: el resultado del recorte del retrato de los autores en el probador de imágenes del panel de InferenceKey, overlay y recorte. Haz clic para reproducir el vídeo narrado de 1 minuto y 40 segundos

Demo de despliegue narrada, 99,6 s, 1920 x 1080: el workload en una RTX 4090, después un recorte de retrato (2.367 ms de ida y vuelta), el conteo del ajedrez con el caballo que falta a la vista (2.140 ms) y "boys holding microphone" (1.087 ms) desde el probador de imágenes del panel.

Fuentes

  • Fichas del modelo: https://huggingface.co/tencent/WeVisOne-VL-4B y https://huggingface.co/tencent/WeVisOne-VL-2B (README, LICENSE, config.json, API de HF con blobs)
  • Código: https://github.com/Tencent/WeVisOne-VL en 40f735b8 (README, engine.py, prompts.py, requirements.txt, configs/wevisone_vl_v1_decoder.json)
  • Página del proyecto: https://tencent.github.io/WeVisOne-VL/
  • Dónde lo vimos: AI Search, https://www.youtube.com/watch?v=EfyQOAJjx1A (25 de octubre de 2026, capítulo de 01:01 a 03:10)
  • Imágenes de prueba: los ejemplos de los autores (seabreeze, chess, boys) y COCO val2017
  • Nuestro ejemplo del SDK: https://github.com/inferencekey/inferencekey-sdk/tree/main/examples/wevisone-vl-4b-perception-custom-backend-private-nvidia