第 5 章 : NLP 实战与部署(详细教程)¶
这一章将带你走出理论与模型训练,进入 NLP 项目实战与落地部署阶段。目标是让你能把前面学的模型(词向量、RNN/LSTM、Transformer、BERT/GPT)应用到真实任务,并将模型部署为可用的服务。
一、学习目标¶
完成本章后,你将能:
- 设计和实现完整的 NLP 项目流程(数据 → 模型 → 部署)。
- 熟练处理文本数据清洗、分词、编码、特征工程。
- 训练并优化不同类型的 NLP 模型(分类、生成、问答)。
- 实现模型在线部署,包括 API 接口、推理优化、容器化。
- 掌握常见部署工具与技术,如 FastAPI、Docker、ONNX、GPU/CPU 推理优化。
二、NLP 项目流程概览¶
-
数据收集与清洗
- 文本清洗:去掉 HTML、标点符号、表情等
- 分词与标准化:中文使用结巴、HanLP,英文可用 NLTK、Spacy
- 数据标注:分类标签、生成任务的 prompt-completion 对等
-
特征工程 / 文本表示
- 稀疏表示:TF-IDF / Bag-of-Words
- 分布式表示:Word2Vec、GloVe、fastText
- 预训练 Transformer 表示:BERT、GPT、RoBERTa
-
模型选择与训练
- 文本分类:BERT、LSTM
- 文本生成:GPT、Transformer Decoder
- 问答系统:BERT + QA Head
-
模型评估
- 分类任务:Accuracy、F1、Precision、Recall
- 生成任务:BLEU、ROUGE、Perplexity
- 可视化:混淆矩阵、t-SNE / PCA
三、NLP 实战示例¶
1. 文本分类(情感分析)¶
from transformers import BertTokenizer, BertForSequenceClassification
from torch.utils.data import DataLoader, Dataset
import torch
# 自定义 Dataset
class MyDataset(Dataset):
def __init__(self, texts, labels, tokenizer, max_len=128):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
enc = self.tokenizer(self.texts[idx],
padding='max_length',
truncation=True,
max_length=self.max_len,
return_tensors='pt')
return { 'input_ids': enc['input_ids'].squeeze(),
'attention_mask': enc['attention_mask'].squeeze(),
'labels': torch.tensor(self.labels[idx]) }
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
# 训练循环省略,可使用 Trainer API
2. 文本生成(GPT)¶
from transformers import GPT2Tokenizer, GPT2LMHeadModel
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
prompt = "Once upon a time"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0]))
四、模型优化与推理¶
- 量化(Quantization):降低模型精度(float32 → int8)减少内存占用
- 蒸馏(Distillation):用小模型逼近大模型,提升速度
- ONNX / TensorRT:跨平台部署与 GPU 加速
- 批量推理 / 并行处理:提高吞吐量
- 缓存机制:对生成任务可缓存前缀向量
五、NLP 模型部署¶
1. API 部署¶
使用 FastAPI 创建模型推理接口:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class TextInput(BaseModel):
text: str
@app.post("/predict")
def predict(input: TextInput):
tokens = tokenizer(input.text, return_tensors="pt")
outputs = model(**tokens)
pred = torch.argmax(outputs.logits, dim=-1).item()
return {"prediction": pred}
2. Docker 容器化¶
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
- 打包成镜像,方便在云服务器或 Kubernetes 上部署
3. 云端部署建议¶
- CPU 推理:小模型 / 量化模型
- GPU 推理:大模型 / 生成任务
- 使用负载均衡与异步请求提高吞吐量
六、实战练习¶
- 对中文短文本进行分类,使用 BERT 微调并部署 FastAPI 接口
- 对英文短故事进行生成,使用 GPT 微调并实现 REST API
- 对模型输出做日志记录和可视化分析(准确率、生成样本)
- 尝试将模型转换为 ONNX 或 TorchScript,加速推理
七、推荐阅读与工具¶
- Hugging Face Transformers 文档:https://huggingface.co/docs/transformers
- FastAPI 官方文档:https://fastapi.tiangolo.com
- Docker 官方文档:https://www.docker.com
- NVIDIA TensorRT、ONNX Runtime 优化指南
如果你希望,我可以帮你生成 完整的 Jupyter Notebook 实战版,包含:
- 中文文本分类(BERT 微调 + FastAPI 部署)
- 英文文本生成(GPT 微调 + API)
- 模型优化与推理示例
是否生成这个 notebook?