If you have ever looked at the Hugging Face ecosystem and felt overwhelmed by the number of classes, configurations, and tokenizers, you are not alone. The pipeline API exists for exactly this reason: it wraps model loading, preprocessing, inference, and postprocessing into a single function call. You do not need to know what a AutoTokenizer does to classify sentiment or transcribe audio.
This guide covers the four pipeline types you will actually use — text, vision, audio, and multimodal — with real model names, working code, and the performance tricks that matter in production.
1. Why Use Pipelines?
Before pipelines, running a transformer model looked like this:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
inputs = tokenizer("I love this product!", return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
predicted_class = torch.argmax(logits, dim=-1).item()
# Then map the integer back to a label somehow
That is 9 lines, three imports, and a manual label lookup. With a pipeline:
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier("I love this product!")
# [{'label': 'POSITIVE', 'score': 0.9998}]
The pipeline handles tokenization, tensor formatting, model inference, and label mapping. The code you write is the code that matters: the input and what you do with the output.
2. Setup and Installation
Install the core library. GPU support is optional but recommended for vision and audio models:
# CPU only
pip install transformers
# With PyTorch GPU support (recommended)
pip install transformers torch
# Verify
python -c "import transformers; print(transformers.__version__)"
The first time you run a pipeline, the default model downloads automatically to ~/.cache/huggingface/. The default sentiment model is about 250 MB; image models run 300–900 MB. If you are on a slow connection, add model_kwargs={"torch_dtype": "auto"} to load in the most efficient dtype the model supports.
3. Text Pipelines: Classification and Summarization
Sentiment Analysis
The most common starting point. The default model is DistilBERT fine-tuned on SST-2:
classifier = pipeline("sentiment-analysis")
results = classifier([
"The API documentation is excellent.",
"I spent three hours debugging a caching issue."
])
for r in results:
print(f"{r['label']}: {r['score']:.4f}")
Output:
POSITIVE: 0.9997
NEGATIVE: 0.9982
Zero-Shot Classification
Classify text into custom labels without training. Useful for tagging support tickets or routing emails:
classifier = pipeline("zero-shot-classification")
text = "The server returned a 502 Bad Gateway after the deployment."
labels = ["infrastructure", "frontend", "security", "database"]
result = classifier(text, candidate_labels=labels)
for label, score in zip(result["labels"], result["scores"]):
print(f"{label}: {score:.3f}")
Output:
infrastructure: 0.847
frontend: 0.089
security: 0.041
database: 0.023
Summarization
The default summarization model is BART-large-CNN. It works best on news-style text over 100 words:
summarizer = pipeline("summarization")
long_text = """Hugging Face released a major update to the transformers library
in mid-2025, introducing native support for quantized model loading through
bitsandbytes integration. This allows developers to run 7B parameter models
on consumer GPUs with only 8 GB of VRAM, down from the 28 GB previously
required for full-precision inference. The pipeline API was also extended
to support audio and vision tasks with the same single-function interface."""
summary = summarizer(long_text, max_length=50, min_length=20, do_sample=False)
print(summary[0]["summary_text"])
4. Vision Pipelines: Image Classification
The vision pipeline loads a ViT (Vision Transformer) by default. Pass a PIL Image, a local path, or a URL:
from transformers import pipeline
from PIL import Image
classifier = pipeline("image-classification")
# From a URL
results = classifier("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
# From a local file
# img = Image.open("photo.jpg")
# results = classifier(img)
for r in results[:3]:
print(f"{r['label']}: {r['score']:.4f}")
Typical output:
Egyptian cat: 0.4231
tabby cat: 0.1857
tiger cat: 0.0943
The model returns the top 5 labels by default. For object detection, use pipeline("object-detection") instead — it returns bounding boxes in addition to labels.
5. Audio Pipelines: Speech Recognition
The automatic speech recognition (ASR) pipeline uses Whisper by default. It accepts a file path, a numpy array, or a raw bytes buffer:
transcriber = pipeline("automatic-speech-recognition")
result = transcriber("audio_sample.wav")
print(result["text"])
For longer audio, Whisper has a 30-second chunk limit in the base pipeline. Use the chunk_length_s parameter to enable long-form transcription:
transcriber = pipeline(
"automatic-speech-recognition",
model="openai/whisper-base",
chunk_length_s=30,
)
result = transcriber("podcast_episode.mp3")
print(result["text"])
6. Batch Processing for Speed
Pipelines accept lists. Batching is significantly faster than looping because it allows the model to process multiple inputs in parallel through the same forward pass:
classifier = pipeline("sentiment-analysis")
# Slow: one forward pass per item
for text in texts:
classifier(text)
# Fast: one batched forward pass
results = classifier(texts)
For large datasets, use a generator with batch_size to avoid loading everything into memory:
def text_generator():
for line in open("reviews.txt"):
yield line.strip()
for result in classifier(text_generator(), batch_size=32):
print(result)
7. Running on GPU
Pass device=0 to move the pipeline to the first CUDA device. The speedup for vision and audio models is typically 5–20x:
# GPU
classifier = pipeline("image-classification", device=0)
# Apple Silicon MPS
classifier = pipeline("image-classification", device="mps")
# CPU (default)
classifier = pipeline("image-classification", device=-1)
If you have multiple GPUs, device=1 selects the second. For production serving, consider the optimum library for ONNX and TensorRT acceleration instead of raw PyTorch.
8. Swapping in a Custom Model
Every pipeline task has a default model, but you can override it with any model from the Hugging Face Hub:
# Use a specific model for a different language
classifier = pipeline(
"sentiment-analysis",
model="cardiffnlp/twitter-roberta-base-sentiment-latest"
)
# Use a smaller, faster model for latency-sensitive work
classifier = pipeline(
"sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english"
)
To find models for a task, search the Hub with the task filter: https://huggingface.co/models?pipeline_tag=text-classification. Check the model card for the languages, datasets, and expected input format it was trained on — a model fine-tuned on tweets behaves differently from one fine-tuned on product reviews.
9. Common Mistakes
Mistake 1: Forgetting the Return Format
Pipeline outputs are always lists of dictionaries, even for a single input. Access the first result with [0]:
result = classifier("Hello")[0] # Not classifier("Hello")
Mistake 2: Passing the Wrong Input Type
Text pipelines need strings. Vision pipelines need PIL Images or paths. Audio pipelines need file paths, numpy arrays, or raw bytes. Passing a string to an image pipeline raises an opaque error about tensor shapes. Check the expected input type in the pipeline documentation before debugging.
Mistake 3: Not Batching on Large Datasets
Running a loop over 10,000 items with individual pipeline calls is 10–50x slower than batching. If memory is a concern, use a generator with batch_size as shown above.
Mistake 4: Ignoring Model Size on First Load
The first call to a pipeline downloads the model. A 900 MB vision model on a slow connection can take minutes. In production, preload models at startup and cache them in memory. In CI, pin model versions and cache the Hugging Face directory between runs.
Mistake 5: Using the Default Model for Non-English Text
The default sentiment model is English-only. Feeding it German or Japanese text returns nonsense labels with high confidence. Always check the model card language coverage, and use a multilingual model like cardiffnlp/twitter-xlm-roberta-base-sentiment for mixed-language workloads.
Frequently Asked Questions
Can I use pipelines without an internet connection?
Yes, after the first download. Models are cached in ~/.cache/huggingface/. Set HF_HUB_OFFLINE=1 to force offline mode. For air-gapped environments, download models manually with huggingface-cli download and point the pipeline to the local path.
How do I save a pipeline to disk?
Save the underlying model and tokenizer, then reload them:
classifier = pipeline("sentiment-analysis")
classifier.model.save_pretrained("./my_model")
classifier.tokenizer.save_pretrained("./my_model")
# Later
classifier = pipeline("sentiment-analysis", model="./my_model")
Are pipelines thread-safe?
No. The underlying PyTorch model is not thread-safe. For concurrent serving, load one pipeline per thread or use a process pool. For production APIs, wrap the pipeline in a FastAPI endpoint with async request handling but synchronous model inference.
Can I use a pipeline inside a Docker container?
Yes. The only requirement is enough disk space for the model cache. Add ENV TRANSFORMERS_CACHE=/app/cache to your Dockerfile and mount a volume there to avoid re-downloading on every container restart.
What is the difference between pipeline and the raw model API?
Pipelines are convenience wrappers. Use them when you want results fast and the default behavior is sufficient. Use the raw API (AutoModel, AutoTokenizer) when you need custom preprocessing, fine-grained control over logits, or integration with training loops.
Do pipelines work with quantized models?
Yes, pass quantization config through model_kwargs:
from transformers import BitsAndBytesConfig
quant_config = BitsAndBytesConfig(load_in_8bit=True)
pipe = pipeline("text-generation", model="meta-llama/Llama-2-7b", model_kwargs={"quantization_config": quant_config})
Bottom Line
The pipeline API is the fastest way to get a transformer model running in Python. One import, one function call, and you have working sentiment analysis, summarization, image classification, or speech recognition. The defaults are good enough for prototypes and internal tools; swap in custom models and GPU acceleration when you move to production.
Start with the task that solves a real problem in your current project — classifying support tickets, summarizing meeting transcripts, or tagging images. The pipeline will handle the model plumbing; you handle the business logic.