从 Tokenizer 到 LoRA 微调全流程

知识库
知识库文档
/tech-stacks/huggingface-transformers/tutorial/从 Tokenizer 到 LoRA 微调全流程.md

文档

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 词被拆为子词,如 tokenizationtoken + ##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 文生图

思考题

  1. 为什么 attention_mask 对 padding 位置设 0?pytorch 中 mask 值为 0 还是 -inf?
  2. LoRA 为什么只训练 Q/V 投影而不训练 FFN?r=8 的 rank 如何影响效果?
  3. BERT 和 GPT 的 tokenizer 有何本质区别?为什么 GPT 不能直接用 BERT tokenizer?

信息

路径
/tech-stacks/huggingface-transformers/tutorial/从 Tokenizer 到 LoRA 微调全流程.md
更新时间
2026/5/31