脚踩键盘狗 發表於 2025-5-2 20:30:00

Transformers库入门实战:用Pipeline和Trainer玩转你的第一个AI模型

<h2 id="0-前言">0 前言</h2>
<p>Transformers设计目标是简单易用,让每个人都能轻松上手学习和构建 Transformer 模型。</p>
<p>用户只需掌握三个主要的类和两个 API,即可实现模型实例化、推理和训练。本快速入门将带你了解 Transformers 的核心功能,包括:</p>
<ul>
<li>加载预训练模型</li>
<li>使用 Pipeline 进行推理</li>
<li>使用 Trainer 微调模型</li>
</ul>
<h2 id="1-设置">1 设置</h2>
<p>创建一个 Hugging Face 账号:</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/other/1097393/202505/1097393-20250502203044353-1544536098.png" class="lazyload"></p>
<p>可助你托管和访问模型、数据集及Spaces(一个构建和分享AI应用的平台)。</p>
<p>创建一个User Access Tokens,再登录你的账号:</p>
<pre><code class="language-python">from huggingface_hub import notebook_login

notebook_login()
</code></pre>
<p>安装huggingface_hub:</p>
<pre><code class="language-bash">(.venv) javaedge@JavaEdgedeMac-Studio AIAgent % huggingface-cli login
    To log in, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .
Enter your token (input will not be visible):
Add token as git credential? (Y/n) Y
Token is valid (permission: fineGrained).
The token `JavaEdge-Mac-Studio-HF` has been saved to /Users/javaedge/.cache/huggingface/stored_tokens
Your token has been saved in your configured git credential helpers (osxkeychain).
Your token has been saved to /Users/javaedge/.cache/huggingface/token
Login successful.
The current active token is: `JavaEdge-Mac-Studio-HF`
</code></pre>
<h3 id="安装深度学习框架">安装深度学习框架</h3>
<p>如PyTorch:</p>
<pre><code class="language-bash">pip install torch
</code></pre>
<p>安装最新版 Transformers 及 Hugging Face 生态中的其他实用库,以访问数据集、评估模型、加速训练等:</p>
<pre><code class="language-bash">pip install -U transformers datasets evaluate accelerate timm
</code></pre>
<h2 id="2-预训练模型">2 预训练模型</h2>
<p>每个预训练模型都继承自以下三个基础类:</p>
<table>
<thead>
<tr>
<th><strong>类名</strong></th>
<th><strong>说明</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>配置文件,定义模型的参数,比如注意力头数、词表大小等</td>
</tr>
<tr>
<td></td>
<td>模型结构本身,基于配置文件中的参数构建,返回的是原始隐藏状态。若用于具体任务,还需加上适配任务的输出头(例如:<code>LlamaModel</code> 与 <code>LlamaForCausalLM</code>)。</td>
</tr>
<tr>
<td>Preprocessor</td>
<td>预处理器,用于将原始输入(文本、图片、音频、多模态等)转换成模型可接受的张量格式。例如 PreTrainedTokenizer 可将文本转为张量。</td>
</tr>
</tbody>
</table>
<p>推荐使用 AutoClass 加载模型和预处理器,会根据模型权重和配置自动识别适配架构。</p>
<p>用 <code>from_pretrained()</code> 可从 Hub 加载权重和配置:</p>
<pre><code class="language-python">from transformers import AutoTokenizer, AutoModelForCausalLM

# 使用一个免费可访问模型
model_name = "Qwen/Qwen2-0.5B-Instruct"

# 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
</code></pre>
<p>用 tokenizer 对文本编码,并将张量移至 GPU 以加快推理速度:</p>
<pre><code class="language-python">model_inputs = tokenizer(["The secret to baking a good cake is "], return_tensors="pt").to("cuda")
</code></pre>
<p>现在模型已准备好进行推理或训练。</p>
<p>进行文本生成推理:</p>
<pre><code class="language-python">generated_ids = model.generate(**model_inputs, max_length=30)
tokenizer.batch_decode(generated_ids)
</code></pre>
<p>输出示例:</p>
<pre><code>'&lt;s&gt; The secret to baking a good cake is 100% in the preparation. There are so many recipes out there,'
</code></pre>
<p>要继续学习模型微调,请查看 Trainer 部分。</p>
<h2 id="3-pipeline">3 Pipeline</h2>
<p>Pipeline,最简单方便的推理接口,支持各种任务,如文本生成、图像分割、语音识别、文档问答。</p>
<p>创建 Pipeline 对象并指定任务类型。默认,Pipeline 会下载并缓存该任务的预训练模型。你也可以通过 <code>model</code> 参数指定模型名称。</p>
<p>如文本生成任务:</p>
<pre><code class="language-python">from transformers import pipeline

pipeline = pipeline("text-generation", model=model_name, device="cuda")

