
หลังจากความพยายามอย่างไม่หยุดยั้งตลอดหนึ่งปี วันนี้เรารู้สึกตื่นเต้นที่จะเปิดตัว Qwen2-VL ! Qwen2-VL เป็นเวอร์ชันล่าสุดของโมเดลภาษาการมองเห็นในตระกูลโมเดล Qwen
การทำความเข้าใจ SoTA สำหรับรูปภาพที่มีความละเอียดและอัตราส่วนต่างๆ : Qwen2-VL บรรลุประสิทธิภาพที่ล้ำสมัยบนเกณฑ์มาตรฐานการทำความเข้าใจภาพ รวมถึง MathVista, DocVQA, RealWorldQA, MTVQA ฯลฯ
ทำความเข้าใจกับวิดีโอที่มีความยาวมากกว่า 20 นาที : ด้วยความสามารถในการสตรีมออนไลน์ Qwen2-VL สามารถเข้าใจวิดีโอที่มีความยาวมากกว่า 20 นาทีได้ด้วยการตอบคำถาม บทสนทนา การสร้างเนื้อหา ฯลฯ ในรูปแบบวิดีโอคุณภาพสูง
ตัวแทนที่สามารถควบคุมโทรศัพท์มือถือ หุ่นยนต์ ฯลฯ ของคุณได้ : ด้วยความสามารถในการให้เหตุผลและการตัดสินใจที่ซับซ้อน Qwen2-VL สามารถรวมเข้ากับอุปกรณ์ต่างๆ เช่น โทรศัพท์มือถือ หุ่นยนต์ ฯลฯ เพื่อการทำงานอัตโนมัติตามสภาพแวดล้อมที่มองเห็นและคำแนะนำแบบข้อความ
การสนับสนุนหลายภาษา : เพื่อรองรับผู้ใช้ทั่วโลก นอกเหนือจากภาษาอังกฤษและจีนแล้ว ขณะนี้ Qwen2-VL รองรับการทำความเข้าใจข้อความในภาษาต่างๆ ภายในรูปภาพ รวมถึงภาษายุโรปส่วนใหญ่ ญี่ปุ่น เกาหลี อาหรับ เวียดนาม ฯลฯ
Naive Dynamic Resolution : ไม่เหมือนกับเมื่อก่อน Qwen2-VL สามารถจัดการความละเอียดของภาพได้ตามต้องการ โดยเชื่อมโยงภาพเหล่านั้นเป็นจำนวนโทเค็นภาพแบบไดนามิก มอบประสบการณ์การประมวลผลภาพที่เหมือนมนุษย์มากขึ้น

การฝังตำแหน่งโรตารีหลายรูปแบบ (M-ROPE) : แยกการฝังตำแหน่งออกเป็นส่วนๆ เพื่อจับภาพข้อความ 1 มิติ ภาพ 2 มิติ และวิดีโอ 3 มิติ ช่วยเพิ่มความสามารถในการประมวลผลหลายรูปแบบ

