Nach einem Jahr unermüdlicher Bemühungen freuen wir uns heute, Qwen2-VL zu veröffentlichen! Qwen2-VL ist die neueste Version der Vision-Sprachmodelle in den Qwen-Modellfamilien.
SoTA-Verständnis von Bildern verschiedener Auflösungen und Verhältnisse : Qwen2-VL erreicht modernste Leistung bei visuellen Verständnis-Benchmarks, einschließlich MathVista, DocVQA, RealWorldQA, MTVQA usw.
Verstehen von Videos von mehr als 20 Minuten Länge : Mit den Online-Streaming-Funktionen kann Qwen2-VL Videos von mehr als 20 Minuten Länge durch hochwertige videobasierte Fragenbeantwortung, Dialoge, Inhaltserstellung usw. verstehen.
Agent, der Ihre Mobiltelefone, Roboter usw. bedienen kann : Mit der Fähigkeit zur komplexen Argumentation und Entscheidungsfindung kann Qwen2-VL in Geräte wie Mobiltelefone, Roboter usw. integriert werden, um einen automatischen Betrieb basierend auf visueller Umgebung und Textanweisungen zu ermöglichen.
Mehrsprachige Unterstützung : Um globale Benutzer zu bedienen, unterstützt Qwen2-VL jetzt neben Englisch und Chinesisch auch das Verständnis von Texten in verschiedenen Sprachen in Bildern, einschließlich der meisten europäischen Sprachen, Japanisch, Koreanisch, Arabisch, Vietnamesisch usw.
Naive dynamische Auflösung : Im Gegensatz zu zuvor kann Qwen2-VL beliebige Bildauflösungen verarbeiten und sie in eine dynamische Anzahl visueller Token abbilden, was ein menschlicheres visuelles Verarbeitungserlebnis bietet.
Multimodale Rotationspositionseinbettung (M-ROPE) : Zerlegt die Positionseinbettung in Teile, um 1D-Text-, 2D-Bild- und 3D-Videopositionsinformationen zu erfassen und so die multimodalen Verarbeitungsfähigkeiten zu verbessern.
Wir verfügen über Open-Source-Qwen2-VL-Modelle, darunter Qwen2-VL-2B und Qwen2-VL-7B unter der Apache 2.0-Lizenz sowie Qwen2-VL-72B unter der Qwen-Lizenz. Diese Modelle sind jetzt in Hugging Face Transformers, vLLM und andere Frameworks von Drittanbietern integriert. Wir wünschen Ihnen viel Spaß bei der Nutzung!
19.09.2024: Das anweisungsoptimierte Qwen2-VL-72B-Modell und seine quantisierte Version [AWQ, GPTQ-Int4, GPTQ-Int8] sind jetzt verfügbar. Gleichzeitig haben wir auch das Qwen2-VL-Papier veröffentlicht.
30.08.2024: Wir haben die Qwen2-VL-Serie veröffentlicht. Die Modelle 2B und 7B sind jetzt verfügbar und das 72B-Modell für OpenSource kommt bald. Weitere Informationen finden Sie in unserem Blog!
Benchmark | Vorherige SoTA (Open-Source-LVLM) | Claude-3.5 Sonett | GPT-4o | Qwen2-VL-72B (? ? | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MMMU- Wert | 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 |
DocVQA- Test | 94.1 | 95,2 | 92,8 | 96,5 | 94,5 | 90.1 |
InfoVQA- Test | 82,0 | - | - | 84,5 | 76,5 | 65,5 |
ChartQA- Test | 88,4 | 90,8 | 85,7 | 88,3 | 83,0 | 73,5 |
TextVQA- Wert | 84,4 | - | - | 85,5 | 84,3 | 79,7 |
OCRBench | 852 | 788 | 736 | 877 | 845 | 794 |
MTVQA | 17.3 | 25.7 | 27.8 | 30.9 | 25.6 | 18.1 |
VCR und ganz einfach | 84,67 | 63,85 | 91,55 | 91,93 | 89,70 | 81,45 |
Videorecorder zh einfach | 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- Summe | 2414.7 | 1920.0 | 2328,7 | 2482,7 | 2326,8 | 1872.0 |
MMBench-EN- Test | 86,5 | 79,7 | 83,4 | 86,5 | 83,0 | 74,9 |
MMBench-CN- Test | 86,3 | 80,7 | 82.1 | 86,6 | 80,5 | 73,5 |
MMBench-V1.1- Test | 85,5 | 78,5 | 82.2 | 85,9 | 80,7 | 72.2 |
MMT- Benchtest | 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 |
HallBench Durchschn | 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 |
MathVision | 16.97 | - | 30.4 | 25.9 | 16.3 | 12.4 |
Benchmark | Vorherige SoTA (Open-Source-LVLM) | Gemini 1.5-Pro | GPT-4o | Qwen2-VL-72B (? ?) | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MVBench | 69,6 | - | - | 73,6 | 67,0 | 63.2 |
PerceptionTest- Test | 66,9 | - | - | 68,0 | 62.3 | 53.9 |
EgoSchema- Test | 62,0 | 63.2 | 72.2 | 77,9 | 66,7 | 54.9 |
Video-MME (mit/mit 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 |
Benchmark | Metrisch | Vorherige SoTA | GPT-4o | Qwen2-VL-72B | |
---|---|---|---|---|---|
Allgemein | FnCall [1] | TM | - | 90,2 | 93.1 |
EM | - | 50,0 | 53.2 | ||
Spiel | Zahlenstrahl | SR | 89,4 [2] | 91,5 | 100,0 |
BlackJack | SR | 40.2 [2] | 34.5 | 42.6 | |
EZPoint | SR | 50,0 [2] | 85,5 | 100,0 | |
Punkt24 | SR | 2,6 [2] | 3,0 | 4.5 | |
Android | AITZ | TM | 83,0 [3] | 70,0 | 89,6 |
EM | 47,7 [3] | 35.3 | 72.1 | ||
AI2THOR | ALFRED gültig-ungesehen | SR | 67,7 [4] | - | 67,8 |
GC | 75,3 [4] | - | 75,8 | ||
VLN | R2R gültig-unsichtbar | SR | 79,0 | 43,7 [5] | 51.7 |
REVERIE gültig-ungesehen | SR | 61,0 | 31,6 [5] | 31.0 |
SR, GC, TM und EM stehen für Erfolgsquote, Zielbedingungserfolg, Typübereinstimmung und genaue Übereinstimmung. ALFRED wird von SAM [6] unterstützt.
Selbst kuratierter Funktionsaufruf-Benchmark vom Qwen-Team
Feinabstimmung großer Vision-Language-Modelle als Entscheidungsträger durch Reinforcement Learning
Android im Zoo: Chain-of-Action-Thought für GUI-Agenten
ThinkBot: Verkörperte Anweisungsfolge mit Gedankenkettenbegründung
MapGPT: Kartengesteuerte Eingabeaufforderung mit adaptiver Pfadplanung für Vision-and-Language-Navigation
Segmentieren Sie alles.
Modelle | AR | DE | FR | ES | JA | KO | RU | TH | VI | Durchschnittlich |
---|---|---|---|---|---|---|---|---|---|---|
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 |
Zwillinge Ultra | 14.7 | 32.3 | 40,0 | 31.8 | 12.3 | 17.2 | 11.8 | 20.3 | 28.6 | 23.2 |
Diese Ergebnisse werden anhand des Benchmarks von MTVQA bewertet.
Nachfolgend stellen wir einfache Beispiele zur Verfügung, die zeigen, wie man Qwen2-VL mit ? ModelScope und ? Transformatoren.
Der Code von Qwen2-VL befindet sich in den neuesten Hugging-Face-Transformern und wir empfehlen Ihnen, mit dem folgenden Befehl aus dem Quellcode zu erstellen:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
Andernfalls könnte der folgende Fehler auftreten:
KeyError: 'qwen2_vl'
HINWEIS : Die aktuellste Version der transformers
weist einen Fehler beim Laden der Qwen2-VL-Konfiguration auf, daher müssen Sie wie oben beschrieben eine bestimmte Version der Transformer installieren.
Wir bieten ein Toolkit an, mit dem Sie verschiedene Arten visueller Eingaben bequemer verarbeiten können, als ob Sie eine API verwenden würden. Dazu gehören Base64, URLs sowie verschachtelte Bilder und Videos. Sie können es mit dem folgenden Befehl installieren:
# Es wird dringend empfohlen, die Funktion „[decord]“ zu verwenden, um das Laden von Videos zu beschleunigen.pip install qwen-vl-utils[decord]
Wenn Sie kein Linux verwenden, können Sie decord
möglicherweise nicht von PyPI aus installieren. In diesem Fall können Sie pip install qwen-vl-utils
verwenden, das für die Videoverarbeitung auf Torchvision zurückgreift. Sie können decord jedoch weiterhin von der Quelle installieren, um decord beim Laden von Videos zu verwenden.
Hier zeigen wir einen Codeausschnitt, der Ihnen zeigt, wie Sie das Chat-Modell mit transformers
und qwen_vl_utils
verwenden:
from Transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils import process_vision_info# default: Laden Sie das Modell auf das/die verfügbare(n) Gerät(e)model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", Torch_dtype="auto", device_map= "auto")# Wir empfehlen die Aktivierung von flash_attention_2 für eine bessere Beschleunigung und Speichereinsparung, insbesondere in Szenarien mit mehreren Bildern und Videos.# model = Qwen2VLForConditionalGeneration.from_pretrained(# "Qwen/Qwen2-VL-7B-Instruct",# Torch_dtype=torch. bfloat16,# attn_implementation="flash_attention_2",# device_map="auto",# )# default processingprocessor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# Der Standardbereich für die Anzahl der visuellen Token pro Bild im Modell ist 4-16384.# Sie können min_pixels und max_pixels entsprechend Ihren Anforderungen festlegen, z. B. einen Tokenbereich von 256-1280, um Leistung und Kosten in Einklang zu bringen.# min_pixels = 256*28*28# max_pixels = 1280*28 *28# Prozessor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [ {"role": "user","content": [ {"type": "image","image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]# Vorbereitung für Inferenztext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs =processor(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors="pt", )inputs = inputs.to("cuda")# Inferenz: Generierung der Ausgabegenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] für in_ids, out_ids in zip(inputs .input_ids, generic_ids) ]output_text =processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Nachrichten mit mehreren Bildern und einer Textabfragemessages = [ {"role": "user","content": [ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Identifizieren Sie die Ähnlichkeiten zwischen diesen Bildern."}, ], } ]# Vorbereitung für Inferenztext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs =processor(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) :] für in_ids, out_ids in zip(inputs.input_ids, generic_ids) ]output_text =processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
# Nachrichten, die eine Bilderliste als Video und eine Textabfrage enthaltenmessages = [ {"role": "user","content": [ {"type": "video", "video": ["file:///path/to/frame1.jpg", "file:///path/to/frame2.jpg", "file:/// path/to/frame3.jpg","file:///path/to/frame4.jpg", ], }, {"type": "text", "text": "Beschreiben Sie dieses Video."}, ], } ]# Nachrichten, die einen lokalen Videopfad und eine Textabfrage enthaltenmessages = [ {"role": "user","content": [ {"type": "video", "video": "file:///path/to/video1.mp4", "max_pixels": 360 * 420, "fps": 1.0, }, {"type": "text", "text": "Beschreiben Sie dieses Video."}, ], } ]# Nachrichten, die eine Video-URL und eine Textabfrage enthaltenmessages = [ {"role": "user","content": [ {"type": "video", "video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }, {"type": "text", "text": "Beschreiben Sie dieses Video."}, ], } ]# Vorbereitung für Inferenztext =processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs =process_vision_info(messages)inputs =processor(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) :] für in_ids, out_ids in zip(inputs.input_ids, generic_ids) ]output_text =processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_text)
Die Video-URL-Kompatibilität hängt weitgehend von der Bibliotheksversion des Drittanbieters ab. Die Details finden Sie in der Tabelle unten. Ändern Sie das Backend durch FORCE_QWENVL_VIDEO_READER=torchvision
oder FORCE_QWENVL_VIDEO_READER=decord
, wenn Sie nicht das Standard-Backend verwenden möchten.
Backend | HTTP | HTTPS |
---|---|---|
Fackelsicht >= 0,19,0 | ✅ | ✅ |
Fackelsicht < 0,19,0 | ❌ | ❌ |
dekoriert | ✅ | ❌ |
# Beispielnachrichten für Batch-Inferenzmessages1 = [ {"role": "user","content": [ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Was sind die gemeinsamen Elemente in diesen Bildern?"}, ], } ]messages2 = [ {"role": "system", "content": "Sie sind ein hilfreicher Assistent."}, {"role": "user", "content": "Wer sind Sie?"}, ]# Nachrichten für die Stapelverarbeitung kombinierenmessages = [messages1, messages2]# Vorbereitung für Stapelinferenztexte = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)für msg in Nachrichten]image_inputs, video_inputs = Process_vision_info(messages)inputs = Prozessor (text=texts,images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt", )inputs = inputs.to("cuda")# Batch Inferencegenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] für in_ids, out_ids in zip(inputs.input_ids, generic_ids ) ]output_texts =processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)print(output_texts)
Wir empfehlen Benutzern, insbesondere denen auf dem chinesischen Festland, dringend, ModelScope zu verwenden. snapshot_download
kann Ihnen bei der Lösung von Problemen beim Herunterladen von Prüfpunkten helfen.
Für Eingabebilder unterstützen wir lokale Dateien, Base64 und URLs. Für Videos unterstützen wir derzeit nur lokale Dateien.
# Sie können einen lokalen Dateipfad, eine URL oder ein Base64-codiertes Bild direkt an der gewünschten Stelle im Text einfügen.## Local file pathmessages = [ {"role": "user","content": [ {"type": "image", "image": "file:///path/to/your/image.jpg"}, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]## Bild-URLmessages = [ {"role": "user","content": [ {"type": "image", "image": "http://path/to/your/image.jpg"}, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]## Base64-kodierte Bildnachrichten = [ {"role": "user","content": [ {"type": "image", "image": "data:image;base64,/9j/..."}, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]
Das Modell unterstützt eine Vielzahl von Auflösungseingängen. Standardmäßig wird die native Auflösung für die Eingabe verwendet, höhere Auflösungen können jedoch die Leistung auf Kosten eines höheren Rechenaufwands steigern. Benutzer können die minimale und maximale Anzahl von Pixeln festlegen, um eine optimale Konfiguration für ihre Anforderungen zu erreichen, z. B. einen Token-Zählungsbereich von 256–1280, um Geschwindigkeit und Speichernutzung in Einklang zu bringen.
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)
Darüber hinaus bieten wir zwei Methoden zur feinkörnigen Steuerung der in das Modell eingegebenen Bildgröße:
Geben Sie die genauen Abmessungen an: Legen Sie resized_height
und resized_width
direkt fest. Diese Werte werden auf das nächste Vielfache von 28 gerundet.
Definieren Sie min_pixels und max_pixels: Die Größe der Bilder wird geändert, um ihr Seitenverhältnis im Bereich von min_pixels und max_pixels beizubehalten.
# resized_height und resized_widthmessages = [ {"role": "user","content": [ {"type": "image", "image": "file:///path/to/your/image.jpg", "resized_height": 280, "resized_width": 420, }, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]# min_pixels und max_pixelsmessages = [ {"role": "user","content": [ {"type": "image", "image": "file:///path/to/your/image.jpg", "min_pixels": 50176, "max_pixels": 50176, }, {"type": "text", "text": "Beschreiben Sie dieses Bild."}, ], } ]
Standardmäßig werden Bilder und Videoinhalte direkt in die Konversation einbezogen. Beim Umgang mit mehreren Bildern ist es hilfreich, den Bildern und Videos zur besseren Referenz Beschriftungen hinzuzufügen. Benutzer können dieses Verhalten mit den folgenden Einstellungen steuern:
Konversation = [ {"role": "user", "content": [{"type": "image"}, {"type": "text", "text": "Hallo, wie geht es dir?"}], }, {"role": "assistant",content": "Mir geht es gut, danke der Nachfrage. Wie kann ich Ihnen heute helfen?", }, {"role": "user","content": [ {"type": "text", "text": "Können Sie diese Bilder und Videos beschreiben?"}, {"type": "image"}, {"type": "image"}, {"type": "video"}, {"type": "text", "text": "Das sind aus meinem Urlaub."}, ], }, {"role": "assistant","content": "Gerne beschreibe ich die Bilder und Videos für Sie. Könnten Sie bitte mehr Kontext zu Ihrem Urlaub liefern?", }, {"role": "user","content": "Es war ein Ausflug in die Berge. Können Sie die Details in den Bildern und im Video sehen?", }, ]# default:prompt_without_id =processor.apply_chat_template(conversation, add_generation_prompt=True)# Ausgenommene Ausgabe: '<|im_start|>systemnSie sind ein hilfreicher Assistent.<|im_end|>n<|im_start|>usern<|vision_start|>< |image_pad|><|vision_end|>Hallo, wie geht es dir?<|im_end|>n<|im_start|>assistantnMir geht es gut, danke der Nachfrage. Wie kann ich Ihnen heute helfen?<|im_end|>n<|im_start|>usernKönnen Sie diese Bilder und Videos beschreiben?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad| ><|vision_end|><|vision_start|><|video_pad|><|vision_end|>Diese stammen aus meinem Urlaub.<|im_end|>n<|im_start|>assistantnIch beschreibe gerne die Bilder und das Video dazu Du. Könnten Sie bitte mehr Kontext zu Ihrem Urlaub liefern?<|im_end|>n<|im_start|>usernEs war ein Ausflug in die Berge. Können Sie die Details in den Bildern und im Video sehen?<|im_end|>n<|im_start|>assistantn'# add idsprompt_with_id =processor.apply_chat_template(conversation, add_generation_prompt=True, add_vision_id=True)# Ausgenommene Ausgabe: '<|im_start |>systemnDu bist ein hilfreicher Assistent.<|im_end|>n<|im_start|>usernBild 1: <|vision_start|><|image_pad|><|vision_end|>Hallo, wie geht es dir?<|im_end|>n< |im_start|>assistantnMir geht es gut, danke der Nachfrage. Wie kann ich Ihnen heute helfen?<|im_end|>n<|im_start|>usernKönnen Sie diese Bilder und Videos beschreiben?Bild 2: <|vision_start|><|image_pad|><|vision_end|>Bild 3: <|vision_start |><|image_pad|><|vision_end|>Video 1: <|vision_start|><|video_pad|><|vision_end|>Das sind aus meinem Urlaub.<|im_end|>n<|im_start|>AssistentnIch würde Gerne beschreibe ich Ihnen die Bilder und das Video. Könnten Sie bitte mehr Kontext zu Ihrem Urlaub liefern?<|im_end|>n<|im_start|>usernEs war ein Ausflug in die Berge. Können Sie die Details in den Bildern und im Video sehen?<|im_end|>n<|im_start|>assistantn'
Stellen Sie zunächst sicher, dass Sie die neueste Version von Flash Attention 2 installieren:
pip install -U flash-attn --no-build-isolation
Außerdem sollten Sie über eine Hardware verfügen, die mit Flash-Attention 2 kompatibel ist. Lesen Sie mehr darüber in der offiziellen Dokumentation des Flash-Attention-Repositorys. FlashAttention-2 kann nur verwendet werden, wenn ein Modell in torch.float16
oder torch.bfloat16
geladen ist.
Um ein Modell mit Flash Attention-2 zu laden und auszuführen, fügen Sie beim Laden des Modells einfach attn_implementation="flash_attention_2"
wie folgt hinzu:
aus Transformatoren importieren Qwen2VLForConditionalGenerationmodel =