当前位置: 首页 > news >正文

PyTorch生成式人工智能——Hugging Face环境配置与应用详解

PyTorch生成式人工智能——Hugging Face环境配置与应用详解

    • 0. 前言
    • 1. 安装 transformers
    • 2. 使用 hf-mirror 快速下载模型
    • 3. 使用语言模型和分词器
    • 4. 使用社区提供的模型
    • 5. 使用多模态 Transformer
    • 相关链接

0. 前言

在本节中,我们将介绍如何在 PyTorchTensorFlow 框架中使用 Hugging Face 模型库,我们将讨论如何获取不同的模型以及使用不同管道的步骤,例如,双向自回归 Transformer (Bidirectional and Auto-regressive Transformer, BART)、BERTTAPAS (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-clihuggingface-cliHugging 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) 的 IDtoken_type_ids 显示了每个 token 的类型,用于区分第一个和第二个序列,如下图所示:

token_type_ids

attention_mask 是由 01 组成的掩码,用于标示序列的开始和结束,以防止不必要的计算。每个分词器有不同的添加特殊 token 的方式。在 BERT 的分词器中,在序列的开始添加了一个 [CLS] token,在序列的结束添加了一个 [SEP] tokenID 分别为 101102。这些数字来源于预训练分词器的 token ID
同一分词器可以同时用于基于 PyTorchTensorFlowTransformer 模型。为了分别获得每种模型的输出,需要在 return_tensors 参数中使用 pttf 关键字。例如,可以通过运行以下命令来使用分词器:

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)

输出结果为模型的嵌入和交叉注意力。
在加载和导入模型时,可以指定想要使用的模型版本。如果在模型名称前加上 TFTransformer 库将加载其 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 拥有大量由来自 GoogleFacebook 等大型人工智能和信息技术公司的合作者提供的社区模型,个人和其它团体也提供了许多有趣的模型,访问和使用这些模型也非常简单。首先,访问官方网站上的 Transformer 模型目录:

Hugging Face
在官方网站无法正常访问时,也可以访问镜像网站 hf-mirror.com 获取模型。除了这些模型,NLP 任务还可以使用不同数据集。
要使用这些社区提供的模型,可以通过关键词搜索来探索它们,或者直接指定 NLP 任务和管道。
例如,使用表格问答模型。在查找到感兴趣的模型后,能够看到以下页面:

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

模型试用
每个模型都有一个由模型作者提供的页面,通常被称为模型卡。可以按照模型页面上提供的示例使用该模型。例如,访问 GPT-2Hugging 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.918.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模型

http://www.lryc.cn/news/611808.html

相关文章:

  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • 远程连接----ubuntu ,rocky 等Linux系统,WindTerm_2.7.0
  • Spring选择哪种方式代理?
  • 阿里云DMS Data Copilot——高效智能的数据助手,助力企业实现数据驱动的未来
  • 深入理解 Maven POM 文件:核心配置详解
  • Jenkinsfile各指令详解
  • Java学习第一百零九部分——Jenkins(一)
  • 基于通用优化软件GAMS的数学建模和优化分析
  • AlphaEarth模型架构梳理及借鉴哪些深度学习领域方面的思想
  • React:受控组件和非受控组件
  • WebStorm转VSCode:高效迁移指南
  • 前端开发_怎么禁止用户复制内容
  • vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能
  • 【前端开发】三. JS运算符
  • 2.6 sync
  • vue3 find 数组查找方法
  • JSON巴巴 - 专业JSON格式化工具:让任何JSON都能完美格式化
  • Excel将整列值转换为字符串
  • Git 乱码文件处理全流程指南
  • 通过最严时序标准,再登产业图谱榜首,TDengine 时序数据库在可信数据库大会荣获双荣誉
  • Apache Flink 的详细介绍
  • 时序数据库的发展现状与未来趋势
  • Excel单元格设置下拉框、选项背景
  • 【OSCP】- Monitoring 靶场学习(Proving Grounds Play)
  • SpringBoot 整合Langchain4j 对接主流大模型实战详解
  • 科技云报到:Agent应用爆发,谁成为向上托举的力量?
  • 第一章-网络信息安全概述
  • 数据赋能(381)——数据挖掘——支持异类数据库
  • C语言的数组与字符串练习题2
  • GitHub 趋势日报 (2025年08月05日)