Transformers Pipeline: Chạy Model NLP Trong Vài Dòng Code
1. Tổng quan
Hugging Face Transformers cung cấp API pipeline() giúp bạn chạy một model NLP/vision/audio đã pretrained chỉ với vài dòng code, không cần tự load tokenizer, config hay xử lý tensor thủ công. Bài này giúp bạn hiểu pipeline() hoạt động thế nào, cách dùng cho các task phổ biến (sentiment analysis, NER, summarization, zero-shot classification), và khi nào nên “xuống tầng thấp hơn” để kiểm soát chi tiết hơn.
Đọc xong, bạn có thể tự chạy inference với model Hugging Face trong ứng dụng Python của mình, viết test kiểm tra output, và biết giới hạn của pipeline trước khi đưa vào production.
2. Cài đặt
Bạn cần thư viện transformers và một backend (PyTorch hoặc TensorFlow). Ví dụ dùng PyTorch:
pip install transformers torch
Phiên bản khuyến nghị tại thời điểm viết bài: transformers>=4.40, torch>=2.2.
Lưu ý: Lần đầu chạy,
pipeline()sẽ tải model từ Hugging Face Hub về và cache tại~/.cache/huggingface. Model có thể vài trăm MB, nên nếu chạy trong container CI, bạn cần tính thời gian/mạng cho bước này hoặc bake sẵn cache vào image.
3. Pipeline Cơ Bản: Sentiment Analysis
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
result = classifier("I really love this product, it works great!")
print(result)
- Dòng 1: import hàm
pipeline. - Dòng 3: tạo pipeline cho task
sentiment-analysis. Khi không chỉ định model, Hugging Face tự chọn model mặc định (thường làdistilbert-base-uncased-finetuned-sst-2-english). - Dòng 4: gọi pipeline như một hàm, truyền câu văn bản vào.
Đầu ra:
[{'label': 'POSITIVE', 'score': 0.9998}]
pipeline trả về list vì nó hỗ trợ xử lý batch (truyền list string vào cũng được).
4. Chỉ Định Model Và Tokenizer Cụ Thể
Không nên phụ thuộc vào model mặc định trong code production, vì Hugging Face có thể đổi default giữa các phiên bản. Hãy chỉ định rõ:
from transformers import pipeline
classifier = pipeline(
task="sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english",
device=-1 # -1 = CPU, 0 = GPU đầu tiên
)
results = classifier([
"This movie was a complete waste of time.",
"Absolutely fantastic service!"
])
for r in results:
print(r)
model: chỉ định rõ checkpoint, tránh phụ thuộc vào default có thể thay đổi.device:-1chạy CPU,0chạy GPU index 0. Nếu máy không có CUDA mà bạn setdevice=0, pipeline sẽ raise lỗi.- Truyền một list câu vào classifier để xử lý batch, hiệu quả hơn gọi từng câu một.
Đầu ra:
{'label': 'NEGATIVE', 'score': 0.9995}
{'label': 'POSITIVE', 'score': 0.9997}
5. Named Entity Recognition (NER)
from transformers import pipeline
ner = pipeline("ner", model="dslim/bert-base-NER", aggregation_strategy="simple")
text = "Satya Nadella is the CEO of Microsoft, based in Redmond."
for entity in ner(text):
print(entity["word"], "->", entity["entity_group"], f"{entity['score']:.2f}")
aggregation_strategy="simple": gộp các sub-token (ví dụSat,##ya) thành một entity hoàn chỉnh thay vì trả về từng mảnh token rời rạc.entity_group: nhãn loại thực thể (PER, ORG, LOC…).
Đầu ra:
Satya Nadella -> PER 0.99
Microsoft -> ORG 0.99
Redmond -> LOC 0.98
Lưu ý: Nếu bỏ
aggregation_strategy, bạn sẽ nhận token rời rạc kiểu BIO-tagging (B-PER,I-PER…), phải tự gộp lại — dễ gây bug nếu không xử lý kỹ.
6. Zero-Shot Classification
Zero-shot cho phép phân loại văn bản vào các nhãn tùy ý mà model chưa từng được huấn luyện riêng cho nhãn đó.
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
result = classifier(
"This new phone has an amazing camera and battery life.",
candidate_labels=["technology", "sports", "politics", "finance"]
)
print(result["labels"][0], result["scores"][0])
candidate_labels: danh sách nhãn bạn tự định nghĩa, không cần fine-tune model.- Model dùng kỹ thuật Natural Language Inference để tính xác suất văn bản “entail” từng nhãn.
Đầu ra:
technology 0.93
Zero-shot rất tiện cho prototype nhanh, nhưng chậm hơn và kém chính xác hơn model đã fine-tune trực tiếp cho task của bạn.
7. Text Summarization
from transformers import pipeline
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
article = """
The Transformers library by Hugging Face provides thousands of pretrained
models to perform tasks on texts such as classification, information
extraction, question answering, summarization, translation, and more.
It bridges research and production by exposing a simple pipeline API
on top of complex model architectures.
"""
summary = summarizer(article, max_length=40, min_length=10, do_sample=False)
print(summary[0]["summary_text"])
max_length/min_length: giới hạn độ dài token của tóm tắt, không phải số từ.do_sample=False: dùng greedy/beam decoding thay vì sampling ngẫu nhiên, cho kết quả ổn định giữa các lần chạy.
Đầu ra (rút gọn):
Transformers library provides pretrained models for classification,
extraction, question answering, and summarization.
8. Bên Trong Pipeline Có Gì?
pipeline() thực chất ghép 3 thành phần: tokenizer, model, và post-processing logic theo từng task. Bạn có thể tự lắp ráp để kiểm soát chi tiết hơn:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
inputs = tokenizer("Great product!", return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1)
label_id = probs.argmax().item()
print(model.config.id2label[label_id], probs[0][label_id].item())
AutoTokenizer/AutoModelForSequenceClassification: tự nhận diện kiến trúc đúng dựa trên tên model.tokenizer(..., return_tensors="pt"): trả về PyTorch tensor thay vì list số thường.torch.no_grad(): tắt tính gradient vì đây là inference, không phải training — giúp tiết kiệm bộ nhớ và nhanh hơn.model.config.id2label: map chỉ số class về tên nhãn (LABEL_0/LABEL_1hoặcPOSITIVE/NEGATIVEtùy model).
Hiểu được tầng này giúp bạn debug khi pipeline cho kết quả lạ, hoặc khi cần custom logic (ví dụ áp threshold riêng thay vì lấy argmax).
9. Viết Test Cho Pipeline
Vì output của model có thể thay đổi nhẹ giữa các phiên bản, test nên kiểm tra “hành vi” thay vì so khớp số thập phân tuyệt đối.
import pytest
from transformers import pipeline
@pytest.fixture(scope="module")
def sentiment_classifier():
return pipeline(
"sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english",
)
def test_classifies_positive_sentence(sentiment_classifier):
result = sentiment_classifier("I absolutely love this!")[0]
assert result["label"] == "POSITIVE"
assert result["score"] > 0.9
def test_classifies_negative_sentence(sentiment_classifier):
result = sentiment_classifier("This is the worst experience ever.")[0]
assert result["label"] == "NEGATIVE"
assert result["score"] > 0.9
scope="module": fixture chỉ load model một lần cho toàn bộ file test, tránh tải model lặp lại ở mỗi test case — việc load model tốn vài giây đến vài chục giây.- Assert dựa trên
labelvà ngưỡngscore, không hardcode giá trị score chính xác vì nó có thể lệch nhẹ giữa các version thư viện.
Lưu ý: Chạy test loại này cần tải model thật, nên không phù hợp cho unit test chạy trong vòng lặp CI nhanh. Tách riêng thành integration test, hoặc mock pipeline khi test logic nghiệp vụ xung quanh.
10. Khi Nào Không Nên Dùng Pipeline
Pipeline rất tốt để prototype và cho các task chuẩn, nhưng có giới hạn:
- Batch lớn, hiệu năng cao: pipeline không tối ưu tốt bằng việc tự quản lý batching, padding, và dynamic batching thủ công.
- Cần custom logic phức tạp: ví dụ áp nhiều điều kiện hậu xử lý, kết hợp nhiều model, hoặc cần truy cập hidden states — lúc này nên dùng trực tiếp
AutoModel+ tokenizer như mục 8. - Serving production ở quy mô lớn: nên cân nhắc các công cụ chuyên dụng như Text Generation Inference hoặc ONNX Runtime/TensorRT để tối ưu latency, thay vì gọi
pipeline()trực tiếp trong request handler. - Model quá lớn cho CPU: các model như
bart-large-mnlihay LLM nhiều tỷ tham số chạy CPU sẽ rất chậm; cần GPU hoặc quantization.
11. Kết luận
pipeline() của Hugging Face Transformers là cách nhanh nhất để chạy inference với model NLP pretrained — chỉ cần vài dòng code cho sentiment analysis, NER, summarization hay zero-shot classification. Khi cần kiểm soát sâu hơn về hiệu năng hoặc logic xử lý, bạn có thể “bóc tách” pipeline thành tokenizer và model riêng để tự quản lý. Hãy luôn chỉ định rõ model thay vì dùng default, và viết test dựa trên hành vi (label, ngưỡng score) thay vì giá trị tuyệt đối để tránh test flaky khi thư viện cập nhật.