1 年間のたゆまぬ努力を経て、本日、 Qwen2-VL をリリースできることを嬉しく思います。 Qwen2-VL は、Qwen モデル ファミリのビジョン言語モデルの最新バージョンです。
さまざまな解像度と比率の画像の SoTA 理解: Qwen2-VL は、MathVista、DocVQA、RealWorldQA、MTVQA などの視覚理解ベンチマークで最先端のパフォーマンスを実現します。
20 分以上のビデオの理解: オンライン ストリーミング機能を備えた Qwen2-VL は、高品質のビデオベースの質問応答、ダイアログ、コンテンツ作成などにより 20 分を超えるビデオを理解できます。
携帯電話やロボットなどを操作できるエージェント: 複雑な推論と意思決定の能力を備えた Qwen2-VL は、携帯電話やロボットなどのデバイスと統合して、視覚環境とテキスト指示に基づいて自動操作を行うことができます。
多言語サポート: 英語と中国語に加えて世界中のユーザーにサービスを提供するために、Qwen2-VL は、ほとんどのヨーロッパ言語、日本語、韓国語、アラビア語、ベトナム語などを含む、画像内のさまざまな言語のテキストの理解をサポートするようになりました。
単純な動的解像度: 以前とは異なり、Qwen2-VL は任意の画像解像度を処理し、それらを動的数のビジュアル トークンにマッピングして、より人間らしいビジュアル処理エクスペリエンスを提供します。
マルチモーダル回転位置エンベディング (M-ROPE) : 位置エンベディングをパーツに分解して、1D テキスト、2D ビジュアル、および 3D ビデオの位置情報をキャプチャし、マルチモーダル処理機能を強化します。
当社は、Apache 2.0 ライセンスに基づく Qwen2-VL-2B および Qwen2-VL-7B と、Qwen ライセンスに基づく Qwen2-VL-72B を含む Qwen2-VL モデルをオープンソース化しています。これらのモデルは、Hugging Face Transformers、vLLM、およびその他のサードパーティ フレームワークと統合されるようになりました。ぜひご利用ください。
2024.09.19: 命令チューニングされた Qwen2-VL-72B モデルとその量子化バージョン [AWQ、GPTQ-Int4、GPTQ-Int8] が利用可能になりました。 Qwen2-VLの論文も同時に公開しました。
2024.08.30: 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 |
チャートQAテスト | 88.4 | 90.8 | 85.7 | 88.3 | 83.0 | 73.5 |
TextVQA値 | 84.4 | - | - | 85.5 | 84.3 | 79.7 |
OCRベンチ | 852 | 788 | 736 | 877 | 845 | 794 |
MTVQA | 17.3 | 25.7 | 27.8 | 30.9 | 25.6 | 18.1 |
ビデオデッキを簡単に | 84.67 | 63.85 | 91.55 | 91.93 | 89.70 | 81.45 |
ビデオデッキ簡単 | 9月22日 | 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ベンチテスト | 63.4 | - | 65.5 | 71.7 | 63.7 | 54.5 |
MMスター | 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-プロ | GPT-4o | クウェン2-VL-72B (??) | クウェン2-VL-7B (??) | クウェン2-VL-2B (??) |
---|---|---|---|---|---|---|
MVベンチ | 69.6 | - | - | 73.6 | 67.0 | 63.2 |
PerceptionTestテスト | 66.9 | - | - | 68.0 | 62.3 | 53.9 |
EgoSchemaテスト | 62.0 | 63.2 | 72.2 | 77.9 | 66.7 | 54.9 |
ビデオ-MME (サブウーファーあり/サブウーファーあり) | 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 | |
---|---|---|---|---|---|
一般的な | Fnコール[1] | TM | - | 90.2 | 93.1 |
EM | - | 50.0 | 53.2 | ||
ゲーム | 数直線 | SR | 89.4 [2] | 91.5 | 100.0 |
ブラックジャック | SR | 40.2 [2] | 34.5 | 42.6 | |
EZポイント | SR | 50.0 [2] | 85.5 | 100.0 | |
Point24 | SR | 2.6 [2] | 3.0 | 4.5 | |
アンドロイド | アイツ | TM | 83.0 [3] | 70.0 | 89.6 |
EM | 47.7 [3] | 35.3 | 72.1 | ||
AI2THOR | アルフレッド有効-未確認 | SR | 67.7 [4] | - | 67.8 |
GC | 75.3 [4] | - | 75.8 | ||
VLN | R2R有効 - 未確認 | SR | 79.0 | 43.7 [5] | 51.7 |
REVERIE有効-未確認 | SR | 61.0 | 31.6 [5] | 31.0 |
SR、GC、TM、および EM は、成功率、目標条件の成功、タイプ一致、完全一致の略です。 ALFRED は SAM によってサポートされています[6] 。
Qwen チームによる自己キュレートされた関数呼び出しベンチマーク
強化学習による意思決定エージェントとしての大規模な視覚言語モデルの微調整
Android in the Zoo: GUI エージェントのためのアクションの連鎖と思考
ThinkBot: 思考連鎖推論による具体化された命令
MapGPT: 視覚と言語によるナビゲーションのための適応経路計画を備えた地図ガイド付きプロンプト
何でもセグメント化します。
モデル | AR | DE | フランス | それ | JA | KO | RU | TH | VI | 平均 |
---|---|---|---|---|---|---|---|---|---|---|
クウェン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 を使用する方法を示す簡単な例を示します。モデルスコープと?トランスフォーマー。
Qwen2-VL のコードは最新のハグ顔トランスフォーマーに含まれており、次のコマンドを使用してソースからビルドすることをお勧めします。
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
または、次のエラーが発生する可能性があります。
KeyError: 'qwen2_vl'
注: 現在の最新バージョンのtransformers
には Qwen2-VL 設定をロードするときにバグがあるため、上記のように特定のバージョンのトランスフォーマーをインストールする必要があります。
API を使用しているかのように、さまざまな種類のビジュアル入力をより便利に処理できるツールキットを提供します。これには、base64、URL、インターリーブされた画像とビデオが含まれます。次のコマンドを使用してインストールできます。
# ビデオの読み込みを高速化するには、`[decord]` 機能を使用することを強くお勧めします。pip install qwen-vl-utils[decord]
Linux を使用していない場合は、PyPI からdecord
をインストールできない可能性があります。その場合、ビデオ処理に torchvision を使用するようにフォールバックするpip install qwen-vl-utils
使用できます。ただし、ソースから Decord をインストールして、ビデオをロードするときに Deccord を使用することはできます。
ここでは、 transformers
とqwen_vl_utils
でチャット モデルを使用する方法を示すコード スニペットを示します。
from トランスフォーマー import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils import process_vision_info# デフォルト: 利用可能なデバイスにモデルをロードしますmodel = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "auto")# 特に複数の画像とビデオのシナリオで、高速化とメモリ節約を向上させるために、flash_attention_2 を有効にすることをお勧めします。 bfloat16,# attn_implementation="flash_attention_2",# device_map="auto",# )# default processerprocessor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# 画像ごとのビジュアル トークン数のデフォルト範囲モデルの値は 4 ~ 16384 です。# パフォーマンスとコストのバランスを取るために、トークンの範囲を 256 ~ 1280 にするなど、必要に応じて min_pixels と max_pixels を設定できます。# 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)messages = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "画像","画像": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }、 {"type": "text", "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")# 推論: 出力の生成generated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs .input_ids、generated_ids) ]output_text =processor.batch_decode(generated_ids_trimmed、skip_special_tokens=True、clean_up_tokenization_spaces=False)print(output_text)
# 複数の画像とテキストを含むメッセージ querymessages = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "画像", "画像": "file:///path/to/image1.jpg"}, {"タイプ": "画像", "画像": "file:///path/to/image2.jpg"}, {"type": "text", "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) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ]output_text =processor.batch_decode(generated_ids_trimmed、skip_special_tokens=True、clean_up_tokenization_spaces=False)print(output_text)
# ビデオとしての画像リストとテキストのクエリメッセージを含むメッセージ = [ {"役割": "ユーザー","コンテンツ": [ {"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": "このビデオについて説明します。"}, ]、 } ]# ローカルビデオパスとテキストクエリメッセージを含むメッセージ = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "ビデオ","ビデオ": "file:///path/to/video1.mp4","最大ピクセル": 360 * 420,"fps": 1.0, }、 {"type": "text", "text": "このビデオについて説明します。"}, ]、 } ]# ビデオ URL とテキスト クエリを含むメッセージmessages = [ {"役割": "ユーザー","コンテンツ": [ {"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }、 {"type": "text", "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) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ]output_text =processor.batch_decode(generated_ids_trimmed、skip_special_tokens=True、clean_up_tokenization_spaces=False)print(output_text)
ビデオ URL の互換性は、サードパーティのライブラリのバージョンに大きく依存します。詳細は以下の表に記載されています。デフォルトのものを使用したくない場合は、 FORCE_QWENVL_VIDEO_READER=torchvision
またはFORCE_QWENVL_VIDEO_READER=decord
によってバックエンドを変更します。
バックエンド | HTTP | HTTPS |
---|---|---|
トーチビジョン >= 0.19.0 | ✅ | ✅ |
トーチビジョン < 0.19.0 | ❌ | ❌ |
装飾 | ✅ | ❌ |
# バッチ推論のサンプルメッセージmessages1 = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "画像", "画像": "file:///path/to/image1.jpg"}, {"タイプ": "画像", "画像": "file:///path/to/image2.jpg"}, {"type": "text", "text": "これらの写真に共通する要素は何ですか?"}, ]、 } ]メッセージ2 = [ {"role": "system", "content": "あなたは役に立つアシスタントです。"}, {"役割": "ユーザー", "コンテンツ": "あなたは誰ですか?"}, ]# バッチ処理用のメッセージを結合messages = [messages1,messages2]# バッチ推論の準備texts = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)for msg inmessages]image_inputs, video_inputs = process_vision_info(messages)inputs =processor (テキスト = テキスト、画像 = 画像入力、ビデオ = ビデオ入力、パディング = True、return_tensors = "pt", )inputs = inputs.to("cuda")# バッチ推論generated_ids = model.generate(**inputs, max_new_tokens=128)generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids ) ]output_texts =processor.batch_decode(generated_ids_trimmed、skip_special_tokens=True、clean_up_tokenization_spaces=False)print(output_texts)
特に中国本土のユーザーには、ModelScope を使用することを強くお勧めします。 snapshot_download
チェックポイントのダウンロードに関する問題の解決に役立ちます。
入力画像については、ローカル ファイル、base64、および URL がサポートされています。ビデオについては、現在ローカル ファイルのみがサポートされています。
# ローカル ファイル パス、URL、または Base64 でエンコードされた画像をテキスト内の任意の位置に直接挿入できます。## Local file pathmessages = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "画像", "画像": "file:///path/to/your/image.jpg"}, {"type": "text", "text": "この画像について説明します。"}, ]、 } ]## 画像 URL メッセージ = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "画像", "画像": "http://path/to/your/image.jpg"}, {"type": "text", "text": "この画像について説明します。"}, ]、 } ]## Base64 でエンコードされたイメージメッセージ = [ {"役割": "ユーザー","コンテンツ": [ {"タイプ": "イメージ", "イメージ": "データ:イメージ;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)
さらに、モデルに入力される画像サイズをきめ細かく制御するための 2 つの方法が提供されています。
正確な寸法を指定する: 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": "text", "text": "これらは私の休暇中のものです。"}, ]、 }、 {"role": "assistant","content": "画像とビデオについて説明させていただきます。休暇について詳しく説明していただけますか?", }、 {"role": "user","content": "山への旅行でした。画像とビデオで詳細を確認できますか?", }、 ]#default:prompt_without_id =processor.apply_chat_template(conversation, add_generation_prompt=True)# 例外的な出力: '<|im_start|>systemnあなたは役に立つアシスタントです。<|im_end|>n<|im_start|>usern<|vision_start|>< |image_pad|><|vision_end|>こんにちは、お元気ですか?<|im_end|>n<|im_start|>アシスタントn元気です、ご質問いただきありがとうございます。今日はどのようにお手伝いできますか?<|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|>アシスタントn の画像とビデオについて説明させていただきます。あなた。休暇についてもう少し詳しく教えていただけますか?<|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)# 例外的な出力: '<|im_start |>systemnあなたは役に立つアシスタントです。<|im_end|>n<|im_start|>usern図 1: <|vision_start|><|image_pad|><|vision_end|>こんにちは、お元気ですか?<|im_end|>n< |im_start|>アシスタントn私は元気です、ご質問いただきありがとうございます。今日はどのようにお手伝いできますか?<|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|>アシスタントn画像やビデオについて説明させていただきます。休暇についてもう少し詳しく教えていただけますか?<|im_end|>n<|im_start|>usernそれは山への旅行でした。画像とビデオで詳細を確認できますか?<|im_end|>n<|im_start|>assistantn'
まず、Flash Attendant 2 の最新バージョンを必ずインストールしてください。
pip install -U flash-attn --no-build-isolation
また、Flash-tention 2 と互換性のあるハードウェアが必要です。詳細については、flash tention リポジトリの公式ドキュメントを参照してください。 FlashAttendant-2 は、モデルがtorch.float16
またはtorch.bfloat16
にロードされている場合にのみ使用できます。
Flash アテンション-2 を使用してモデルをロードして実行するには、次のようにモデルをロードするときにattn_implementation="flash_attention_2"
を追加するだけです。
トランスフォーマーから import Qwen2VLForConditionalGenerationmodel =