¡Después de un año de incansables esfuerzos, hoy estamos encantados de lanzar Qwen2-VL ! Qwen2-VL es la última versión de los modelos de lenguaje de visión de las familias de modelos Qwen.
Comprensión SoTA de imágenes de diversas resoluciones y proporciones : Qwen2-VL logra un rendimiento de vanguardia en puntos de referencia de comprensión visual, incluidos MathVista, DocVQA, RealWorldQA, MTVQA, etc.
Comprensión de videos de más de 20 minutos : con las capacidades de transmisión en línea, Qwen2-VL puede comprender videos de más de 20 minutos mediante respuestas a preguntas, diálogos, creación de contenido, etc. basados en videos de alta calidad.
Agente que puede operar sus móviles, robots, etc .: con capacidades de razonamiento complejo y toma de decisiones, Qwen2-VL se puede integrar con dispositivos como teléfonos móviles, robots, etc., para una operación automática basada en un entorno visual e instrucciones de texto.
Soporte multilingüe : para atender a usuarios globales, además de inglés y chino, Qwen2-VL ahora admite la comprensión de textos en diferentes idiomas dentro de imágenes, incluidos la mayoría de los idiomas europeos, japonés, coreano, árabe, vietnamita, etc.
Resolución dinámica ingenua : a diferencia de antes, Qwen2-VL puede manejar resoluciones de imágenes arbitrarias, mapeándolas en una cantidad dinámica de tokens visuales, ofreciendo una experiencia de procesamiento visual más humana.
Incrustación de posición rotativa multimodal (M-ROPE) : descompone la incrustación posicional en partes para capturar información posicional textual 1D, visual 2D y video 3D, mejorando sus capacidades de procesamiento multimodal.
Disponemos de modelos Qwen2-VL de código abierto, incluidos Qwen2-VL-2B y Qwen2-VL-7B bajo la licencia Apache 2.0, así como Qwen2-VL-72B bajo la licencia Qwen. Estos modelos ahora están integrados con Hugging Face Transformers, vLLM y otros marcos de terceros. ¡Esperamos que disfrutes usándolos!
19.09.2024: El modelo Qwen2-VL-72B ajustado por instrucciones y su versión cuantificada [AWQ, GPTQ-Int4, GPTQ-Int8] ya están disponibles. También publicamos el documento Qwen2-VL simultáneamente.
2024.08.30: Lanzamos la serie Qwen2-VL. Los modelos 2B y 7B ya están disponibles y el modelo 72B para código abierto estará disponible próximamente. Para obtener más detalles, consulte nuestro blog.
Punto de referencia | SoTA anterior (LVLM de código abierto) | Claude-3.5 Soneto | GPT-4o | Qwen2-VL-72B (? ? | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
Valor MMMU | 58.3 | 68.3 | 69.1 | 64,5 | 54.1 | 41.1 |
MMMU-Pro | 46,9 | 51,5 | 51,9 | 46.2 | 43,5 | 37,6 |
Prueba DocVQA | 94.1 | 95,2 | 92,8 | 96,5 | 94,5 | 90.1 |
Prueba InfoVQA | 82.0 | - | - | 84,5 | 76,5 | 65,5 |
Prueba ChartQA | 88,4 | 90,8 | 85,7 | 88.3 | 83.0 | 73,5 |
TextoVQA val | 84,4 | - | - | 85,5 | 84,3 | 79,7 |
OCRBanco | 852 | 788 | 736 | 877 | 845 | 794 |
MTVQA | 17.3 | 25,7 | 27,8 | 30,9 | 25.6 | 18.1 |
VCR es fácil | 84,67 | 63,85 | 91,55 | 91,93 | 89,70 | 81,45 |
VCR zh fácil | 22.09 | 1.0 | 14,87 | 65,37 | 59,94 | 46.16 |
RealWorldQA | 72.2 | 60.1 | 75,4 | 77,8 | 70.1 | 62,9 |
Suma MME | 2414.7 | 1920.0 | 2328.7 | 2482,7 | 2326.8 | 1872.0 |
Prueba MMBench-EN | 86,5 | 79,7 | 83,4 | 86,5 | 83.0 | 74,9 |
Prueba MMBench-CN | 86,3 | 80,7 | 82.1 | 86,6 | 80,5 | 73,5 |
Prueba MMBench-V1.1 | 85,5 | 78,5 | 82.2 | 85,9 | 80,7 | 72.2 |
Prueba de banco MMT | 63.4 | - | 65,5 | 71,7 | 63,7 | 54,5 |
MMStar | 67.1 | 62.2 | 63,9 | 68.3 | 60,7 | 48.0 |
MMVet GPT-4-Turbo | 65,7 | 66.0 | 69.1 | 74.0 | 62.0 | 49,5 |
Promedio HallBench | 55.2 | 49,9 | 55.0 | 58.1 | 50,6 | 41,7 |
Mini prueba de MathVista | 67,5 | 67,7 | 63,8 | 70,5 | 58.2 | 43.0 |
MatemáticasVisión | 16,97 | - | 30.4 | 25,9 | 16.3 | 12.4 |
Punto de referencia | SoTA anterior (LVLM de código abierto) | Géminis 1.5-Pro | GPT-4o | Qwen2-VL-72B (? ?) | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MVBenco | 69,6 | - | - | 73,6 | 67.0 | 63.2 |
Prueba de percepción | 66,9 | - | - | 68.0 | 62.3 | 53,9 |
Prueba de esquema del ego | 62.0 | 63.2 | 72.2 | 77,9 | 66,7 | 54,9 |
Vídeo-MME (dos/con subs) | 66,3/69,6 | 75,0 / 81,3 | 71,9/77,2 | 71,2/77,8 | 63,3/69,0 | 55,6/60,4 |
Punto de referencia | Métrico | SoTA anterior | GPT-4o | Qwen2-VL-72B | |
---|---|---|---|---|---|
General | FnLlamada [1] | MT | - | 90.2 | 93.1 |
EM | - | 50.0 | 53.2 | ||
Juego | recta numérica | SR | 89,4 [2] | 91,5 | 100.0 |
Veintiuna | SR | 40.2 [2] | 34,5 | 42,6 | |
Punto EZ | SR | 50.0 [2] | 85,5 | 100.0 | |
Punto24 | SR | 2.6 [2] | 3.0 | 4.5 | |
Androide | AITZ | MT | 83,0 [3] | 70.0 | 89,6 |
EM | 47,7 [3] | 35.3 | 72.1 | ||
AI2THOR | ALFRED válido-no visto | SR | 67,7 [4] | - | 67,8 |
GC | 75,3 [4] | - | 75,8 | ||
VLN | R2R válido-no visto | SR | 79.0 | 43,7 [5] | 51,7 |
REVERIE válido-no visto | SR | 61.0 | 31,6 [5] | 31.0 |
SR, GC, TM y EM son abreviaturas de tasa de éxito, éxito de condición de objetivo, coincidencia de tipo y coincidencia exacta. ALFRED cuenta con el apoyo de SAM [6] .
Comparativa de llamadas de función seleccionada por el equipo Qwen
Ajuste de modelos de lenguaje-visión amplios como agentes de toma de decisiones mediante el aprendizaje por refuerzo
Android en el zoológico: pensamiento en cadena de acción para agentes GUI
ThinkBot: seguimiento de instrucciones incorporadas con razonamiento en cadena de pensamiento
MapGPT: indicaciones guiadas por mapas con planificación de ruta adaptativa para navegación por visión y lenguaje
Segmentar cualquier cosa.
Modelos | Arkansas | Delaware | FR | ÉL | JA | KO | RU | TH | VI | AVG |
---|---|---|---|---|---|---|---|---|---|---|
Qwen2-VL-72B | 20.7 | 36,5 | 44.1 | 42,8 | 21.6 | 37,4 | 15.6 | 17.7 | 41,6 | 30,9 |
GPT-4o | 20.2 | 34.2 | 41.2 | 32,7 | 20.0 | 33,9 | 11.5 | 22,5 | 34.2 | 27,8 |
Claude3 Opus | 15.1 | 33.4 | 40,6 | 34.4 | 19.4 | 27.2 | 13.0 | 19.5 | 29.1 | 25,7 |
Géminis Ultra | 14.7 | 32.3 | 40.0 | 31,8 | 12.3 | 17.2 | 11.8 | 20.3 | 28.6 | 23.2 |
Estos resultados se evalúan según el punto de referencia de MTVQA.
A continuación, proporcionamos ejemplos sencillos para mostrar cómo utilizar Qwen2-VL con ? ModeloScope y ? Transformadores.
El código de Qwen2-VL se encuentra en los últimos transformadores de Hugging Face y le recomendamos que lo construya desde el código fuente con el comando:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
o puede encontrar el siguiente error:
KeyError: 'qwen2_vl'
NOTA : La última versión actual de transformers
tiene un error al cargar la configuración Qwen2-VL, por lo que necesita instalar una versión específica de Transformers como se indica arriba.
Ofrecemos un conjunto de herramientas para ayudarlo a manejar varios tipos de entrada visual de manera más conveniente, como si estuviera usando una API. Esto incluye base64, URL e imágenes y vídeos entrelazados. Puedes instalarlo usando el siguiente comando:
# Es muy recomendable utilizar la función `[decord]` para una carga de video más rápida.pip install qwen-vl-utils[decord]
Si no está utilizando Linux, es posible que no pueda instalar decord
desde PyPI. En ese caso, puede usar pip install qwen-vl-utils
, que recurrirá al uso de torchvision para el procesamiento de video. Sin embargo, aún puedes instalar la grabación desde la fuente para usarla al cargar el video.
Aquí mostramos un fragmento de código para mostrarle cómo usar el modelo de chat con transformers
y qwen_vl_utils
:
desde transformadores importe Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessordesde qwen_vl_utils importe proceso_vision_info# predeterminado: cargue el modelo en los dispositivos disponibles modelo = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "auto")# Recomendamos habilitar flash_attention_2 para una mejor aceleración y ahorro de memoria, especialmente en escenarios de múltiples imágenes y videos.# model = Qwen2VLForConditionalGeneration.from_pretrained(# "Qwen/Qwen2-VL-7B-Instruct",# torch_dtype=torch. bfloat16,# attn_implementation="flash_attention_2",# device_map="auto",# )# default Processerprocessor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# El rango predeterminado para el número de tokens visuales por imagen en el modelo es 4-16384.# Puede configurar min_pixels y max_pixels según sus necesidades, como un rango de token de 256-1280, para equilibrar el rendimiento y el costo.# min_pixels = 256*28*28# max_pixels = 1280*28 *28# procesador = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen","imagen": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }, {"type": "text", "text": "Describe esta imagen."}, ], } ]# Preparación para la inferenciatexto = procesador.apply_chat_template(messages, tokenize=False, add_generación_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = procesador(text=[texto],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferencia: Generación de la salidagenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] para in_ids, out_ids en zip(inputs .input_ids, generado_ids) ]text_salida = procesador.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Mensajes que contienen varias imágenes y mensajes de consulta de texto = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen", "imagen": "archivo:///ruta/a/image1.jpg"}, {"tipo": "imagen", "imagen": "archivo:///ruta/a/image2.jpg"}, {"type": "text", "text": "Identifica las similitudes entre estas imágenes."}, ], } ]# Preparación para la inferenciatexto = procesador.apply_chat_template(messages, tokenize=False, add_generación_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = procesador(text=[texto],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferenciagenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] para in_ids, out_ids en zip(inputs.input_ids, generate_ids) ]text_salida = procesador.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Mensajes que contienen una lista de imágenes como un video y mensajes de consulta de texto = [ {"rol": "usuario", "contenido": [ {"tipo": "video","video": ["archivo:///ruta/al/frame1.jpg","archivo:///ruta/al/frame2.jpg","archivo:/// ruta/a/frame3.jpg","archivo:///ruta/a/frame4.jpg", ], }, {"type": "text", "text": "Describe este video."}, ], } ]# Mensajes que contienen una ruta de video local y mensajes de consulta de texto = [ {"rol": "usuario", "contenido": [ {"tipo": "video","video": "archivo:///ruta/a/video1.mp4","max_pixels": 360 * 420,"fps": 1.0, }, {"type": "text", "text": "Describe este video."}, ], } ]# Mensajes que contienen una URL de video y mensajes de consulta de texto = [ {"rol": "usuario", "contenido": [ {"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }, {"type": "text", "text": "Describe este video."}, ], } ]# Preparación para la inferenciatexto = procesador.apply_chat_template(messages, tokenize=False, add_generación_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = procesador(text=[texto],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferenciagenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] para in_ids, out_ids en zip(inputs.input_ids, generate_ids) ]text_salida = procesador.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
La compatibilidad de la URL del vídeo depende en gran medida de la versión de la biblioteca de terceros. Los detalles se encuentran en la siguiente tabla. cambie el backend por FORCE_QWENVL_VIDEO_READER=torchvision
o FORCE_QWENVL_VIDEO_READER=decord
si prefiere no usar el predeterminado.
backend | HTTP | HTTPS |
---|---|---|
visión de antorcha >= 0.19.0 | ✅ | ✅ |
visión de antorcha < 0.19.0 | ❌ | ❌ |
decoración | ✅ | ❌ |
# Mensajes de muestra para mensajes de inferencia por lotes1 = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen", "imagen": "archivo:///ruta/a/image1.jpg"}, {"tipo": "imagen", "imagen": "archivo:///ruta/a/image2.jpg"}, {"type": "text", "text": "¿Cuáles son los elementos comunes en estas imágenes?"}, ], } ]mensajes2 = [ {"role": "system", "content": "Eres un asistente útil."}, {"rol": "usuario", "contenido": "¿Quién eres?"}, ]# Combinar mensajes para procesamiento por lotesmessages = [messages1, message2]# Preparación para inferencia por lotestexts = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)for msg in message]image_inputs, video_inputs = Process_vision_info(messages)inputs = procesador (texto=textos,imagenes=entradas_imagen,videos=entradas_video,padding=True,return_tensors="pt", )inputs = inputs.to("cuda")# Inferencia por lotesgenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] para in_ids, out_ids en zip(inputs.input_ids, generate_ids ) ]textos_salida = procesador.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_texts)
Recomendamos encarecidamente a los usuarios, especialmente a aquellos de China continental, que utilicen ModelScope. snapshot_download
puede ayudarle a resolver problemas relacionados con la descarga de puntos de control.
Para imágenes de entrada, admitimos archivos locales, base64 y URL. Para videos, actualmente solo admitimos archivos locales.
# Puede insertar directamente una ruta de archivo local, una URL o una imagen codificada en base64 en la posición que desee en el texto.## Ruta de archivo localmessages = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen", "imagen": "archivo:///ruta/a/tu/imagen.jpg"}, {"type": "text", "text": "Describe esta imagen."}, ], } ]## Mensajes de URL de imagen = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen", "imagen": "http://ruta/a/tu/imagen.jpg"}, {"type": "text", "text": "Describe esta imagen."}, ], } ]## mensajes de imagen codificados en Base64 = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen", "imagen": "datos:imagen;base64,/9j/..."}, {"type": "text", "text": "Describe esta imagen."}, ], } ]
El modelo admite una amplia gama de entradas de resolución. De forma predeterminada, utiliza la resolución nativa para la entrada, pero resoluciones más altas pueden mejorar el rendimiento a costa de más cálculos. Los usuarios pueden establecer la cantidad mínima y máxima de píxeles para lograr una configuración óptima para sus necesidades, como un rango de recuento de tokens de 256 a 1280, para equilibrar la velocidad y el uso de memoria.
min_pixels = 256 * 28 * 28max_pixels = 1280 * 28 * 28procesador = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
Además, proporcionamos dos métodos para un control detallado sobre el tamaño de la imagen ingresado al modelo:
Especifique las dimensiones exactas: establezca directamente resized_height
y resized_width
. Estos valores se redondearán al múltiplo de 28 más cercano.
Defina min_pixels y max_pixels: se cambiará el tamaño de las imágenes para mantener su relación de aspecto dentro del rango de min_pixels y max_pixels.
# resized_height y resized_widthmessages = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen","imagen": "archivo:///ruta/a/su/imagen.jpg","resized_height": 280,"resized_width": 420, }, {"type": "text", "text": "Describe esta imagen."}, ], } ]# min_pixels y max_pixelsmessages = [ {"rol": "usuario", "contenido": [ {"tipo": "imagen","imagen": "archivo:///ruta/a/su/imagen.jpg","min_pixels": 50176,"max_pixels": 50176, }, {"type": "text", "text": "Describe esta imagen."}, ], } ]
De forma predeterminada, las imágenes y el contenido de vídeo se incluyen directamente en la conversación. Al manejar varias imágenes, es útil agregar etiquetas a las imágenes y videos para una mejor referencia. Los usuarios pueden controlar este comportamiento con las siguientes configuraciones:
conversación = [ {"role": "usuario","content": [{"type": "image"}, {"type": "text", "text": "Hola, ¿cómo estás?"}], }, {"role": "assistant","content": "Estoy bien, gracias por preguntar. ¿En qué puedo ayudarte hoy?", }, {"rol": "usuario", "contenido": [ {"type": "text", "text": "¿Puedes describir estas imágenes y videos?"}, {"tipo": "imagen"}, {"tipo": "imagen"}, {"tipo": "vídeo"}, {"type": "text", "text": "Estos son de mis vacaciones."}, ], }, {"role": "assistant","content": "Estaré encantado de describirte las imágenes y el vídeo. ¿Podrías brindarnos más contexto sobre tus vacaciones?", }, {"role": "user","content": "Fue un viaje a la montaña. ¿Puedes ver los detalles en las imágenes y el video?", }, ]# default:prompt_ without_id = procesador.apply_chat_template(conversation, add_generación_prompt=True)# Salida exceptuada: '<|im_start|>systemnEres un asistente útil.<|im_end|>n<|im_start|>usern<|vision_start|>< |image_pad|><|vision_end|>Hola, ¿cómo estás?<|im_end|>n<|im_start|>asistentenEstoy bien, gracias por preguntar. ¿En qué puedo ayudarle hoy?<|im_end|>n<|im_start|>usern¿Puede describir estas imágenes y videos?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad| ><|vision_end|><|vision_start|><|video_pad|><|vision_end|>Estos son de mis vacaciones.<|im_end|>n<|im_start|>asistentenEstaría encantado de describir las imágenes y el vídeo de tú. ¿Podrías brindarnos más contexto sobre tus vacaciones?<|im_end|>n<|im_start|>usernFue un viaje a las montañas. ¿Puedes ver los detalles en las imágenes y el video?<|im_end|>n<|im_start|>assistantn'# add idsprompt_with_id = procesador.apply_chat_template(conversation, add_generation_prompt=True, add_vision_id=True)# Salida exceptuada: '<|im_start |>systemnEres un asistente útil.<|im_end|>n<|im_start|>usernImagen 1: <|vision_start|><|image_pad|><|vision_end|>Hola, ¿cómo estás?<|im_end|>n< |im_start|>assistantnEstoy bien, gracias por preguntar. ¿En qué puedo ayudarle hoy?<|im_end|>n<|im_start|>usern¿Puede describir estas imágenes y videos?Imagen 2: <|vision_start|><|image_pad|><|vision_end|>Imagen 3: <|vision_start |><|image_pad|><|vision_end|>Video 1: <|vision_start|><|video_pad|><|vision_end|>Estos son de mis vacaciones.<|im_end|>n<|im_start|>asistentenI'd Estaremos encantados de describirle las imágenes y el vídeo. ¿Podrías brindarnos más contexto sobre tus vacaciones?<|im_end|>n<|im_start|>usernFue un viaje a las montañas. ¿Puedes ver los detalles en las imágenes y el vídeo?<|im_end|>n<|im_start|>assistantn'
Primero, asegúrese de instalar la última versión de Flash Attention 2:
instalación de pip -U flash-attn --no-build-isolation
Además, debe tener un hardware que sea compatible con Flash-Attention 2. Lea más sobre esto en la documentación oficial del repositorio de flash atención. FlashAttention-2 solo se puede usar cuando un modelo está cargado en torch.float16
o torch.bfloat16
.
Para cargar y ejecutar un modelo usando Flash Attention-2, simplemente agregue attn_implementation="flash_attention_2"
al cargar el modelo de la siguiente manera:
desde transformadores importe Qwen2VLForConditionalGenerationmodel =