文档
HuggingFace Transformers 入门教程
1. Tokenizer:文本 → 数字
模型不懂文字,只懂 token ID。Tokenizer 是翻译官:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer("Hello, world!")
print(tokens) # {'input_ids': [101, 7592, 1010, 2088, 999, 102], 'attention_mask': [1,1,1,1,1,1]}
# 解码回去
print(tokenizer.decode(tokens['input_ids'])) # [CLS] hello, world! [SEP]
关键概念:
- 特殊 token:
[CLS]句首,[SEP]分隔,[PAD]填充 - attention_mask:0 表示忽略该位置(padding)
- subword 分词:OOV 词被拆为子词,如
tokenization→token+##ization
2. Model:加载预训练权重
from transformers import AutoModelForSequenceClassification, AutoModelForCausalLM
# BERT 系(编码器)
bert = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
# GPT 系(解码器)
gpt = AutoModelForCausalLM.from_pretrained("gpt2")
# T5 系(编码-解码)
t5 = AutoModelForSeq2SeqLM.from_pretrained("t5-small")
from_pretrained() 自动下载 config.json + 权重到缓存。
3. Trainer:一行训练
from transformers import Trainer, TrainingArguments
args = TrainingArguments(
output_dir="./results",
per_device_train_batch_size=16,
num_train_epochs=3,
evaluation_strategy="epoch",
save_strategy="epoch",
)
trainer = Trainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
4. LoRA 微调:消费级 GPU 微调 LLaMA
from peft import LoraConfig, get_peft_model, TaskType
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, # rank
lora_alpha=32,
lora_dropout=0.1,
target_modules=["q_proj", "v_proj"], # 仅训练 Q/K/V 投影
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.0622%
仅训练 0.06% 参数,微调效果接近全量微调!
5. 模型部署:Text Generation Inference
# Docker 一键部署 Llama-3 推理服务
docker run -p 8080:80 \
-v $PWD/models:/data \
ghcr.io/huggingface/text-generation-inference:latest \
--model-id meta-llama/Meta-Llama-3-8B-Instruct
6. 架构族速查
| 架构 | 类型 | 代表模型 | 强项 |
|---|---|---|---|
| BERT | 编码器 | bert-base, roberta | NLU:分类/NER/QA |
| GPT | 解码器 | gpt2, llama, mistral | NLG:对话/生成 |
| T5 | 编-解码 | t5, bart, flan-t5 | 翻译/摘要/指令 |
| ViT | 视觉 | vit, swin, dinov2 | 图像分类 |
| CLIP | 多模态 | clip, siglip | 图文检索 |
| Whisper | 语音 | whisper | ASR 识别 |
| Stable Diffusion | 生成 | stable-diffusion-xl | 文生图 |
思考题
- 为什么
attention_mask对 padding 位置设 0?pytorch 中 mask 值为 0 还是 -inf? - LoRA 为什么只训练 Q/V 投影而不训练 FFN?r=8 的 rank 如何影响效果?
- BERT 和 GPT 的 tokenizer 有何本质区别?为什么 GPT 不能直接用 BERT tokenizer?