Hugging Face 详细教程:从调用模型到微调与部署
文章目录
如果你想把大模型真正用起来,Hugging Face 几乎是最值得掌握的平台之一。它不只是“模型下载站”,而是一整套围绕模型、数据集、训练、评测、分享与部署的开发生态。
这篇教程从零开始,带你完成一条完整路径:安装环境 → 调用预训练模型 → 处理数据集 → 微调模型 → 上传 Hub → 用 Spaces 部署应用。
一、Hugging Face 到底是什么?
Hugging Face 主要由几类核心能力组成:
• Hub:托管模型、数据集和 Demo。
• Transformers:加载、推理和训练 Transformer 模型。
• Datasets:统一下载、处理和缓存数据集。
• Tokenizers:高性能文本分词器。
• Accelerate:简化 CPU、单卡、多卡和混合精度训练。
• PEFT:用 LoRA 等参数高效方法微调大模型。
• Spaces:把模型快速部署成可交互应用。
一个实用的理解方式是:Hub 负责资源管理,库负责工程能力,Spaces 负责展示和部署。
二、安装环境
建议使用 Python 3.10 或更高版本,并创建独立虚拟环境:
python -m venv .venv
source .venv/bin/activate
Windows PowerShell:
.venv\Scripts\Activate.ps1
安装基础依赖:
pip install -U transformers datasets tokenizers accelerate evaluate huggingface_hub safetensors
如果使用 PyTorch,请根据 CUDA 版本从 PyTorch 官网安装匹配版本。检查环境:
import torch
print(torch.__version__)
print(torch.cuda.is_available())
如果 CUDA 返回 False,不代表代码不能运行,只是会使用 CPU,速度通常会慢很多。
三、登录 Hugging Face Hub
在 huggingface.co/settings/tokens 创建一个具有合适权限的 Access Token,然后登录:
from huggingface_hub import login
login()
命令行也可以使用:
hf auth login
不要把 Token 写进代码、提交到 Git,或放进公开日志。生产环境应使用环境变量或密钥管理服务。
四、用 Pipeline 快速完成推理
Pipeline 是最适合入门的高级 API。它会自动处理 tokenizer、模型加载、输入预处理和输出解码。
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
print(classifier("Hugging Face makes model development much easier."))
文本生成:
generator = pipeline("text-generation", model="distilgpt2")
result = generator("Machine learning is", max_new_tokens=50)
print(result[0]["generated_text"])
常见任务包括:sentiment-analysis、text-classification、text-generation、question-answering、summarization、translation、automatic-speech-recognition、image-classification 和 object-detection。
第一次运行时模型会自动下载并缓存到本地。线上部署时,建议提前下载并固定模型版本,避免启动时临时下载。
五、理解 Tokenizer
模型不能直接理解字符串,必须先把文本转换成 token,再转换成 input IDs。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
inputs = tokenizer(
"Hugging Face is useful.",
return_tensors="pt",
padding=True,
truncation=True,
max_length=128,
)
print(inputs)
批量输入:
texts = ["first sentence", "a much longer second sentence"]
batch = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
padding 让同一批次长度一致,truncation 防止超长输入,max_length 控制最大长度。训练时要特别注意 tokenizer 的 padding_side、pad_token 和模型最大上下文长度。
六、直接加载模型
分类模型示例:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
"distilbert-base-uncased-finetuned-sst-2-english"
)
outputs = model(**inputs)
print(outputs.logits)
生成式模型则使用 AutoModelForCausalLM:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("distilgpt2")
设备映射:
model = AutoModelForCausalLM.from_pretrained(
"your-model-name",
device_map="auto",
torch_dtype="auto",
)
显存不足时,可以考虑更小模型、量化、CPU offload、减少 batch size 或使用 PEFT。
七、使用 Datasets 处理数据
from datasets import load_dataset
dataset = load_dataset("imdb")
print(dataset)
print(dataset["train"][0])
批量分词:
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
max_length=256,
)
tokenized = dataset.map(tokenize_function, batched=True)
常用操作:
• map:批量转换或增加字段。
• filter:筛选样本。
• train_test_split:切分训练集和验证集。
• remove_columns:删除原始字段。
• set_format:设置 PyTorch、NumPy 等输出格式。
数据处理的关键不是“全部塞进模型”,而是明确标签、去重、清洗异常样本、控制长度,并保留一份可复现的数据版本。
八、使用 Trainer 微调模型
from transformers import (
AutoTokenizer,
AutoModelForSequenceClassification,
TrainingArguments,
Trainer,
)
model_name = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
def tokenize(batch):
return tokenizer(batch["text"], truncation=True, padding="max_length", max_length=256)
tokenized = dataset.map(tokenize, batched=True)
args = TrainingArguments(
output_dir="./results",
eval_strategy="epoch",
save_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=2,
weight_decay=0.01,
load_best_model_at_end=True,
report_to="none",
)
trainer = Trainer(
model=model,
args=args,
train_dataset=tokenized["train"],
eval_dataset=tokenized["test"],
tokenizer=tokenizer,
)
trainer.train()
trainer.evaluate()
实际项目中,学习率、batch size、训练轮数、最大长度和评测指标都需要根据数据规模调整。不要只看训练 loss,还要观察验证集指标和真实样例。
九、用 LoRA / PEFT 高效微调大模型
全参数微调需要更新模型的全部参数,显存和存储成本很高。LoRA 只训练少量低秩适配器参数,通常更适合个人开发者和中小团队。
pip install -U peft
from peft import LoraConfig, TaskType, get_peft_model
config = LoraConfig(
task_type=TaskType.SEQ_CLS,
r=8,
lora_alpha=16,
lora_dropout=0.05,
target_modules=["q_lin", "v_lin"],
)
model = get_peft_model(model, config)
model.print_trainable_parameters()
不同架构的 target_modules 不同,不能机械照抄。使用前应查看模型结构,确认注意力层命名。对因果语言模型,TaskType 通常使用 CAUSAL_LM;对分类任务则使用 SEQ_CLS。
十、上传模型到 Hub
训练完成后:
trainer.push_to_hub()
或者手动上传:
model.push_to_hub("your-username/my-model")
tokenizer.push_to_hub("your-username/my-model")
建议同时上传 README.md,写清楚模型用途、训练数据、限制、评测结果、许可证和使用示例。一个可复现的模型仓库,通常比“只有权重文件”的仓库更有价值。
十一、用 Spaces 部署 Demo
Spaces 支持 Gradio、Streamlit 等方式。最小 Gradio 示例:
import gradio as gr
from transformers import pipeline
pipe = pipeline("sentiment-analysis")
def predict(text):
return pipe(text)
gré = gr.Interface(
fn=predict,
inputs=gr.Textbox(label="输入文本"),
outputs=gr.JSON(label="结果"),
title="情感分析 Demo",
)
gré.launch()
把 app.py、requirements.txt 和必要配置上传到 Space,Hub 会自动构建并运行。部署前要注意启动时间、内存、并发、模型缓存和隐私问题。
十二、如何选择模型
不要只看下载量。至少检查:
• 任务类型是否匹配。
• 输入语言和领域是否匹配。
• 模型许可证是否允许你的用途。
• 上下文长度是否足够。
• 参数规模与显存是否匹配。
• 模型卡是否写明训练数据、限制和评测。
• 推理速度与准确率是否满足业务目标。
工程上最常见的正确路线是:先用小模型做 baseline,再根据效果和成本决定是否换更大的模型或进行微调。
十三、常见问题排查
-
CUDA out of memory:减小 batch size、max_length,使用 fp16/bf16、量化或 LoRA。
-
tokenizer 没有 pad_token:根据模型类型设置合适的 pad_token,生成模型尤其要检查 padding_side。
-
模型下载很慢:检查网络和缓存目录,或提前下载后离线部署。
-
训练后效果差:检查标签映射、数据泄漏、类别不平衡、截断比例和学习率。
-
推理结果不稳定:固定生成参数,设置 max_new_tokens、temperature、top_p,并记录模型版本。
-
依赖冲突:锁定 transformers、datasets、torch 等关键版本,使用 requirements.txt 或 uv.lock。
十四、一条推荐学习路线
第一阶段:会用 pipeline 和 Hub,能完成文本分类、生成、语音或图像推理。
第二阶段:掌握 tokenizer、Datasets、Trainer,完成一个小数据集微调项目。
第三阶段:学习 Accelerate、PEFT、量化和评测,降低训练与推理成本。
第四阶段:使用 Spaces 或自己的 API 服务部署,加入日志、缓存、监控和权限控制。
十五、官方资料
• Transformers Quick Tour:https://huggingface.co/docs/transformers/quicktour
• Pipeline Tutorial:https://huggingface.co/docs/transformers/pipeline_tutorial
• Datasets Quickstart:https://huggingface.co/docs/datasets/en/quickstart
• PEFT Quicktour:https://huggingface.co/docs/peft/quicktour
• Hub CLI:https://huggingface.co/docs/huggingface_hub/en/guides/cli
• Spaces Overview:https://huggingface.co/docs/hub/en/spaces-overview
总结:Hugging Face 的价值不在于某一个 API,而在于它把“模型获取、数据处理、训练微调、版本管理和应用部署”串成了一条完整工作流。建议从一个小任务开始,先跑通推理,再做数据处理和微调,最后把结果部署成别人可以直接使用的 Demo。



