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

Multimodal Mô hình (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ỳ chế độ nào trong số đó. Khác với các mô hình đơn chế độ hoặc cố định chế độ 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 â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 chế độ đầ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:

```bash
pip install -q transformers accelerate flash_attn
```

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

```python
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](../chat_templating) để 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.

```python
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()](/docs/transformers/main/vi/main_classes/processors#transformers.ProcessorMixin.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.

```python
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.

```python
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](/docs/transformers/main/vi/main_classes/pipelines#transformers.Pipeline). Chỉ định tác vụ `"any-to-any"` và mô hình bạn muốn sử dụng.

```python
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.

```python
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](/docs/transformers/main/vi/main_classes/pipelines#transformers.Pipeline) và đặt `return_full_text=False` để loại bỏ phần đầu vào khỏi kết quả tạo ra.

```python
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ụ:

```python
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"])
```

