Transformers documentation

Tạo đa phương thức

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

Tạo đa phương thức

Mô hình đa phương thức (any-to-any) là các mô hình ngôn ngữ có khả năng xử lý nhiều loại dữ liệu đầu vào khác nhau (ví dụ: văn bản, hình ảnh, âm thanh hoặc video) và tạo ra đầu ra ở bất kỳ phương thức nào trong số đó. Khác với các mô hình đơn phương thức hoặc mô hình cố định phương thức truyền thống, chúng cho phép kết hợp linh hoạt giữa đầu vào và đầu ra, giúp một hệ thống duy nhất có thể xử lý một phạm vi rộng các tác vụ: từ tạo hình ảnh từ văn bản đến chuyển đổi âm thanh thành văn bản, chú thích hình ảnh, hiểu video, v.v. Tác vụ này có nhiều điểm tương đồng với image-text-to-text, nhưng hỗ trợ một phạm vi rộng hơn các phương thức đầu vào và đầu ra.

Trong hướng dẫn này, chúng tôi cung cấp cái nhìn tổng quan ngắn gọn về các mô hình any-to-any và cách sử dụng chúng với Transformers để suy luận. Khác với Vision LLMs, thường bị giới hạn ở các tác vụ thị giác-ngôn ngữ, các mô hình omni-modal có thể nhận bất kỳ tổ hợp nào của các modalities (ví dụ: văn bản, hình ảnh, âm thanh, video) làm đầu vào và tạo ra đầu ra ở các modalities khác nhau, chẳng hạn như văn bản hoặc hình ảnh.

Hãy bắt đầu bằng cách cài đặt các thư viện phụ thuộc:

pip install -q transformers accelerate flash_attn

Hãy khởi tạo mô hình và bộ xử lý.

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

Các mô hình này thường bao gồm một chat template để cấu trúc các cuộc hội thoại xuyên suốt các phương thức (modalities). Đầu vào có thể kết hợp hình ảnh, văn bản, âm thanh hoặc các định dạng khác được hỗ trợ trong một lượt. Đầu ra cũng có thể khác nhau (ví dụ: tạo văn bản hoặc tạo âm thanh), tùy thuộc vào cấu hình.

Dưới đây là một ví dụ cung cấp đầu vào “text + audio” và yêu cầu phản hồi dạng văn bản.

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

Chúng ta sẽ gọi phương thức apply_chat_template() của các bộ xử lý để tiền xử lý đầu ra của chúng cùng với các đầu vào hình ảnh.

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

Bây giờ chúng ta có thể truyền các đầu vào đã tiền xử lý vào mô hình.

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

Cách nhanh nhất để bắt đầu là sử dụng API Pipeline. Chỉ định tác vụ "any-to-any" và mô hình bạn muốn sử dụng.

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

Ví dụ bên dưới sử dụng chat templates để định dạng các đầu vào văn bản và sử dụng phương thức âm thanh (audio modality) như một dữ liệu đa phương thức.

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

Truyền văn bản và hình ảnh đã định dạng theo chat template vào Pipeline và đặt return_full_text=False để loại bỏ phần đầu vào khỏi kết quả tạo ra.

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

Pipeline any-to-any cũng hỗ trợ tạo audio hoặc hình ảnh bằng các mô hình any-to-any. Để làm điều đó, bạn cần đặt tham số generation_mode. Đừng quên đặt video sampling theo FPS mong muốn, nếu không toàn bộ video sẽ được tải mà không có sampling. Dưới đây là một đoạn mã ví dụ:

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