После года неустанных усилий сегодня мы рады представить Qwen2-VL ! Qwen2-VL — это последняя версия моделей языка видения в семействе моделей Qwen.
Понимание SoTA изображений различного разрешения и соотношения : Qwen2-VL обеспечивает высочайшую производительность в тестах визуального понимания, включая MathVista, DocVQA, RealWorldQA, MTVQA и т. д.
Понимание видео длительностью более 20 минут : благодаря возможностям онлайн-трансляции Qwen2-VL может понимать видео продолжительностью более 20 минут с помощью высококачественных видеоответов на вопросы, диалогов, создания контента и т. д.
Агент, который может управлять вашими мобильными телефонами, роботами и т. д .: благодаря способностям к сложному рассуждению и принятию решений Qwen2-VL может быть интегрирован с такими устройствами, как мобильные телефоны, роботы и т. д., для автоматического управления на основе визуальной среды и текстовых инструкций.
Многоязычная поддержка : для обслуживания пользователей по всему миру, помимо английского и китайского, Qwen2-VL теперь поддерживает понимание текстов на разных языках внутри изображений, включая большинство европейских языков, японский, корейский, арабский, вьетнамский и т. д.
Наивное динамическое разрешение . В отличие от предыдущего варианта, Qwen2-VL может обрабатывать изображения с произвольным разрешением, отображая их в динамическое количество визуальных токенов, предлагая более человеческий опыт обработки изображений.
Мультимодальное встраивание поворотного положения (M-ROPE) : разлагает позиционное встраивание на части для захвата 1D-текстовой, 2D-визуальной и 3D-видео позиционной информации, расширяя возможности мультимодальной обработки.
У нас есть модели Qwen2-VL с открытым исходным кодом, включая Qwen2-VL-2B и Qwen2-VL-7B под лицензией Apache 2.0, а также Qwen2-VL-72B под лицензией Qwen. Эти модели теперь интегрированы с Hugging Face Transformers, vLLM и другими сторонними платформами. Мы надеемся, что вам понравится их использовать!
2024.09.19: Теперь доступны настроенная по инструкциям модель Qwen2-VL-72B и ее квантованная версия [AWQ, GPTQ-Int4, GPTQ-Int8]. Одновременно мы также выпустили документ Qwen2-VL.
30.08.2024: Мы выпустили серию Qwen2-VL. Модели 2B и 7B уже доступны, а скоро появится модель 72B с открытым исходным кодом. Для получения более подробной информации, пожалуйста, посетите наш блог!
Контрольный показатель | Предыдущий СоТА (LVLM с открытым исходным кодом) | Клод-3.5 Сонет | ГПТ-4о | Qwen2-VL-72B (? ? | Квен2-ВЛ-7Б (? ?) | Квен2-ВЛ-2Б (??) |
---|---|---|---|---|---|---|
МММУ вал | 58,3 | 68,3 | 69,1 | 64,5 | 54,1 | 41,1 |
МММУ-Про | 46,9 | 51,5 | 51,9 | 46,2 | 43,5 | 37,6 |
Тест DocVQA | 94,1 | 95,2 | 92,8 | 96,5 | 94,5 | 90,1 |
InfoVQA- тест | 82,0 | - | - | 84,5 | 76,5 | 65,5 |
ChartQA тест | 88,4 | 90,8 | 85,7 | 88,3 | 83,0 | 73,5 |
TextVQA значение | 84,4 | - | - | 85,5 | 84,3 | 79,7 |
OCRBench | 852 | 788 | 736 | 877 | 845 | 794 |
МТВКА | 17,3 | 25,7 | 27,8 | 30,9 | 25,6 | 18.1 |
Видеомагнитофон легко | 84,67 | 63,85 | 91,55 | 91,93 | 89,70 | 81,45 |
Видеомагнитофон ж просто | 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 |
Сумма MME | 2414,7 | 1920,0 | 2328,7 | 2482,7 | 2326,8 | 1872,0 |
Тест MMBench-EN | 86,5 | 79,7 | 83,4 | 86,5 | 83,0 | 74,9 |
Тест MMBench-CN | 86,3 | 80,7 | 82,1 | 86,6 | 80,5 | 73,5 |
Тест MMBench-V1.1 | 85,5 | 78,5 | 82,2 | 85,9 | 80,7 | 72,2 |
Стендовый тест ММТ | 63,4 | - | 65,5 | 71,7 | 63,7 | 54,5 |
ММСтар | 67,1 | 62,2 | 63,9 | 68,3 | 60,7 | 48,0 |
ММВет ГПТ-4-Турбо | 65,7 | 66,0 | 69,1 | 74,0 | 62,0 | 49,5 |
ХоллСкамейка в среднем | 55,2 | 49,9 | 55,0 | 58,1 | 50,6 | 41,7 |
MathVista testmini | 67,5 | 67,7 | 63,8 | 70,5 | 58,2 | 43,0 |
МатВижн | 16.97 | - | 30,4 | 25,9 | 16.3 | 12.4 |
Контрольный показатель | Предыдущий СоТА (LVLM с открытым исходным кодом) | Близнецы 1.5-Про | ГПТ-4о | Qwen2-VL-72B (? ?) | Квен2-ВЛ-7Б (? ?) | Квен2-ВЛ-2Б (??) |
---|---|---|---|---|---|---|
MVBench | 69,6 | - | - | 73,6 | 67,0 | 63,2 |
Тест восприятия | 66,9 | - | - | 68,0 | 62,3 | 53,9 |
Тест ЭгоСхемы | 62,0 | 63,2 | 72,2 | 77,9 | 66,7 | 54,9 |
Видео-ММЕ (без сабов) | 66,3/69,6 | 75,0 / 81,3 | 71,9/77,2 | 71,2/77,8 | 63,3/69,0 | 55,6/60,4 |
Контрольный показатель | Метрика | Предыдущий СоТА | ГПТ-4о | Qwen2-VL-72B | |
---|---|---|---|---|---|
Общий | FnВызов [1] | ТМ | - | 90,2 | 93,1 |
ЭМ | - | 50,0 | 53,2 | ||
Игра | Числовая линия | СР | 89,4 [2] | 91,5 | 100,0 |
Блэкджек | СР | 40,2 [2] | 34,5 | 42,6 | |
ЭЗПойнт | СР | 50,0 [2] | 85,5 | 100,0 | |
Точка24 | СР | 2,6 [2] | 3.0 | 4,5 | |
Андроид | АИТЦ | ТМ | 83,0 [3] | 70,0 | 89,6 |
ЭМ | 47,7 [3] | 35,3 | 72,1 | ||
АИ2ТОР | АЛЬФРЕД действительный-невидимый | СР | 67,7 [4] | - | 67,8 |
ГК | 75,3 [4] | - | 75,8 | ||
ВЛН | R2R действителен-невидим | СР | 79,0 | 43,7 [5] | 51,7 |
REVERIE действительный-невидимый | СР | 61,0 | 31,6 [5] | 31,0 |
SR, GC, TM и EM — это сокращения для показателя успеха, успеха целевого условия, соответствия типа и точного соответствия. ALFRED поддерживается SAM [6] .
Тест самостоятельного вызова функций от команды Qwen
Точная настройка больших моделей языка видения как агентов принятия решений посредством обучения с подкреплением
Android в зоопарке: цепочка действий для агентов с графическим интерфейсом
ThinkBot: воплощенная инструкция, следующая за рассуждениями по цепочке мыслей
MapGPT: подсказки на основе карты с адаптивным планированием пути для визуальной и языковой навигации
Сегментируйте что угодно.
Модели | АР | DE | фр. | ЭТО | Я.А. | КО | RU | ТД | 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 |
ГПТ-4о | 20.2 | 34,2 | 41,2 | 32,7 | 20,0 | 33,9 | 11,5 | 22,5 | 34,2 | 27,8 |
Клод3 Опус | 15.1 | 33,4 | 40,6 | 34,4 | 19,4 | 27,2 | 13,0 | 19,5 | 29.1 | 25,7 |
Близнецы Ультра | 14,7 | 32,3 | 40,0 | 31,8 | 12.3 | 17.2 | 11,8 | 20.3 | 28,6 | 23.2 |
Эти результаты оцениваются по эталону MTVQA.
Ниже мы приводим простые примеры, показывающие, как использовать Qwen2-VL с ? ModelScope и? Трансформеры.
Код Qwen2-VL был в последних трансформерах Hugging Face, и мы советуем вам собрать его из исходного кода с помощью команды:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
или вы можете столкнуться со следующей ошибкой:
KeyError: 'qwen2_vl'
ПРИМЕЧАНИЕ . В текущей последней версии transformers
есть ошибка при загрузке конфигурации Qwen2-VL, поэтому вам необходимо установить определенную версию трансформаторов, как указано выше.
Мы предлагаем набор инструментов, который поможет вам более удобно обрабатывать различные типы визуального ввода, как если бы вы использовали API. Сюда входят base64, URL-адреса, а также чередующиеся изображения и видео. Вы можете установить его с помощью следующей команды:
# Настоятельно рекомендуется использовать функцию `[decord]` для более быстрой загрузки видео. pip install qwen-vl-utils[decord]
Если вы не используете Linux, возможно, вы не сможете установить decord
из PyPI. В этом случае вы можете использовать pip install qwen-vl-utils
, который вернется к использованию torchvision для обработки видео. Тем не менее, вы все равно можете установить декор из исходного кода, чтобы использовать его при загрузке видео.
Здесь мы покажем фрагмент кода, показывающий, как использовать модель чата с transformers
и qwen_vl_utils
:
из трансформаторов import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils importprocess_vision_info# default: Загрузите модель на доступные устройства(а)model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "auto")# Мы рекомендуем включить flash_attention_2 для лучшего ускорения и экономии памяти, особенно в сценариях с несколькими изображениями и видео.# model = Qwen2VLForConditionalGeneration.from_pretrained(# "Qwen/Qwen2-VL-7B-Instruct",# torch_dtype=torch. bfloat16,# attn_implementation="flash_attention_2",# device_map="auto",# )# процессор по умолчанию = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# Диапазон по умолчанию для количества визуальных токенов на изображение в модели — 4-16384.# Вы можете установить min_pixels и max_pixels в соответствии с вашими потребностями, например диапазон токенов 256-1280, чтобы сбалансировать производительность и стоимость.# min_pixels = 256*28*28# max_pixels = 1280*28 *28# процессор = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [ {"роль": "пользователь","контент": [ {"type": "image","image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }, {"type": "text", "text": "Опишите это изображение."}, ], } ]# Подготовка к выводуtext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs = процессор(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Вывод: генерация выходных данныхgenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] для in_ids, out_ids в zip(inputs) .input_ids, сгенерированные_ids) ]output_text =processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Сообщения, содержащие несколько изображений и текстовый запросmessages = [ {"роль": "пользователь","контент": [ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Определите сходство между этими изображениями."}, ], } ]# Подготовка к выводуtext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs = процессор(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferencegenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] для in_ids, out_ids в zip(inputs.input_ids,generated_ids) ]output_text =processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Сообщения, содержащие список изображений в виде видео и текстовый запросmessages = [ {"роль": "пользователь","контент": [ {"type": "video","video": ["file:///path/to/frame1.jpg","file:///path/to/frame2.jpg","file:/// путь/к/frame3.jpg","файл:///путь/к/frame4.jpg", ], }, {"type": "text", "text": "Опишите это видео."}, ], } ]# Сообщения, содержащие локальный путь к видео и текстовый запросmessages = [ {"роль": "пользователь","контент": [ {"type": "video","video": "file:///path/to/video1.mp4", "max_pixels": 360 * 420, "fps": 1,0, }, {"type": "text", "text": "Опишите это видео."}, ], } ]# Сообщения, содержащие URL-адрес видео и текстовый запросmessages = [ {"роль": "пользователь","контент": [ {"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }, {"type": "text", "text": "Опишите это видео."}, ], } ]# Подготовка к выводуtext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs = процессор(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferencegenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] для in_ids, out_ids в zip(inputs.input_ids,generated_ids) ]output_text =processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
Совместимость URL-адресов видео во многом зависит от версии сторонней библиотеки. Подробности в таблице ниже. измените серверную часть на FORCE_QWENVL_VIDEO_READER=torchvision
или FORCE_QWENVL_VIDEO_READER=decord
, если вы предпочитаете не использовать версию по умолчанию.
Бэкэнд | HTTP | HTTPS |
---|---|---|
факельное зрение >= 0.19.0 | ✅ | ✅ |
факельное зрение < 0.19.0 | ❌ | ❌ |
украшенный | ✅ | ❌ |
# Примеры сообщений для пакетного выводаmessages1 = [ {"роль": "пользователь","контент": [ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Каковы общие элементы на этих изображениях?"}, ], } ]сообщения2 = [ {"role": "system", "content": "Вы полезный помощник."}, {"role": "user", "content": "Кто вы?"}, ]# Объединение сообщений для пакетной обработкиmessages = [messages1, messages2]# Подготовка к пакетному выводуtexts = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)для сообщений в сообщениях]image_inputs, video_inputs =process_vision_info(messages)inputs = процессор (text=texts,images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt", )inputs = inputs.to("cuda")# Пакетный выводgenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] для in_ids, out_ids в zip(inputs.input_ids,generated_ids) ) ]output_texts =processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_texts)
Мы настоятельно советуем пользователям, особенно проживающим в материковом Китае, использовать ModelScope. snapshot_download
может помочь вам решить проблемы, связанные с загрузкой контрольных точек.
Для входных изображений мы поддерживаем локальные файлы, base64 и URL-адреса. Для видео в настоящее время мы поддерживаем только локальные файлы.
# Вы можете напрямую вставить путь к локальному файлу, URL-адрес или изображение в кодировке Base64 в нужное место в тексте.## Путь к локальному файлуmessages = [ {"роль": "пользователь","контент": [ {"type": "image", "image": "file:///path/to/your/image.jpg"}, {"type": "text", "text": "Опишите это изображение."}, ], } ]## URL-адрес изображенияmessages = [ {"роль": "пользователь","контент": [ {"type": "image", "image": "http://path/to/your/image.jpg"}, {"type": "text", "text": "Опишите это изображение."}, ], } ]## imagemessages в кодировке Base64 = [ {"роль": "пользователь","контент": [ {"type": "image", "image": "data:image;base64,/9j/..."}, {"type": "text", "text": "Опишите это изображение."}, ], } ]
Модель поддерживает широкий диапазон входных разрешений. По умолчанию для ввода используется собственное разрешение, но более высокие разрешения могут повысить производительность за счет дополнительных вычислений. Пользователи могут установить минимальное и максимальное количество пикселей для достижения оптимальной конфигурации для своих нужд, например диапазон количества токенов 256–1280, чтобы сбалансировать скорость и использование памяти.
min_pixels = 256 * 28 * 28max_pixels = 1280 * 28 * 28processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
Кроме того, мы предоставляем два метода для детального контроля над вводом размера изображения в модель:
Укажите точные размеры: напрямую задайте resized_height
и resized_width
. Эти значения будут округлены до ближайшего числа, кратного 28.
Определите min_pixels и max_pixels: размеры изображений будут изменены, чтобы сохранить соотношение сторон в диапазоне min_pixels и max_pixels.
# resized_height и resized_widthmessages = [ {"роль": "пользователь","контент": [ {"type": "image","image": "file:///path/to/your/image.jpg", "resized_height": 280, "resized_width": 420, }, {"type": "text", "text": "Опишите это изображение."}, ], } ]# min_pixels и max_pixelsmessages = [ {"роль": "пользователь","контент": [ {"type": "image","image": "file:///path/to/your/image.jpg", "min_pixels": 50176, "max_pixels": 50176, }, {"type": "text", "text": "Опишите это изображение."}, ], } ]
По умолчанию изображения и видеоконтент напрямую включаются в разговор. При работе с несколькими изображениями полезно добавлять метки к изображениям и видео для удобства использования. Пользователи могут контролировать это поведение с помощью следующих настроек:
разговор = [ {"role": "user","content": [{"type": "image"}, {"type": "text", "text": "Привет, как дела?"}], }, {"role": "assistant","content": "У меня все хорошо, спасибо, что спросили. Чем я могу вам помочь сегодня?", }, {"роль": "пользователь","контент": [ {"type": "text", "text": "Можете ли вы описать эти изображения и видео?"}, {"тип": "изображение"}, {"тип": "изображение"}, {"тип": "видео"}, {"type": "text", "text": "Это из моего отпуска."}, ], }, {"role": "assistant","content": "Я буду рада описать вам изображения и видео. Не могли бы вы рассказать больше о своем отпуске?", }, {"role": "user","content": "Это была поездка в горы. Вы можете рассмотреть детали на изображениях и видео?", }, ]# default:prompt_without_id =processor.apply_chat_template(conversation, add_generation_prompt=True)# Исключенный вывод: '<|im_start|>systemnВы полезный помощник.<|im_end|>n<|im_start|>user<|vision_start|>< |image_pad|><|vision_end|>Привет, как дела?<|im_end|>n<|im_start|>assistantnУ меня все хорошо, спасибо, что спросили. Чем я могу вам помочь сегодня?<|im_end|>n<|im_start|>usernМожете ли вы описать эти изображения и видео?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad| ><|vision_end|><|vision_start|><|video_pad|><|vision_end|>Это из моего отпуска.<|im_end|>n<|im_start|>assistantnЯ буду рад описать изображения и видео для ты. Не могли бы вы рассказать больше о вашем отпуске?<|im_end|>n<|im_start|>usernЭто была поездка в горы. Можете ли вы увидеть детали изображений и видео?<|im_end|>n<|im_start|>assistantn'# add idsprompt_with_id =processor.apply_chat_template(conversation, add_generation_prompt=True, add_vision_id=True)# Исключенный вывод: '<|im_start |>systemnВы полезный помощник.<|im_end|>n<|im_start|>usernPicture 1: <|vision_start|><|image_pad|><|vision_end|>Привет, как дела?<|im_end|>n< |im_start|>assistantnУ меня все хорошо, спасибо, что спросили. Чем я могу вам помочь сегодня?<|im_end|>n<|im_start|>usernМожете ли вы описать эти изображения и видео?Рисунок 2: <|vision_start|><|image_pad|><|vision_end|>Рисунок 3: <|vision_start |><|image_pad|><|vision_end|>Видео 1: <|vision_start|><|video_pad|><|vision_end|>Это из моего отпуска.<|im_end|>n<|im_start|>assistantnId будем рады описать вам изображения и видео. Не могли бы вы рассказать больше о вашем отпуске?<|im_end|>n<|im_start|>usernЭто была поездка в горы. Вы видите детали на изображениях и видео?<|im_end|>n<|im_start|>assistantn'
Сначала обязательно установите последнюю версию Flash Attention 2:
pip install -U flash-attn --no-build-isolation
Также у вас должно быть оборудование, совместимое с Flash-Attention 2. Подробнее об этом читайте в официальной документации репозитория flash-attention. FlashAttention-2 можно использовать только тогда, когда модель загружена в torch.float16
или torch.bfloat16
.
Чтобы загрузить и запустить модель с помощью Flash Attention-2, просто добавьте attn_implementation="flash_attention_2"
при загрузке модели следующим образом:
из трансформаторов import Qwen2VLForConditionalGenerationmodel =