本节导读:前面三节分别掌握了库概览、模型库和工具链,本节把它们串成两个可直接复现的端到端案例:情感分析微调上线、本地问答服务,走完"数据→训练→评估→部署"的完整闭环。
| 阶段 | 产出 | 关键工具 |
|---|---|---|
| 数据准备 | tokenized数据集 | datasets + AutoTokenizer |
| 训练微调 | 模型权重 | Trainer / TrainingArguments |
| 评估验证 | 指标报告 | evaluate + 验证集 |
| 部署服务 | 推理接口 | pipeline / ONNX导出 |
案例选型说明:情感分类是"小数据、快迭代、指标清晰"的代表任务,最适合作为第一个微调项目;问答服务则演示了"不训练、直接用预训练模型交付业务"的轻量路径。两类路径覆盖了绝大多数业务场景。
from datasets import load_dataset from transformers import AutoTokenizer raw = load_dataset("csv", data_files={"train": "train.csv", "test": "test.csv"}) tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") def tokenize(batch): return tokenizer(batch["text"], truncation=True, max_length=128) ds = raw.map(tokenize, batched=True)
from transformers import (AutoModelForSequenceClassification, TrainingArguments, Trainer) model = AutoModelForSequenceClassification.from_pretrained( "bert-base-chinese", num_labels=2) args = TrainingArguments( output_dir="ckpt-sentiment", learning_rate=2e-5, per_device_train_batch_size=32, num_train_epochs=3, eval_strategy="epoch", # 每轮评估一次 save_strategy="epoch", load_best_model_at_end=True, metric_for_best_model="f1", ) trainer = Trainer( model=model, args=args, train_dataset=ds["train"], eval_dataset=ds["test"], processing_class=tokenizer, ) trainer.train()
import evaluate f1 = evaluate.load("f1") preds = trainer.predict(ds["test"]) result = f1.compute( predictions=preds.predictions.argmax(-1), references=preds.label_ids, ) print(result) # {'f1': 0.94, ...} trainer.save_model("sentiment-model") # 含权重+配置,tokenizer一并保存
from transformers import pipeline clf = pipeline("text-classification", model="sentiment-model") clf(["物流很快,包装完好", "客服态度太差了"]) # [{'label': 'LABEL_1', 'score': 0.99}, {'label': 'LABEL_0', 'score': 0.98}]
Flask封装后即可对外提供HTTP接口,一个最小可用的业务服务就此上线。
数据量不足或需要快速交付时,可直接复用预训练模型:
from transformers import pipeline qa = pipeline("question-answering", model="uer/roberta-base-chinese") answer = qa(question="Transformers库由谁维护?", context="HuggingFace维护的Transformers库是NLP领域最流行的开源工具。") print(answer["answer"]) # "HuggingFace"
这条路径省去训练环节,把开发周期压缩到"接口联调"级别,适合原型验证与内部工具。
Q1:训练loss下降但验证指标不动,怎么办?
通常是过拟合或标签泄漏。检查:①验证集是否与训练集有重复样本;②数据集类别是否极度不均衡(此时accuracy无意义,改看F1);③减小epoch或加大dropout/weight_decay。
Q2:num_labels该设多少?标签顺序怎么对应?
等于业务类别数。标签到id的映射由数据集feature决定,务必用 model.config.id2label 打印确认,预测结果反查时才不会张冠李戴。
Q3:微调后模型在测试集上表现好,上线后变差?
典型的分布漂移。排查线上样本与训练数据的差异(用语、长度、来源渠道),用线上真实样本回流构造评估集,迭代微调。
Q4:batch_size设多大合适?
以GPU不爆显存为上限,一般从32起步。显存不足时优先降batch_size并开启 gradient_accumulation_steps 补偿,而非直接改小学习率。
Q5:为什么要设 load_best_model_at_end=True?
训练结束时的权重未必是最优的(可能已过拟合)。该参数让Trainer回滚到验证指标最好的checkpoint,是低成本拿"最优权重"的标准做法。
trainer.save_model 一并落盘;TrainingArguments 的 eval_strategy 与 save_strategy 必须同为 epoch,否则 load_best_model_at_end 会报错;本节通过情感分析微调与零训练问答两个案例,演示了HuggingFace应用开发的标准路径:datasets 准备数据、Trainer 完成训练、evaluate 输出指标、pipeline 封装服务。案例一适合有标注数据的定制场景,案例二适合快速复用预训练能力。至此,第3章"生态工具"全部讲完,下一章将进入应用实践,把这些能力组合进更大的业务系统。