HuggingFace · 技术问答
Hugging Face · 技术问答
必会
重点 什么时候用 BERT 微调,什么时候用大模型?
口述:先看标注、任务死不死、显存。不是谁更新就用谁。
- BERT — 大量标注、任务固定、要准要快(生产推理)、显存大约 1–2GB。Logits 一次 argmax 出类别。
- 大模型 — 没标注、任务杂、要快速验证和零样本、显存大约 8GB+。拼 Prompt 生成再解析。
口条:有标签走微调,没标签走 Prompt。稳定分类别默认上大模型。
重点 为什么需要微调(Fine-tuning)?
口述:Hub 上拿来就能用,但那是通识,不懂你的业务口径。预训练像大学通识教育;微调像岗前培训。
- 预训练 — BERT 读过维基、书籍,懂语法、成语,「苹果」可以是水果也可以是公司。不知道你们发票怎么审、垃圾邮件怎么定义。
- 微调 — 在预训练权重上,用领域数据再训一小会儿。目标:从「懂中文的毕业生」变成「懂医疗发票的审核员」。
通用模型搞不定的例子(别说成自己上线的):
- 通用 BERT 看见「CT显示肺部纹理增多」,只知道这是一句话;医疗微调后能标出检查项 / 部位 / 临床表现。
- 「恭喜您中奖了」通用情感可能判成 Positive,业务里就是 Spam。
口条:预训练懂语言,微调懂业务。 标签和口径跟通用集不一致,就必须微调。
重点 AutoModel 和 AutoModelFor… 分别是什么?
口述:Auto* 是工厂,按 config.json 自动选 BERT / GPT 等实现。差在出什么:只要特征,还是直接出任务分数。
AutoModel(Base) — 只有大脑。输出 Hidden States,一堆高维向量,人看不懂。适合自己在后面搭头、做特征、做检索向量。AutoModelForSequenceClassification(带头) — 大脑 + 嘴巴。Base 后面接一层全连接 Classification Head,直接出各类别 Logits,再argmax就是标签。
ForTokenClassification、ForQuestionAnswering、ForCausalLM 同理:都是 Base + 对应任务头。微调分类用带头的;只想抠 [CLS] 向量用 Base。
python
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # import 之前
os.environ["HF_HOME"] = "/path/to/hf_cache" # model 和 tokenizer 缓存
from transformers import AutoModel, AutoModelForSequenceClassification
base_model = AutoModel.from_pretrained("bert-base-chinese")
cls_model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese", num_labels=2
)
# 分类头输出形状:(batch_size, num_labels),例如 (2, 2)num_labels 要和任务类别数一致,二分类写 2。口条:AutoModel 出向量,For… 出任务结果。
重点 Encoder-Only、Decoder-Only、Encoder-Decoder 有何区别?
答题要点
- Encoder-Only(BERT):双向注意力,分类、NER、情感。
- Decoder-Only(GPT/Llama):自回归生成,对话、代码、推理(当前主流 Chat)。
- Encoder-Decoder(T5/BART):序列到序列,翻译、摘要。
加分句:先看任务是理解、生成还是转换,再报架构。
进阶
微调里 Datasets 和 DataCollator 干什么?
口述:业务数据通常在 CSV / Excel,不在 Hub。Datasets 负责加载和并行预处理;DataCollator 负责每个 batch 动态补齐,别把所有句子都垫到 512。
- 加载 —
load_dataset("csv", data_files="my_data.csv")。 map— 不是普通 for 循环,能多进程并行。把文本列批量变成 Input IDs。- DataCollator(动态补齐) — BERT 同一 batch 长度必须一致。全局补到 512:10 个字也垫 502 个 0,显卡在算空气。训练时看这一批最长(比如 50),只补到 50。速度上去、显存下来。
python
from datasets import load_dataset
raw = load_dataset("csv", data_files="my_data.csv")
tokenized = raw.map(tokenize_fn, batched=True) # 可加 num_proc 并行口条:CSV 进 Datasets,map 转 ID,Collator 按批最长补齐。 512 是模型上限,不是每句都要垫满。
用 Trainer API 有什么好处?
口述:HF 出现之前,训练循环要自己写 Forward、Backward、optimizer.step、zero_grad,写错一步就不收敛。Trainer 把这些脏活包掉,实例化一个类就能跑。
| 维度 | 手写 PyTorch 循环 | HuggingFace Trainer |
|---|---|---|
| 代码量 | 一整段训练循环 | 实例化 1 个类 |
| 功能 | 日志、保存、断点续训要自己写 | Checkpoints、Logging 开箱即用 |
| 硬件 | 混合精度要手配 | fp16=True |
| 多卡 | 自己上 DDP,难 | 自动适配多卡 |
特殊 loss、奇葩采样,循环还是要自己写。标准微调分类 / 生成,Trainer 够用。口条:标准微调用 Trainer;它包的是循环和工程,不是把模型训得更聪明。
微调这几个名词分别指什么?
口述:面试把四个词说清就够。HF 把 NLP 从数据准备 → 训练 → 推理串成一条流水线,人盯数据和模型本身。
- 预训练 vs 微调 — 预训练已经会语言;微调用少量领域数据适应特定任务。
- 动态补齐 —
DataCollatorWithPadding按这一批最长句补齐,不是全局垫到 512。 - Trainer API — 封装 Forward / Backward / 保存 / 多卡,开发者专注数据和模型。
- 评估策略 — 每个 epoch 结束做一次评估并保存,便于盯过拟合、挑 checkpoint。对应
eval_strategy="epoch"、save_strategy="epoch"。
口条:预训练通识,微调上岗;Collator 按批补齐;Trainer 包循环;epoch 末评估再存盘。
Pipeline 很好用,还要不要看里面封装了什么?
口述:Pipeline 是傻瓜相机,Demo 直接拍。要深度定制或微调,必须拆开。里面第一块是 Tokenizer:把文本变成 Tensor。
- 词表必须和模型一套 — 不能用 BERT 的字典去切 GPT。混用就是乱码,和权重必须同一 checkpoint。
- Padding — 短句补长(通常补 0),GPU 要整齐矩阵才能成 batch。
- Truncation — 超长切掉,BERT 一类常见上限 512。截断会丢尾巴,别默认以为全看见了。
python
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 必须在 import 之前
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
inputs = tokenizer(
["我爱AI", "HuggingFace真好用"],
padding=True,
truncation=True,
max_length=10,
return_tensors="pt",
)
# input_ids:字对应的数字;attention_mask:1 是真字,0 是 Padding口条:上手用 Pipeline,微调拆 Tokenizer。 mask 里 1 才进注意力,0 是垫的。
推理部署时 Tokenizer 为什么不能跨模型混用?
答题要点
- 模型只认 Token ID;词表和切词算法(BPE / WordPiece)各不相同,同一 ID 在不同模型含义不同。
- 特殊符号不兼容(
[CLS]vs<s>)。 - 必须和权重同一 checkpoint 配对加载,否则乱码。
加分句:和 Embedding「query/doc 必须同模型」是同一类纪律。
了解
视频基础模型 InternVideo2 / 2.5 是什么?
口述:OpenGVLab 的视频基础模型。InternVideo2 强调渐进式预训练;其后续对话向版本强化长视频与细粒度理解。具体版本能力、数据规模和榜单以对应论文与模型卡为准,不将年份或课件口径当成长期结论。
InternVideo2 三阶段
- 时空结构 — Video Encoder 学结构;Expert Encoder 冻结引导。
- 多模态对齐 — 视频 / 音频 / 文本对比学习 Align。
- 对话 — Q-Former + LLM,next-token 出回答。
数据重点是时空一致与标签质量。InternVid2 使用语义切段,并对视觉、音频、语音分别描述再融合;训练数据规模应回查对应模型卡或论文。
InternVideo2.5 — 基于 InternVL2.5 + LRC:自适应分层 token 压缩 HiCo(更长视频);任务偏好 TPO(跟踪/分割等细粒度)。开源 Chat 约 8B。
口条:2 = 结构→对齐→对话;2.5 = 长视频 MLLM(HiCo + TPO)。
视频多模态注释框架 VidCap 是什么?主要用哪些模型?
口述:InternVideo2 的自动注释流水线,不是聊天模型。分模态 caption,再用 LLM 融合,给视频对齐训练造高质量文本。
四个组件:
- Video Captioner — InternVid 视频描述流水线 → 视觉描述
- Audio Captioner — VideoChat + BEATs,只训 Q-Former(WavCaps)→ 音频描述
- Speech Captioner — WhisperV2-large → 语音字幕
- LLM 融合 — Vicuna-1.5 校正并合成 AV / AVS
每 clip 产出 V、A、S、AV、AVS 五种文本。切段常用 AutoShot。下游 InternVideo2 动作识别课件口径:16 帧冲 SOTA(数字报论文,别说亲测)。
口条:VidCap = 视/音/语 Captioner + Vicuna 融合;是数据引擎,不是 Chat 本体。
没有标注、算法没排期,怎么最快验证电商评论情感分类?
答题要点
- HuggingFace
pipeline,zero-shot-classification,业务只给标签列表。 - 封装了分词→推理→后处理,适合 Demo。
- 准确率不够再上标注和微调;Pipeline 难深度定制。
加分句:先证明业务有没有信号,再谈训练。