🛫AI大模型训练到发布一条龙:Hugging Face终极工作流

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。

本文全面解析Hugging Face Transformers库的核心功能,通过丰富示例和最佳实践,带你快速掌握预训练模型的加载、使用和微调技术。

一、Transformers库安装与环境配置

1.1 安装基础库

perl 复制代码
# 安装核心库(推荐使用虚拟环境)
pip install transformers
# 安装加速库(可选但推荐)
pip install accelerate
# 安装PyTorch(根据CUDA版本选择)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 安装可选依赖
pip install datasets evaluate sentencepiece

1.2 环境验证

python 复制代码
import transformers
import torch
print(f"Transformers版本: {transformers.__version__}")
print(f"PyTorch版本: {torch.__version__}")
print(f"GPU可用: {'是' if torch.cuda.is_available() else '否'}")
# 输出示例:
# Transformers版本: 4.45.1
# PyTorch版本: 2.2.1+cu118
# GPU可用: 是

1.3 配置缓存目录(可选)

lua 复制代码
import os
# 设置模型缓存目录(避免重复下载)
os.environ['TRANSFORMERS_CACHE'] = '/path/to/cache/dir'
# 设置离线模式(仅使用缓存)
os.environ['TRANSFORMERS_OFFLINE'] = '1'

二、Pipeline API:零代码模型应用

2.1 Pipeline核心功能

scss 复制代码
from transformers import pipeline
# 文本分类
classifier = pipeline("text-classification")
result = classifier("Hugging Face Transformers is amazing!")
print(result)
# [{'label': 'POSITIVE', 'score': 0.9998}]
# 命名实体识别
ner = pipeline("ner", grouped_entities=True)
result = ner("My name is John and I work at Google in New York.")
print(result)
# [{'entity_group': 'PER', 'score': 0.99, 'word': 'John'},#  {'entity_group': 'ORG', 'score': 0.98, 'word': 'Google'},#  {'entity_group': 'LOC', 'score': 0.99, 'word': 'New York'}]
# 文本生成
generator = pipeline("text-generation", model="gpt2")
result = generator("In a world where", max_length=50, num_return_sequences=2)
for i, res in enumerate(result):
    print(f"生成结果 {i+1}: {res['generated_text']}\n")

2.2 多语言支持

ini 复制代码
# 中文情感分析
classifier_zh = pipeline("text-classification", model="bert-base-chinese")
result = classifier_zh("这部电影太精彩了,强烈推荐!")
print(result)  # [{'label': '积极', 'score': 0.99}]
# 日语问答
qa_ja = pipeline("question-answering", model="cl-tohoku/bert-base-japanese")
context = "東京は日本の首都です。"
question = "日本の首都はどこですか?"
result = qa_ja(question=question, context=context)
print(f"回答: {result['answer']}")  # 東京

2.3 视觉任务应用

