1.モデル紹介
Qwen2-VLがリリースされてから5ヶ月間、多くの開発者がQwen2-VLの視覚言語モデルの上に新しいモデルを構築し、Qwenチームに貴重なフィードバックを提供してくれました。この間、Qwen チームは、より有用な視覚言語モデルの構築に注力してきました。本日、Qwenチームは、Qwenファミリーの最新メンバーであるQwen2.5-VLを発表します。
主な強化点
- 物事を視覚的に理解する:Qwen 2.5-VLは、花、鳥、魚、昆虫などの一般的なオブジェクトを認識できるだけでなく、画像内のテキスト、チャート、アイコン、グラフ、レイアウトの分析にも精通しています。
- Agenticity:Qwen2.5-VLは、コンピュータや携帯電話で使用できる推論・動的コマンドツールの機能を持ち、直接ビジュアルエージェントの役割を果たします。
- 長時間のビデオを理解し、イベントをキャプチャ:Qwen 2.5-VLは、1時間以上のビデオを理解することができ、今回は関連するビデオクリップをピンポイントでキャプチャする新しい機能を備えています。
- Qwen2.5-VLは、バウンディングボックスやポイントを生成することで、画像内のオブジェクトの位置を正確に特定し、座標や属性の安定したJSON出力を提供します。
- 構造化出力の生成:請求書、フォーム、表などのスキャンデータに対して、Qwen 2.5-VLは、財務、ビジネス、その他の分野での使用に有益な、コンテンツの構造化出力をサポートします。
モデル・アーキテクチャ:
- ビデオ理解のためのダイナミックな解像度とフレームレートのトレーニング:
動的FPSサンプリングを採用することで、動的解像度を時間次元に拡張し、モデルは様々なサンプルレートのビデオを理解できるようになりました。これに対応して、QwenチームはmRoPEを更新し、時間次元におけるIDおよび絶対時間アライメントを追加した。これにより、モデルは時間的順序と速度を学習し、最終的に特定の瞬間をピンポイントで特定する能力を獲得した。
- 合理的で効率的なビジュアル・コーダー
ViTのアーキテクチャは、SwiGLUとRMSNormによってさらに最適化され、Qwen 2.5 LLMの構造に合わせている。
このオープンソースには3つのモデルがあり、パラメータは30億、70億、720億である。このレポには、コマンドチューニングされた72B Qwen2.5-VLモデルが含まれています。
モデル・アンサンブル
https://www.modelscope.cn/collections/Qwen25-VL-58fbb5d31f1d47
モデリング経験:
https://chat.qwenlm.ai/
テックブログ
https://qwenlm.github.io/blog/qwen2.5-vl/
コード・アドレス
https://github.com/QwenLM/Qwen2.5-VL
2.モデリング効果
モデリング評価
ホセ・マリア・ゴンサレス氏
3.モデル化された推論
変圧器を使った推論
Qwen2.5-VLのコードは最新のトランスフォーマーにあり、コマンドを使ってソースからビルドすることを推奨します:
pip install git+https://github.com/huggingface/transformers
APIと同じように、さまざまな種類の視覚的入力を簡単に扱うためのツールキットが提供されている。これには、base64、URL、インターリーブ画像や動画が含まれる。以下のコマンドでインストールできる:
pip install qwen-vl-utils[decord]==0.0.8
コードについての推論:
from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor from qwen_vl_utils import process_vision_info from modelscope import snapshot_download # モデルのダウンロードとロード model_dir = snapshot_download("Qwen/Qwen2.5-VL-3B-Instruct") # デフォルト:利用可能なデバイスにモデルをロードします。 model = Qwen2_5_VLForConditionalGeneration.from_pretrained( model_dir, torch_dtype="auto", device_map="auto" ) # オプション: flash_attention_2 を有効にして、高速化とメモリ節約を改善します。 # model = Qwen2_5_VLForConditionalGeneration.from_pretrained( # "Qwen/Qwen2.5-VL-3B-Instruct", # torch_dtype = "Qwen2_5_VLForConditionalGeneration.from_pretrained() # torch_dtype=torch.bfloat16、 # attn_implementation="flash_attention_2"、 # device_map="auto"、 # ) # デフォルトのプロセッサをロードする processor = AutoProcessor.from_pretrained(model_dir) # オプション:ビジュアルのカスタム最小ピクセルと最大ピクセルを設定する トークン 範囲 # min_pixels = 256 * 28 * 28 # max_pixels = 1280 * 28 * 28 # processor = AutoProcessor.from_pretrained() # "Qwen/Qwen2.5-VL-3B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels # ) # 入力メッセージの定義 メッセージ = [ { "役割": "ユーザー", "内容": [ ]。 「コンテンツ": [ { "type": "image", "image": "", "content": [ { 「image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"、 }, {タイプ": "テキスト", "テキスト": "この画像を説明してください。} ], } } ] # 推論のための入力の準備 text = processor.apply_chat_template(messages, tokenise=False, add_generation_prompt=True) image_inputs, video_inputs = process_vision_info(messages) inputs = processor( text=[text], images=image_inputs, video_inputs = processor( images=image_inputs, videos=video_inputs videos=video_inputs、 images=image_inputs, videos=video_inputs, padding=True、 return_tensors="pt"、 ) inputs = inputs.to("cuda") #推論:出力を生成する generated_ids = model.generate(**inputs, max_new_tokens=128) generate_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_tokenisation_spaces=False ) # 生成された出力をプリントする print(output_text)
Magic Hitch API-Inferenceを使用して直接呼び出されます。
また、Magic MatchプラットフォームのAPI-Inferenceは、Qwen2.5-VLシリーズのモデルを初めてサポートする。Magic Matchのユーザーは、APIコールを通じて直接利用することができます。API-Inferenceの具体的な使用方法は、モデルのページ(例:https://www.modelscope.cn/models/Qwen/Qwen2.5-VL-72B-Instruct)で確認できます:
またはAPI-Inferenceのドキュメントを参照:
https://www.modelscope.cn/docs/model-service/API-Inference/intro
Qwen/Qwen2.5-VL-72B-Instructモデルを使用してAPIを呼び出す例を以下の画像に示す:
from openai import OpenAI # OpenAIクライアントを初期化する client = OpenAI( api_key="", # モデルスコープトークン base_url="https://api-inference.modelscope.cn/v1" ) # チャット完了リクエストを作成する response = client.chat.completions.create( model="Qwen/Qwen2.5-VL-72B-Instruct", # ModelScope Model-Id messages=[ { "role": "user"、 "content": [ { "type": "image_url"、 "image_url": { "url": "https://modelscope.oss-cn-beijing.aliyuncs.com/demo/images/bird-vl.jpg" } }, { "type": "text", { "text": ( "図中の鳥の数を、頭だけ出している鳥も含めて数えなさい。 正確を期すために、まず" "それらのキーポイントを検出し、それから総数を数えてください。" 正確を期すために、まず" "それらのキーポイントを検出し、それから総数を数えてください。" ) }, } ), } } ), ], } stream=True ) # レスポンスをストリームする for chunk in response. print(chunk.choices[0].delta.content, end='', flush=True)
4.モデルの微調整
Qwen/Qwen2.5-VL-7B-Instructのファインチューニングにおけるms-swiftの利用を紹介します。ms-swiftは、ラージモデルとマルチモーダルラージモデルのファインチューニングデプロイメントフレームワークが公式に提供するマジックライドコミュニティです。ms-swiftのオープンソースアドレスです:
https://github.com/modelscope/ms-swift
ここでは、実行可能な微調整のデモを示し、自己定義データセットのフォーマットを示す。
微調整を始める前に、環境が整っていることを確認してください。
git clone https://github.com/modelscope/ms-swift.git cd ms-swift pip install -e .
画像OCR微調整スクリプトは以下の通り:
max_pixels=1003520 cuda_visible_devices=0 swift sft ---model Qwen/Qwen2.5-VL-7B-Instruct ¦ AI-ModelScope/LaTeX_OCR:human_handwrite --dataset AI-ModelScope/LaTeX_OCR:human_handwrite#20000 ┣ ---train_type lora ---train_type lora ---train_type lora ◆ ---torch_dtype bfloat16 ◆ ---num_train_epoat --num_train_epochs 1 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --学習速度 1e-4 --lora_rank 8 --lora_alpha 32 ---target_modules all-linear ୧-͈ᴗ-͈ᴗ --freeze_vit true --勾配蓄積ステップ数 16 ---eval_steps 50 ---save_steps 50 ---save_total_limit 5 \ --logging_steps 5 ---max_length 2048 --output_dir 出力先 --warmup_ratio 0.05 ¦ -dataoader_num --dataloader_num_workers 4
トレーニングビデオのメモリリソース:
ビデオの微調整スクリプトは以下の通り:
# VIDEO_MAX_PIXELS その他のパラメータの意味を確認できます: # https://swift.readthedocs.io/zh-cn/latest/Instruction/.html#id18 nproc_per_node=2 CUDA_VISIBLE_DEVICES=0,1 NPROC_PER_NODE=$nproc_per_node ¦ビデオの最大画素数 video_max_pixels=100352 ⅳビデオの最大ピクセル数 fps_max_frames=24 swift sft ---モデルQwen/Qwen2.5-VL-7B-Instruct(Qwen2.5-VL-7B-Instruct) -データセット swift/VideoChatGPT:all ୧---train_type lora ---train_type lora ---train_type lora ◆ ---torch_dtype bfloat16 ◆ ---num_train_epoat ---torch_dtype bfloat16 ¦ -num_train_epochs 1 --per_device_train_batch_size 1 ¦デバイス毎のトレーニングバッチ数 --per_device_eval_batch_size 1 \ --学習速度 1e-4 --lora_rank 8 --lora_alpha 32 ---target_modules all-linear ୧-͈ᴗ-͈ᴗ --freeze_vit true gradient_蓄積ステップ $(expr 16 / $nproc_per_node) ୧--eval_steps 50 --eval_steps 50 ---save_steps 50 ---save_total_limit 5 ୧-͈ᴗ-͈⁎ --logging_steps 5 --logging_steps 5 ---max_length 2048 --output_dir 出力先 --warmup_ratio 0.05 ¦ -dataoader_num --dataloader_num_workers 4 --deepspeed zero2
トレーニングビデオのメモリリソース:
カスタム・データセットの書式は以下のとおり(システム・フィールドはオプション)。--dataset `と指定するだけでよい:
{"messages": [{"role": "user", "content": "浙江省の省都はどこですか?" }]]。役割": "アシスタント", "内容": "浙江省の省都は杭州にあります。 {"messages": [{"role": "user", "content":"What's the difference between the two images"}, {"role": "assistant", "content": "The first one is a kitten, the second is a puppy"}], "images": ["/xxx/x.jpg", "xxx/x.png"]}. { "messages": [{ "role": "system", "content": "あなたは便利で無害なアシスタントです"}, { "role": "user", "content": "ビデオの中身"}, { "role": "assistant", "content": "In the videoは草むらを走る子犬です"}], "videos": ["/xxx/x.mp4"]}。
接地タスクの微調整スクリプトは以下の通り:
cuda_visible_devices=0 \ max_pixels=1003520 ¦。 swift sft ---model Qwen/Qwen2.5-VL-7B-Instruct ¦ AI-ModelScope/coco#20000 --dataset 'AI-ModelScope/coco#20000' ┣ ---train_type lora ---train_type lora ---train_type lora --num_train_epochs 1 \ --per_device_train_batch_size1(バッチサイズ1) --per_device_eval_batch_size 1 \ --学習速度 1e-4 --lora_rank 8 --lora_alpha 32 ---target_modules all-linear ୧-͈ᴗ-͈ᴗ --freeze_vit true --Γ Γ Γ Γ Γ Γ Γ Γ Γ Γ Γ Γ Γ Γ ---eval_steps 100 ---save_steps 100 ---save_total_limit 2 \ --logging_steps 5 ---max_length 2048 --output_dir 出力先 --warmup_ratio 0.05 ¦ -dataoader_num --dataloader_num_workers 4 ୧-͈ᴗ-͈⁎ -dataset_num_workers 4 --dataset_num_proc 4 ┣ -dataset_num_proc 4
トレーニングビデオのメモリリソース:
グラウンディング・タスクのカスタム・データセットのフォーマットは以下の通り:
{"messages": [{"role": "system", "content": "あなたは親切なアシスタントです。"}, {"role": "user", "content": "画像の説明"}, {"role": "assistant", "content": "とが浜辺で遊んでいる"}", "images": ["/xxx/x.jpg"], "objects": {"ref": ["a dog", "a woman"], "bbox": [[331.5、761.4, 853.5, 1594.8], [676.5, 685.8, 1099.5, 1427.4]]}} {"messages": [{"role": "system", "content": "あなたは役に立つアシスタントです。"}, {"role": "user", "content": "画像内のを探してください。"assistant", "content": ""}], "images": ["/xxx/x.jpg"], "objects": {"ref": ["sheep"], "bbox": [[90.9, 160.8, 135, 212.8], [360.9, 480.8、495, 532.8]]}}
トレーニングが完了したら、トレーニングで得られた検証セットに対して、以下のコマンドを使って推論を行う。
ここで `--adapters` は、トレーニングによって生成された最後のチェックポイントフォルダに置き換える必要があります。 adaptersフォルダにはトレーニングのパラメータファイルが格納されているため、`--model`を追加で指定する必要はありません:
cuda_visible_devices=0
迅速な推論
--アダプタ output/vx-xxx/checkpoint-xxx
--stream false
--最大バッチサイズ 1
--load_data_args true
--max_new_tokens 2048
モデルを ModelScope にプッシュします:
cuda_visible_devices=0
スイフトエクスポート
--アダプタ output/vx-xxx/checkpoint-xxx
-push_to_hub真
--hub_model_id ''
--hub_token ''