# ByT5

[ByT5](https://huggingface.co/papers/2105.13626) là phiên bản không cần tokenizer của mô hình [T5](./t5), được thiết kế để hoạt động trực tiếp trên các byte UTF-8 thô. Điều này có nghĩa là nó có thể xử lý bất kỳ ngôn ngữ nào, chống chịu tốt hơn với nhiễu như lỗi chính tả, và đơn giản hơn để sử dụng vì không yêu cầu một pipeline tiền xử lý.

Bạn có thể tìm thấy tất cả các checkpoint ByT5 gốc dưới tổ chức [Google](https://huggingface.co/google?search_models=byt5).

> [!TIP]
> Tham khảo tài liệu [T5](./t5) để xem thêm các ví dụ về cách áp dụng ByT5 cho các tác vụ ngôn ngữ khác nhau.

Ví dụ dưới đây minh họa cách tạo văn bản bằng [Pipeline](/docs/transformers/main/vi/main_classes/pipelines#transformers.Pipeline), [AutoModel](/docs/transformers/main/vi/model_doc/auto#transformers.AutoModel) và từ dòng lệnh.

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
    "google/byt5-small"
)
model = AutoModelForSeq2SeqLM.from_pretrained(
    "google/byt5-small",
    device_map="auto"
)

input_ids = tokenizer("summarize: Photosynthesis is the process by which plants, algae, and some bacteria convert light energy into chemical energy.", return_tensors="pt").to(model.device)

output = model.generate(**input_ids)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

## Lượng tử hóa

Quantization giảm gánh nặng bộ nhớ của các mô hình lớn bằng cách biểu diễn trọng số ở độ chính xác thấp hơn. Tham khảo tổng quan về [Quantization](../quantization/overview) để biết thêm các backend quantization khả dụng.

Ví dụ bên dưới sử dụng [torchao](../quantization/torchao) để chỉ lượng tử hóa trọng số xuống int4.

```python
# pip install torchao
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, TorchAoConfig

quantization_config = TorchAoConfig("int4_weight_only", group_size=128)

model = AutoModelForSeq2SeqLM.from_pretrained(
    "google/byt5-xl",
    device_map="auto",
    quantization_config=quantization_config
)

tokenizer = AutoTokenizer.from_pretrained("google/byt5-xl")
input_ids = tokenizer("translate English to French: The weather is nice today.", return_tensors="pt").to(model.device)

output = model.generate(**input_ids)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

## Ghi chú

- Khuyến nghị sử dụng tokenizer cho suy luận và huấn luyện theo lô (batched).
- Ví dụ dưới đây cho thấy cách sử dụng mô hình mà không có tokenizer.

    ```python
    import torch
    from transformers import AutoModelForSeq2SeqLM

    model = AutoModelForSeq2SeqLM.from_pretrained("google/byt5-small", device_map="auto")

    num_special_tokens = 3

    input_ids = torch.tensor([list("Life is like a box of chocolates.".encode("utf-8"))]) + num_special_tokens
    labels = torch.tensor([list("La vie est comme une boîte de chocolat.".encode("utf-8"))]) + num_special_tokens
    loss = model(input_ids, labels=labels).loss
    loss.item()
    ```

- ByT5 sử dụng các giá trị byte cao nhất (258, 257, v.v.) để che (masking) thay vì các token sentinel như `{extra_id_0}`.

    ```python
    # Example: character-level denoising with mask tokens
    input_ids = tokenizer("The dog chases a ball in the park.").input_ids
    masked_input = torch.tensor([input_ids[:8] + [258] + input_ids[14:21] + [257] + input_ids[28:]])
    output = model.generate(masked_input, max_length=100)
    ```

## ByT5Tokenizer[[transformers.ByT5Tokenizer]]

#### transformers.ByT5Tokenizer[[transformers.ByT5Tokenizer]]

```python
transformers.ByT5Tokenizer(eos_token = '</s>', unk_token = '<unk>', pad_token = '<pad>', extra_ids = 125, additional_special_tokens = None, **kwargs)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/byt5/tokenization_byt5.py#L25)

**Tham số:**

eos_token (`str`, *tùy chọn*, mặc định là `"</s>"`) : Token kết thúc chuỗi. Khi xây dựng một chuỗi bằng các token đặc biệt, đây không phải là token được dùng cho việc kết thúc chuỗi. Token được dùng là `sep_token`.

unk_token (`str`, *tùy chọn*, mặc định là `"<unk>"`) : Token không xác định. Một token không có trong từ vựng sẽ không thể được chuyển đổi thành ID và sẽ được gán thành token này thay thế.

pad_token (`str`, *tùy chọn*, mặc định là `"<pad>"`) : Token được sử dụng để đệm, chẳng hạn khi xử lý các lô (batch) các chuỗi có độ dài khác nhau.

extra_ids (`int`, *tuỳ chọn*, mặc định là 125) : Thêm một số id bổ sung vào cuối bảng từ vựng để sử dụng như các token sentinel. Các token này có thể truy cập dưới dạng "" trong đó "{%d}" là một số từ 0 đến extra_ids-1. Các token bổ sung được đánh chỉ số từ cuối bảng từ vựng đến đầu ("" là token cuối cùng trong bảng từ vựng, giống như trong tiền xử lý ByT5, xem [tại đây](https://github.com/google-research/text-to-text-transfer-transformer/blob/9fd7b14a769417be33bc6c850f9598764913c833/t5/data/preprocessors.py#L2117)).

additional_special_tokens (`list[str]`, *tùy chọn*) : Các token đặc biệt bổ sung được sử dụng bởi tokenizer.

Xây dựng một tokenizer ByT5. ByT5 đơn giản chỉ sử dụng mã hóa byte thô utf-8.

Tokenizer này kế thừa từ [PreTrainedTokenizer](/docs/transformers/main/vi/main_classes/tokenizer#transformers.PythonBackend), lớp chứa hầu hết các phương thức chính. Người dùng nên tham khảo siêu lớp này để biết thêm thông tin về các phương thức đó.

#### build_inputs_with_special_tokens[[transformers.ByT5Tokenizer.build_inputs_with_special_tokens]]

```python
build_inputs_with_special_tokens(token_ids_0: list[int], token_ids_1: list[int] | None = None)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/byt5/tokenization_byt5.py#L169)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID mà các token đặc biệt sẽ được thêm vào.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [input IDs](../glossary#input-ids) với các token đặc biệt phù hợp.

Xây dựng đầu vào mô hình từ một chuỗi hoặc một cặp chuỗi cho các tác vụ phân loại chuỗi bằng cách nối và thêm các token đặc biệt. Một chuỗi có định dạng như sau:

- một chuỗi duy nhất: `X </s>`
- cặp chuỗi: `A </s> B </s>`

#### convert_tokens_to_string[[transformers.ByT5Tokenizer.convert_tokens_to_string]]

```python
convert_tokens_to_string(tokens)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/byt5/tokenization_byt5.py#L215)

Chuyển đổi một chuỗi các token (chuỗi ký tự) trong một chuỗi duy nhất.

#### create_token_type_ids_from_sequences[[transformers.ByT5Tokenizer.create_token_type_ids_from_sequences]]

```python
create_token_type_ids_from_sequences(token_ids_0: list[int], token_ids_1: list[int] | None = None)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/byt5/tokenization_byt5.py#L147)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách các số 0.

Tạo một mask từ hai chuỗi được truyền vào để sử dụng trong một tác vụ phân loại cặp chuỗi. ByT5 không sử dụng id loại token, do đó một danh sách các số không được trả về.

#### get_special_tokens_mask[[transformers.ByT5Tokenizer.get_special_tokens_mask]]

```python
get_special_tokens_mask(token_ids_0: list[int], token_ids_1: list[int] | None = None, already_has_special_tokens: bool = False)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/byt5/tokenization_byt5.py#L108)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

already_has_special_tokens (`bool`, *tùy chọn*, mặc định là `False`) : Xác định xem danh sách token đã được định dạng với các token đặc biệt cho mô hình hay chưa.

**Trả về:** `list[int]`

Một danh sách các số nguyên trong khoảng [0, 1]: 1 cho một token đặc biệt, 0 cho một token chuỗi.

Lấy các id của chuỗi từ một danh sách token chưa được thêm token đặc biệt. Phương thức này được gọi khi thêm token đặc biệt bằng cách sử dụng phương thức `prepare_for_model` của tokenizer.

