--- pipeline_tag: image-text-to-text license: apache-2.0 base_model: Qwen/Qwen2-VL-2B library_name: zeromodels language: - en tags: - keras - zeromodels - qwen2_vl - qwen2-vl - multimodal - vision - image-text-to-text - pytorch - jax - tf --- # Run Qwen2-VL with Keras 3: JAX, PyTorch, or TensorFlow [![GitHub](https://img.shields.io/badge/GitHub-ZeroModels-181717?logo=github)](https://github.com/IMvision12/ZeroModels) [![Docs](https://img.shields.io/badge/Docs-Qwen2--VL-1f6feb)](https://imvision12.github.io/ZeroModels/qwen2_vl/) [![HuggingFace](https://img.shields.io/badge/HuggingFace-Qwen2--VL-ffd21e?logo=huggingface&logoColor=black)](https://huggingface.co/collections/zeromodels/qwen2-vl-6a8eae2d09e489fe58f3910c) # zeromodels/qwen2-vl-2b Pure-**Keras 3** conversion of [`Qwen/Qwen2-VL-2B`](https://huggingface.co/Qwen/Qwen2-VL-2B) for [zeromodels](https://github.com/IMvision12/ZeroModels). One implementation runs unmodified on **TensorFlow / Torch / JAX**. This is the **2B** variant, served here as **image + text -> text** via `Qwen2VLProcessor`; weights are stored in **bfloat16**. For model details, license, and usage terms, see the upstream [model card](https://huggingface.co/Qwen/Qwen2-VL-2B). Paper: [Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution (arXiv:2409.12191)](https://arxiv.org/abs/2409.12191) · [HF Papers](https://huggingface.co/papers/2409.12191) Paper: [Qwen-VL: A Frontier Large Vision-Language Model with Versatile Abilities (arXiv:2308.12966)](https://arxiv.org/abs/2308.12966) · [HF Papers](https://huggingface.co/papers/2308.12966) ## ✨ Quick start ### Text-only ```python import os os.environ["KERAS_BACKEND"] = "torch" # or "jax" / "tensorflow" from zeromodels.models.qwen2_vl import Qwen2VLTextGenerate, Qwen2VLProcessor model = Qwen2VLTextGenerate.from_weights("zeromodels/qwen2-vl-2b") processor = Qwen2VLProcessor.from_weights("zeromodels/qwen2-vl-2b") inputs = processor(conversation=[ {"role": "user", "content": [{"type": "text", "text": "Hello, who are you?"}]} ]) outputs = model.generate(**inputs, max_new_tokens=64) print(processor.decode(outputs[0])) ``` ### Image + text ```python import os os.environ["KERAS_BACKEND"] = "torch" # or "jax" / "tensorflow" from PIL import Image from zeromodels.models.qwen2_vl import Qwen2VLConditionalGenerate, Qwen2VLProcessor model = Qwen2VLConditionalGenerate.from_weights("zeromodels/qwen2-vl-2b") processor = Qwen2VLProcessor.from_weights("zeromodels/qwen2-vl-2b") inputs = processor(conversation=[ {"role": "user", "content": [ {"type": "image", "image": Image.open("photo.jpg")}, {"type": "text", "text": "Describe this image in one sentence."}, ]} ]) outputs = model.generate(**inputs, max_new_tokens=64) print(processor.decode(outputs[0])) ``` Load any Qwen2-VL variant the same way with `from_weights("zeromodels/")`: | Variant | Hub | | --- | --- | | `qwen2-vl-2b` | [zeromodels/qwen2-vl-2b](https://huggingface.co/zeromodels/qwen2-vl-2b) | | `qwen2-vl-2b-instruct` | [zeromodels/qwen2-vl-2b-instruct](https://huggingface.co/zeromodels/qwen2-vl-2b-instruct) | | `qwen2-vl-7b` | [zeromodels/qwen2-vl-7b](https://huggingface.co/zeromodels/qwen2-vl-7b) | | `qwen2-vl-7b-instruct` | [zeromodels/qwen2-vl-7b-instruct](https://huggingface.co/zeromodels/qwen2-vl-7b-instruct) | | `qwen2-vl-72b` | [zeromodels/qwen2-vl-72b](https://huggingface.co/zeromodels/qwen2-vl-72b) | | `qwen2-vl-72b-instruct` | [zeromodels/qwen2-vl-72b-instruct](https://huggingface.co/zeromodels/qwen2-vl-72b-instruct) | ## Special Thanks A huge thank you to the Qwen team at Alibaba for creating and releasing these models. License: Apache 2.0.