Skip to content

模型与推理

分词之后,就该把模型加载起来跑推理了。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, BertForSequenceClassification

3. 模型有「头」之分:同一个骨干接不同任务头

      预训练骨干(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最多生成多少 token50~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

下一步

推理会了,训练前还得把数据准备好 → 数据集处理