Tokenizer 与模型

Pipeline 够用之后,下一步是拆开 PreprocessorPreTrainedModel。几乎所有检查点都通过 AutoClass + from_pretrained 加载。


AutoClass 怎么选

何时用
AutoConfig只读结构超参,不占显存
AutoTokenizer文本 ↔ token id
AutoImageProcessor / AutoProcessor图像、多模态
AutoModel裸骨架(无任务头),少直接用
AutoModelForSequenceClassification句分类
AutoModelForCausalLMGPT / Qwen 等自回归生成
AutoModelForSeq2SeqLMT5 / BART 等编码-解码

config.json 里的 model_type 决定具体子类(如 DistilBertForSequenceClassification)。你不必记住类名。

from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = "distilbert/distilgpt2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id, device_map="auto", dtype="auto"
)

编码与解码

from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
enc = tok("Transformers run on the Hub.", return_tensors="pt")
print(enc.keys())          # input_ids, attention_mask
print(enc["input_ids"])
print(tok.convert_ids_to_tokens(enc["input_ids"][0]))
print(tok.decode(enc["input_ids"][0], skip_special_tokens=True))

要点:

  • input_ids:词表下标,模型真正吃的整数序列。
  • attention_mask1 为有效 token,0 为 pad,避免 pad 参与注意力。
  • return_tensors="pt":直接得到 PyTorch 张量(基础见 PyTorch 教程)。
  • DistilBERT 会加 [CLS] / [SEP];GPT 类通常只有 BOS/EOS 或甚至没有。

批处理要设 padding,并保证 pad token 存在:

texts = ["short", "a much longer example sentence"]
if tok.pad_token is None:
    tok.pad_token = tok.eos_token
batch = tok(texts, padding=True, truncation=True, return_tensors="pt")

前向计算 vs 生成

分类头吃 tokenizer 输出,取 logits

from transformers import AutoModelForSequenceClassification

clf_tok = AutoTokenizer.from_pretrained(
    "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
)
clf = AutoModelForSequenceClassification.from_pretrained(
    "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
)
out = clf(**clf_tok("Great acting.", return_tensors="pt"))
print(out.logits.argmax(-1))

因果 LM 用 generate()(下一章),不要只跑一次 forward 就当「写完了文章」。


指令模型与 chat template

Qwen/Qwen2.5-0.5B-Instruct 这类模型必须走 apply_chat_template,不能把用户句子当纯续写:

from transformers import AutoModelForCausalLM, AutoTokenizer

mid = "Qwen/Qwen2.5-0.5B-Instruct"
tok = AutoTokenizer.from_pretrained(mid)
model = AutoModelForCausalLM.from_pretrained(
    mid, device_map="auto", dtype="auto"
)
messages = [
    {"role": "system", "content": "You are a concise tutor."},
    {"role": "user", "content": "What is a tokenizer?"},
]
ids = tok.apply_chat_template(
    messages, add_generation_prompt=True, return_tensors="pt"
).to(model.device)

模板写在 Tokenizer 配置里,换模型不要手抄 Qwen 的标记去套 DeepSeek。


保存与三类文件

save_dir = "./my-distilgpt2"
model.save_pretrained(save_dir)
tokenizer.save_pretrained(save_dir)
# 目录中可见 config.json、tokenizer.json、*.safetensors

对应官方三件套:PreTrainedConfigPreTrainedModelPreprocessor。之后 from_pretrained(save_dir) 即可离线加载。


常见坑

现象处理
pad_token is Nonetokenizer.pad_token = tokenizer.eos_token,并同步 model.config
中文被切成单字且效果差换 Qwen 等中文词表,而不是英文 DistilBERT
显存炸device_map="auto"dtype="auto"、更小模型或量化
门控 401换本课 ungated ID,或在网页同意许可后再 hf auth login

下一步

评论