「Qwen2.5-Omni」を試す
モデルは2つ
Qwen/Qwen2.5-Omni
概要
はじめに
Qwen2.5-Omniは、テキスト、画像、音声、動画など多様なモダリティを認識しつつ、テキストと自然な音声の応答をストリーミング形式で同時に生成するよう設計された、エンドツーエンドのマルチモーダルモデルです。
referred from https://huggingface.co/Qwen/Qwen2.5-Omni-3B主な特長
Omniかつ新規性のあるアーキテクチャ: Thinker-Talkerアーキテクチャを提案します。これは、テキスト、画像、音声、動画などの多様なモダリティを認識しながら、テキストおよび自然音声の応答をストリーミング形式で同時生成するエンドツーエンドのマルチモーダルモデルです。また、動画入力のタイムスタンプと音声を同期させるための新しい位置埋め込み手法「TMRoPE(Time-aligned Multimodal RoPE)」を提案します。
リアルタイム音声・ビデオチャット: 完全なリアルタイム対話に対応したアーキテクチャにより、チャンク単位の入力と即時の出力をサポートします。
自然で頑健な音声生成: 多くの既存のストリーミングおよび非ストリーミング手法を上回る性能を示し、音声生成において優れた頑健性と自然さを実現します。
モダリティ全体での高性能: 同等のサイズの単一モダリティモデルと比較したベンチマークにおいて、すべてのモダリティで卓越した性能を示します。Qwen2.5-Omniは、音声において同等サイズのQwen2-Audioを上回り、Qwen2.5-VL-7Bと同等の性能を達成しています。
エンドツーエンドの音声命令追従性能も優秀: Qwen2.5-Omniは、テキスト入力に対する性能に匹敵するレベルでエンドツーエンドの音声命令追従を実現しており、MMLUやGSM8Kなどのベンチマークでもその有効性が示されています。
モデルアーキテクチャ
referred from https://huggingface.co/Qwen/Qwen2.5-Omni-3Bパフォーマンス
私たちは、Qwen2.5-Omniの包括的な評価を実施しました。本モデルは、同等サイズの単一モダリティモデルや、Qwen2.5-VL-7B、Qwen2-Audio、Gemini-1.5-proといったクローズドソースモデルと比較して、すべてのモダリティにおいて高い性能を示しました。複数のモダリティ統合を要するタスク(例:OmniBench)では、Qwen2.5-Omniは最先端の性能を達成しました。また、単一モダリティのタスクにおいても、音声認識(Common Voice)、翻訳(CoVoST2)、音声理解(MMAU)、画像推論(MMMU、MMStar)、動画理解(MVBench)、音声生成(Seed-tts-evalおよび主観的自然さ)といった分野で卓越した性能を発揮しています。
referred from https://huggingface.co/Qwen/Qwen2.5-Omni-3B
なお必要なGPUのVRAMサイズが記載されている
最小 GPU メモリ要件
モデル 精度 15秒動画 30秒動画 60秒動画 Qwen-Omni-3B FP32 89.10 GB 推奨しません 推奨しません Qwen-Omni-3B BF16 18.38 GB 22.43 GB 28.22 GB Qwen-Omni-7B FP32 93.56 GB 推奨しません 推奨しません Qwen-Omni-7B BF16 31.11 GB 41.85 GB 60.19 GB 注:上記の表は、
transformers
を使用した推論の理論上の最小メモリ要件を示しており、BF16
はattn_implementation="flash_attention_2"
でテストされています。ただし、実際のメモリ使用量は通常、これの 1.2 倍以上になります。詳細については、こちらのリンク先のリソースをご覧ください。
とりあえず3BモデルをColaboratoryで試してみる。上の表を参考に最初はL4でやってみたけどあえなく"CUDA out of memory"になったので、A100で。
transformersを最新のものに入れ替え。
!pip uninstall -y transformers
!pip install git+https://github.com/huggingface/transformers@v4.51.3-Qwen2.5-Omni-preview
!pip install accelerate
マルチモーダル入力用のツールキットをインストール。動画の高速な処理のためにdecord
extraを有効にするのが推奨されている。
pip install qwen-omni-utils[decord] -U
あとFlashAttention2も推奨されているのでインストール
!pip install flash-attn --no-build-isolation
モデルとプロセッサをロード
import soundfile as sf
from transformers import Qwen2_5OmniForConditionalGeneration, Qwen2_5OmniProcessor
from qwen_omni_utils import process_mm_info
# モデルとプロセサをロード
model_name = "Qwen/Qwen2.5-Omni-3B"
model = Qwen2_5OmniForConditionalGeneration.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto",
attn_implementation="flash_attention_2",
)
processor = Qwen2_5OmniProcessor.from_pretrained(model_name)
モデルロード時点でのVRAM消費は約12GBというところ。T4だとちょっと厳しそう。
Thu May 1 00:17:30 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100-SXM4-40GB Off | 00000000:00:04.0 Off | 0 |
| N/A 31C P0 46W / 400W | 11949MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
では推論。サンプルコードでは以下のような動画を入力として使っている(以下は画像)
動画内の音声は以下のような感じ
Hello, take a look at what I am drawing.
(日本語訳: こんにちは、私が描いているものを見てください。)
conversation = [
{
"role": "system",
"content": [
{"type": "text", "text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."}
],
},
{
"role": "user",
"content": [
{"type": "video", "video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2.5-Omni/draw.mp4"},
],
},
]
# 動画内のオーディオを使用する
USE_AUDIO_IN_VIDEO = True
# 推論準備
text = processor.apply_chat_template(
conversation,
add_generation_prompt=True,
tokenize=False
)
audios, images, videos = process_mm_info(
conversation,
use_audio_in_video=USE_AUDIO_IN_VIDEO
)
inputs = processor(
text=text,
audio=audios,
images=images,
videos=videos,
return_tensors="pt",
padding=True,
use_audio_in_video=USE_AUDIO_IN_VIDEO
)
inputs = inputs.to(model.device).to(model.dtype)
# 推論: テキストとオーディオで出力を生成
text_ids, audio = model.generate(**inputs, use_audio_in_video=USE_AUDIO_IN_VIDEO)
text = processor.batch_decode(text_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(text)
sf.write(
"output.wav",
audio.reshape(-1).detach().cpu().numpy(),
samplerate=24000,
)
約1分ほどで結果が出力された
["system\nYou are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.\nuser\n\nassistant\nOh, that's a cool drawing! It looks like you're drawing a guitar. You're using a stylus, right? Have you been practicing a lot? If you want, you can show me more of your drawings."]
Oh, that's a cool drawing! It looks like you're drawing a guitar. You're using a stylus, right? Have you been practicing a lot? If you want, you can show me more of your drawings.
(日本語訳: それはかっこいい絵ですね!ギターを描いているように見えます。スタイラスを使っていますか?たくさん練習していますか?もしよければ、もっと絵を見せてください。)
あと、出力された音声。
で、日本語でやる場合、システムプロンプトは日本語に変えたいところだけども、システムプロンプトを変更するとこんなWARNINGが出る
WARNING:root:System prompt modified, audio output may not work as expected. Audio output mode only works when using default system prompt 'You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.'
Usage Tipsにあるように、推論結果の出力に音声を使う場合はどうもシステムプロンプトを変更できない様子・・・
使用上の注意
音声出力の指示
ユーザーが音声出力を必要とする場合、システムプロンプトを「あなたは、アリババグループ、Qwen チームによって開発された、聴覚および視覚入力を認識し、テキストや音声を生成することができる仮想人間、Qwen です。」に設定する必要があります。そうしないと、音声出力が正常に機能しない場合があります。
推論後のVRAMは約21GBというところ。
Thu May 1 00:24:12 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100-SXM4-40GB Off | 00000000:00:04.0 Off | 0 |
| N/A 31C P0 46W / 400W | 20625MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
日本語が含まれたオーディオファイルを入力に使ってみる。以下のような発話が含まれているWAVファイルを用意した。
競馬の魅力について5つリストアップして
conversation = [
{
"role": "system",
"content": [
{"type": "text", "text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."}
],
},
{
"role": "user",
"content": [
{"type": "audio", "audio": "sample_query.wav"},
]
}
]
USE_AUDIO_IN_VIDEO = True
text = processor.apply_chat_template(
conversation,
add_generation_prompt=True,
tokenize=False
)
audios, images, videos = process_mm_info(
conversation,
use_audio_in_video=USE_AUDIO_IN_VIDEO
)
inputs = processor(
text=text,
audio=audios,
images=images,
videos=videos,
return_tensors="pt",
padding=True,
use_audio_in_video=USE_AUDIO_IN_VIDEO
)
inputs = inputs.to(model.device).to(model.dtype)
text_ids, audio = model.generate(**inputs, use_audio_in_video=USE_AUDIO_IN_VIDEO)
text = processor.batch_decode(text_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(text)
sf.write(
"output.wav",
audio.reshape(-1).detach().cpu().numpy(),
samplerate=24000,
)
結果。中国語になっていた。
['system\nYou are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.\nuser\n\nassistant\n嗯…首先呢,比赛的紧张刺激,就像在看一场生死搏斗。然后呢,选手们超高的竞技水平,每一次比赛都是一场技术的较量。还有啊,观众的欢呼声,那种氛围特别棒。再有就是,比赛结果的不确定性,让人很期待。最后,比赛能展现人类的毅力和勇气。你要是还有啥想法或者想补充的,随时跟我说哈。']
嗯…首先呢,比赛的紧张刺激,就像在看一场生死搏斗。然后呢,选手们超高的竞技水平,每一次比赛都是一场技术的较量。还有啊,观众的欢呼声,那种氛围特别棒。再有就是,比赛结果的不确定性,让人很期待。最后,比赛能展现人类的毅力和勇气。你要是还有啥想法或者想补充的,随时跟我说哈。
(日本語訳: うーん…まず、試合の緊張感と興奮は、まるで生死を賭けた闘いを観ているようなものです。そして、選手たちの非常に高い競技レベルで、すべての試合が技術的な戦いです。さらに、観客の歓声、その雰囲気も最高です。また、試合の結果が予測できないことも、とてもワクワクします。最後に、試合は人間の不屈の精神と勇気を表現していると思います。他に何か感想や追加したいことがあれば、いつでも言ってください。)
コンテンツはリストで渡せるようなので、それを使ってちょっとひねってみた。
conversation = [
{
"role": "system",
"content": [
{"type": "text", "text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."},
{"type": "text", "text": "回答は日本語で行うこと。"},
],
},
{
"role": "user",
"content": [
{"type": "audio", "audio": "sample_query.wav"},
]
}
]
(snip)
結果。中国語が混ざってるけど、一応日本語は出た。
['system\nYou are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.回答は日本語で行うこと。\nuser\n\nassistant\n競馬の魅力は以下の5つです。まず、予想の楽しみ性があります。レースの結果を予想して楽しむことが大きな魅力ですね。次に、競争の激しさ。多くの競馬場で多くの競馬が行われ、その中から勝ち馬を選ぶのはとても刺激的です。また、レースの速さ。馬がどれだけ速く走れるかが競馬の醍醐味の一つです。そして、レースの結果が変わる瞬間の興奮。勝ち馬が決まる瞬間は、観客全員が一斉に歓声を上げます。さらに、競馬の歴史と文化。日本には長い歴史があり、その文化は世界でも知られています。この5つが競馬の魅力の主な部分です。你要是还有关于竞马的问题,欢迎随时问我哦。']
競馬の魅力は以下の5つです。まず、予想の楽しみ性があります。レースの結果を予想して楽しむことが大きな魅力ですね。次に、競争の激しさ。多くの競馬場で多くの競馬が行われ、その中から勝ち馬を選ぶのはとても刺激的です。また、レースの速さ。馬がどれだけ速く走れるかが競馬の醍醐味の一つです。そして、レースの結果が変わる瞬間の興奮。勝ち馬が決まる瞬間は、観客全員が一斉に歓声を上げます。さらに、競馬の歴史と文化。日本には長い歴史があり、その文化は世界でも知られています。この5つが競馬の魅力の主な部分です。你要是还有关于竞马的问题,欢迎随时问我哦。
ただオーディオは中国語のまま・・・
Qwenなので期待したのだけども、日本語はちょっと厳しそう。
あと、たまにVRAM消費が一気に増える場合がある。3BでもA100でVRAM使い切ってOOMになることもあったので、求められるHW要件もなかなか厳しそう。
llama.cppのマルチモーダルで対応されているみたい。