Transformers documentation
Мультимодальная генерация
Мультимодальная генерация
Multimodal (any-to-any) models are language models capable of processing diverse types of input data (e.g., text, images, audio, or video) and generating outputs in any of these modalities. Unlike traditional unimodal or fixed-modality models, they allow flexible combinations of input and output, enabling a single system to handle a wide range of tasks: from text-to-image generation to audio-to-text transcription, image captioning, video understanding, and so on. This task shares many similarities with image-text-to-text, but supports a wider range of input and output modalities.
In this guide, we provide a brief overview of any-to-any models and show how to use them with Transformers for inference. Unlike Vision LLMs, which are typically limited to vision-and-language tasks, omni-modal models can accept any combination of modalities (e.g., text, images, audio, video) as input, and generate outputs in different modalities, such as text or images.
Начнем с установки зависимостей:
pip install -q transformers accelerate flash_attn
Инициализируем модель и процессор.
from transformers import AutoProcessor, AutoModelForMultimodalLM, infer_device
import torch
device = torch.device(infer_device())
model = AutoModelForMultimodalLM.from_pretrained(
"Qwen/Qwen2.5-Omni-3B",
dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
).to(device)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-Omni-3B")Обычно такие модели включают шаблон чата для структурирования диалогов между различными модальностями. Во входных данных в рамках одного хода могут сочетаться изображения, текст, аудио или другие поддерживаемые форматы. Выходные данные также могут различаться (например, генерация текста или генерация аудио) в зависимости от конфигурации.
Ниже приведен пример, в котором в качестве входных данных используются «текст + аудио», а в качестве ответа запрашивается текст.
messages = [
{
"role": "user",
"content": [
{"type": "audio", "url": "https://huggingface.co/datasets/raushan-testing-hf/audio-test/resolve/main/f2641_0_throatclearing.wav"},
{"type": "text", "text": "What do you hear in this audio?"},
]
},
]Теперь мы вызовем метод apply_chat_template() процессоров, чтобы предобработать их вывод вместе с входными изображениями.
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
)Теперь мы можем передать предобработанные входные данные в модель.
with torch.no_grad():
generated_ids = model.generate(**inputs, max_new_tokens=100)
generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_texts)Пайплайн
Самый быстрый способ начать работу — использовать API Pipeline. Укажите задачу "any-to-any" и модель, которую вы хотите использовать.
from transformers import pipeline
pipe = pipeline("any-to-any", model="mistralai/Voxtral-Mini-3B-2507")В примере ниже используются шаблоны чата для форматирования текстовых входных данных, а модальность аудио — как мультимодальные данные.
messages = [
{
"role": "user",
"content": [
{
"type": "audio",
"url": "https://huggingface.co/datasets/raushan-testing-hf/audio-test/resolve/main/glass-breaking-151256.mp3",
},
{"type": "text", "text": "What do you hear in this audio?"},
],
},
]Передайте в Pipeline текст, отформатированный с помощью chat template, и изображение, и установите return_full_text=False, чтобы исключить входные данные из сгенерированного результата.
outputs = pipe(text=messages, max_new_tokens=20, return_full_text=False)
outputs[0]["generated_text"]Any-to-any pipeline also supports generating audio or images with any-to-any models. For that you need to set generation_mode parameter. Do not forget to set video sampling to the desired FPS, otherwise the whole video will be loaded without sampling. Here is an example code:
import soundfile as sf
pipe = pipeline("any-to-any", model="Qwen/Qwen2.5-Omni-3B")
messages = [
{
"role": "user",
"content": [
{"type": "video", "path": "https://huggingface.co/datasets/raushan-testing-hf/videos-test/resolve/main/Cooking_cake.mp4"},
{"type": "text", "text": "Describe this video."},
],
},
]
output = pipe(text=messages, fps=1, load_audio_from_video=True, max_new_tokens=20, generation_mode="audio")
sf.write("generated_audio.wav", out[0]["generated_audio"])