Setelah upaya tanpa henti selama setahun, hari ini kami sangat gembira untuk merilis Qwen2-VL ! Qwen2-VL adalah versi terbaru model bahasa visi dalam keluarga model Qwen.
Pemahaman SoTA terhadap gambar dengan berbagai resolusi & rasio : Qwen2-VL mencapai kinerja canggih pada tolok ukur pemahaman visual, termasuk MathVista, DocVQA, RealWorldQA, MTVQA, dll.
Memahami video berdurasi 20 menit+ : dengan kemampuan streaming online, Qwen2-VL dapat memahami video berdurasi lebih dari 20 menit dengan menjawab pertanyaan, dialog, pembuatan konten berbasis video berkualitas tinggi, dll.
Agen yang dapat mengoperasikan ponsel, robot, dll . : dengan kemampuan penalaran dan pengambilan keputusan yang kompleks, Qwen2-VL dapat diintegrasikan dengan perangkat seperti ponsel, robot, dll., untuk pengoperasian otomatis berdasarkan lingkungan visual dan instruksi teks.
Dukungan Multibahasa : untuk melayani pengguna global, selain bahasa Inggris dan Cina, Qwen2-VL kini mendukung pemahaman teks dalam berbagai bahasa di dalam gambar, termasuk sebagian besar bahasa Eropa, Jepang, Korea, Arab, Vietnam, dll.
Resolusi Dinamis Naif : Tidak seperti sebelumnya, Qwen2-VL dapat menangani resolusi gambar sewenang-wenang, memetakannya menjadi sejumlah token visual yang dinamis, menawarkan pengalaman pemrosesan visual yang lebih mirip manusia.
Multimodal Rotary Position Embedding (M-ROPE) : Menguraikan penyematan posisi menjadi beberapa bagian untuk menangkap informasi posisi tekstual 1D, visual 2D, dan video 3D, sehingga meningkatkan kemampuan pemrosesan multimodalnya.
Kami memiliki model Qwen2-VL bersumber terbuka, termasuk Qwen2-VL-2B dan Qwen2-VL-7B di bawah lisensi Apache 2.0, serta Qwen2-VL-72B di bawah lisensi Qwen. Model-model ini sekarang terintegrasi dengan Hugging Face Transformers, vLLM, dan kerangka kerja pihak ketiga lainnya. Kami harap Anda menikmati menggunakannya!
19.09.2024: Model Qwen2-VL-72B yang disesuaikan dengan instruksi dan versi terkuantisasinya [AWQ, GPTQ-Int4, GPTQ-Int8] kini tersedia. Kami juga telah merilis makalah Qwen2-VL secara bersamaan.
30.08.2024: Kami telah merilis seri Qwen2-VL. Model 2B dan 7B kini tersedia, dan model 72B untuk sumber terbuka akan segera hadir. Untuk lebih jelasnya, silakan periksa blog kami!
Tolok ukur | SoTA sebelumnya (LVLM sumber terbuka) | Claude-3.5 Soneta | GPT-4o | Qwen2-VL-72B (? ? | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MMMU val | 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 |
Tes DocVQA | 94.1 | 95.2 | 92.8 | 96,5 | 94.5 | 90.1 |
Tes InfoVQA | 82.0 | - | - | 84.5 | 76.5 | 65.5 |
Tes ChartQA | 88.4 | 90.8 | 85.7 | 88.3 | 83.0 | 73.5 |
TeksVQA val | 84.4 | - | - | 85.5 | 84.3 | 79.7 |
Bench OCR | 852 | 788 | 736 | 877 | 845 | 794 |
MTVQA | 17.3 | 25.7 | 27.8 | 30.9 | 25.6 | 18.1 |
VCR dengan mudah | 84.67 | 63,85 | 91,55 | 91,93 | 89,70 | 81.45 |
VCR zh mudah | 22.09 | 1.0 | 14.87 | 65.37 | 59,94 | 46.16 |
Dunia NyataQA | 72.2 | 60.1 | 75.4 | 77.8 | 70.1 | 62.9 |
jumlah MME | 2414.7 | 1920.0 | 2328.7 | 2482.7 | 2326.8 | 1872.0 |
Tes MMBench-EN | 86.5 | 79.7 | 83.4 | 86.5 | 83.0 | 74.9 |
Tes MMBench-CN | 86.3 | 80.7 | 82.1 | 86.6 | 80,5 | 73.5 |
Tes MMBench-V1.1 | 85.5 | 78.5 | 82.2 | 85.9 | 80.7 | 72.2 |
Tes MMT-Bench | 63.4 | - | 65.5 | 71.7 | 63.7 | 54.5 |
Bintang MM | 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 |
Rata-rata HallBench | 55.2 | 49.9 | 55.0 | 58.1 | 50.6 | 41.7 |
Tes mini MathVista | 67.5 | 67.7 | 63.8 | 70.5 | 58.2 | 43.0 |
Visi Matematika | 16.97 | - | 30.4 | 25.9 | 16.3 | 12.4 |
Tolok ukur | SoTA sebelumnya (LVLM sumber terbuka) | Gemini 1.5-Pro | GPT-4o | Qwen2-VL-72B (? ?) | Qwen2-VL-7B (? ?) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MVBench | 69.6 | - | - | 73.6 | 67.0 | 63.2 |
Tes Persepsi | 66.9 | - | - | 68.0 | 62.3 | 53.9 |
Tes Skema Ego | 62.0 | 63.2 | 72.2 | 77.9 | 66.7 | 54.9 |
Video-MME (tanpa kapal selam) | 66.3/69.6 | 75.0 / 81.3 | 71.9/77.2 | 71.2/77.8 | 63.3/69.0 | 55.6/60.4 |
Tolok ukur | Metrik | SoTA sebelumnya | GPT-4o | Qwen2-VL-72B | |
---|---|---|---|---|---|
Umum | Panggilan Fn [1] | TM | - | 90.2 | 93.1 |
mereka | - | 50.0 | 53.2 | ||
Permainan | Garis Angka | SR | 89,4 [2] | 91.5 | 100,0 |
Selikuran | SR | 40.2 [2] | 34.5 | 42.6 | |
Titik EZ | SR | 50,0 [2] | 85.5 | 100,0 | |
Poin24 | SR | 2.6 [2] | 3.0 | 4.5 | |
Android | AITZ | TM | 83,0 [3] | 70.0 | 89.6 |
mereka | 47,7 [3] | 35.3 | 72.1 | ||
AI2THOR | ALFRED valid-tidak terlihat | SR | 67,7 [4] | - | 67.8 |
hal | 75,3 [4] | - | 75.8 | ||
VLN | R2R valid-tidak terlihat | SR | 79.0 | 43,7 [5] | 51.7 |
REVERIE valid-tidak terlihat | SR | 61.0 | 31.6 [5] | 31.0 |
SR, GC, TM, dan EM adalah kependekan dari tingkat keberhasilan, keberhasilan kondisi tujuan, pencocokan jenis, dan pencocokan tepat. ALFRED didukung oleh SAM [6] .
Tolok Ukur Panggilan Fungsi yang Dikurasi Sendiri oleh Tim Qwen
Menyempurnakan Model Bahasa Visi Besar sebagai Agen Pengambil Keputusan melalui Pembelajaran Penguatan
Android di Kebun Binatang: Pemikiran Rantai Aksi untuk Agen GUI
ThinkBot: Instruksi yang Diwujudkan Mengikuti dengan Penalaran Rantai Pemikiran
MapGPT: Anjuran Berpanduan Peta dengan Perencanaan Jalur Adaptif untuk Navigasi Visi dan Bahasa
Segmentasikan Apa Saja.
Model | AR | DE | Perancis | DIA | JA | KO | ru | TH | VI | Rata-rata |
---|---|---|---|---|---|---|---|---|---|---|
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 |
Karya Claude3 | 15.1 | 33.4 | 40.6 | 34.4 | 19.4 | 27.2 | 13.0 | 19.5 | 29.1 | 25.7 |
Gemini Ultra | 14.7 | 32.3 | 40.0 | 31.8 | 12.3 | 17.2 | 11.8 | 20.3 | 28.6 | 23.2 |
Hasil ini dievaluasi berdasarkan benchmark MTVQA.
Di bawah ini, kami memberikan contoh sederhana untuk menunjukkan cara menggunakan Qwen2-VL dengan ? ModelScope dan ? transformator.
Kode Qwen2-VL telah ada di Hugging face transformer terbaru dan kami menyarankan Anda untuk membangun dari sumber dengan perintah:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
atau Anda mungkin mengalami kesalahan berikut:
KeyError: 'qwen2_vl'
CATATAN : transformers
versi terbaru saat ini memiliki bug saat memuat konfigurasi Qwen2-VL, jadi Anda perlu menginstal trafo versi tertentu seperti di atas.
Kami menawarkan perangkat untuk membantu Anda menangani berbagai jenis masukan visual dengan lebih nyaman, seolah-olah Anda menggunakan API. Ini termasuk base64, URL, serta gambar dan video yang disisipkan. Anda dapat menginstalnya menggunakan perintah berikut:
# Sangat disarankan untuk menggunakan fitur `[decord]` untuk memuat video lebih cepat.pip install qwen-vl-utils[decord]
Jika Anda tidak menggunakan Linux, Anda mungkin tidak dapat menginstal decord
dari PyPI. Dalam hal ini, Anda dapat menggunakan pip install qwen-vl-utils
yang akan kembali menggunakan torchvision untuk pemrosesan video. Namun, Anda masih dapat menginstal dekorasi dari sumber agar dekorasi digunakan saat memuat video.
Di sini kami menampilkan cuplikan kode untuk menunjukkan cara menggunakan model obrolan dengan transformers
dan qwen_vl_utils
:
dari transformator import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils import process_vision_info# default: Muat model pada perangkat yang tersediamodel = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "auto")# Sebaiknya aktifkan flash_attention_2 untuk akselerasi dan penghematan memori yang lebih baik, terutama dalam skenario multi-gambar dan video.# model = Qwen2VLForConditionalGeneration.from_pretrained(# "Qwen/Qwen2-VL-7B-Instruct",# torch_dtype=torch. bfloat16,# attn_implementation="flash_attention_2",# device_map="auto",# )# default processorprocessor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# Kisaran default untuk jumlah token visual per gambar dalam model adalah 4-16384.# Anda dapat mengatur min_pixels dan max_pixels sesuai dengan kebutuhan Anda, seperti rentang token 256-1280, untuk menyeimbangkan kinerja dan biaya.# min_pixels = 256*28*28# max_pixels = 1280*28 *28# prosesor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [ {"peran": "pengguna","konten": [ {"type": "image","image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]# Persiapan untuk inferensitext = processor.apply_chat_template(messages, tokenize=False, add_generasi_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")# Inferensi: Pembuatan outputgenerated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] untuk in_ids, out_ids dalam zip(inputs .input_ids, generate_ids) ]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=Benar, clean_up_tokenization_spaces=False)print(output_text)
# Pesan yang berisi banyak gambar dan teks querymessages = [ {"peran": "pengguna","konten": [ {"type": "gambar", "gambar": "file:///path/to/image1.jpg"}, {"type": "gambar", "gambar": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Identifikasi persamaan antara gambar-gambar ini."}, ], } ]# Persiapan untuk inferensitext = processor.apply_chat_template(messages, tokenize=False, add_generasi_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) :] untuk in_ids, out_ids dalam zip(inputs.input_ids, generate_ids) ]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=Benar, clean_up_tokenization_spaces=False)print(output_text)
# Pesan yang berisi daftar gambar sebagai video dan permintaan teks pesan = [ {"peran": "pengguna","konten": [ {"type": "video","video": ["file:///path/to/frame1.jpg","file:///path/to/frame2.jpg","file:/// jalur/ke/frame3.jpg","file:///path/ke/frame4.jpg", ], }, {"type": "text", "text": "Deskripsikan video ini."}, ], } ]# Pesan berisi jalur video lokal dan permintaan teksmessages = [ {"peran": "pengguna","konten": [ {"type": "video","video": "file:///path/to/video1.mp4","max_pixels": 360 * 420,"fps": 1.0, }, {"type": "text", "text": "Deskripsikan video ini."}, ], } ]# Pesan berisi url video dan teks querymessages = [ {"peran": "pengguna","konten": [ {"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }, {"type": "text", "text": "Deskripsikan video ini."}, ], } ]# Persiapan untuk inferensitext = processor.apply_chat_template(messages, tokenize=False, add_generasi_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) :] untuk in_ids, out_ids dalam zip(inputs.input_ids, generate_ids) ]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=Benar, clean_up_tokenization_spaces=False)print(output_text)
Kompatibilitas URL video sangat bergantung pada versi perpustakaan pihak ketiga. Detailnya ada pada tabel di bawah ini. ubah backend dengan FORCE_QWENVL_VIDEO_READER=torchvision
atau FORCE_QWENVL_VIDEO_READER=decord
jika Anda memilih untuk tidak menggunakan yang default.
Bagian belakang | HTTP | HTTPS |
---|---|---|
penglihatan obor >= 0.19.0 | ✅ | ✅ |
penglihatan obor <0.19.0 | ❌ | ❌ |
dekorasi | ✅ | ❌ |
# Contoh pesan untuk pesan inferensi batch1 = [ {"peran": "pengguna","konten": [ {"type": "gambar", "gambar": "file:///path/to/image1.jpg"}, {"type": "gambar", "gambar": "file:///path/to/image2.jpg"}, {"type": "text", "text": "Apa saja elemen umum dalam gambar ini?"}, ], } ]pesan2 = [ {"role": "system", "content": "Anda adalah asisten yang berguna."}, {"role": "pengguna", "konten": "Siapa Anda?"}, ]# Gabungkan pesan untuk pemrosesan batchmessages = [pesan1, pesan2]# Persiapan untuk inferensi batchteks = [processor.apply_chat_template(msg, tokenize=False, add_generasi_prompt=True)untuk pesan dalam pesan]image_inputs, video_inputs = process_vision_info(messages)inputs = prosesor (teks=teks,gambar=masukan_gambar,video=masukan_video,padding=Benar,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) :] untuk in_ids, out_ids dalam zip(inputs.input_ids, generate_ids ) ]output_texts = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=Benar, clean_up_tokenization_spaces=False)print(output_texts)
Kami sangat menyarankan pengguna terutama yang berada di daratan Tiongkok untuk menggunakan ModelScope. snapshot_download
dapat membantu Anda memecahkan masalah terkait pengunduhan pos pemeriksaan.
Untuk gambar masukan, kami mendukung file lokal, base64, dan URL. Untuk video, saat ini kami hanya mendukung file lokal.
# Anda dapat langsung menyisipkan jalur file lokal, URL, atau gambar berkode base64 ke posisi yang Anda inginkan dalam teks.## Jalur file lokal pesan = [ {"peran": "pengguna","konten": [ {"type": "gambar", "gambar": "file:///path/to/your/image.jpg"}, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]## Pesan URL Gambar = [ {"peran": "pengguna","konten": [ {"type": "gambar", "gambar": "http://path/to/your/image.jpg"}, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]## Pesan gambar yang dikodekan Base64 = [ {"peran": "pengguna","konten": [ {"type": "gambar", "gambar": "data:gambar;base64,/9j/..."}, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]
Model ini mendukung berbagai input resolusi. Secara default, ini menggunakan resolusi asli untuk input, namun resolusi yang lebih tinggi dapat meningkatkan kinerja dengan mengorbankan lebih banyak komputasi. Pengguna dapat mengatur jumlah piksel minimum dan maksimum untuk mencapai konfigurasi optimal sesuai kebutuhan mereka, seperti rentang jumlah token 256-1280, untuk menyeimbangkan kecepatan dan penggunaan memori.
min_pixels = 256 * 28 * 28max_pixels = 1280 * 28 * 28prosesor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
Selain itu, Kami menyediakan dua metode untuk kontrol mendetail atas masukan ukuran gambar ke model:
Tentukan dimensi yang tepat: Tetapkan langsung resized_height
dan resized_width
. Nilai-nilai ini akan dibulatkan ke kelipatan 28 terdekat.
Tentukan min_pixels dan max_pixels: Gambar akan diubah ukurannya untuk mempertahankan rasio aspeknya dalam rentang min_pixels dan max_pixels.
# tinggi_yang diubah ukurannya dan pesan_lebarnya diubah ukurannya = [ {"peran": "pengguna","konten": [ {"type": "image","image": "file:///path/to/your/image.jpg","resized_height": 280,"resized_width": 420, }, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]# min_pixels dan max_pixelsmessages = [ {"peran": "pengguna","konten": [ {"type": "image","image": "file:///path/to/your/image.jpg","min_pixels": 50176,"max_pixels": 50176, }, {"type": "text", "text": "Deskripsikan gambar ini."}, ], } ]
Secara default, konten gambar dan video langsung disertakan dalam percakapan. Saat menangani banyak gambar, sebaiknya tambahkan label pada gambar dan video untuk referensi yang lebih baik. Pengguna dapat mengontrol perilaku ini dengan pengaturan berikut:
percakapan = [ {"role": "user","content": [{"type": "image"}, {"type": "text", "text": "Halo, apa kabar?"}], }, {"role": "assistant","content": "Saya baik-baik saja, terima kasih telah bertanya. Apa yang bisa saya bantu hari ini?", }, {"peran": "pengguna","konten": [ {"type": "text", "text": "Dapatkah Anda menjelaskan gambar dan video ini?"}, {"tipe": "gambar"}, {"tipe": "gambar"}, {"ketik": "video"}, {"type": "text", "text": "Ini dari liburan saya."}, ], }, {"role": "assistant","content": "Saya akan dengan senang hati menjelaskan gambar dan videonya untuk Anda. Bisakah Anda memberikan lebih banyak konteks tentang liburan Anda?", }, {"role": "user","content": "Itu adalah perjalanan ke pegunungan. Bisakah Anda melihat detailnya di gambar dan video?", }, ]# default:prompt_without_id = processor.apply_chat_template(percakapan, add_generasi_prompt=True)# Output yang dikecualikan: '<|im_start|>systemnAnda adalah asisten yang sangat membantu.<|im_end|>n<|im_start|>usern<|vision_start|>< |image_pad|><|vision_end|>Halo, apa kabar?<|im_end|>n<|im_start|>asistenSaya baik-baik saja, terima kasih sudah bertanya. Apa yang bisa saya bantu hari ini?<|im_end|>n<|im_start|>usernDapatkah Anda mendeskripsikan gambar dan video ini?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad| ><|vision_end|><|vision_start|><|video_pad|><|vision_end|>Ini dari liburan saya.<|im_end|>n<|im_start|>asistenSaya dengan senang hati akan menjelaskan gambar dan videonya Anda. Bisakah Anda memberikan lebih banyak konteks tentang liburan Anda?<|im_end|>n<|im_start|>usernItu adalah perjalanan ke pegunungan. Bisakah Anda melihat detailnya di gambar dan video?<|im_end|>n<|im_start|>assistantn'# add idsprompt_with_id = processor.apply_chat_template(conversation, add_generasi_prompt=True, add_vision_id=True)# Output yang dikecualikan: '<|im_start |>systemnAnda adalah asisten yang sangat membantu.<|im_end|>n<|im_start|>usernGambar 1: <|vision_start|><|image_pad|><|vision_end|>Halo, apa kabar?<|im_end|>n< |im_start|>asistenSaya baik-baik saja, terima kasih sudah bertanya. Apa yang bisa saya bantu hari ini?<|im_end|>n<|im_start|>usernDapatkah Anda menjelaskan gambar dan video ini?Gambar 2: <|vision_start|><|image_pad|><|vision_end|>Gambar 3: <|vision_start |><|image_pad|><|vision_end|>Video 1: <|vision_start|><|video_pad|><|vision_end|>Ini dari liburan saya.<|im_end|>n<|im_start|>asistennSaya akan dengan senang hati menjelaskan gambar dan video untuk Anda. Bisakah Anda memberikan lebih banyak konteks tentang liburan Anda?<|im_end|>n<|im_start|>usernItu adalah perjalanan ke pegunungan. Bisa lihat detailnya di gambar dan video?<|im_end|>n<|im_start|>assistantn'
Pertama, pastikan untuk menginstal Flash Attention 2 versi terbaru:
pip install -U flash-attn --no-build-isolation
Selain itu, Anda harus memiliki perangkat keras yang kompatibel dengan Flash-Attention 2. Baca selengkapnya di dokumentasi resmi repositori perhatian flash. FlashAttention-2 hanya dapat digunakan ketika model dimuat di torch.float16
atau torch.bfloat16
.
Untuk memuat dan menjalankan model menggunakan Flash Attention-2, cukup tambahkan attn_implementation="flash_attention_2"
saat memuat model sebagai berikut:
dari transformator impor Qwen2VLForConditionalGenerationmodel =