文章目录
- 作用:提供预训练模型(如 BERT、GPT、RoBERTa)和工具,用于 NLP 任务(文本分类、翻译、生成等)。 核心组件: Tokenizer:文本分词与编码 Model:神经网络模型架构 Pipeline:快速推理的封装接口
- pip install transformers torch datasets
- from transformers import pipeline # 使用情感分析流水线 classifier = pipeline(“sentiment-analysis”) result = classifier(“I love programming with Transformers!”) print(result) # [{‘label’: ‘POSITIVE’, ‘score’: 0.9998}]
- from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(“bert-base-uncased”) text = “Hello, world!” encoded = tokenizer(text, padding=True, truncation=True, return_tensors=”pt”) # 返回PyTorch张量 print(encoded) # {‘input_ids’: tensor([[101, 7592, 1010, 2088, 999, 102]]), # ‘attention_mask’: tensor([[1, 1, 1, 1, 1, 1]])}
- from transformers import AutoModel model = AutoModel.from_pretrained(“bert-base-uncased”) outputs = model(**encoded) # 前向传播 last_hidden_states = outputs.last_hidden_state
- from transformers import BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset # 加载数据集 dataset = load_dataset(“imdb”) tokenized_datasets = dataset.map( lambda x: tokenizer(x[“text”], padding=True, truncation=True), batched=True ) # 定义模型 model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”, num_labels=2) # 训练参数配置 training_args = TrainingArguments( output_dir=”./results”, num_train_epochs=3, per_device_train_batch_size=8, evaluation_strategy=”epoch” ) # 训练器配置 trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_datasets[“train”], eval_dataset=tokenized_datasets[“test”] ) # 开始训练 trainer.train()
- model.save_pretrained(“./my_model”) tokenizer.save_pretrained(“./my_model”) # 加载自定义模型 new_model = AutoModel.from_pretrained(“./my_model”)
- from transformers import BertModel, BertTokenizer import torch model = BertModel.from_pretrained(“bert-base-uncased”, output_attentions=True) inputs = tokenizer(“The cat sat on the mat”, return_tensors=”pt”) outputs = model(**inputs) # 提取第0层的注意力权重 attention = outputs.attentions[0][0] print(attention.shape) # [num_heads, seq_len, seq_len]
- from transformers import TrainingArguments training_args = TrainingArguments( fp16=True, # 启用混合精度 … )
- 在训练过程中动态调整学习率,防止梯度爆炸: from transformers import TrainingArguments training_args = TrainingArguments( output_dir=”./results”, learning_rate=2e-5, weight_decay=0.01, warmup_steps=500, # 学习率预热步数 gradient_accumulation_steps=2, # 梯度累积(节省显存) gradient_clipping=1.0, # 梯度裁剪阈值 … )
- import torch from transformers import BertForSequenceClassification class CustomModel(BertForSequenceClassification): def __init__(self, config): super().__init__(config) def forward(self, input_ids, attention_mask, labels=None): outputs = super().forward(input_ids, attention_mask) logits = outputs.logits if labels is not None: loss_fct = torch.nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0])) # 类别权重 loss = loss_fct(logits.view(-1, 2), labels.view(-1)) return {“loss”: loss, “logits”: logits} return outputs
- from transformers import GPT2LMHeadModel, GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained(“gpt2”) model = GPT2LMHeadModel.from_pretrained(“gpt2”) prompt = “In a world where AI dominates,” input_ids = tokenizer.encode(prompt, return_tensors=”pt”) # 生成文本(配置生成参数) output = model.generate( input_ids, max_length=100, temperature=0.7, # 控制随机性(低值更确定) top_k=50, # 限制候选词数量 num_return_sequences=3 # 生成3个不同结果 ) for seq in output: print(tokenizer.decode(seq, skip_special_tokens=True))
- from transformers import pipeline qa_pipeline = pipeline(“question-answering”, model=”deepset/roberta-base-squad2″) context = “”” Hugging Face is a company based in New York City. Its Transformers library is widely used in NLP. “”” question = “Where is Hugging Face located?” result = qa_pipeline(question=question, context=context) print(f”Answer: {result[‘answer’]} (score: {result[‘score’]:.2f})”) # Answer: New York City (score: 0.92)
- from transformers import BertModel, AutoTokenizer import torch model = BertModel.from_pretrained(“bert-base-uncased”) quantized_model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, # 量化所有线性层 dtype=torch.qint8 ) # 量化后推理速度提升2-4倍,模型体积减少约75%
- from transformers import BertTokenizer, BertForSequenceClassification from torch.onnx import export model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”) tokenizer = BertTokenizer.from_pretrained(“bert-base-uncased”) # 示例输入 dummy_input = tokenizer(“This is a test”, return_tensors=”pt”) # 导出为ONNX export( model, (dummy_input[“input_ids”], dummy_input[“attention_mask”]), “model.onnx”, opset_version=13, input_names=[“input_ids”, “attention_mask”], output_names=[“logits”], dynamic_axes={“input_ids”: {0: “batch”}, “attention_mask”: {0: “batch”}} )
- import torch # 在训练循环中插入显存监控 print(f”Allocated: {torch.cuda.memory_allocated() / 1e9:.2f} GB”) print(f”Cached: {torch.cuda.memory_reserved() / 1e9:.2f} GB”)
- from torch.profiler import profile, record_function, ProfilerActivity with profile(activities=[ProfilerActivity.CUDA], record_shapes=True) as prof: outputs = model(**inputs) print(prof.key_averages().table(sort_by=”cuda_time_total”, row_limit=10))
- from transformers import MBartForConditionalGeneration, MBart50TokenizerFast model = MBartForConditionalGeneration.from_pretrained(“facebook/mbart-large-50-many-to-many-mmt”) tokenizer = MBart50TokenizerFast.from_pretrained(“facebook/mbart-large-50-many-to-many-mmt”) # 中文转英文 tokenizer.src_lang = “zh_CN” text = “欢迎使用Transformers库” encoded = tokenizer(text, return_tensors=”pt”) generated_tokens = model.generate(**encoded, forced_bos_token_id=tokenizer.lang_code_to_id[“en_XX”]) print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)) # [‘Welcome to the Transformers library’]
- from PIL import Image from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained(“openai/clip-vit-base-patch32”) processor = CLIPProcessor.from_pretrained(“openai/clip-vit-base-patch32”) image = Image.open(“cat.jpg”) text = [“a photo of a cat”, “a photo of a dog”] inputs = processor(text=text, images=image, return_tensors=”pt”, padding=True) outputs = model(**inputs) # 计算图文相似度 logits_per_image = outputs.logits_per_image probs = logits_per_image.softmax(dim=1) # 概率分布
- 实现一个简化版 Transformer: import torch.nn as nn class TransformerBlock(nn.Module): def __init__(self, d_model=512, nhead=8): super().__init__() self.attention = nn.MultiheadAttention(d_model, nhead) self.linear = nn.Linear(d_model, d_model) self.norm = nn.LayerNorm(d_model) def forward(self, x): attn_output, _ = self.attention(x, x, x) x = x + attn_output x = self.norm(x) x = x + self.linear(x) return x
- 贡献 Hugging Face 代码库 复现最新论文模型(如 LLaMA、BLOOM)
- 解决方案: 减小 batch_size 启用梯度累积 (gradient_accumulation_steps) 使用混合精度 (fp16=True) 清理缓存:torch.cuda.empty_cache()
- from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained(“bert-base-chinese”) # 手动添加特殊词汇 tokenizer.add_tokens([“【特殊词】”]) # 调整模型嵌入层 model.resize_token_embeddings(len(tokenizer)) 以下继续扩展关于 transformers 库的深度应用内容,涵盖更多实际场景、前沿技术及工业级实践方案。
- from transformers import LlamaForCausalLM, LlamaTokenizer, TrainingArguments # 加载模型和分词器(需申请权限) model = LlamaForCausalLM.from_pretrained(“decapoda-research/llama-7b-hf”) tokenizer = LlamaTokenizer.from_pretrained(“decapoda-research/llama-7b-hf”) # 低秩适配(LoRA)微调 from peft import get_peft_model, LoraConfig lora_config = LoraConfig( r=8, # 低秩维度 lora_alpha=32, target_modules=[“q_proj”, “v_proj”], # 仅微调部分模块 lora_dropout=0.05, bias=”none” ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 显示可训练参数占比(通常 <1%) # 继续配置训练参数…
- # 使用 TRL 库进行 RLHF 训练 from trl import PPOTrainer, AutoModelForCausalLMWithValueHead model = AutoModelForCausalLMWithValueHead.from_pretrained(“gpt2”) ppo_trainer = PPOTrainer( model=model, config=training_args, dataset=dataset, tokenizer=tokenizer ) # 定义奖励模型 for epoch in range(3): for batch in ppo_trainer.dataloader: # 生成响应 response_tensors = model.generate(batch[“input_ids”]) # 计算奖励(需自定义奖励函数) rewards = calculate_rewards(response_tensors, batch) # PPO 优化步骤 ppo_trainer.step( response_tensors, rewards, batch[“attention_mask”] )
- from transformers import TrainingArguments # 配置分布式训练 training_args = TrainingArguments( per_device_train_batch_size=4, gradient_accumulation_steps=8, fp16=True, tpu_num_cores=8, # 使用TPU时指定核心数 dataloader_num_workers=4, deepspeed=”./configs/deepspeed_config.json” # 使用DeepSpeed优化 ) # DeepSpeed 配置文件示例(ds_config.json): { “fp16”: { “enabled”: true }, “optimizer”: { “type”: “AdamW”, “params”: { “lr”: 3e-5 } }, “zero_optimization”: { “stage”: 3 # 启用ZeRO-3优化 } }
- from fastapi import FastAPI from pydantic import BaseModel from transformers import pipeline app = FastAPI() generator = pipeline(“text-generation”, model=”gpt2″) class Request(BaseModel): text: str max_length: int = 100 @app.post(“/generate”) async def generate_text(request: Request): result = generator(request.text, max_length=request.max_length) return {“generated_text”: result[0][“generated_text”]} # 启动服务:uvicorn main:app –port 8000
- from transformers import AutoTokenizer, AutoModelForQuestionAnswering tokenizer = AutoTokenizer.from_pretrained(“bert-large-uncased-whole-word-masking-finetuned-squad”) model = AutoModelForQuestionAnswering.from_pretrained(“bert-large-uncased-whole-word-masking-finetuned-squad”) def process_long_text(context, question, max_length=384, stride=128): # 分块处理长文本 inputs = tokenizer( question, context, max_length=max_length, truncation=”only_second”, stride=stride, return_overflowing_tokens=True, return_offsets_mapping=True ) # 对各块推理并合并结果 best_score = 0 best_answer = “” for i in range(len(inputs[“input_ids”])): outputs = model(**{k: torch.tensor([v[i]]) for k, v in inputs.items()}) answer_start = torch.argmax(outputs.start_logits) answer_end = torch.argmax(outputs.end_logits) + 1 score = (outputs.start_logits[answer_start] + outputs.end_logits[answer_end-1]).item() if score > best_score: best_score = score best_answer = tokenizer.decode(inputs[“input_ids”][i][answer_start:answer_end]) return best_answer
- # 使用 XLM-RoBERTa 进行跨语言迁移 from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification tokenizer = XLMRobertaTokenizer.from_pretrained(“xlm-roberta-base”) model = XLMRobertaForSequenceClassification.from_pretrained(“xlm-roberta-base”) # 通过少量样本微调(代码与BERT训练类似)
- import spacy from spacy_transformers import TransformersLanguage, TransformersWordPiecer # 创建spacy管道 nlp = TransformersLanguage(trf_name=”bert-base-uncased”) # 自定义组件 @spacy.registry.architectures(“CustomClassifier.v1”) def create_classifier(transformer, tok2vec, n_classes): return TransformersTextCategorizer(transformer, tok2vec, n_classes) # 在spacy中直接使用Transformer模型 doc = nlp(“This is a text to analyze.”) print(doc._.trf_last_hidden_state.shape) # [seq_len, hidden_dim]
- import gradio as gr from transformers import pipeline ner_pipeline = pipeline(“ner”) def extract_entities(text): results = ner_pipeline(text) return {“text”: text, “entities”: [ {“entity”: res[“entity”], “start”: res[“start”], “end”: res[“end”]} for res in results ]} gr.Interface( fn=extract_entities, inputs=gr.Textbox(lines=5), outputs=gr.HighlightedText() ).launch()
- # 使用 nn_pruning 进行结构化剪枝 from transformers import BertForSequenceClassification from nn_pruning import ModelPruning model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”) pruner = ModelPruning( model, target_sparsity=0.5, # 剪枝50%的注意力头 pattern=”block_sparse” # 结构化剪枝模式 ) # 执行剪枝并微调 pruned_model = pruner.prune() pruned_model.save_pretrained(“./pruned_bert”) # 知识蒸馏(教师→学生模型) from transformers import DistilBertForSequenceClassification, DistilBertTokenizer teacher = BertForSequenceClassification.from_pretrained(“bert-base-uncased”) student = DistilBertForSequenceClassification.from_pretrained(“distilbert-base-uncased”) # 使用蒸馏训练器 from transformers import DistillationTrainingArguments, DistillationTrainer training_args = DistillationTrainingArguments( output_dir=”./distilled”, temperature=2.0, # 软化概率分布 alpha_ce=0.5, # 交叉熵损失权重 alpha_mse=0.5 # 隐藏层MSE损失权重 ) trainer = DistillationTrainer( teacher=teacher, student=student, args=training_args, train_dataset=tokenized_datasets[“train”], tokenizer=tokenizer ) trainer.train()
- # 转换模型为TensorRT引擎 trtexec –onnx=model.onnx –saveEngine=model.trt –fp16 # Python 调用TensorRT引擎 import tensorrt as trt import pycuda.driver as cuda runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING)) with open(“model.trt”, “rb”) as f: engine = runtime.deserialize_cuda_engine(f.read()) context = engine.create_execution_context() # 绑定输入输出缓冲区进行推理
- from transformers import AutoTokenizer, AutoModelForTokenClassification tokenizer = AutoTokenizer.from_pretrained(“dmis-lab/biobert-v1.1”) model = AutoModelForTokenClassification.from_pretrained(“dmis-lab/biobert-v1.1”) text = “The patient exhibited EGFR mutations and responded to osimertinib.” inputs = tokenizer(text, return_tensors=”pt”) outputs = model(**inputs).logits # 提取基因实体 predictions = torch.argmax(outputs, dim=2) print([tokenizer.decode([token]) for token in inputs.input_ids[0]]) print(predictions.tolist()) # BIO标注结果
- # 合同条款分类 from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained(“nlpaueb/legal-bert-base-uncased”) model = BertForSequenceClassification.from_pretrained(“nlpaueb/legal-bert-base-uncased”) clause = “The Parties hereby agree to arbitrate all disputes in accordance with ICC rules.” inputs = tokenizer(clause, return_tensors=”pt”, truncation=True, padding=True) outputs = model(**inputs) predicted_class = torch.argmax(outputs.logits).item() # 0: 仲裁条款, 1: 保密条款等
- from transformers import BertForSequenceClassification import coremltools as ct model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”) tokenizer = BertTokenizer.from_pretrained(“bert-base-uncased”) # 转换模型 traced_model = torch.jit.trace(model, (input_ids, attention_mask)) mlmodel = ct.convert( traced_model, inputs=[ ct.TensorType(name=”input_ids”, shape=input_ids.shape), ct.TensorType(name=”attention_mask”, shape=attention_mask.shape) ] ) mlmodel.save(“BertSenti.mlmodel”)
- from transformers import TFBertForSequenceClassification import tensorflow as tf model = TFBertForSequenceClassification.from_pretrained(“bert-base-uncased”) # 转换为TFLite converter = tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations = [tf.lite.Optimize.DEFAULT] # 动态范围量化 tflite_model = converter.convert() with open(“model_quant.tflite”, “wb”) as f: f.write(tflite_model)
- from transformers import pipeline from fairness_metrics import demographic_parity # 检测模型偏见 classifier = pipeline(“text-classification”, model=”bert-base-uncased”) protected_groups = { “gender”: [“she”, “he”], “race”: [“African”, “European”] } bias_scores = {} for category, terms in protected_groups.items(): texts = [f”{term} is qualified for this position” for term in terms] results = classifier(texts) bias_scores[category] = demographic_parity(results)
- from textattack import AttackRecipe from textattack.models.wrappers import HuggingFaceModelWrapper model_wrapper = HuggingFaceModelWrapper(model, tokenizer) attack = AttackRecipe.build(“bae”) # BAE攻击方法 # 生成对抗样本 attack_args = textattack.AttackArgs(num_examples=5) attacker = textattack.Attacker(attack, model_wrapper, attack_args) attack_results = attacker.attack_dataset(dataset)
- from transformers import LongformerModel model = LongformerModel.from_pretrained(“allenai/longformer-base-4096”) inputs = tokenizer(“This is a very long document…”*1000, return_tensors=”pt”) outputs = model(**inputs) # 支持最长4096 tokens
- # 使用Switch Transformers from transformers import SwitchTransformersForConditionalGeneration model = SwitchTransformersForConditionalGeneration.from_pretrained(“google/switch-base-8”) outputs = model.generate( input_ids, expert_choice_mask=True, # 追踪专家路由 ) print(outputs.expert_choices) # 显示每个token使用的专家
目录
- 一、基础知识
- 1. Transformers 库简介
- 2. 安装与环境配置
- 3. 快速上手示例
- 二、核心模块详解
- 1. Tokenizer(分词器)
- 2. Model(模型加载)
- 三、高级用法
- 1. 自定义模型训练(PyTorch示例)
- 2. 模型保存与加载
- 四、深入进阶
- 1. 注意力机制可视化
- 2. 混合精度训练
- 五、完整案例:命名实体识别(NER)
- 六、学习路径建议
- 七、资源推荐
- 八、高级训练技巧
- 1. 学习率调度与梯度裁剪
- 2. 自定义损失函数(PyTorch示例)
- 九、复杂任务实战
- 1. 文本生成(GPT-2示例)
- 2. 问答系统(BERT-based)
- 十、模型优化与部署
- 1. 模型量化(减小推理延迟)
- 2. ONNX 格式导出(生产部署)
- 十一、调试与性能分析
- 1. 检查显存占用
- 2. 使用 PyTorch Profiler
- 十二、多语言与跨模态
- 1. 多语言翻译(mBART)
- 2. 图文多模态(CLIP)
- 十三、学习路径补充
- 1. 深入理解 Transformer 架构
- 2. 参与开源项目
- 十四、常见问题解答
- 1. OOM(显存不足)错误处理
- 2. 中文分词特殊处理
- 十五、前沿技术实践
- 1. 大语言模型(LLM)微调(以 LLaMA 为例)
- 2. 强化学习与人类反馈(RLHF)
- 十六、工业级应用方案
- 1. 分布式训练(多GPU/TPU)
- 2. 流式推理服务(FastAPI + Transformers)
- 十七、特殊场景处理
- 1. 长文本处理(滑动窗口)
- 2. 低资源语言处理
- 十八、模型解释性
- 1. 特征重要性分析(使用 Captum)
- 十九、生态系统整合
- 1. 与 spaCy 集成
- 2. 使用 Gradio 快速构建演示界面
- 二十、持续学习建议
- 二十一、生产级模型优化
- 1. 模型剪枝与知识蒸馏
- 2. TensorRT 加速推理
- 二十二、领域专用模型
- 1. 生物医学NLP(BioBERT)
- 2. 法律文书解析(Legal-BERT)
- 二十三、边缘设备部署
- 1. Core ML 转换(iOS部署)
- 2. TensorFlow Lite 量化(Android部署)
- 二十四、伦理与安全
- 1. 偏见检测与缓解
- 2. 对抗样本防御
- 二十五、前沿架构探索
- 1. Sparse Transformer(处理超长序列)
- 2. 混合专家模型(MoE)
- 二十六、全链路项目模板
- 二十七、终身学习建议
以下是一份关于 transformers 库的全面讲解,包含基础知识、高级用法、案例代码及学习路径。内容经过组织,适合不同阶段的学习者。
- 作用:提供预训练模型(如 BERT、GPT、RoBERTa)和工具,用于 NLP 任务(文本分类、翻译、生成等)。
- 核心组件:
Tokenizer:文本分词与编码
Model:神经网络模型架构
Pipeline:快速推理的封装接口
Tokenizer:文本分词与编码Model:神经网络模型架构Pipeline:快速推理的封装接口
pip install transformers torch datasets
from transformers import pipeline
# 使用情感分析流水线
classifier = pipeline("sentiment-analysis")
result = classifier("I love programming with Transformers!")
print(result) # [{'label': 'POSITIVE', 'score': 0.9998}]
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "Hello, world!"
encoded = tokenizer(text,
padding=True,
truncation=True,
return_tensors="pt") # 返回PyTorch张量
print(encoded)
# {'input_ids': tensor([[101, 7592, 1010, 2088, 999, 102]]),
# 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])}
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased")
outputs = model(**encoded) # 前向传播
last_hidden_states = outputs.last_hidden_state
from transformers import BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
# 加载数据集
dataset = load_dataset("imdb")
tokenized_datasets = dataset.map(
lambda x: tokenizer(x["text"], padding=True, truncation=True),
batched=True
)
# 定义模型
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
# 训练参数配置
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=8,
evaluation_strategy="epoch"
)
# 训练器配置
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"]
)
# 开始训练
trainer.train()
model.save_pretrained("./my_model")
tokenizer.save_pretrained("./my_model")
# 加载自定义模型
new_model = AutoModel.from_pretrained("./my_model")
from transformers import BertModel, BertTokenizer
import torch
model = BertModel.from_pretrained("bert-base-uncased", output_attentions=True)
inputs = tokenizer("The cat sat on the mat", return_tensors="pt")
outputs = model(**inputs)
# 提取第0层的注意力权重
attention = outputs.attentions[0][0]
print(attention.shape) # [num_heads, seq_len, seq_len]
from transformers import TrainingArguments
training_args = TrainingArguments(
fp16=True, # 启用混合精度
...
)
from transformers import pipeline
# 加载NER流水线
ner_pipeline = pipeline("ner", model="dslim/bert-base-NER")
text = "Apple was founded by Steve Jobs in Cupertino."
results = ner_pipeline(text)
# 结果可视化
for entity in results:
print(f"{entity['word']} -> {entity['entity']} (confidence: {entity['score']:.2f})")
入门阶段:
- 官方文档:huggingface.co/docs/transformers
- 学习
pipeline和基础模型使用
中级阶段:
- 掌握自定义训练流程
- 理解模型架构(Transformer、BERT原理)
高级阶段:
- 模型蒸馏与量化
- 自定义模型架构开发
- 大模型微调技巧
必读论文:
- 《Attention Is All You Need》(Transformer 原始论文)
- 《BERT: Pre-training of Deep Bidirectional Transformers》
实践项目:
- 文本摘要生成
- 多语言翻译系统
- 对话机器人开发
社区资源:
- Hugging Face Model Hub
- Kaggle NLP 竞赛案例
在训练过程中动态调整学习率,防止梯度爆炸:
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
learning_rate=2e-5,
weight_decay=0.01,
warmup_steps=500, # 学习率预热步数
gradient_accumulation_steps=2, # 梯度累积(节省显存)
gradient_clipping=1.0, # 梯度裁剪阈值
...
)
import torch
from transformers import BertForSequenceClassification
class CustomModel(BertForSequenceClassification):
def __init__(self, config):
super().__init__(config)
def forward(self, input_ids, attention_mask, labels=None):
outputs = super().forward(input_ids, attention_mask)
logits = outputs.logits
if labels is not None:
loss_fct = torch.nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0])) # 类别权重
loss = loss_fct(logits.view(-1, 2), labels.view(-1))
return {"loss": loss, "logits": logits}
return outputs
from transformers import GPT2LMHeadModel, GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
prompt = "In a world where AI dominates,"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
# 生成文本(配置生成参数)
output = model.generate(
input_ids,
max_length=100,
temperature=0.7, # 控制随机性(低值更确定)
top_k=50, # 限制候选词数量
num_return_sequences=3 # 生成3个不同结果
)
for seq in output:
print(tokenizer.decode(seq, skip_special_tokens=True))
from transformers import pipeline
qa_pipeline = pipeline("question-answering", model="deepset/roberta-base-squad2")
context = """
Hugging Face is a company based in New York City.
Its Transformers library is widely used in NLP.
"""
question = "Where is Hugging Face located?"
result = qa_pipeline(question=question, context=context)
print(f"Answer: {result['answer']} (score: {result['score']:.2f})")
# Answer: New York City (score: 0.92)
from transformers import BertModel, AutoTokenizer
import torch
model = BertModel.from_pretrained("bert-base-uncased")
quantized_model = torch.quantization.quantize_dynamic(
model,
{torch.nn.Linear}, # 量化所有线性层
dtype=torch.qint8
)
# 量化后推理速度提升2-4倍,模型体积减少约75%
from transformers import BertTokenizer, BertForSequenceClassification
from torch.onnx import export
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 示例输入
dummy_input = tokenizer("This is a test", return_tensors="pt")
# 导出为ONNX
export(
model,
(dummy_input["input_ids"], dummy_input["attention_mask"]),
"model.onnx",
opset_version=13,
input_names=["input_ids", "attention_mask"],
output_names=["logits"],
dynamic_axes={"input_ids": {0: "batch"}, "attention_mask": {0: "batch"}}
)
import torch
# 在训练循环中插入显存监控
print(f"Allocated: {torch.cuda.memory_allocated() / 1e9:.2f} GB")
print(f"Cached: {torch.cuda.memory_reserved() / 1e9:.2f} GB")
from torch.profiler import profile, record_function, ProfilerActivity
with profile(activities=[ProfilerActivity.CUDA], record_shapes=True) as prof:
outputs = model(**inputs)
print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=10))
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
tokenizer = MBart50TokenizerFast.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
# 中文转英文
tokenizer.src_lang = "zh_CN"
text = "欢迎使用Transformers库"
encoded = tokenizer(text, return_tensors="pt")
generated_tokens = model.generate(**encoded, forced_bos_token_id=tokenizer.lang_code_to_id["en_XX"])
print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True))
# ['Welcome to the Transformers library']
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image = Image.open("cat.jpg")
text = ["a photo of a cat", "a photo of a dog"]
inputs = processor(text=text, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
# 计算图文相似度
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1) # 概率分布
实现一个简化版 Transformer:
import torch.nn as nn
class TransformerBlock(nn.Module):
def __init__(self, d_model=512, nhead=8):
super().__init__()
self.attention = nn.MultiheadAttention(d_model, nhead)
self.linear = nn.Linear(d_model, d_model)
self.norm = nn.LayerNorm(d_model)
def forward(self, x):
attn_output, _ = self.attention(x, x, x)
x = x + attn_output
x = self.norm(x)
x = x + self.linear(x)
return x
- 贡献 Hugging Face 代码库
- 复现最新论文模型(如 LLaMA、BLOOM)
解决方案:
- 减小
batch_size - 启用梯度累积 (
gradient_accumulation_steps) - 使用混合精度 (
fp16=True) - 清理缓存:
torch.cuda.empty_cache()
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
# 手动添加特殊词汇
tokenizer.add_tokens(["【特殊词】"])
# 调整模型嵌入层
model.resize_token_embeddings(len(tokenizer))
以下继续扩展关于 transformers 库的深度应用内容,涵盖更多实际场景、前沿技术及工业级实践方案。
from transformers import LlamaForCausalLM, LlamaTokenizer, TrainingArguments
# 加载模型和分词器(需申请权限)
model = LlamaForCausalLM.from_pretrained("decapoda-research/llama-7b-hf")
tokenizer = LlamaTokenizer.from_pretrained("decapoda-research/llama-7b-hf")
# 低秩适配(LoRA)微调
from peft import get_peft_model, LoraConfig
lora_config = LoraConfig(
r=8, # 低秩维度
lora_alpha=32,
target_modules=["q_proj", "v_proj"], # 仅微调部分模块
lora_dropout=0.05,
bias="none"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 显示可训练参数占比(通常 <1%)
# 继续配置训练参数...
# 使用 TRL 库进行 RLHF 训练
from trl import PPOTrainer, AutoModelForCausalLMWithValueHead
model = AutoModelForCausalLMWithValueHead.from_pretrained("gpt2")
ppo_trainer = PPOTrainer(
model=model,
config=training_args,
dataset=dataset,
tokenizer=tokenizer
)
# 定义奖励模型
for epoch in range(3):
for batch in ppo_trainer.dataloader:
# 生成响应
response_tensors = model.generate(batch["input_ids"])
# 计算奖励(需自定义奖励函数)
rewards = calculate_rewards(response_tensors, batch)
# PPO 优化步骤
ppo_trainer.step(
response_tensors,
rewards,
batch["attention_mask"]
)
from transformers import TrainingArguments
# 配置分布式训练
training_args = TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=8,
fp16=True,
tpu_num_cores=8, # 使用TPU时指定核心数
dataloader_num_workers=4,
deepspeed="./configs/deepspeed_config.json" # 使用DeepSpeed优化
)
# DeepSpeed 配置文件示例(ds_config.json):
{
"fp16": {
"enabled": true
},
"optimizer": {
"type": "AdamW",
"params": {
"lr": 3e-5
}
},
"zero_optimization": {
"stage": 3 # 启用ZeRO-3优化
}
}
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
generator = pipeline("text-generation", model="gpt2")
class Request(BaseModel):
text: str
max_length: int = 100
@app.post("/generate")
async def generate_text(request: Request):
result = generator(request.text, max_length=request.max_length)
return {"generated_text": result[0]["generated_text"]}
# 启动服务:uvicorn main:app --port 8000
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model = AutoModelForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
def process_long_text(context, question, max_length=384, stride=128):
# 分块处理长文本
inputs = tokenizer(
question,
context,
max_length=max_length,
truncation="only_second",
stride=stride,
return_overflowing_tokens=True,
return_offsets_mapping=True
)
# 对各块推理并合并结果
best_score = 0
best_answer = ""
for i in range(len(inputs["input_ids"])):
outputs = model(**{k: torch.tensor([v[i]]) for k, v in inputs.items()})
answer_start = torch.argmax(outputs.start_logits)
answer_end = torch.argmax(outputs.end_logits) + 1
score = (outputs.start_logits[answer_start] + outputs.end_logits[answer_end-1]).item()
if score > best_score:
best_score = score
best_answer = tokenizer.decode(inputs["input_ids"][i][answer_start:answer_end])
return best_answer
# 使用 XLM-RoBERTa 进行跨语言迁移
from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification
tokenizer = XLMRobertaTokenizer.from_pretrained("xlm-roberta-base")
model = XLMRobertaForSequenceClassification.from_pretrained("xlm-roberta-base")
# 通过少量样本微调(代码与BERT训练类似)
from captum.attr import LayerIntegratedGradients
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")
def forward_func(input_ids, attention_mask):
return model(input_ids, attention_mask).logits
lig = LayerIntegratedGradients(forward_func, model.bert.embeddings)
# 计算输入词重要性
attributions, delta = lig.attribute(
inputs=input_ids,
baselines=tokenizer.pad_token_id * torch.ones_like(input_ids),
additional_forward_args=attention_mask,
return_convergence_delta=True
)
# 可视化结果
import matplotlib.pyplot as plt
plt.bar(range(len(attributions[0])), attributions[0].detach().numpy())
plt.xticks(ticks=range(len(tokens)), labels=tokens, rotation=90)
plt.show()
import spacy
from spacy_transformers import TransformersLanguage, TransformersWordPiecer
# 创建spacy管道
nlp = TransformersLanguage(trf_name="bert-base-uncased")
# 自定义组件
@spacy.registry.architectures("CustomClassifier.v1")
def create_classifier(transformer, tok2vec, n_classes):
return TransformersTextCategorizer(transformer, tok2vec, n_classes)
# 在spacy中直接使用Transformer模型
doc = nlp("This is a text to analyze.")
print(doc._.trf_last_hidden_state.shape) # [seq_len, hidden_dim]
import gradio as gr
from transformers import pipeline
ner_pipeline = pipeline("ner")
def extract_entities(text):
results = ner_pipeline(text)
return {"text": text, "entities": [
{"entity": res["entity"], "start": res["start"], "end": res["end"]}
for res in results
]}
gr.Interface(
fn=extract_entities,
inputs=gr.Textbox(lines=5),
outputs=gr.HighlightedText()
).launch()
跟踪最新进展:
- 关注 Hugging Face 博客和论文(如 T5、BLOOM、Stable Diffusion)
- 参与社区活动(Hugging Face 的 Discord 和论坛)
实战项目进阶:
- 构建端到端 NLP 系统(数据清洗 → 模型训练 → 部署监控)
- 参加 Kaggle 比赛(如 CommonLit Readability Prize)
系统优化方向:
- 模型量化与剪枝
- 服务端优化(TensorRT 加速、模型并行)
- 边缘设备部署(ONNX Runtime、Core ML)
以下继续扩展关于 transformers 库的终极实践指南,涵盖生产级优化、前沿模型架构、领域专用方案及伦理考量。
# 使用 nn_pruning 进行结构化剪枝
from transformers import BertForSequenceClassification
from nn_pruning import ModelPruning
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")
pruner = ModelPruning(
model,
target_sparsity=0.5, # 剪枝50%的注意力头
pattern="block_sparse" # 结构化剪枝模式
)
# 执行剪枝并微调
pruned_model = pruner.prune()
pruned_model.save_pretrained("./pruned_bert")
# 知识蒸馏(教师→学生模型)
from transformers import DistilBertForSequenceClassification, DistilBertTokenizer
teacher = BertForSequenceClassification.from_pretrained("bert-base-uncased")
student = DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
# 使用蒸馏训练器
from transformers import DistillationTrainingArguments, DistillationTrainer
training_args = DistillationTrainingArguments(
output_dir="./distilled",
temperature=2.0, # 软化概率分布
alpha_ce=0.5, # 交叉熵损失权重
alpha_mse=0.5 # 隐藏层MSE损失权重
)
trainer = DistillationTrainer(
teacher=teacher,
student=student,
args=training_args,
train_dataset=tokenized_datasets["train"],
tokenizer=tokenizer
)
trainer.train()
# 转换模型为TensorRT引擎
trtexec --onnx=model.onnx --saveEngine=model.trt --fp16
# Python 调用TensorRT引擎
import tensorrt as trt
import pycuda.driver as cuda
runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))
with open("model.trt", "rb") as f:
engine = runtime.deserialize_cuda_engine(f.read())
context = engine.create_execution_context()
# 绑定输入输出缓冲区进行推理
from transformers import AutoTokenizer, AutoModelForTokenClassification
tokenizer = AutoTokenizer.from_pretrained("dmis-lab/biobert-v1.1")
model = AutoModelForTokenClassification.from_pretrained("dmis-lab/biobert-v1.1")
text = "The patient exhibited EGFR mutations and responded to osimertinib."
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs).logits
# 提取基因实体
predictions = torch.argmax(outputs, dim=2)
print([tokenizer.decode([token]) for token in inputs.input_ids[0]])
print(predictions.tolist()) # BIO标注结果
# 合同条款分类
from transformers import BertTokenizer, BertForSequenceClassification
tokenizer = BertTokenizer.from_pretrained("nlpaueb/legal-bert-base-uncased")
model = BertForSequenceClassification.from_pretrained("nlpaueb/legal-bert-base-uncased")
clause = "The Parties hereby agree to arbitrate all disputes in accordance with ICC rules."
inputs = tokenizer(clause, return_tensors="pt", truncation=True, padding=True)
outputs = model(**inputs)
predicted_class = torch.argmax(outputs.logits).item() # 0: 仲裁条款, 1: 保密条款等
from transformers import BertForSequenceClassification
import coremltools as ct
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 转换模型
traced_model = torch.jit.trace(model, (input_ids, attention_mask))
mlmodel = ct.convert(
traced_model,
inputs=[
ct.TensorType(name="input_ids", shape=input_ids.shape),
ct.TensorType(name="attention_mask", shape=attention_mask.shape)
]
)
mlmodel.save("BertSenti.mlmodel")
from transformers import TFBertForSequenceClassification
import tensorflow as tf
model = TFBertForSequenceClassification.from_pretrained("bert-base-uncased")
# 转换为TFLite
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT] # 动态范围量化
tflite_model = converter.convert()
with open("model_quant.tflite", "wb") as f:
f.write(tflite_model)
from transformers import pipeline
from fairness_metrics import demographic_parity
# 检测模型偏见
classifier = pipeline("text-classification", model="bert-base-uncased")
protected_groups = {
"gender": ["she", "he"],
"race": ["African", "European"]
}
bias_scores = {}
for category, terms in protected_groups.items():
texts = [f"{term} is qualified for this position" for term in terms]
results = classifier(texts)
bias_scores[category] = demographic_parity(results)
from textattack import AttackRecipe
from textattack.models.wrappers import HuggingFaceModelWrapper
model_wrapper = HuggingFaceModelWrapper(model, tokenizer)
attack = AttackRecipe.build("bae") # BAE攻击方法
# 生成对抗样本
attack_args = textattack.AttackArgs(num_examples=5)
attacker = textattack.Attacker(attack, model_wrapper, attack_args)
attack_results = attacker.attack_dataset(dataset)
from transformers import LongformerModel
model = LongformerModel.from_pretrained("allenai/longformer-base-4096")
inputs = tokenizer("This is a very long document..."*1000, return_tensors="pt")
outputs = model(**inputs) # 支持最长4096 tokens
# 使用Switch Transformers
from transformers import SwitchTransformersForConditionalGeneration
model = SwitchTransformersForConditionalGeneration.from_pretrained("google/switch-base-8")
outputs = model.generate(
input_ids,
expert_choice_mask=True, # 追踪专家路由
)
print(outputs.expert_choices) # 显示每个token使用的专家
"""
端到端文本分类系统架构:
1. 数据采集 → 2. 清洗 → 3. 标注 → 4. 模型训练 → 5. 评估 → 6. 部署 → 7. 监控
"""
# 步骤4的增强训练流程
from transformers import TrainerCallback
class CustomCallback(TrainerCallback):
def on_log(self, args, state, control, logs=None, **kwargs):
# 实时记录指标到Prometheus
prometheus_logger.log_metrics(logs)
# 步骤7的漂移检测
from alibi_detect.cd import MMDDrift
detector = MMDDrift(
X_train,
backend="tensorflow",
p_val=0.05
)
drift_preds = detector.predict(X_prod)
技术跟踪:
- 订阅 arXiv 的 cs.CL 分类
- 参与 Hugging Face 社区周会
技能扩展:
- 学习模型量化理论(《Efficient Machine Learning》)
- 掌握 CUDA 编程基础
跨界融合:
- 探索 LLM 与知识图谱结合
- 研究多模态大模型(如 Flamingo、DALL·E 3)
伦理实践:
- 定期进行模型公平性审计
- 参与 AI for Social Good 项目
到此这篇关于Python Transformers库【NLP处理库】全面讲解的文章就介绍到这了,更多相关Python Transformers库内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python使用Transformers实现机器翻译功能
- 详解python架构 PyNeuraLogic超越Transformers