เรามีโมเดล Qwen2-VL แบบโอเพ่นซอร์ส ซึ่งรวมถึง Qwen2-VL-2B และ Qwen2-VL-7B ภายใต้ใบอนุญาต Apache 2.0 และ Qwen2-VL-72B ภายใต้ใบอนุญาต Qwen โมเดลเหล่านี้ได้รวมเข้ากับ Hugging Face Transformers, vLLM และเฟรมเวิร์กของบริษัทอื่นแล้ว เราหวังว่าคุณจะสนุกกับการใช้มัน!
19.09.2024: รุ่น Qwen2-VL-72B ที่ปรับแต่งตามคำสั่งและเวอร์ชันเชิงปริมาณ [AWQ, GPTQ-Int4, GPTQ-Int8] พร้อมใช้งานแล้ว เรายังได้เปิดตัวรายงาน Qwen2-VL ไปพร้อมๆ กันอีกด้วย
30.08.2024: เราได้เปิดตัวซีรีส์ Qwen2-VL แล้ว ขณะนี้มีรุ่น 2B และ 7B และรุ่น 72B สำหรับโอเพ่นซอร์สจะมาในเร็วๆ นี้ สำหรับรายละเอียดเพิ่มเติม โปรดตรวจสอบบล็อกของเรา!
| เกณฑ์มาตรฐาน | SoTA ก่อนหน้า (LVLM โอเพ่นซอร์ส) | คลอดด์-3.5 ซอนเน็ต | GPT-4o | คิวเวน2-VL-72B - | คิวเวน2-VL-7B - | คิวเวน2-VL-2B - |
|---|---|---|---|---|---|---|
| MMMU วาล | 58.3 | 68.3 | 69.1 | 64.5 | 54.1 | 41.1 |
| MMMU-โปร | 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 |
| วีซีอาร์ zh ง่าย ๆ | 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 |
| การทดสอบ MMT-Bench | 63.4 | - | 65.5 | 71.7 | 63.7 | 54.5 |
| เอ็มเอ็มสตาร์ | 67.1 | 62.2 | 63.9 | 68.3 | 60.7 | 48.0 |
| MMVet GPT-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 | 67.5 | 67.7 | 63.8 | 70.5 | 58.2 | 43.0 |
| แมทวิชั่น | 16.97 | - | 30.4 | 25.9 | 16.3 | 12.4 |
| เกณฑ์มาตรฐาน | SoTA ก่อนหน้า (LVLM โอเพ่นซอร์ส) | ราศีเมถุน 1.5-Pro | GPT-4o | คิวเวน2-VL-72B - | คิวเวน2-VL-7B - | คิวเวน2-VL-2B - |
|---|---|---|---|---|---|---|
| เอ็มวีเบนช์ | 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 |
| วิดีโอ-MME (wo/w ซับ) | 66.3/69.6 | 75.0 / 81.3 | 71.9/77.2 | 71.2/77.8 | 63.3/69.0 | 55.6/60.4 |
| เกณฑ์มาตรฐาน | เมตริก | SoTA ก่อนหน้า | GPT-4o | คิวเวน2-VL-72B | |
|---|---|---|---|---|---|
| ทั่วไป | เอฟเอ็นคอล [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 | ||
| AI2THOR | อัลเฟรด ถูกต้อง-ไม่เห็น | เอสอาร์ | 67.7 [4] | - | 67.8 |
| GC | 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 ใน Zoo: ห่วงโซ่แห่งการดำเนินการ-ความคิดสำหรับตัวแทน GUI
ThinkBot: คำสั่งที่เป็นตัวเป็นตนตามด้วยการใช้เหตุผลแบบลูกโซ่ความคิด
MapGPT: การเตือนด้วยแผนที่พร้อมการวางแผนเส้นทางแบบปรับเปลี่ยนได้สำหรับการนำทางด้วยการมองเห็นและภาษา
แบ่งส่วนอะไรก็ได้
| โมเดล | เออาร์ | เด | ศ | มัน | เจ.เอ | เคโอ | ร | ไทย | วี | เฉลี่ย |
|---|---|---|---|---|---|---|---|---|---|---|
| คิวเวน2-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 |
| บทประพันธ์ของคลอดด์ 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 Transformers ล่าสุด และเราแนะนำให้คุณสร้างจากแหล่งที่มาด้วยคำสั่ง:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
หรือคุณอาจพบข้อผิดพลาดต่อไปนี้:
KeyError: 'qwen2_vl'
หมายเหตุ : transformers ล่าสุดปัจจุบันมีข้อบกพร่องเมื่อโหลดการกำหนดค่า Qwen2-VL ดังนั้นคุณจึงต้องติดตั้งหม้อแปลงเวอร์ชันเฉพาะดังที่กล่าวข้างต้น
เรามีชุดเครื่องมือที่จะช่วยให้คุณจัดการกับการป้อนข้อมูลด้วยภาพประเภทต่างๆ ได้สะดวกยิ่งขึ้น ราวกับว่าคุณกำลังใช้ API ซึ่งรวมถึง base64, URL และรูปภาพและวิดีโอที่แทรกไว้ คุณสามารถติดตั้งได้โดยใช้คำสั่งต่อไปนี้:
# ขอแนะนำอย่างยิ่งให้ใช้คุณสมบัติ `[decord]` เพื่อการโหลดวิดีโอที่เร็วขึ้น pip ติดตั้ง qwen-vl-utils[decord]
หากคุณไม่ได้ใช้ Linux คุณอาจไม่สามารถติดตั้ง decord จาก PyPI ได้ ในกรณีนั้น คุณสามารถใช้ pip install qwen-vl-utils ซึ่งจะกลับไปใช้ torchvision สำหรับการประมวลผลวิดีโอ อย่างไรก็ตาม คุณยังคงสามารถติดตั้ง decord จากแหล่งที่มาเพื่อใช้ในการโหลดวิดีโอได้
ที่นี่เราจะแสดงข้อมูลโค้ดเพื่อแสดงวิธีใช้โมเดลการแชทกับ transformers และ qwen_vl_utils :
จากหม้อแปลงนำเข้า Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils import process_vision_info# default: โหลดโมเดลบนอุปกรณ์ที่มีอยู่ model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "อัตโนมัติ")# เราแนะนำให้เปิดใช้งาน 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)ข้อความ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "image", "image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",
-
{"type": "text", "text": "อธิบายภาพนี้"},
-
-
]# การเตรียมการสำหรับการอนุมานข้อความ = 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")# การอนุมาน: การสร้าง outputgenerated_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)พิมพ์(output_text) # ข้อความที่มีหลายภาพและข้อความค้นหาข้อความ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "image", "image": "file:///path/to/image1.jpg"},
{"type": "image", "image": "file:///path/to/image2.jpg"},
{"type": "text", "text": "ระบุความคล้ายคลึงกันระหว่างภาพเหล่านี้"},
-
-
]# การเตรียมการสำหรับการอนุมานข้อความ = 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) :] สำหรับ 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)พิมพ์(output_text) # ข้อความที่มีรายการรูปภาพเป็นวิดีโอและข้อความค้นหาข้อความ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "video", "วิดีโอ": ["file:///path/to/frame1.jpg","file:///path/to/frame2.jpg","file:/// เส้นทาง/to/frame3.jpg","ไฟล์:///path/to/frame4.jpg",
-
-
{"type": "text", "text": "อธิบายวิดีโอนี้"},
-
-
]# ข้อความที่มีเส้นทางวิดีโอในเครื่องและข้อความค้นหาข้อความ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "video", "วิดีโอ": "file:///path/to/video1.mp4", "max_pixels": 360 * 420,"fps": 1.0,
-
{"type": "text", "text": "อธิบายวิดีโอนี้"},
-
-
]# ข้อความที่มี URL ของวิดีโอและข้อความค้นหาข้อความ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"ประเภท": "วิดีโอ", "วิดีโอ": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4",
-
{"type": "text", "text": "อธิบายวิดีโอนี้"},
-
-
]# การเตรียมการสำหรับการอนุมานข้อความ = 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) :] สำหรับ 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)พิมพ์(output_text) ความเข้ากันได้ของ URL วิดีโอส่วนใหญ่ขึ้นอยู่กับเวอร์ชันไลบรารีของบุคคลที่สาม รายละเอียดอยู่ในตารางด้านล่าง เปลี่ยนแบ็กเอนด์โดย FORCE_QWENVL_VIDEO_READER=torchvision หรือ FORCE_QWENVL_VIDEO_READER=decord หากคุณไม่ต้องการใช้ค่าเริ่มต้น
| แบ็กเอนด์ | HTTP | HTTPS |
|---|---|---|
| การมองเห็นคบเพลิง >= 0.19.0 | ||
| การมองเห็นคบเพลิง < 0.19.0 | ||
| ตกแต่ง |
# ข้อความตัวอย่างสำหรับข้อความอนุมานแบบแบตช์1 = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"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": "คุณเป็นใคร?"},
]# รวมข้อความสำหรับการประมวลผลเป็นชุดข้อความ = [ข้อความ1, ข้อความ2]# การเตรียมการสำหรับข้อความอนุมานแบบกลุ่ม = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)สำหรับ msg ในข้อความ]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")# Batch 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, สร้าง_ids )
]output_texts = processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True, clean_up_tokenization_spaces=False)พิมพ์(output_texts) เราขอแนะนำให้ผู้ใช้โดยเฉพาะผู้ที่อยู่ในจีนแผ่นดินใหญ่ใช้ ModelScope snapshot_download สามารถช่วยคุณแก้ไขปัญหาเกี่ยวกับการดาวน์โหลดจุดตรวจสอบได้
สำหรับรูปภาพที่ป้อน เรารองรับไฟล์ในเครื่อง, base64 และ URL สำหรับวิดีโอ ขณะนี้เรารองรับเฉพาะไฟล์ในเครื่องเท่านั้น
# คุณสามารถแทรกเส้นทางของไฟล์ในเครื่อง, URL หรือรูปภาพที่เข้ารหัส base64 ลงในตำแหน่งที่คุณต้องการในข้อความได้โดยตรง## เส้นทางของไฟล์ในเครื่อง = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "image", "image": "file:///path/to/your/image.jpg"},
{"type": "text", "text": "อธิบายภาพนี้"},
-
-
]## ข้อความ URL รูปภาพ = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "image", "image": "http://path/to/your/image.jpg"},
{"type": "text", "text": "อธิบายภาพนี้"},
-
-
]## ข้อความภาพที่เข้ารหัส 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
# resize_height และ resize_widthmessages = [
{"บทบาท": "ผู้ใช้", "เนื้อหา": [
{"type": "image", "image": "file:///path/to/your/image.jpg",resize_height": 280,"resize_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": "รูปภาพ"},
{"type": "รูปภาพ"},
{"type": "วิดีโอ"},
{"type": "text", "text": "สิ่งเหล่านี้มาจากวันหยุดพักผ่อนของฉัน"},
-
-
{"role": "assistant", "content": "ฉันยินดีที่จะอธิบายรูปภาพและวิดีโอให้คุณ คุณช่วยกรุณาให้บริบทเพิ่มเติมเกี่ยวกับวันหยุดพักผ่อนของคุณได้ไหม",
-
{"role": "user", "content": "เป็นการไปเที่ยวภูเขา คุณดูรายละเอียดในภาพและวิดีโอได้ไหม",
-
]# default:prompt_without_id = processor.apply_chat_template(conversation, add_รุ่น_prompt=True)# เอาต์พุตที่ยกเว้น: '<|im_start|>systemnคุณเป็นผู้ช่วยที่เป็นประโยชน์<|im_end|>n<|im_start|>usern<|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)# Excepted output: '<|im_start |>systemnคุณเป็นคนที่มีประโยชน์ Assistant.<|im_end|>n<|im_start|>usernPicture 1: <|vision_start|><|image_pad|><|vision_end|>สวัสดี สบายดีไหม<|im_end|>n<|im_start|>assistantnI' ฉันสบายดี ขอบคุณที่ถาม วันนี้ฉันจะช่วยคุณได้อย่างไร<|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|>สิ่งเหล่านี้มาจากฉัน vacation.<|im_end|>n<|im_start|>assistantnฉันยินดีที่จะอธิบายรูปภาพและวิดีโอให้กับคุณ คุณช่วยกรุณาให้บริบทเพิ่มเติมเกี่ยวกับวันหยุดพักผ่อนของคุณได้ไหม<|im_end|>n<|im_start|>usernเป็นการไปเที่ยวภูเขา คุณสามารถดูรายละเอียดในภาพและวิดีโอได้หรือไม่<|im_end|>n<|im_start|>assistantn'ขั้นแรก ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Flash Attention 2 เวอร์ชันล่าสุด:
pip ติดตั้ง -U flash-attn --no-build-isolation
นอกจากนี้ คุณควรมีฮาร์ดแวร์ที่เข้ากันได้กับ Flash-Attention 2 อ่านเพิ่มเติมเกี่ยวกับฮาร์ดแวร์ดังกล่าวในเอกสารประกอบอย่างเป็นทางการของ Flash Attention Repository FlashAttention-2 สามารถใช้ได้เฉพาะเมื่อมีการโหลดโมเดลใน torch.float16 หรือ torch.bfloat16
หากต้องการโหลดและรันโมเดลโดยใช้ Flash Attention-2 เพียงเพิ่ม attn_implementation="flash_attention_2" เมื่อโหลดโมเดลดังนี้:
จากหม้อแปลงนำเข้า Qwen2VLForConditionalGenerationmodel = <spa