หลังจากความพยายามอย่างไม่หยุดยั้งตลอดหนึ่งปี วันนี้เรารู้สึกตื่นเต้นที่จะเปิดตัว 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",# )# default processorprocessor = 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# processor = 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 (ข้อความ) อินพุต = โปรเซสเซอร์ (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คุณคือผู้ช่วยที่เป็นประโยชน์<|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|>assistantnI'd ยินดีอธิบายภาพและวิดีโอให้กับคุณ คุณช่วยกรุณาให้บริบทเพิ่มเติมเกี่ยวกับวันหยุดพักผ่อนของคุณได้ไหม<|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 Repository FlashAttention-2 สามารถใช้ได้เฉพาะเมื่อมีการโหลดโมเดลใน torch.float16
หรือ torch.bfloat16
หากต้องการโหลดและรันโมเดลโดยใช้ Flash Attention-2 เพียงเพิ่ม attn_implementation="flash_attention_2"
เมื่อโหลดโมเดลดังนี้:
จากหม้อแปลงนำเข้า Qwen2VLForConditionalGenerationmodel =