Transformer实战——Hugging Face环境配置与应用详解

Transformer实战------Hugging Face环境配置与应用详解

    • [0. 前言](#0. 前言)
    • [1. 安装 transformers](#1. 安装 transformers)
      • [1.1 安装 Anaconda](#1.1 安装 Anaconda)
      • [1.2 安装 TensorFlow、PyTorch 和 Transformer](#1.2 安装 TensorFlow、PyTorch 和 Transformer)
      • [1.3 使用 hf-mirror 快速下载模型](#1.3 使用 hf-mirror 快速下载模型)
    • [2. 使用语言模型和分词器](#2. 使用语言模型和分词器)
    • [3. 使用社区提供的模型](#3. 使用社区提供的模型)
    • [4. 使用多模态 Transformer](#4. 使用多模态 Transformer)
    • 小结
    • 系列链接

0. 前言

我们已经了解了使用深度学习 (Deep Learning, DL) 方法的自然语言处理 (Natural Language Processing, NLP) 技术演进,学习了关于 Transformer 及其架构的一些基本信息。在本节中,我们将深入探讨 Transformer 模型的应用,详细介绍分词器 (tokenizer) 和模型,例如双向编码器表示 (Bidirectional Encoder Representations from Transformer, BERT),并通过实践介绍如何加载分词器/模型,以及如何使用预训练模型。在进行实践之前,我们将首先了解所需环境的安装步骤,介绍如何在 PyTorchTensorFlow 框架中使用模型。
Hugging Face 模型库也是本节的一个重要部分,我们将讨论如何获取不同的模型以及使用不同管道的步骤。例如,双向自回归 Transformer (Bidirectional and Auto-regressive Transformer, BART)、BERTTAPAS (TAble PArSing) 等模型,同时介绍 GPT-2 (Generative Pretrained Transformer 2) 文本生成。需要注意的是,本节主要集中在如何准备环境以及如何使用预训练模型,而不是模型训练。模型训练将在后续学习中详细讨论。

1. 安装 transformers

Anaconda 是一个用于 PythonR 编程语言的发行版,旨在简化科学计算中包的分发和部署。在本节中,我们将介绍如何安装 transformers 库。虽然也可以在不使用 Anaconda 的情况下安装此库,但使用 Anaconda 的主要目的是为了更容易地解释安装过程,并且能够更好地管理所使用的库。Anaconda 文档提供了适用于常见操作系统 (macOSWindowsLinux) 的官方安装指南,步骤简便易行。

1.1 安装 Anaconda

1.1.1 Linux 操作系统

Anaconda 官网下载适用于 LinuxAnaconda 安装程序。打开终端并运行以下命令:

bash 复制代码
bash ./FilePath/For/Anaconda.sh

安装完成后,在终端运行 python 命令,能够在 Python 版本信息后看到 Anaconda 提示符。

可以通过从终端运行 anaconda-navigator 命令来访问 Anaconda Navigator

1.1.2 Windows 操作系统

Anaconda 官网下载适用于 Windows 操作系统的安装程序。打开安装程序并按照向导点击 "I Agree" 按钮进行操作。选择安装位置后,单击 Next

勾选 "Add anaconda3 to my PATH environment variable" 复选框后单击 Install。如果不勾选该框,Anaconda 版本的 Python 将不会添加到 Windows 环境变量中,将无法直接在 Windows 命令行或 Windows Shell 中使用 python 命令运行 Anaconda。安装完成后,可以从开始菜单启动 Anaconda Navigator

1.1.3 macOS 操作系统

Anaconda 官网下载适用于 macOS 的安装程序。打开安装程序。根据安装引导,点击 Install 按钮,将 Anaconda 安装到预定义的位置,也可以更改默认安装目录。

安装完成后,能够访问 Anaconda Navigator

1.2 安装 TensorFlow、PyTorch 和 Transformer

TensorFlowPyTorch 是深度学习中使用的两个主要库,可以通过 pipconda 进行安装。conda 提供了一个命令行界面,使得安装这些库更加便捷。

为了避免干扰其他环境,最好 为huggingface 库创建一个新的 conda 环境。可以通过运行以下代码来实现:

shell 复制代码
$ conda create -n Transformer

该命令将创建一个空的环境用于安装其他库。创建完成后,需要激活此环境:

shell 复制代码
$ conda activate Transformer

安装 Transformer 库非常简单,只需要运行以下命令:

shell 复制代码
$ conda install -c conda-forge tensorflow
$ conda install -c conda-forge pytorch
$ conda install -c conda-forge transformers

conda install 命令中,-c 参数让 Anaconda 使用额外的渠道来查找库。

需要注意的是,安装 TensorFlowPyTorch 是必要的,因为 Transformer 库依赖于这两个库。conda 能够轻松处理 TensorFlowPyTorchCPUGPU 版本,通过 pip 安装 PyTorchGPU 版本时,需要安装相关的库,如 cuda 等,但 conda 会自动处理这一过程,无需手动设置或安装其他内容。

这些库安装也可以在没有 conda 的情况下完成,但使用 Anaconda 的原因在于其简便性。特别是在安装 TensorFlowPyTorchGPU 版本时,能够节省大量时间。

1.3 使用 hf-mirror 快速下载模型

hf-mirror.comHugging Face 官方网站的镜像,旨在解决访问 Hugging Face 官方站点时遇到的网络瓶颈和下载缓慢问题。
hf-mirror.com 致力于帮助用户快速、稳定的下载模型、数据集。可以直接在 hf-mirror.com 网站中搜索所需模型和数据集,并在模型主页的 Files and Version 中下载文件。

此外,还可以使用 huggingface-clihuggingface-cliHugging Face 官方提供的命令行工具,自带完善的下载功能。使用 huggingface-cli 首先需要安装依赖:

shell 复制代码
$ pip install -U huggingface_hub

然后,设置环境变量:

shell 复制代码
# linux 为了使之永久生效,可以将其写入 `~/.bashrc`
$ export HF_ENDPOINT=https://hf-mirror.com
# windows
$env:HF_ENDPOINT = https://hf-mirror.com

设置完成后,可以通过以下命令下载模型和数据集:

shell 复制代码
$ huggingface-cli download --resume-download gpt2 --local-dir gpt2
$ huggingface-cli download --repo-type dataset --resume-download wikitext --local-dir wikitext

可以添加 --local-dir-use-symlinks False 参数禁用文件软链接。设置完成后,除了直接下载模型和数据集外,也可以通过内置的 from_pretrained() 函数直接从镜像网站上下载模型。

2. 使用语言模型和分词器

在本节中,我们将介绍如何使用 Transformer 库中的语言模型,以及与之相关的分词器。为了使用指定的语言模型,首先需要导入它,我们从 Google 提供的 BERT 模型开始,并使用其预训练版本:

python 复制代码
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

以上代码的第一行导入了 BERT 的分词器,第二行下载了 BERT 基础版的预训练分词器。需要注意的是,uncased 版本是以不区分大小写的字母训练的,因此字母的大小写不会影响模型的效果。测试并查看输出:

python 复制代码
text = "Using Transformers is easy!"
tokenizer(text)

输出结果如下所示:

shell 复制代码
{'input_ids': [101, 2478, 19081, 2003, 3733, 999, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}

input_ids 显示了每个词元 (token) 的 IDtoken_type_ids 显示了每个 token 的类型,用于区分第一个和第二个序列,如下图所示:

attention_mask 是由 01 组成的掩码,用于标示序列的开始和结束,以防止不必要的计算。每个分词器有不同的添加特殊 token 的方式。在 BERT 的分词器中,在序列的开始添加了一个 [CLS] token,在序列的结束添加了一个 [SEP] tokenID 分别为 101102。这些数字来源于预训练分词器的 token ID

同一分词器可以同时用于基于 PyTorchTensorFlowTransformer 模型。为了分别获得每种模型的输出,需要在 return_tensors 参数中使用 pttf 关键字。例如,可以通过运行以下命令来使用分词器:

python 复制代码
encoded_input = tokenizer(text, return_tensors="pt")

得到的 encoded_input 就是已分词的文本,可以用于 PyTorch 模型。为了运行模型(例如 BERT 模型),可以使用以下代码从 Hugging Face 的模型仓库下载模型:

python 复制代码
from transformers import BertModel
model = BertModel.from_pretrained("BERT-base-uncased")

通过以下代码可以将分词器的输出传递给模型:

python 复制代码
output = model(**encoded_input)

输出结果为模型的嵌入和交叉注意力。

在加载和导入模型时,可以指定想要使用的模型版本。如果在模型名称前加上 TFTransformer 库将加载其 TensorFlow 版本。以下代码展示了如何加载并使用 BERT 基础模型的 TensorFlow 版本:

python 复制代码
from transformers import BertTokenizer, TFBertModel
tokenizer = BertTokenizer.from_pretrained('BERT-base-uncased')
model = TFBertModel.from_pretrained("BERT-base-uncased")
text = "Using Transformer is easy!"
encoded_input = tokenizer(text, return_tensors='tf')
output = model(**encoded_input)

对于特定任务,Hugging Face 提供了现成的管道 (pipeline)。例如,使用语言模型填充掩码的任务可以通过以下代码实现:

python 复制代码
from transformers import pipeline
unmasker = pipeline('fill-mask', model='BERT-base-uncased')
unmasker("The man worked as a [MASK].")

生成输出如下所示,输出分数和可能替换 [MASK] 的词汇:

使用 pandas 可以获取更整洁的视图:

python 复制代码
pd.DataFrame(unmasker("The man worked as a [MASK]."))

结果如下所示:

3. 使用社区提供的模型

Hugging Face 拥有大量由来自 GoogleFacebook 等大型人工智能和信息技术公司的合作者提供的社区模型,个人和其它团体也提供了许多有趣的模型,访问和使用这些模型也非常简单。首先,访问官方网站上的Transformer 模型目录

在官方网站无法正常访问时,也可以访问镜像网站 hf-mirror.com 获取模型。除了这些模型,NLP 任务还可以使用不同数据集。

要使用这些社区提供的模型,可以通过关键词搜索来探索它们,或者直接指定 NLP 任务和管道。

例如,使用表格问答模型。在查找到感兴趣的模型后,能够看到以下页面:

在右侧,有一个面板可以测试这个模型。表格问答模型可以回答有关提供给模型的表格的问题。进行提问后,模型将通过高亮显示答案来进行回答。下图显示了它如何获取输入并为特定表格提供答案:

每个模型都有一个由模型作者提供的页面,通常被称为模型卡。可以按照模型页面上提供的示例使用该模型。例如,访问 GPT-2Hugging Face 仓库页面,并查看作者提供的示例,如下图所示:

推荐使用管道 (pipelines),因为所有的复杂工作都由 Transformer 库处理。假设需要一个开箱即用的零样本分类器,以下代码展示了实现和使用预训练模型的便捷性:

python 复制代码
from transformers import pipeline 
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli") 
sequence_to_classify = "I am going to france." 
candidate_labels = ['travel', 'cooking', 'dancing'] 
classifier(sequence_to_classify, candidate_labels) 

输出结果如下所示:

shell 复制代码
{'labels': ['travel', 'dancing', 'cooking'], 'scores': 
[0.9866883158683777, 0.007197578903287649, 0.006114077754318714], 
'sequence': 'I am going to france.'}

4. 使用多模态 Transformer

零样本图像分类在只有类别名称或与类别相关的短语可用时非常有用。CLIP 作为一个多模态模型,能够将图像和文本表示在同一个语义空间中。为了得到一个零样本图像分类器,即在没有任何关于类别的先验知识的情况下进行分类,可以设想以下场景:类名已经给定,但没有示例样本的类别信息。此时唯一可用的知识就是这些类名以及一组之前未见过的图像。

(1) 首先准备图片:

python 复制代码
from PIL import Image
import requests
url = "http://images.cocodataset.org/test-stuff2017/000000027922.jpg"
image = Image.open(requests.get(url, stream=True).raw)

(2) 加载图像后,查看图像样本:

python 复制代码
image


(3) 为所有类别创建提示 (prompt),然后为文本部分创建输入:

python 复制代码
prompt = "a photo of a "
class_names = ["food", "fruit"]
inputs = [prompt + class_name for class_name in class_names]

(4) 文本和图像的输入准备好后,加载模型:

python 复制代码
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14")

(5) processor 是一个用于分词的封装器。最后,可以将预处理和分词后的数据交给模型,最终得到输出:

python 复制代码
inputs = processor(text=inputs, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits = outputs.logits_per_image
probs = logits.softmax(dim=1)
# tensor([[0.9923, 0.0077]], grad_fn=<SoftmaxBackward0>)

Logits 是与每个组合(第一个提示和图像,第二个提示和图像)相关的分数,分别为 10.918.5。为了获得最终的类别概率,需要对其应用 SoftMax 函数,得到结果概率(例如,food 的概率为 0.99)。

小结

在本节中,介绍了语言模型、社区提供的模型和分词过程,测试了使用多模态模型和简单提示进行零样本图像分类的基本方法。

系列链接

Transformer实战------词嵌入技术详解
Transformer实战------循环神经网络详解
Transformer实战------从词袋模型到Transformer:NLP技术演进

相关推荐
qq_397752931 小时前
革新仓储新纪元:海格里斯HEGERLS四向穿梭车智领未来
大数据·人工智能
思绪漂移1 小时前
让Agent的应用价值增长
人工智能·aigc
羊小猪~~1 小时前
【NLP入门系列三】NLP文本嵌入(以Embedding和EmbeddingBag为例)
人工智能·深度学习·神经网络·自然语言处理·大模型·nlp·embedding
事变天下1 小时前
店匠科技闪耀“跨博会”,技术+生态打造灵活出海能力
大数据·人工智能·科技
未来智慧谷1 小时前
全球首款5G-A人形机器人亮相,通信与AI融合进入新阶段
人工智能·5g·机器人
love530love2 小时前
【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载缓存占满 C 盘问题:更改缓存位置全流程
开发语言·人工智能·windows·笔记·python·缓存·uv
贝多财经2 小时前
魅族“换血”出牌:手机基本盘站不稳,想靠AI和汽车“改命”
人工智能·智能手机·汽车
青软青之LIMS2 小时前
King’s LIMS 系统引领汽车检测实验室数字化转型
大数据·人工智能·汽车·实验室数字化管理系统·实验室综合管理平台·实验室检测管理系统
Jamence2 小时前
多模态大语言模型arxiv论文略读(131)
论文阅读·人工智能·语言模型·自然语言处理·论文笔记
LLM大模型2 小时前
LangGraph篇-子图可控性
人工智能·程序员·llm