A API pipeline da biblioteca transformers atua como uma abstração de alto nível que orquestra todo o fluxo de trabalho de inferência de machine learning. Ela encapsula três etapas fundamantais: o pré-processamento dos dados de entrada, a execução do modelo neural e o pós-processamento dos tensores brutos para gerar resultados interpretáveis.
Dessa forma, é possível enviar texto ou imagens diretamente e receber previsões formatadas, sem a necessidade de gerenciar manualmente tokenizadores ou operações matemáticas complexas.
Criação e Execução de um Pipeline Básico
Para iniciar, basta importtar a função e especificar a tarefa desejada. Por padrão, a biblioteca baixa e utiliza modelos treinados no idioma inglês.
from transformers import pipeline
classificador_texto = pipeline(task="text-classification")
resultado = classificador_texto("This product is absolutely fantastic!")
print(resultado)
Especificando Modelos e Hardware
É possível substituir o modelo padrão por checkpoints personalizados disponíveis no Hugging Face Hub. Ao instanciar o pipeline dessa forma, o sistema carrega automaticamente tanto a arquitetura do modelo quanto o tokenizador correspondente.
from transformers import pipeline
# Pipeline customizado para análise de sentimentos em chinês
analisador = pipeline(
task="text-classification",
model="uer/roberta-base-finetuned-dianping-chinese"
)
print(analisador("A experiência foi excelente."))
Para acelerar a inferência em ambientes de produção ou com grandes volumes de dados, o processamento pode ser delegado à GPU. O parâmetro device aceita o índice numérico da placa de vídeo, começando em 0.
analisador_gpu = pipeline(
task="text-classification",
model="uer/roberta-base-finetuned-dianping-chinese",
device=0 # Define a execução na primeira GPU disponível
)
Explorando Parâmetros de Tarefas Complexas
Dependendo da arquitetura, o pipeline aceita argumentos adicionais para configurar a inferência. Para tarefas de resposta a perguntas (Question Answering), é necessário fornecer tanto o contexto base quento a pergunta a ser respondida.
qa_system = pipeline(
task="question-answering",
model="uer/roberta-base-chinese-extractive-qa"
)
# Consultando a documentação interna do objeto para verificar assinaturas esperadas
help(qa_system)
resposta = qa_system(
question="O que a API simplifica?",
context="A API pipeline do Transformers abstrai o pré-processamento, a inferência e o pós-processamento."
)
print(resposta)
Aplicação em Visão Computacional
A ferramenta também suporta tarefas multimodais, como a detecção de objetos utilizando aprendizado zero-shot (zero-shot object detection).
import requests
from PIL import Image, ImageDraw
modelo_visao = "google/owlvit-base-patch32"
detector_objetos = pipeline(task="zero-shot-object-detection", model=modelo_visao)
# Carregando imagem a partir de uma URL externa
imagem_url = "https://unsplash.com/photos/oj0zeY2Ltk4/download?ixid=MnwxMjA3fDB8MXxzZWFyY2h8MTR8fHBpY25pY3xlbnwwfHx8fDE2Nzc0OTE1NDk&force=true&w=640"
imagem = Image.open(requests.get(imagem_url, stream=True).raw)
# Executando inferência com classes candidatas
deteccoes = detector_objetos(
imagem,
candidate_labels=["hat", "sunglasses", "book", "bag"]
)
# Desenhando as caixas delimitadoras (bounding boxes) e rótulos
editor = ImageDraw.Draw(imagem)
for item in deteccoes:
caixa = item["box"]
classe = item["label"]
confianca = item["score"]
x_min, y_min, x_max, y_max = caixa.values()
editor.rectangle([(x_min, y_min), (x_max, y_max)], outline="blue", width=2)
editor.text((x_min, y_min - 10), f"{classe}: {confianca:.2f}", fill="blue")
imagem.show()
Entendendo o Funcionamento Interno
Embora o pipeline oculte a complexidade do fluxo, as etapas subjacentes podem ser reproduzidas manualmente. Isso oferece maior controle sobre a manipulação de tensores e o consumo de memória.
1. Inicialização do Tokenizador e do Modelo
from transformers import AutoTokenizer, AutoModelForSequenceClassification
checkpoint = "uer/roberta-base-finetuned-dianping-chinese"
tokenizador = AutoTokenizer.from_pretrained(checkpoint)
modelo = AutoModelForSequenceClassification.from_pretrained(checkpoint)
2. Pré-processamento dos Dados
texto_entrada = "O atendimento foi muito ruim."
entradas = tokenizador(texto_entrada, return_tensors="pt")
3. Inferência
import torch
with torch.no_grad():
saidas = modelo(**entradas)
logits = saidas.logits
4. Pós-processamento
probabilidades = torch.softmax(logits, dim=-1)
indice_previsto = torch.argmax(probabilidades).item()
# Mapeando o índice numérico para o rótulo textual original
rotulo_final = modelo.config.id2label[indice_previsto]
print(f"Sentimento previsto: {rotulo_final}")