# Byte Latent Transformer (BLT)

## Visão geral

O modelo BLT foi proposto em [Byte Latent Transformer: Patches Scale Better Than Tokens](https://huggingface.co/papers/2412.09871) por Artidoro Pagnoni, Ram Pasunuru, Pedro Rodriguez, John Nguyen, Benjamin Muller, Margaret Li1, Chunting Zhou, Lili Yu, Jason Weston, Luke Zettlemoyer, Gargi Ghosh, Mike Lewis, Ari Holtzman†, Srinivasan Iyer. O BLT é um LLM em nível de bytes que atinge desempenho no nível de tokenização por meio de patching dinâmico baseado em entropia.

O resumo do artigo é o seguinte:

*Apresentamos o Byte Latent Transformer (BLT), uma nova arquitetura de LLM em nível de bytes que, pela primeira vez, alcança o desempenho de LLMs baseadas em tokenização em larga escala, com melhorias significativas na eficiência de inferência e na robustez. O BLT codifica bytes em patches de tamanho dinâmico, que servem como as unidades primárias de computação. Os patches são segmentados com base na entropia do próximo byte, alocando mais computação e capacidade do modelo onde a complexidade dos dados exige. Apresentamos o primeiro estudo de escala controlado por flops para modelos em nível de bytes, com até 8B de parâmetros e 4T de bytes de treinamento. Nossos resultados demonstram a viabilidade de escalar modelos treinados em bytes brutos, sem um vocabulário fixo. Tanto a eficiência de treinamento quanto a de inferência melhoram devido à seleção dinâmica de patches longos quando os dados são previsíveis, além de melhorias qualitativas no raciocínio e na generalização de cauda longa. No geral, para custos de inferência fixos, o BLT apresenta uma escala significativamente melhor do que os modelos baseados em tokenização, ao aumentar simultaneamente o tamanho do patch e o tamanho do modelo.*

## Dicas de uso

- **Arquitetura de modelo duplo**: o BLT consiste em dois modelos treinados separadamente:
  - **Patcher (Modelo de Entropia)**: um modelo de transformer menor que prevê a entropia em nível de bytes para determinar as fronteiras dos patches e segmentar a entrada.
  - **Modelo Transformer principal**: o modelo principal que processa os patches por meio de um Codificador Local, um Transformer Global e um Decodificador Local.

- **Patch dinâmico**: O modelo usa patch dinâmico baseado em entropia, onde:
  - Regiões de alta entropia (dados complexos) recebem patches mais curtos com mais atenção computacional
  - Regiões de baixa entropia (dados previsíveis) recebem patches mais longos para maior eficiência
  - Isso permite que o modelo alocue recursos de computação onde são mais necessários

- **Local Encoder**: Processa sequências de bytes com atenção cruzada para embeddings de patches
- **Global Transformer**: Processa representações em nível de patch com atenção completa entre os patches
- **Decoder local**: Gera a saída com atenção cruzada de volta para a sequência de bytes original

- **Tokenizador em nível de bytes**: Diferentemente dos tokenizadores tradicionais que usam vocabulários aprendidos, o tokenizador do BLT simplesmente converte o texto em bytes UTF-8 e mapeia cada byte para um ID de token. Não há necessidade de um vocabulário.

O modelo pode ser carregado por meio de:

```python
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("itazap/blt-1b-hf")
model = AutoModelForCausalLM.from_pretrained(
    "itazap/blt-1b-hf",
    device_map="auto",
)

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

prompt = "my name is"
generated_ids = model.generate(
    **inputs, max_new_tokens=NUM_TOKENS_TO_GENERATE, do_sample=False, use_cache=False
)

print(tokenizer.decode(generated_ids[0]))
```

Este modelo foi contribuído por [itazap](https://huggingface.co/). O código original pode ser encontrado [aqui]().

## BltConfig[[transformers.BltConfig]]

#### transformers.BltConfig[[transformers.BltConfig]]

```python
transformers.BltConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, vocab_size: int = 260, max_position_embeddings: int = 4096, patch_in_forward: bool | None = True, patch_size: int | None = 4, patching_mode: str | None = 'entropy', patching_threshold: float | None = 1.335442066192627, patching_batch_size: int | None = 1, max_patch_length: int | None = None, local_attention_window_len: int | None = 512, cross_attn_k: int | None = 2, encoder_hash_byte_group_size: list[int] | None = None, encoder_hash_byte_group_vocab: int | None = 500002, encoder_hash_byte_group_nb_functions: int | None = 1, patcher_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, encoder_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, decoder_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, global_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, tie_word_embeddings: bool = False, use_cache: bool = True, pad_token_id: int | None = None, bos_token_id: int | None = None, eos_token_id: int | list[int] | None = None, initializer_range: float = 0.02, rope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = None)
```

[Origem](https://github.com/huggingface/transformers/blob/main/src/transformers/models/blt/configuration_blt.py#L167)

**Parâmetros:**

vocab_size (`int`, *opcional*, padrão `260`) : Tamanho do vocabulário do modelo. Define o número de tokens diferentes que podem ser representados pelos `input_ids`.

max_position_embeddings (`int`, *opcional*, padrão `4096`) : O comprimento máximo de sequência com o qual este modelo pode ser utilizado.

patch_in_forward (`bool`, *opcional*, padrão `True`) : Se deve executar o patching durante a passagem de frente.

patch_size (`int`, *opcional*, padrão 4) : Tamanho dos patches usados no mecanismo de patching.

patching_mode (`str`, *opcional*, padrão `"entropy"`) : O modo usado para patching, como o patching baseado em entropia.

patching_threshold (`float`, *opcional*, padrão 1.34) : Valor de limiar usado para determinar quando aplicar patches.

patching_batch_size (`int`, *opcional*, padrão 1) : Tamanho do lote usado durante o processo de patching.

max_patch_length (`int`, *opcional*) : Comprimento máximo dos patches que podem ser gerados.

local_attention_window_len (`int`, *opcional*, padrão é 512) : Tamanho da janela de atenção local usada pelo codificador local e decodificador local, correspondente a `local_attention_window_len` nos checkpoints liberados. Defina como `None` para considerar todo o contexto causal em vez disso.

cross_attn_k (`int`, *opcional*, padrão 2) : Número de cabeças de atenção cruzada usadas no modelo.

encoder_hash_byte_group_size (`list`, *opcional*) : Lista dos tamanhos dos grupos de bytes usados na função de hash do codificador.

encoder_hash_byte_group_vocab (`int`, *opcional*, padrão 500002) : Tamanho do vocabulário para os grupos de bytes de hash do codificador.

encoder_hash_byte_group_nb_functions (`int`, *opcional*, padrão 1) : Número de funções de hash usadas no agrupamento de bytes do codificador.

patcher_config (`BltPatcherConfig`, *opcional*) : Configuração para o componente patcher do modelo.

encoder_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`, *opcional*) : O objeto de configuração ou dicionário do backbone do codificador.

decoder_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`, *opcional*) : O objeto de configuração ou dicionário do backbone do decodificador.

global_config (`BltGlobalTransformerConfig`, *opcional*) : Configuração para o componente de transformer global do modelo.

tie_word_embeddings (`bool`, *opcional*, padrão `False`) : Se deve vincular as embeddings de pesos de acordo com o mapeamento `tied_weights_keys` do modelo.

use_cache (`bool`, *opcional*, padrão `True`) : Indica se o modelo deve retornar as últimas atenções de chave/valor (não utilizado por todos os modelos). Relevante apenas se `config.is_decoder=True` ou quando o modelo for um modelo generativo somente de decodificador.

pad_token_id (`int`, *opcional*) : ID do token usado para preenchimento (padding) no vocabulário.

bos_token_id (`int`, *opcional*) : ID do token usado para o início do fluxo no vocabulário.

eos_token_id (`Union[int, list[int]]`, *opcional*) : ID do token usado para o fim do fluxo no vocabulário.

initializer_range (`float`, *opcional*, padrão `0.02`) : O desvio padrão do truncated_normal_initializer para inicializar todas as matrizes de pesos.

rope_parameters (`Union[~modeling_rope_utils.RopeParameters, dict]`, *opcional*) : Dicionário contendo os parâmetros de configuração para os embeddings RoPE. O dicionário deve conter um valor para `rope_theta` e, opcionalmente, parâmetros usados para escalonamento, caso você queira usar RoPE com `max_position_embeddings` maiores.

Esta é a classe de configuração para armazenar a configuração de um BltModel. Ela é usada para instanciar um modelo Blt de acordo com os argumentos especificados, definindo a arquitetura do modelo. Instanciar uma configuração com os padrões resultará em uma configuração semelhante à do [itazap/blt-1b-hf](https://huggingface.co/itazap/blt-1b-hf)

Os objetos de configuração herdam de [PreTrainedConfig](/docs/transformers/main/pt/main_classes/configuration#transformers.PreTrainedConfig) e podem ser usados para controlar as saídas do modelo. Leia a documentação de [PreTrainedConfig](/docs/transformers/main/pt/main_classes/configuration#transformers.PreTrainedConfig) para mais informações.

Exemplo:
```python
>>> from transformers import BltModel, BltConfig

>>> # Initializing a Blt configuration
>>> configuration = BltConfig()

>>> # Initializing a model from the configuration
>>> model = BltModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

#### transformers.BltModel[[transformers.BltModel]]

```python
transformers.BltModel(config: BltConfig)
```

[Origem](https://github.com/huggingface/transformers/blob/main/src/transformers/models/blt/modeling_blt.py#L1144)

#### forward[[transformers.BltModel.forward]]

```python
forward(input_ids: typing.Optional[torch.LongTensor] = None, patch_lengths: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, position_ids: typing.Optional[torch.LongTensor] = None, past_key_values: transformers.cache_utils.Cache | None = None, inputs_embeds: typing.Optional[torch.Tensor] = None, use_cache: bool | None = None, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[Origem](https://github.com/huggingface/transformers/blob/main/src/transformers/models/blt/modeling_blt.py#L1165)

## BltForCausalLM[[transformers.BltForCausalLM]]

#### transformers.BltForCausalLM[[transformers.BltForCausalLM]]

```python
transformers.BltForCausalLM(config: BltConfig)
```

[Origem](https://github.com/huggingface/transformers/blob/main/src/transformers/models/blt/modeling_blt.py#L1327)

**Parâmetros:**

config ([BltConfig](/docs/transformers/main/pt/model_doc/blt#transformers.BltConfig)) : Classe de configuração do modelo com todos os parâmetros do modelo. A inicialização com um arquivo de configuração não carrega os pesos associados ao modelo, apenas a configuração. Consulte o método [from_pretrained()](/docs/transformers/main/pt/main_classes/model#transformers.PreTrainedModel.from_pretrained) para carregar os pesos do modelo.

O modelo Blt Text com uma cabeça de modelagem de linguagem no topo.

Este modelo herda de [PreTrainedModel](/docs/transformers/main/pt/main_classes/model#transformers.PreTrainedModel). Consulte a documentação da classe pai para os métodos genéricos que a biblioteca implementa para todos os seus modelos (como download ou salvamento, redimensionamento dos embeddings de entrada, poda de cabeças, etc.).

Este modelo também é uma subclasse de [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) do PyTorch. Use-o como um Módulo PyTorch regular e consulte a documentação do PyTorch para todos os assuntos relacionados ao uso e comportamento gerais.

#### forward[[transformers.BltForCausalLM.forward]]

```python
forward(input_ids: typing.Optional[torch.LongTensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, position_ids: typing.Optional[torch.LongTensor] = None, cross_attention_states: typing.Optional[torch.LongTensor] = None, cross_attention_mask: typing.Optional[torch.LongTensor] = None, full_text_row_masked_out_mask: tuple[torch.Tensor, torch.Tensor] | None = None, past_key_values: transformers.cache_utils.Cache | None = None, inputs_embeds: typing.Optional[torch.Tensor] = None, labels: typing.Optional[torch.LongTensor] = None, use_cache: bool | None = None, logits_to_keep: typing.Union[int, torch.Tensor] = 0, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[Origem](https://github.com/huggingface/transformers/blob/main/src/transformers/models/blt/modeling_blt.py#L1342)

**Parâmetros:**

input_ids (`torch.LongTensor` de forma `(batch_size, sequence_length)`, *opcional*) : Índices dos tokens da sequência de entrada no vocabulário. O preenchimento (padding) será ignorado por padrão. Os índices podem ser obtidos usando [AutoTokenizer](/docs/transformers/main/pt/model_doc/auto#transformers.AutoTokenizer). Consulte [PreTrainedTokenizer.encode()](/docs/transformers/main/pt/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.encode) e [PreTrainedTokenizer.__call__()](/docs/transformers/main/pt/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.__call__) para mais detalhes. [O que são IDs de entrada?](../glossary#input-ids)

attention_mask (`torch.Tensor` de forma `(batch_size, sequence_length)`, *opcional*) : Máscara para evitar a execução de atenção nos índices de tokens de preenchimento. Valores de máscara selecionados em `[0, 1]`:  - 1 para tokens que **não estão mascarados**, - 0 para tokens que **estão mascarados**.  [O que são máscaras de atenção?](../glossary#attention-mask)

position_ids (`torch.LongTensor` de forma `(batch_size, sequence_length)`, *opcional*) : Índices das posições dos tokens de cada sequência de entrada nos embeddings de posição. Selecionados no intervalo `[0, config.n_positions - 1]`.  [O que são IDs de posição?](../glossary#position-ids)

cross_attention_states (`torch.Tensor`, *opcional*) : Saída do modelo de visão, usada para cross-attention. Este tensor contém os recursos de imagem processados aos quais o modelo de linguagem prestará atenção.

cross_attention_mask (`torch.Tensor` de forma `(batch_size, seq_length, max_num_images, max_num_tiles)`, *opcional*) : Máscara de atenção cruzada para controlar a interação entre tokens de texto e tiles de imagem. Este tensor 4D define para quais tiles de imagem cada token de texto deve prestar atenção. Para cada token de texto (em seq_length): - 1 indica que o token **deve prestar atenção** ao tile de imagem correspondente - 0 indica que o token **não deve prestar atenção** ao tile de imagem correspondente

full_text_row_masked_out_mask (`tuple[torch.Tensor, torch.Tensor]`, *opcional*) : Uma tupla contendo dois tensores que mascaram linhas no mecanismo de cross-attention: - O primeiro tensor tem a forma `(batch_size, 1, seq_length, 1)` e contém valores 0 ou 1. Um valor de 0 indica que a linha inteira correspondente ao token de texto na matriz de cross-attention deve ser mascarada (todos os tokens de imagem são ignorados). - O segundo tensor tem a mesma forma e é usado internamente para aplicar a máscara durante a passagem de frente das camadas de cross-attention. Esta máscara é derivada do cross_attention_mask e é usada para lidar com casos em que um token de texto não deve prestar atenção a nenhum token de imagem.

past_key_values (`~cache_utils.Cache`, *opcional*) : hidden-states pré-computados (chaves e valores nos blocos de autoatenção e nos blocos de atenção cruzada) que podem ser usados para acelerar a decodificação sequencial. Isso geralmente consiste nos `past_key_values` retornados pelo modelo em uma etapa anterior da decodificação, quando `use_cache=True` ou `config.use_cache=True`.  Apenas uma instância de [Cache](/docs/transformers/main/pt/internal/generation_utils#transformers.Cache) é permitida como entrada, consulte nosso [guia de kv cache](https://huggingface.co/docs/transformers/en/kv_cache). Se nenhum `past_key_values` for passado, [DynamicCache](/docs/transformers/main/pt/internal/generation_utils#transformers.DynamicCache) será inicializado por padrão.  O modelo sairá no mesmo formato de cache que foi fornecido como entrada.  Se `past_key_values` forem usados, espera-se que o usuário insira apenas `input_ids` não processados (aqueles que não têm seus estados de chave e valor passados para este modelo) com a forma `(batch_size, unprocessed_length)` em vez de todos os `input_ids` com a forma `(batch_size, sequence_length)`.

inputs_embeds (`torch.Tensor` de forma `(batch_size, sequence_length, hidden_size)`, *opcional*) : Opcionalmente, em vez de passar `input_ids`, você pode escolher passar diretamente uma representação incorporada. Isso é útil se você quiser ter mais controle sobre como converter os índices de `input_ids` nos vetores associados do que a matriz de busca de incorporação interna do modelo.

labels (`torch.LongTensor` de forma `(batch_size, sequence_length)`, *opcional*) : Rótulos para calcular a perda de modelagem de linguagem mascarada. Os índices devem estar em `[0, ..., config.vocab_size]` ou ser -100 (veja a docstring de `input_ids`). Tokens com índices definidos como `-100` são ignorados (mascarados); a perda é calculada apenas para os tokens com rótulos em `[0, ..., config.vocab_size]`.

use_cache (`bool`, *opcional*) : Se definido como `True`, os estados de chave-valor de `past_key_values` são retornados e podem ser usados para acelerar a decodificação (veja `past_key_values`).

logits_to_keep (`Union[int, torch.Tensor]`, *opcional*, padrão `0`) : Se for um `int`, calcula os logits para os últimos `logits_to_keep` tokens. Se for `0`, calcula os logits para todos os `input_ids` (caso especial). Apenas os logits do último token são necessários para a geração, e calculá-los apenas para esse token pode economizar memória, o que se torna bastante significativo para sequências longas ou tamanho de vocabulário grande. Se for um `torch.Tensor`, deve ser 1D, correspondendo aos índices a serem mantidos na dimensão de comprimento da sequência. Isso é útil ao usar o formato de tensor empacotado (uma única dimensão para lote e comprimento da sequência).

**Retorna:** [CausalLMOutputWithPast](/docs/transformers/main/pt/main_classes/output#transformers.modeling_outputs.CausalLMOutputWithPast) ou `tuple(torch.Tensor)`

Um [CausalLMOutputWithPast](/docs/transformers/main/pt/main_classes/output#transformers.modeling_outputs.CausalLMOutputWithPast) ou uma tupla de `torch.Tensor` (se `return_dict=False` for passado ou quando `config.return_dict=False`), composto por diversos elementos, dependendo da configuração ([BltConfig](/docs/transformers/main/pt/model_doc/blt#transformers.BltConfig)) e das entradas.

O método forward de [BltForCausalLM](/docs/transformers/main/pt/model_doc/blt#transformers.BltForCausalLM) sobrescreve o método especial `__call__`.

Embora a receita para a passagem direta precise ser definida dentro desta função, deve-se chamar a instância de `Module` em seguida, em vez desta, pois a primeira cuida da execução das etapas de pré e pós-processamento, enquanto a segunda as ignora silenciosamente.

- **loss** (`torch.Tensor` de forma `(1,)`, *opcional*, retornado quando `labels` é fornecido) -- Perda de modelagem de linguagem (para previsão do próximo token).
- **logits** (`torch.Tensor` de forma `(batch_size, sequence_length, config.vocab_size)`) -- Pontuações de previsão da cabeça de modelagem de linguagem (pontuações para cada token do vocabulário antes do SoftMax).
- **past_key_values** (`Cache`, *opcional*, retornado quando `use_cache=True` é passado ou quando `config.use_cache=True`) -- Trata-se de uma instância de [Cache](/docs/transformers/main/pt/internal/generation_utils#transformers.Cache). Para mais detalhes, consulte nosso [guia de cache kv](https://huggingface.co/docs/transformers/en/kv_cache).

  Contém estados ocultos pré-computados (chaves e valores nos blocos de autoatenção) que podem ser usados (veja a entrada `past_key_values`) para acelerar a decodificação sequencial.
- **hidden_states** (`tuple(torch.Tensor)`, *opcional*, retornado quando `output_hidden_states=True` é passado ou quando `config.output_hidden_states=True`) -- Tupla de `torch.Tensor` (um para a saída dos embeddings, se o modelo tiver uma camada de embedding, + um para a saída de cada camada) com a forma `(batch_size, sequence_length, hidden_size)`.

  Estados ocultos do modelo na saída de cada camada, além das saídas opcionais do embedding inicial.
- **attentions** (`tuple(torch.Tensor)`, *opcional*, retornado quando `output_attentions=True` é passado ou quando `config.output_attentions=True`) -- Tupla de `torch.Tensor` (um para cada camada) com a forma `(batch_size, num_heads, sequence_length, sequence_length)`.

  Pesos de atenção após o softmax de atenção, usados para calcular a média ponderada nas cabeças de autoatenção.

Exemplo:

```python
>>> from transformers import AutoTokenizer, BltForCausalLM

>>> model = BltForCausalLM.from_pretrained("itazap/blt-1b-hf")
>>> tokenizer = AutoTokenizer.from_pretrained("itazap/blt-1b-hf")

>>> prompt = "If I had to write a haiku, it would be:"
>>> inputs = tokenizer(prompt, return_tensors="pt")

>>> # Generate
>>> generate_ids = model.generate(inputs.input_ids, max_length=40, do_sample=True, temperature=0.6)
>>> result = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
>>> print(result)
If I had to write a haiku, it would be: "Snowflakes gently fall" - simple, yet peaceful.
I love the idea of snowflakes gently falling, each one
```

