Transformers documentation

Génération multimodale

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Génération multimodale

Les modèles multimodaux (de tout à tout) sont des modèles de langage capables de traiter divers types de données d'entrée (par exemple, du texte, des images, de l'audio ou de la vidéo) et de générer des sorties dans l'une de ces modalités. Contrairement aux modèles unimodaux ou à modalité fixe traditionnels, ils permettent des combinaisons flexibles d'entrées et de sorties, permettant à un système unique de gérer une large gamme de tâches : de la génération d'images à partir de texte à la transcription audio vers texte, en passant par la légende d'images, la compréhension de vidéos, et ainsi de suite. Cette tâche présente de nombreuses similitudes avec l'image-texte-vers-texte, mais prend en charge une gamme plus large de modalités d'entrée et de sortie.

Dans ce guide, nous présentons un aperçu des modèles any-to-any et montrons comment les utiliser avec Transformers pour l'inférence. Contrairement aux Vision LLM, qui sont généralement limités aux tâches de vision et de langage, les modèles omni-modaux peuvent accepter n'importe quelle combinaison de modalités (par exemple, texte, images, audio, vidéo) en entrée et générer des sorties dans différentes modalités, telles que le texte ou les images.

Commençons par installer les dépendances :

pip install -q transformers accelerate flash_attn

Initialisons le modèle et le processeur.

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")

Ces modèles incluent généralement un chat template pour structurer les conversations entre les différentes modalités. Les entrées peuvent mélanger des images, du texte, de l'audio ou d'autres formats pris en charge dans un même tour. Les sorties peuvent également varier (par exemple, génération de texte ou génération d'audio), selon la configuration.

Voici un exemple fournissant une entrée « texte + audio » et demandant une réponse en texte.

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?"},
        ]
    },
]

Nous allons maintenant appeler la méthode apply_chat_template() des processeurs pour prétraiter sa sortie ainsi que les entrées d’images.

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    add_generation_prompt=True,
)

Nous pouvons maintenant passer les entrées prétraitées au modèle.

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)

Pipeline

La méthode la plus rapide pour commencer est d'utiliser l'API Pipeline. Spécifiez la tâche "any-to-any" et le modèle que vous souhaitez utiliser.

from transformers import pipeline
pipe = pipeline("any-to-any", model="mistralai/Voxtral-Mini-3B-2507")

L'exemple ci-dessous utilise des modèles de chat pour formater les entrées textuelles et exploite la modalité audio comme donnée multimodale.

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?"},
         ],
     },
 ]

Transmettez le texte et l'image au format du modèle de chat à Pipeline et définissez return_full_text=False pour supprimer l'entrée de la sortie générée.

outputs = pipe(text=messages, max_new_tokens=20, return_full_text=False)
outputs[0]["generated_text"]

Le pipeline any-to-any prend également en charge la génération d'audio ou d'images avec des modèles any-to-any. Pour cela, il faut définir le paramètre generation_mode. N'oubliez pas de régler l'échantillonnage vidéo sur le FPS souhaité, sinon la vidéo entière sera chargée sans échantillonnage. Voici un exemple de 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"])
Update on GitHub