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 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?