# Mac M芯片
pipeline = pipeline("text-generation", model=model_name, device="mps")
</code></pre>
<p>输入初始文本,让模型继续生成:</p>
<pre><code class="language-python">result = pipeline("The secret to baking a good cake is ", max_length=50,truncation=True)
print(result)
</code></pre>
<p>输出示例:</p>
<pre><code>[
    {
      "generated_text": "The secret to baking a good cake is 1) the right flour, 2) the right sugar and 3) the right eggs. The best way to achieve these ingredients is to follow these steps:\n\n1. Measure out your ingredients.\n2"
    }
]
</code></pre>
<h2 id="4-trainer">4 Trainer</h2>
<p>Trainer,用于 PyTorch 模型的完整训练与评估流程封装器,屏蔽大量重复代码,方便你专注设计模型训练。</p>
<p>只需提供模型、数据集、预处理器和数据整理器即可训练模型。</p>
<p>先加载模型、tokenizer 和数据集:</p>
<pre><code class="language-python">from transformers import AutoModelForSequenceClassification, AutoTokenizer
from datasets import load_dataset

model_name = "Qwen/Qwen2-0.5B-Instruct"

model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
dataset = load_dataset("rotten_tomatoes")
</code></pre>
<p>定义 tokenization 函数,并用 <code>map</code> 方法处理整个数据集:</p>
<pre><code class="language-python">def tokenize_dataset(dataset):
    return tokenizer(dataset["text"])
dataset = dataset.map(tokenize_dataset, batched=True)
</code></pre>
<p>加载数据整理器,用于按需填充数据批次:</p>
<pre><code class="language-python">from transformers import DataCollatorWithPadding

data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
</code></pre>
<p>设置训练参数:</p>
<pre><code class="language-python">from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="distilbert-rotten-tomatoes",
    learning_rate=2e-5,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=2,
    push_to_hub=True,
)
</code></pre>
<p>将上述组件传入 <code>Trainer</code> 并启动训练:</p>
<pre><code class="language-python">from transformers import Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    tokenizer=tokenizer,
    data_collator=data_collator,
)

trainer.train()
</code></pre>
<p>训练完成后,可将模型上传至 Hub:</p>
<pre><code class="language-python">trainer.push_to_hub()
</code></pre>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/other/1097393/202505/1097393-20250502203046739-531296890.png" class="lazyload"><br>
完成第一个 Transformers 模型的训练!</p>
<h3 id="tensorflow">TensorFlow</h3>
<p>并非所有预训练模型都提供 TensorFlow 版本,参考模型文档确认是否支持。</p>
<p><code>Trainer</code> 不支持 TensorFlow 模型,但可通过 Keras 训练,Transformers 提供的 TensorFlow 模型兼容标准的 <code>tf.keras.Model</code> 接口。</p>
<p>加载模型、tokenizer 和数据集:</p>
<pre><code class="language-python">from transformers import TFAutoModelForSequenceClassification, AutoTokenizer

model = TFAutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
</code></pre>
<p>定义 tokenization 函数,并处理数据集:</p>
<pre><code class="language-python">def tokenize_dataset(dataset):
    return tokenizer(dataset["text"])
dataset = dataset.map(tokenize_dataset)
</code></pre>
<p>使用 <code>prepare_tf_dataset()</code> 生成训练用的 tf.data.Dataset:</p>
<pre><code class="language-python">tf_dataset = model.prepare_tf_dataset(
    dataset["train"], batch_size=16, shuffle=True, tokenizer=tokenizer
)
</code></pre>
<p>用 Keras 的 <code>compile</code> 和 <code>fit</code> 进行训练:</p>
<pre><code class="language-python">from tensorflow.keras.optimizers import Adam

model.compile(optimizer="adam")
model.fit(tf_dataset)
</code></pre>
<h2 id="5-下一步">5 下一步</h2>
<p>掌握 Transformers 基础,探索感兴趣方向:</p>
<ul>
<li><strong>基础类</strong>:深入学习配置类、模型类、预处理类,有助于自定义模型、处理不同类型的输入(音频、图像、多模态)并上传模型</li>
<li><strong>推理</strong>:深入了解 Pipeline,了解与 LLM 聊天、Agent 推理及在硬件上的推理优化</li>
<li><strong>训练</strong>:深入研究 Trainer、分布式训练和硬件优化训练</li>
<li><strong>量化</strong>:使用模型量化减少内存和存储需求,加快推理速度</li>
<li><strong>资源</strong>:想找具体任务的完整训练和推理范例?查看 Hugging Face 提供的任务模板(task recipes)</li>
</ul>
<p>本文已收录在Github,<strong>关注我,紧跟本系列专栏文章,咱们下篇再续!</strong></p>
<ul>
<li>🚀 魔都架构师 | 全网30W技术追随者</li>
<li>🔧 大厂分布式系统/数据中台实战专家</li>
<li>🏆 主导交易系统百万级流量调优 &amp; 车联网平台架构</li>
<li>🧠 AIGC应用开发先行者 | 区块链落地实践者</li>
<li>🌍 以技术驱动创新,我们的征途是改变世界!</li>
<li>👉 实战干货:编程严选网</li>
</ul>
<blockquote>
<p>本文由博客一文多发平台 OpenWrite 发布!</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/JavaEdge/p/18857768
頁: [1]
查看完整版本: Transformers库入门实战:用Pipeline和Trainer玩转你的第一个AI模型