ini 复制代码
# 图像分类
vision_classifier = pipeline("image-classification")
result = vision_classifier("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
print([(res['label'], f"{res['score']:.2f}") for res in result[:3]])
# [('tiger cat', '0.43'), ('tabby', '0.23'), ('Egyptian cat', '0.20')]
# 图像描述生成
image_captioner = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
result = image_captioner("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
print(f"图像描述: {result[0]['generated_text']}")
# 一只胖乎乎的猫坐在草地上

三、AutoClass:灵活模型与分词器

3.1 AutoTokenizer详解

lua 复制代码
from transformers import AutoTokenizer
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 分词示例
text = "Hugging Face Transformers is awesome!"
tokens = tokenizer.tokenize(text)
print(f"分词结果: {tokens}")
# ['hugging', 'face', 'transformers', 'is', 'awesome', '!']
# 编码为模型输入
inputs = tokenizer(text, return_tensors="pt")
print(f"编码结果: {inputs}")
# {
#   'input_ids': tensor([[101, 17662, 6161, 11303, 2003, 7073, 999, 102]]),
#   'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0]]),
#   'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
# }

3.2 AutoModel详解

python 复制代码
from transformers import AutoModel
import torch
# 加载模型
model = AutoModel.from_pretrained("bert-base-uncased")
# 前向传播
with torch.no_grad():
    outputs = model(**inputs)
# 输出解析
last_hidden_state = outputs.last_hidden_state
print(f"隐藏状态形状: {last_hidden_state.shape}")  # torch.Size([1, 8, 768])

3.3 任务专用AutoClass

ini 复制代码
# 文本分类
from transformers import AutoModelForSequenceClassification
cls_model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
cls_outputs = cls_model(**inputs)
logits = cls_outputs.logits
predicted_class = torch.argmax(logits).item()
print(f"预测类别: {'积极' if predicted_class else '消极'}")  # 积极
# 问答任务
from transformers import AutoModelForQuestionAnswering
qa_model = AutoModelForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
qa_inputs = tokenizer("Hugging Face is a company based in New York.", 
                     "Where is Hugging Face based?", 
                     return_tensors="pt")
qa_outputs = qa_model(**qa_inputs)
answer_start = torch.argmax(qa_outputs.start_logits)
answer_end = torch.argmax(qa_outputs.end_logits) + 1
answer = tokenizer.convert_tokens_to_string(
    tokenizer.convert_ids_to_tokens(qa_inputs["input_ids"][0][answer_start:answer_end])
print(f"回答: {answer}")  # New York

四、常用预训练模型加载指南

4.1 BERT系列模型

ini 复制代码
# 基础英语BERT
model_bert = AutoModel.from_pretrained("bert-base-uncased")
# 中文BERT
model_bert_zh = AutoModel.from_pretrained("bert-base-chinese")
# 多语言BERT
model_bert_multi = AutoModel.from_pretrained("bert-base-multilingual-cased")
# 蒸馏BERT(轻量版)
model_distilbert = AutoModel.from_pretrained("distilbert-base-uncased")

4.2 GPT系列模型

ini 复制代码
# GPT-2
model_gpt2 = AutoModelForCausalLM.from_pretrained("gpt2")
# 中文GPT
model_gpt_zh = AutoModelForCausalLM.from_pretrained("uer/gpt2-chinese-cluecorpussmall")
# GPT-Neo(GPT-3开源替代)
model_gpt_neo = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-neo-1.3B")

4.3 T5系列模型

ini 复制代码
# 文本到文本转换
model_t5 = AutoModelForSeq2SeqLM.from_pretrained("t5-small")
# 使用示例
tokenizer_t5 = AutoTokenizer.from_pretrained("t5-small")
inputs = tokenizer_t5("translate English to French: Hello, how are you?", return_tensors="pt")
outputs = model_t5.generate(**inputs)
print(tokenizer_t5.decode(outputs[0]))  # <pad> Bonjour, comment allez-vous?</s>

4.4 视觉模型

ini 复制代码
# ViT图像分类
from transformers import ViTFeatureExtractor, ViTForImageClassification
import requests
from PIL import Image
feature_extractor = ViTFeatureExtractor.from_pretrained("google/vit-base-patch16-224")
model_vit = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png"
image = Image.open(requests.get(url, stream=True).raw)
inputs = feature_extractor(images=image, return_tensors="pt")
outputs = model_vit(**inputs)
logits = outputs.logits
predicted_class_idx = logits.argmax(-1).item()
print(f"预测类别: {model_vit.config.id2label[predicted_class_idx]}")

五、模型微调实战:情感分析

5.1 数据准备

ini 复制代码
from datasets import load_dataset
# 加载IMDB数据集
dataset = load_dataset("imdb")
print(dataset["train"][0])  # 查看样本
# 数据集拆分
train_dataset = dataset["train"].select(range(1000))  # 小型训练集
test_dataset = dataset["test"].select(range(200))     # 小型测试集

5.2 数据处理

ini 复制代码
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
# 分词函数
def tokenize_function(examples):
    return tokenizer(
        examples["text"], 
        padding="max_length", 
        truncation=True,
        max_length=256
    )
# 应用分词
tokenized_train = train_dataset.map(tokenize_function, batched=True)
tokenized_test = test_dataset.map(tokenize_function, batched=True)

5.3 微调模型

ini 复制代码
from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer
import numpy as np
from evaluate import load
# 加载模型
model = AutoModelForSequenceClassification.from_pretrained(
    "distilbert-base-uncased", 
    num_labels=2  # 二分类
)
# 训练参数
training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=3,
    weight_decay=0.01,
    logging_dir="./logs",
)
# 评估函数
accuracy_metric = load("accuracy")
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return accuracy_metric.compute(predictions=predictions, references=labels)
# 创建Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_train,
    eval_dataset=tokenized_test,
    compute_metrics=compute_metrics,
)
# 开始训练
trainer.train()
# 评估模型
eval_results = trainer.evaluate()
print(f"评估准确率: {eval_results['eval_accuracy']:.4f}")

5.4 使用微调模型

python 复制代码
# 创建pipeline使用微调模型
custom_pipeline = pipeline(
    "text-classification",
    model=model,
    tokenizer=tokenizer,
    device=0 if torch.cuda.is_available() else -1
)
# 测试新样本
results = custom_pipeline([
    "This movie was absolutely fantastic!",
    "The worst film I've ever seen in my life."
])
for res in results:
    print(f"文本: {res['text']}")
    print(f"情感: {'积极' if res['label'] == 'LABEL_1' else '消极'}, 置信度: {res['score']:.4f}\n")

六、高级应用技巧

6.1 模型量化加速

ini 复制代码
# 动态量化(推理加速)
from transformers import AutoModelForSequenceClassification
# 加载原始模型
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")
# 应用动态量化
quantized_model = torch.quantization.quantize_dynamic(
    model,
    {torch.nn.Linear},
    dtype=torch.qint8
)
# 保存量化模型
quantized_model.save_pretrained("./quantized_model")

6.2 模型共享与上传

python 复制代码
from huggingface_hub import notebook_login
from transformers import AutoModel, AutoTokenizer
# 登录Hugging Face账号
notebook_login()
# 加载模型
model = AutoModel.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 微调模型(示例)
# ... 微调代码 ...
# 保存到本地
model.save_pretrained("./my_finetuned_bert")
tokenizer.save_pretrained("./my_finetuned_bert")
# 上传到Hugging Face Hub
model.push_to_hub("my-username/my-finetuned-bert")
tokenizer.push_to_hub("my-username/my-finetuned-bert")

6.3 自定义模型配置

ini 复制代码
from transformers import BertConfig, BertModel
# 自定义BERT配置
config = BertConfig(
    vocab_size=52000,       # 自定义词汇表大小
    hidden_size=768,
    num_hidden_layers=8,    # 减少层数
    num_attention_heads=8,
    intermediate_size=3072,
    max_position_embeddings=256,  # 减少最大长度
)
# 从配置初始化模型
custom_model = BertModel(config)
# 查看模型结构
print(custom_model)

七、Transformers生态系统

7.1 生态系统全景

关键要点总结

Pipeline快速使用:

ini 复制代码
# 三行代码实现文本分类
classifier = pipeline("text-classification")
result = classifier("Awesome product!")
print(result[0]['label'])  # POSITIVE/NEGATIVE

AutoClass加载模式:

ini 复制代码
# 灵活加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

模型选择指南:

微调最佳实践:

ini 复制代码
# 使用Trainer简化训练
trainer = Trainer(
    model=model,
    args=TrainingArguments(per_device_train_batch_size=16, learning_rate=2e-5),
    train_dataset=dataset,
    compute_metrics=compute_metrics
)
trainer.train()

通过掌握Hugging Face Transformers库,你将能够快速实现各种NLP和计算机视觉任务,为构建真实世界的AI应用提供强大支持!更多AI大模型应用开发学习视频内容和资料,尽在聚客AI学院

相关推荐
我是王大你是谁几秒前
SmolVLA:一种用于经济实惠和高效的机器人视觉-语言-动作模型
人工智能·llm
MarkGosling4 分钟前
【语音合成】B 站开源 IndexTTS :声音克隆,吊打真人发音,断句精准度 98%
人工智能·python
数据智能老司机12 分钟前
AI产品开发的艺术——搜索与检索增强生成
人工智能·产品经理·产品
火车叼位14 分钟前
加速 Hugging Face 模型下载过程
llm
机器之心28 分钟前
逐个token太慢!大模型原生并行出token,CMU、英伟达新作Multiverse
人工智能·llm
杨昆33 分钟前
MCP工具多了咋办,效率高吗?
llm
杨昆34 分钟前
大模型MCP示例
llm
顾林海1 小时前
DeepSeek 技术原理详解
深度学习·llm·deepseek
AI大模型技术社2 小时前
⚙️企业级Transformer优化:混合精度×梯度裁剪×权重初始化最佳实践
人工智能·llm
机器之心2 小时前
首个转型AI公司的新势力,在全球AI顶会展示下一代自动驾驶模型
人工智能