Transformers documentation

Visão geral

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

and get access to the augmented documentation experience

to get started

Visão geral

O Transformers oferece diversas técnicas de otimização de inferência para tornar os modelos rápidos, acessíveis e viáveis. As opções incluem mecanismos de atenção alternativos para reduzir o tráfego de memória, compilação de código para uma execução mais rápida e kernels otimizados para aumentar a taxa de transferência. Combine essas técnicas para obter o máximo desempenho.

Para configuração de dispositivo e ajustes específicos de hardware, consulte os guias de Hardware. Verifique quais técnicas são suportadas pelo seu hardware antes de aplicar as otimizações abaixo.

Memória e velocidade estão intimamente relacionadas, mas não são a mesma coisa. Reduzir a pegada de memória torna um modelo “mais rápido” porque há menos dados para mover. Otimizações puras de velocidade nem sempre reduzem a memória e, às vezes, aumentam o uso. Escolha a otimização adequada com base no seu caso de uso e no seu hardware.

Use a tabela abaixo para escolher uma técnica de otimização.

TécnicaVelocidadeMemória
Compilação✅
Backends de atenção✅✅
Kernels✅✅
Quantização✅✅
Cache✅✅
Paralelismo✅
Loteamento contínuo✅

Este guia oferece uma introdução rápida às otimizações do Transformers.

Compilação

torch.compile reduz a sobrecarga do Python, funde operações e cria kernels ajustados para as suas formas e o seu hardware. A primeira execução faz o aquecimento e as execuções subsequentes usam o caminho compilado mais rápido.

Passe um cache de tamanho fixo para generate() para acionar automaticamente o torch.compile.

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype=torch.float16, device_map="auto")
input = tokenizer("The French Bread Law states", return_tensors="pt").to(model.device)

output = model.generate(**input, do_sample=False, max_new_tokens=20, cache_implementation="static")
tokenizer.batch_decode(output, skip_special_tokens=True)[0]

Evite chamar torch.compile(model) fora de generate() para evitar que o modelo seja recompilado a cada etapa.

Backends de atenção

Backends alternativos de atenção reduzem o tráfego de memória. Por exemplo, o FlashAttention aplica tiles às computações de atenção e evita tensores intermediários grandes para reduzir a pegada de memória.

Defina attn_implementation em from_pretrained() para carregar um backend de atenção otimizado.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", attn_implementation="flash_attention_2")

Kernels

Kernels fundem operações para aumentar a taxa de transferência e reduzir o uso de memória. A biblioteca Kernels carrega kernels de computação otimizados do Hub de forma flexível e com segurança de versão.

O exemplo abaixo carrega um kernel otimizado do FlashAttention-2 sem instalar o pacote.

import torch
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", attn_implementation="kernels-community/flash-attn2"
)

Quantização

Quantização reduz o tamanho de cada parâmetro, o que diminui a pegada de memória e aumenta a velocidade, pois é possível executar mais operações.

Passe uma configuração de quantização para o argumento quantization_config em from_pretrained(). Cada backend de quantização possui uma configuração diferente com argumentos distintos. O exemplo abaixo quantiza um modelo para 4 bits e configura o dtype de computação com o backend bitsandbytes.

import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)

model = AutoModelForCausalLM.from_pretrained(
    "allenai/Olmo-3-7B-Think", quantization_config=bnb_config
)

Cache

Caching acelera a geração reutilizando chaves e valores anteriores, em vez de recalculá-los para cada token. Para compensar e reduzir o custo de memória de armazenar chaves e valores anteriores, o Transformers suporta o offloading do cache para a CPU. Apenas a camada atual permanece na GPU.

Use o argumento cache_implementation em generate() para definir uma estratégia de cache.

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", attn_implementation="kernels-community/flash-attn2"
)
inputs = tokenizer("The Le Décret Pain states that a baguette must,", return_tensors="pt")
outputs = model.generate(**inputs, do_sample=False, max_new_tokens=50, cache_implementation="offloaded")

Paralelismo

Paralelismo distribui um modelo entre dispositivos para que modelos grandes demais para um único dispositivo sejam executados com rapidez. Essa abordagem utiliza mais memória devido ao overhead de sharding e à comunicação necessária para sincronizar os resultados.

Paralelismo de tensor divide uma camada do modelo entre dispositivos. Defina o número de dispositivos com DistributedConfig(tp_size=N) e passe-o para from_pretrained() para ativá-lo.

from transformers import AutoModelForCausalLM, DistributedConfig

distributed_config = DistributedConfig(tp_size=4)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3-8B-Instruct",
    distributed_config=distributed_config,
)
print(model._tp_plan)

Loteamento contínuo

Continuous batching maximiza a taxa de transferência mantendo a GPU ocupada com agendamento dinâmico e pré-preenchimento em blocos. Aplicações de Serving o utilizam para processar múltiplas solicitações recebidas simultaneamente.

Use generate_batch() para habilitar o loteamento contínuo.

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import ContinuousBatchingConfig, GenerationConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    attn_implementation="sdpa",
    device_map="auto",
    torch_dtype=torch.bfloat16,
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")

prompts = [
    "The Le Décret Pain states that a baguette must",
    "Explain gravity in one sentence.",
    "Name the capital of France.",
]
inputs = [tokenizer.encode(p) for p in prompts]

generation_config = GenerationConfig(
    max_new_tokens=32,
    eos_token_id=tokenizer.eos_token_id,
    pad_token_id=tokenizer.pad_token_id,
    do_sample=False,
)
continuous_batching_config = ContinuousBatchingConfig(max_batch_tokens=512)

outputs = model.generate_batch(
    inputs=inputs,
    generation_config=generation_config,
    continuous_batching_config=continuous_batching_config,
)

for request_id, output in outputs.items():
    text = tokenizer.decode(output.generated_tokens, skip_special_tokens=True)
    print(f"[{request_id}] {text}")
Update on GitHub