Appearance
模型与推理
分词之后,就该把模型加载起来跑推理了。HuggingFace Transformers 库用统一的 API 封装了成千上万个模型,让你「三行代码出结果」。
1. 两条路:Pipeline 高层 API vs 手动底层
┌── Pipeline: 一行搞定, 快速验证 (适合上手/生产)
推理方式 ┤
└── Model+Tokenizer 手动: 完全可控 (适合研究/定制/微调)高层:Pipeline
python
from transformers import pipeline
# 文本生成(Decoder-only)
gen = pipeline("text-generation", model="gpt2")
print(gen("Once upon a time", max_new_tokens=30)[0]["generated_text"])
# 情感分类(Encoder)
clf = pipeline("sentiment-analysis")
print(clf("I love this tutorial!")[0]) # {'label': 'POSITIVE', 'score': 0.999}
# 零样本分类 / 翻译 / 摘要 /问答... 换个 task 名即可Pipeline 内部帮你做完了:分词 → 模型 → 后处理(softmax/解码)。
底层:手动三步
python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
name = "gpt2"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name)
inputs = tok("Transformer is", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=20, do_sample=True, temperature=0.8)
print(tok.decode(out[0], skip_special_tokens=True))2. 「Auto」类是怎么选对模型的
AutoModelForCausalLM ── 读取模型的 config.json 里的 model_type ──► 自动实例化 GPT2LMHeadModel
AutoTokenizer ── 同理,自动挑对应分词器Auto* 前缀 = 「根据 checkpoint 自动匹配正确架构」。想显式控制就用具体类:
python
from transformers import GPT2LMHeadModel, BertForSequenceClassification3. 模型有「头」之分:同一个骨干接不同任务头
预训练骨干(Transformer 堆叠)
│
┌──────────┼───────────────┬────────────────┐
BERT 系: GPT 系:
AutoModel → 只出隐藏状态(特征) AutoModel
AutoModelForMaskedLM → 出词表分布(完形填空) AutoModelForCausalLM → 下一词
AutoModelForSequenceClassification → 分类logits AutoModelForTokenClassification → NER选对类很关键:做分类要 ...ForSequenceClassification,做生成要 ...ForCausalLM,加载错会拿不到想要的输出。
4. 放到 GPU / 半精度
python
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
inputs = {k: v.to(device) for k, v in inputs.items()}
# 大模型省显存: 加载即用 bf16
model = AutoModelForCausalLM.from_pretrained(name, torch_dtype=torch.bfloat16, device_map="auto")5. generate() 的关键参数
generate 是 Decoder-only 的生成总控,参数直接决定输出风格:
| 参数 | 作用 | 常用值 |
|---|---|---|
max_new_tokens | 最多生成多少 token | 50~512 |
do_sample | 是否采样(关掉=贪心) | True |
temperature | 随机性,越大越野 | 0.7~1.0 |
top_p | 核采样,累计概率阈值 | 0.9 |
top_k | 只在概率最高的 k 个里采样 | 50 |
repetition_penalty | 抑制重复 | 1.1~1.3 |
eos_token_id | 遇到就停 | 模型自带 |
python
out = model.generate(
**inputs, max_new_tokens=100,
do_sample=True, temperature=0.8, top_p=0.95,
repetition_penalty=1.1, pad_token_id=tok.eos_token_id,
)若 batch 生成且用 GPT-2(无 PAD),记得设
pad_token_id,否则报错或生成异常。
6. Encoder 模型的推理略有不同
理解类任务不需要 generate,前向一次拿 logits 即可:
python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tok = AutoTokenizer.from_pretrained("bert-base-chinese")
m = AutoModelForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2).eval()
x = tok("这个教程讲得真清楚!", return_tensors="pt")
with torch.no_grad():
logits = m(**x).logits
print("预测类别:", logits.argmax(-1).item())小结
- 快速上手用
pipeline,精细控制用AutoTokenizer + AutoModel*。 - 按任务选「模型头」:生成用
ForCausalLM,分类用ForSequenceClassification。 generate的 temperature/top_p/max_new_tokens 决定生成质量。- 别忘了把模型和张量搬到 GPU、批量生成时配好
pad_token_id。
下一步
推理会了,训练前还得把数据准备好 → 数据集处理。