PyTorch生成式人工智能——Hugging Face环境配置与应用详解
PyTorch生成式人工智能——Hugging Face环境配置与应用详解
- 0. 前言
- 1. 安装 transformers
- 2. 使用 hf-mirror 快速下载模型
- 3. 使用语言模型和分词器
- 4. 使用社区提供的模型
- 5. 使用多模态 Transformer
- 相关链接
0. 前言
在本节中,我们将介绍如何在 PyTorch
和 TensorFlow
框架中使用 Hugging Face
模型库,我们将讨论如何获取不同的模型以及使用不同管道的步骤,例如,双向自回归 Transformer
(Bidirectional and Auto-regressive Transformer
, BART
)、BERT
和 TAPAS
(TAble PArSing
) 等模型,同时介绍 GPT-2
(Generative Pretrained Transformer 2
) 文本生成。需要注意的是,本节主要集中在如何准备环境以及如何使用预训练模型,而不是模型训练,模型训练将在后续学习中详细讨论。
1. 安装 transformers
安装 transformers
库非常简单,只需要运行以下命令:
$ pip install transformers
2. 使用 hf-mirror 快速下载模型
hf-mirror.com 是 Hugging Face 官方网站的镜像,旨在解决访问 Hugging Face
官方站点时遇到的网络瓶颈和下载缓慢问题。
hf-mirror.com 致力于帮助用户快速、稳定的下载模型、数据集。可以直接在 hf-mirror.com
网站中搜索所需模型和数据集,并在模型主页的 Files and Version
中下载文件。
此外,还可以使用 huggingface-cli
,huggingface-cli
是 Hugging Face
官方提供的命令行工具,自带完善的下载功能。使用 huggingface-cli
首先需要安装依赖:
$ pip install -U huggingface_hub
然后,设置环境变量:
# linux 为了使之永久生效,可以将其写入 `~/.bashrc`
$ export HF_ENDPOINT=https://hf-mirror.com
# windows
$env:HF_ENDPOINT = https://hf-mirror.com
设置完成后,可以通过以下命令下载模型和数据集:
$ 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()
函数直接从镜像网站上下载模型。
3. 使用语言模型和分词器
在本节中,我们将介绍如何使用 Transformer
库中的语言模型,以及与之相关的分词器。为了使用指定的语言模型,首先需要导入它,我们从 Google
提供的 BERT
模型开始,并使用其预训练版本:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
以上代码的第一行导入了 BERT
的分词器,第二行下载了 BERT
基础版的预训练分词器。需要注意的是,uncased
版本是以不区分大小写的字母训练的,因此字母的大小写不会影响模型的效果。测试并查看输出:
text = "Using Transformers is easy!"
tokenizer(text)
输出结果如下所示:
{'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
) 的 ID
。token_type_ids
显示了每个 token
的类型,用于区分第一个和第二个序列,如下图所示:
attention_mask
是由 0
和 1
组成的掩码,用于标示序列的开始和结束,以防止不必要的计算。每个分词器有不同的添加特殊 token
的方式。在 BERT
的分词器中,在序列的开始添加了一个 [CLS]
token
,在序列的结束添加了一个 [SEP]
token
,ID
分别为 101
和 102
。这些数字来源于预训练分词器的 token ID
。
同一分词器可以同时用于基于 PyTorch
和 TensorFlow
的 Transformer
模型。为了分别获得每种模型的输出,需要在 return_tensors
参数中使用 pt
和 tf
关键字。例如,可以通过运行以下命令来使用分词器:
encoded_input = tokenizer(text, return_tensors="pt")
得到的 encoded_input
就是已分词的文本,可以用于 PyTorch
模型。为了运行模型(例如 BERT
模型),可以使用以下代码从 Hugging Face
的模型仓库下载模型:
from transformers import BertModel
model = BertModel.from_pretrained("BERT-base-uncased")
通过以下代码可以将分词器的输出传递给模型:
output = model(**encoded_input)
输出结果为模型的嵌入和交叉注意力。
在加载和导入模型时,可以指定想要使用的模型版本。如果在模型名称前加上 TF
,Transformer
库将加载其 TensorFlow
版本。以下代码展示了如何加载并使用 BERT
基础模型的 TensorFlow
版本:
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
)。例如,使用语言模型填充掩码的任务可以通过以下代码实现:
from transformers import pipeline
unmasker = pipeline('fill-mask', model='BERT-base-uncased')
unmasker("The man worked as a [MASK].")
生成输出如下所示,输出分数和可能替换 [MASK]
的词汇:
使用 pandas
可以获取更整洁的视图:
pd.DataFrame(unmasker("The man worked as a [MASK]."))
结果如下所示:
4. 使用社区提供的模型
Hugging Face
拥有大量由来自 Google
和 Facebook
等大型人工智能和信息技术公司的合作者提供的社区模型,个人和其它团体也提供了许多有趣的模型,访问和使用这些模型也非常简单。首先,访问官方网站上的 Transformer 模型目录:
在官方网站无法正常访问时,也可以访问镜像网站 hf-mirror.com 获取模型。除了这些模型,NLP
任务还可以使用不同数据集。
要使用这些社区提供的模型,可以通过关键词搜索来探索它们,或者直接指定 NLP
任务和管道。
例如,使用表格问答模型。在查找到感兴趣的模型后,能够看到以下页面:
在右侧,有一个面板可以测试这个模型。表格问答模型可以回答有关提供给模型的表格的问题。进行提问后,模型将通过高亮显示答案来进行回答。下图显示了它如何获取输入并为特定表格提供答案:
每个模型都有一个由模型作者提供的页面,通常被称为模型卡。可以按照模型页面上提供的示例使用该模型。例如,访问 GPT-2
的 Hugging Face
仓库页面,并查看作者提供的示例,如下图所示:
推荐使用管道 (pipelines
),因为所有的复杂工作都由 Transformer
库处理。假设需要一个开箱即用的零样本分类器,以下代码展示了实现和使用预训练模型的便捷性:
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)
输出结果如下所示:
{'labels': ['travel', 'dancing', 'cooking'], 'scores':
[0.9866883158683777, 0.007197578903287649, 0.006114077754318714],
'sequence': 'I am going to france.'}
5. 使用多模态 Transformer
零样本图像分类在只有类别名称或与类别相关的短语可用时非常有用。CLIP
作为一个多模态模型,能够将图像和文本表示在同一个语义空间中。为了得到一个零样本图像分类器,即在没有任何关于类别的先验知识的情况下进行分类,可以设想以下场景:类名已经给定,但没有示例样本的类别信息。此时唯一可用的知识就是这些类名以及一组之前未见过的图像。
(1) 首先准备图片:
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) 加载图像后,查看图像样本:
image
(3) 为所有类别创建提示 (prompt
),然后为文本部分创建输入:
prompt = "a photo of a "
class_names = ["food", "fruit"]
inputs = [prompt + class_name for class_name in class_names]
(4) 文本和图像的输入准备好后,加载模型:
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
是一个用于分词的封装器。最后,可以将预处理和分词后的数据交给模型,最终得到输出:
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.9
和 18.5
。为了获得最终的类别概率,需要对其应用 SoftMax
函数,得到结果概率(例如,food
的概率为 0.99
)。
相关链接
PyTorch生成式人工智能实战:从零打造创意引擎
PyTorch生成式人工智能(1)——神经网络与模型训练过程详解
PyTorch生成式人工智能(2)——PyTorch基础
PyTorch生成式人工智能(3)——使用PyTorch构建神经网络
PyTorch生成式人工智能(4)——卷积神经网络详解
PyTorch生成式人工智能(5)——分类任务详解
PyTorch生成式人工智能(6)——生成模型(Generative Model)详解
PyTorch生成式人工智能(18)——循环神经网络详解与实现
PyTorch生成式人工智能(19)——自回归模型详解与实现
PyTorch生成式人工智能(24)——使用PyTorch构建Transformer模型
PyTorch生成式人工智能(25)——基于Transformer实现机器翻译
PyTorch生成式人工智能(26)——使用PyTorch构建GPT模型